2016-03-22 21 views
0

Powershell için yeniyim ve bir bilgisayarda oturum açmış olduğunu görmek için bir ulak dosyadan karşılaştırma yapmak için bir CSV oluşturmaya çalışıyorum. Ancak, bazen bir bilgisayarda oturum açmamış olsalar bile komut dosyasının aynı kullanıcıyı birden çok kez çekeceği tuhaf bir sorunla karşılaşıyorum. İşte tam kodum. Yapılabilecek pek çok optimizasyon olduğunu biliyorum (ve kaldırılması gereken parçalar, bunlar belirtilmelidir). Get-WMIObject'i ya da benzer bir şeyi yanlış kullanmış olduğumu farz ediyorum, herkes bu bilgiyi neden böyle çekeceğini görebiliyor mu?WMI, oturum açmamış olsa bile geçerli kullanıcıyı çeker

$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 

cevap

0

nedense $UserName veya $ADName bir artık-değeri yoktur olabilir olduğu hala oturum Kullanıcı (kullanıcı oturum varken WMI $null döndürür) varken sen Get-ADUser -Identity $null çalıştırmayı denedi çünkü eski değerdir .

Ayrıca ping-testinizi bir koddan bir if-testine değiştirdim. Public'un geri döndüğünü hiç görmedim, ama gerçekten de zarar görmediği için bıraktım.

Dene:

#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

ben güncellenmiş kodu kullandım ve aynı şeyi yapar. Değişkenleri temizlemeye çalışmak için döngü sonunda bir net değişken koymaya çalıştım, ancak bir hatayı atıyor, değişkenin içindeki değişkeni temizlemeye çalışıyor gibi görünüyor. konu. Ancak, sayfaya bakıldığında, bu, $ null değerini çekmekten ziyade problem gibi görünüyor, sadece tanımlanmış olan önceki $ kullanıcı adını tekrarlıyor. –

+0

Güncelleştirilen yanıtı deneyin, kodunuzda "null-value üstünde" çağrı metodu işlediğim hariç, sonuncu gibi çalışmalıyım. Eğer işe yaramazsa, o zaman komut dosyasında bir kesme noktası eklemeniz ve yanlış değerlerden birine sahip olduğunuzda hata ayıklamanız gerekir, çünkü onu yeniden üretemiyorum. –

+0

Yani, açık değişken aslında değişkeni temizlemiyor gibi görünüyor, ama sizinki çalışıyor (Ya da, kullandığınız get-wmi'deki ekstra bitler, bunun ne olduğundan emin olamayacağından emin olun). –

İlgili konular