【问题标题】:Importing CSV and using Get-Hotfix to export to CSV导入 CSV 并使用 Get-Hotfix 导出为 CSV
【发布时间】:2020-01-06 17:33:56
【问题描述】:

所以,我在尝试使用一些代码从许多计算机(列在“IP 地址”列下的 CSV 文件中)获取修补程序并将结果导出到.csv。它们每个都需要一个本地计算机帐户才能登录(在“CPU 名称”列下的同一 CSV 中)。我真的不在乎它是整个事情的一个 csv 还是每个结果的一个 csv。到目前为止的代码如下:

$ipaddress = [What do I put here?]
$cpuname = [What do I put here?]
$OutputFile = 'MyFolder\Computer.csv'
$Username = '$cpuname\MyUsername' [Is this ok?]
$Password = 'MyPassword'
$pass = ConvertTo-SecureString -AsPlainText $Password -Force

$SecureString = $pass
$MySecureCreds = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $Username,$SecureString

$Computers = Import-CSV "C:\MyFolder\Computers.csv"

ForEach ($ipaddress in $Computers) {
    }

  try  

    { 
Get-HotFix -Credential $MySecureCreds -ipaddress $IPAddress | Select-Object PSComputerName,HotFixID,Description,InstalledBy,InstalledOn | export-csv $OutputFile
    } 

catch

    { 
Write-Warning "System Not reachable:$ipaddress"
    }

我接近了吗?

【问题讨论】:

  • 这段代码运行时会发生什么?是否符合您的要求?如果不是,它在哪些方面不符合要求?有关如何提问的信息,请参阅stackoverflow.com/help
  • 它似乎没有正确读取 IP 地址列。它只是说系统无法访问。如何引用 $ipaddress 中的“IP 地址”列和 $cpuname 中的“CPU 名称”列?

标签: powershell


【解决方案1】:

IP 地址和计算机名称来自 CSV,因此您无需静态定义它们。

关于用户名,有几点:

  • 需要使用双引号展开。

  • 此外,您还需要以一种方式读取“CPU 名称”属性 将在双引号较大的表达式中使用子表达式,例如"$($variable.property)more text"。或者你可以连接字符串$variable.property + 'more text'

  • 由于CPU Name 在列名中有一个空格,您需要将其括在引号中。

  • 由于用户名来自计算机名,而计算机名来自 CSV,定义用户名变量需要在foreach循环中。

此脚本中的安全做法存在问题,但超出了问题的范围。例如将密码保存在脚本中,尤其是对具有相同密码的大量联网机器具有管理权限的本地帐户...

$InputFile = 'C:\MyFolder\Input.csv'
$OutputFile = 'C:\MyFolder\Output.csv'
$Password = Read-Host | ConvertTo-SecureString -AsPlainText -Force
$Computers = Import-CSV $InputFile

$HotfixOutput = foreach ($Computer in $Computers) {

    $Username = "$($Computer.'CPU Name')\MyUsername"
    $MySecureCreds = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $Username,$Password

    try { 
        Get-HotFix -Credential $MySecureCreds -ipaddress $Computer.'IP Address' | Select-Object PSComputerName, HotFixID, Description, InstalledBy, InstalledOn
    } 

    catch { 
        Write-Warning "System Not reachable: $($Computer.'IP Address')"
    }

}

$HotfixOutput | Export-Csv $OutputFile -NoTypeInformation

Remove-Variable Password
Remove-Variable MySecureCreds

【讨论】:

  • 关于安全问题,您说的很对。这些在网络上,但不在域上(因此无法使用 SCCM 或其他东西来获取此信息。我会手动执行此操作,但它总共有一百个系统,我真的不想进入密码多次。密码本身不符合任何安全要求。它们不会存在太久(希望如此)。
  • 哦,在这种情况下我应该把密码放在哪里?
  • 此代码提示您使用Read-Host 并将输入传递给ConvertTo-SecureString,这样至少它不会保存在脚本中。 Remove-Variable 确保凭据没有保存在内存中
猜你喜欢
  • 2013-03-18
  • 2021-10-12
  • 1970-01-01
  • 2014-11-22
  • 1970-01-01
  • 2015-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多