2015-04-28 48 views
0

我正在檢查在一組計算機上使用WMI的服務,但有一些出現錯誤。我如何捕獲這些錯誤,以便採取適當的行動?powershell捕獲wmi查詢的異常代碼

查詢是

$listOfServices = Get-WmiObject -credential $wsCred -ComputerName $comp.name -Query "Select name, state from win32_Service" 

如果我碰到下面我想嘗試其他憑據

Get-WmiObject : Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)) 

如果我得到Get-WmiObject : User credentials cannot be used for local connections我想如果我得到Get-WmiObject : The RPC server is unavailable. (Exception from HRESULT: 0x800706BA)刪除憑據

或任何其他錯誤,我只是想報告錯誤。

我知道我應該使用try catch塊,但我不知道如何爲每個異常指定catch。

這裏是我迄今爲止 -

try { 
    $listOfServices = Get-WmiObject -credential $wsCred -ComputerName $comp.name -Query "Select name, state from win32_Service" -ErrorAction Stop 
} 
catch { 
    $e = $_.Exception 
    switch ($e.ErrorCode) { 
     0x80070005 { 
       $listOfServices = Get-WmiObject -credential $svrCred -ComputerName $comp.name -Query "Select name, state from win32_Service" -ErrorAction Stop 
     } 
     default { 
      write "Error code: $e.ErrorCode" 
      write "Error details: $e.ErrorDetails" 
      write "Full error: $e" 
     } 
    } 
} 

回答

3

錯誤號存儲在異常的HResult財產。請注意,您需要將錯誤操作設置爲Stop使WMI錯誤捕:

$ErrorActionPreference = 'Stop' 
try { 
    Get-WmiObject ... 
} catch { 
    $e = $_.Exception 
    switch ($e.HResult) { 
    0x80070005 { ... } 
    default { throw $e } 
    } 
} 
+0

這似乎不工作,因爲$ e.errorcode返回的不僅僅是代碼這是一些輸出的整個消息 - System.UnauthorizedAccessException:訪問被拒絕。 (來自HRESULT的異常:0x80070005(E_ACCESSDENIED)) at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode,IntPtr errorInfo) – user2369812

+0

@ user2369812在這種情況下,請使用'HResult'屬性。您可能還需要設置'$ ErrorActionPreference'而不是使用'-ErrorAction'。查看更新的答案。 –

0

這是什麼最終爲我工作。

catch [System.UnauthorizedAccessException]