2017-10-02 9 views
0

J'ai écrit un script dans PowerShell, scripts collecte des informations sur l'état de certains services système, par exemple le service DHCP sur les hôtes distants. Parfois, il existe un problème de connexion aux hôtes distants et de collecte d'informations auprès de WMI. La commande WMI ci-dessous:Powershell - Erreur WMI via la connexion à distance

$DHCP = Get-WmiObject win32_service -ComputerName $server 2>>$logerror2 | 
Where-Object -FilterScript {$_.Name -eq "dhcp"} 

J'ai créé objet avec deux propriétés:

   [pscustomobject][ordered]@{ 
       ServerName = $server 
       DHCP = $DHCP.State 
       } 

La sortie est dirigée vers le fichier .csv, le contenu du fichier ressemble à ceci:

"ServerName","DHCP" 
"srv1","Running" 
"srv2",, 
"srv3",, 

Sur les hôtes nommés "srv2" et "srv3", il y a un problème de connexion et de collecte d'informations provenant des hôtes distants WMI. Je voudrais au lieu de l'espace vide pour donner quelques informations, par exemple « WMI problème », et le contenu du fichier doit ressembler à ceci:

"ServerName","DHCP" 
"srv1","Running" 
"srv2",WMI Problem, 
"srv3",WMI Problem,  

Répondre

1

Essayez cela devrait être ok:

## Clear the Error variable incase the last server had an error ## 
if ($error) 
{ 
    $error.clear() 
} 

## Attempt to do the WMI command ## 
try 
{ 
    $DHCP = Get-WmiObject win32_service -ComputerName $server -erroraction stop | Where-Object {$_.Name -eq "dhcp"} 
} 
Catch 
{ 
    $errormsg = $_.Exception.Message 
} 

## If the WMI command errored then do this ## 
if ($error) 
{ 
    [pscustomobject][ordered]@{ 
    ServerName = $server 
    DHCP = $errormsg 
    } 
} 

## If the WMI command was successful do this ## 
Else 
{ 
    [pscustomobject][ordered]@{ 
    ServerName = $server 
    DHCP = $DHCP.State 
    } 
} 
0

Prendre une page de la réponse @ Dizzy.

$CSV = Foreach ($Server in $ServerList) 
{ 
    $ServerObj = [pscustomobject][ordered]@{ 
     ServerName = $server 
     DHCP = $null 
    } 

    ## Attempt to do the WMI command ## 
    try 
    { 
     $DHCP = Get-WmiObject win32_service -ComputerName $server -erroraction stop | Where-Object {$_.Name -eq "dhcp"} 
     [String]$ServerObj.DHCP = $DHCP.State 
    } 
    Catch 
    { 
     $errormsg = $_.Exception.Message 
     [String]$ServerObj.DHCP = $errormsg 
    } 
    $ServerObj 
} 
$CSV | Export-Csv .\result.csv -NoTypeInformation