0

私はPowerShellを初めて使用します。www.powershell.comでいくつかの行を読みました。今、私は問題を解決するためにあなたの助けが必要です。ネットワーク内のクライアントからUUIDを読み取りたい。そのため、すべてのPCが保存されているドキュメント「pcs.txt」を作成しました。

$pc = Get-Content pcs.txt #Read content of file
$cred = Get-Credential “domain\user” 

for ($i=0; $i -lt $pc.length; $i++)     {

    $Result=test-connection -ComputerName $pc[$i] -Count 1 -Quiet
    If ($Result -eq 'True')
    { 
        $uuid = (Get-WmiObject Win32_ComputerSystemProduct -ComputerName $pc[$i] -Credential $cred).UUID 
        $Ausgabe=$pc[$i] + ';'+$uuid
        $Ausgabe  


    } 
    else
    {

        $Ausgabe=$pc[$i] + '; UUID nicht erhalten'
        $Ausgabe 
    }

}

まず、pingが機能するかどうかをテストします。pingが機能するとき、私はuuidを取得しようとします。pingが機能しても、uuidが取得されないことがあります。したがって、タイムアウトをコーディングしたいと思います。つまり、2秒後にuuidがない場合は、次のPCに移動します。

手伝ってくれませんか。

4

2 に答える 2

0

良い回避策を見つけました!

http://theolddogscriptingblog.wordpress.com/2012/05/11/wmi-hangs-and-how-to-avoid-them/

ここで私の作業コード:

$pc = Get-Content pcs.txt #FILE FROM THE HARDDISK
$cred = Get-Credential “DOMAIN\USER” #

for ($i=0; $i -lt $pc.length; $i++) 
{
$Result=test-connection -ComputerName $pc[$i] -Count 1 -Quiet 
If ($Result -eq 'True')
{ 
    $WMIJob = Get-WmiObject Win32_ComputerSystemProduct -ComputerName $pc[$i] -Credential $cred -AsJob     
    $Timeout=Wait-Job -ID $WMIJob.ID -Timeout 1 # the Job times out after 1 seconds.   
    $uuid = Receive-Job $WMIJob.ID

    if ($uuid -ne $null)
    {
        $Wert =$uuid.UUID 
        $Ausgabe=$pc[$i] + ';'+$Wert
        $Ausgabe  
    }

    else
    {
    <#$b = $error | select Exception       
    $E = $b -split (:)     
    $x = $E[1]   
    $Error.Clear()      #>
    $Ausgabe=$pc[$i] + '; got no uuid'
    $Ausgabe 
    }



} 
else
{
    $Ausgabe='PC not reached through ping.'
    $Ausgabe 
}


}

私はそれで誰かを助けることができることを願っています

于 2012-09-07T12:29:57.457 に答える
0

Get-WmiObject残念ながら、コマンドレットのタイムアウト パラメータはありません。MS Connectに機能要求がありますが、それは 2011 年のものであり、まだ開いています。

私がテストしていない回避策は、 を使用して利用できますSystem.Management。リンクが切れた場合に備えて、ここにコピーして貼り付けます。(そして、存在するかもしれないし存在しないかもしれないリソースへのリンクのみを含むSOの回答は嫌いです...)

Function Get-WmiCustom([string]$computername,[string]$namespace,[string]$class,[int]$timeout=15){
$ConnectionOptions = new-object System.Management.ConnectionOptions
$EnumerationOptions = new-object System.Management.EnumerationOptions 

$timeoutseconds = new-timespan -seconds $timeout
$EnumerationOptions.set_timeout($timeoutseconds) 

$assembledpath = "\\" + $computername + "\" + $namespace
#write-host $assembledpath -foregroundcolor yellow 

$Scope = new-object System.Management.ManagementScope $assembledpath, $ConnectionOptions
$Scope.Connect() 

$querystring = "SELECT * FROM " + $class
#write-host $querystring 

$query = new-object System.Management.ObjectQuery $querystring
$searcher = new-object System.Management.ManagementObjectSearcher
$searcher.set_options($EnumerationOptions)
$searcher.Query = $querystring
$searcher.Scope = $Scope 

trap { $_ } $result = $searcher.get() 

return $result
}
于 2012-09-07T10:47:13.023 に答える