GWMI クエリが失敗したときに、カスタム エラー メッセージをログに出力したいと考えています。例外をキャッチできますが、エラー ファイルの出力にはリスト内の最後のコンピューターの名前しか含まれていないため、明らかに最後の例外だけです。WMI が有効になっていないことがわかっているコンピューターのリストを使用しています。それぞれにエントリがあるはずです。
テキスト ファイルにドメイン コンピューターのリストがあり、それぞれが 1 行であり、末尾の文字はありません。GWMI を使用して、ファイルをループしてネットワーク情報を取得します。一部のコンピュータでは WMI が有効になっていません。どのコンピュータかを知りたいです。私の現在のスクリプトは単にスローします:
gwmi : The RPC server is unavailable. (Exception from HRESULT: 0x800706BA)
At line:12 char:17
+ $base = gwmi win32_networkadapterconfiguration -computername $comp | whe ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [Get-WmiObject], COMException
+ FullyQualifiedErrorId : GetWMICOMException,Microsoft.PowerShell.Commands.GetWmiObjectCommand
wmi が有効になっていないマシンをループするたびに。
これは、例外をスローしたコンピューターを識別しません。私が望むのは、エラーがスローされるたびRPC server is unavailable...
に、カスタムエラーメッセージが例外をスローしたコンピューターの名前でログに書き込まれることです。
私のスクリプト:
$computers = Get-Content -path f:\scripts\docs\computer_list_test.txt
if (F:\scripts\wmi_mac_output.txt){
rm F:\scripts\wmi_mac_output.txt
}
foreach ($comp in $computers) {
try
{
$base = gwmi win32_networkadapterconfiguration -computername $comp -ErrorAction Stop | where {$_.dnsdomain -eq "mydomain.com"}
$machine = $base.DNSHostName
$mac = $base.MACAddress
$ip = $base.IPAddress
"<COMPUTER>`n`tname: $machine`n`tMAC: $mac`n`tIP: $ip`n</COMPUTER>" | Out-File F:\scripts\wmi_mac_output.txt
}
catch [Exception]
{
if ($_.Exception.GetType().Name -eq "COMException")
{
"$comp has no winrm" > f:\scripts\docs\error.txt
}
}
}
ありがとうございました。