我的任务是审核 Windows 服务器,查看安装了哪些服务和程序。我认为 PowerShell 是理想的选择,尽管我对 PowerShell 脚本还不熟悉。
我在一个 txt 文件中有一个服务器列表,并且一直在使用以下命令。
Get-CimInstance -ComputerName (Get-Content .\servers.txt) -ClassName win32_product | Select-Object PSComputerName, Name, PackageName, InstallDate, IdentifyingNumber | Export-CSV -Path .\programs.csv
Get-Service -ComputerName (Get-Content .\servers.txt) -ErrorAction Continue | Select-Object MachineName, Name, DisplayName, Status, StartType | Export-CSV .\services.csv
.\servers.txt 是一个包含服务器 FQDN 的简单文本文件。
如果服务器无法访问或找不到,第一个语句会打印错误消息并继续。据我了解,ErrorAction 默认是继续。但是,第二个语句失败并停止执行。我预计会出现错误,我可以逐个处理它们,但为什么语句没有按预期在出现错误时继续?
如果我从列表中删除有问题的服务器,Get-Services 就可以正常运行。我宁愿在脚本中出现错误并单独处理。
更新以包含 Powershell 输出
Get-Service:无法在计算机“computer_name”上打开服务控制管理器。此操作可能需要其他权限。在 .\get-service.ps1:1 char:1 + Get-Service -ComputerName (Get-Content .\servers.txt) -ErrorAction Co ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo:未指定:(:) [Get-Service],InvalidOperationException + FullyQualifiedErrorId:System.InvalidOperationException,Microsoft.PowerShell.Commands.GetServiceCommand
答案1
只是为了向您展示我想象如何使用try-catch
-statement。
$serverList = Get-Content .\servers.txt
foreach ($server in $serverLists)
{
try
{
Get-CimInstance -ComputerName $server -ClassName win32_product | Select-Object PSComputerName, Name, PackageName, InstallDate, IdentifyingNumber | Export-CSV -Path .\programs.csv -Append
Get-Service -ComputerName $server | Select-Object MachineName, Name, DisplayName, Status, StartType | Export-CSV .\services.csv -Append
}
catch
{
"Error on server $server occurred." | Out-File -FilePath .\errors.log -Append
}
}
您可以调整 catch 块来区分 CimInstance 和服务,或者您可以转发通用错误消息$_.Exception.Message
。