2016-03-22 5 views
0

私はpowershellを初めて使用しています。現在、コンピュータにログインしているユーザーを比較するために、ExcelファイルからCSVを作成しようとしています。しかし、私は奇妙な問題に遭遇しています。奇妙な問題は、コンピュータにログインしていなくても、スクリプトが同じユーザを何度も引きつけることがあります。ここに私のフルコードです。私はできることができる多くの最適化があることを知っています(そしてそれらは削除される必要があります、それらは留意すべきです)。私はGet-WMIObjectやそれに類するものを悪用したと仮定しています。あなたがGet-ADUser -Identity $nullを実行しようとしたので、ログインしていなくてもWMIが現在のユーザーを引き出します

$csvRunFile = "test.csv" 
$output = "Results_$(Get-Date -format yyyy.MM.dd).csv" 

#Import the created csv. 
$csv = import-csv $CsvRunFile 

$results = foreach($csv_line in $csv) { 
    $ctag = $csv_line.ctag 
    $test_ping = test-connection $ctag -Count 1 -Quiet 


    #If the computer is pingable (IE: Online) 
    switch ($test_ping) { 
     $true { 
      #Pull the actual logged in user. 
      $Username = (Get-WmiObject -ComputerName $ctag -Class Win32_ComputerSystem).Username.Split("\\")[1] 

      #If the last modified folder is 'public' put an error, otherwise pull the username's information from AD. 
      #This was from when it pulled from the \User folder rather than the last log in, this is probably removeable. 
      if ($Username -eq "Public") { 
       $ADName = "No User" 
      } else { 
       $ADName = Get-ADUser -Identity $Username 
       $ADName = $ADName.Name 
      } #end If 
     }#end Switch:True 

    #Show there was an error when pinging the computer. 
     $false {$ADName = "ERROR"} 
    }#end Switch 

    #write the results the new output CSV. 
    $result = [PSCustomObject]@{ 
     CTAG = $ctag 
     Username = $ADName 
    }#end PSCustom Object 

    $result 
} #end foreach 

#Turn the .txt into a CSV so it can be manually compared to the list in the original excel file. 
$results | Export-Csv -path $output 

答えて

0

何らかの理由または$ADNameため$UserNameに残り価値があるかもしれませんが、まだそれは古い値ですさはユーザーがなかったとき(ユーザーがログインしていないがありますとき、WMIが$nullを返す)ログオン。

また、コードをクリーンアップするために、スイッチからpingテストをif-testに変更しました。私はPublicが返されるのを見たことがありませんでしたが、本当に傷ついていないので残しました。

試してみてください。

#If the computer is pingable (IE: Online) 
if($test_ping) { 
    #Clear username var just to be safe 
    $Username = $null 
    #Pull the actual logged in user. 
    $Username = (Get-WmiObject -ComputerName $ctag -Class Win32_ComputerSystem).Username | ? { $_ } | % { $_.Split("\\")[1] } 

    #If the last modified folder is 'public' put an error, otherwise pull the username's information from AD. 
    #This was from when it pulled from the \User folder rather than the last log in, this is probably removeable. 
    if (($Username -eq "Public") -or ($Username -eq $null)) { 
     $ADName = "No User" 
    } else { 
     $ADName = Get-ADUser -Identity $Username 
     $ADName = $ADName.Name 
    } #end If username public 
} else { $ADName = "ERROR"} 
+0

私は、更新されたコードを使用しました、そして、それは同じことを行います。私はループの終わりに変数をクリアしようとすると、変数をクリアしようとしましたが、エラーがスローされました。変数内の値をクリアしようとしているようです。問題。しかし、シートを見ると、それは問題であるように見えますが、$ null値を引き出すのではなく、定義された前の$ユーザー名を繰り返すだけです。 –

+0

更新された答えを試してください。これは、あなたのコードで "null値の呼び出しメソッド"を処理した以外の最後のものと同じように動作します。それが動作しない場合は、私はそれを再現することはできませんので、あなたが実際に間違った値の1つを持っているときにスクリプトにブレークポイントを追加し、それをデバッグする必要があります。 –

+0

それは、変数が実際に変数をクリアしていないように見えますが、あなたのものが働いています(これは、あなたが使ったget-wmiの余分なビットです。 –

関連する問題