2013-06-20 101 views
0

嗨,我創建了以下腳本來審覈遠程主機上的本地管理員組。它工作正常,但由於它只在數據經過所有主機後才輸出數據,所以恐怕在數據有機會導出到csv之前數據將會用完,所以我一直試圖創建它並且在每個主機經過列表時追加輸出,除非我不能在第一行顯示標題並在其下面添加其他行。以下是當我嘗試追加時得到的輸出。斜體字應該是標題,其他信息應該列在下一行。我究竟做錯了什麼?附加CSV輸出編碼問題

@ {服務器 = pc1; 會員 =管理員; DistinguishedName = DC = Domain,DC = com

這就是它的樣子。看起來這樣,如果我不追加和我讓它創建CSV文件已經完成,通過主機

Server   Members   DistinguishedName 
host1 Administrator;Admin2 DC=DOMAIN,DC=COM 





$servers= get-content "C:\Scripts\AD Audits\Local Admin\workstations.txt" 
$output = "c:\temp\local admin audit $CurrentDate.csv" 
$results = @() 
$disconnected = "Did not respond" 
foreach($server in $servers) 
{ 
$connected = Test-Connection $server -count 1 -quiet 
    if ($connected) { 
     "$server responded" | Out-File -append "c:\temp\LocalAdmin goodhosts $CurrentDate.txt"} 

    else { 
     "$server did not respond" | Out-File -append "c:\temp\LocalAdmin badhosts $CurrentDate.txt"} 

$group =[ADSI]"WinNT://$server/Administrators" 
$members = $group.Members() | foreach {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null) } 
$results += New-Object PsObject -Property @{ 
    DistinguishedName = (get-adcomputer ($server) -properties * | select distinguishedname).distinguishedname 
    Server = $server 
    Members = $members -join ";" 

    } 

$results | Export-Csv $Output -NoTypeInformation 

}` 

if($connected -eq $True) { New-Object PSObject -Property @{ DistinguishedName = (Get-ADComputer $_).DistinguishedName Server = $_ Members = $members -join ";" }} else {write-host ""}

回答

0

我的建議是使用管道而不是一個foreach語句列表中去後,所以每個對象都會在處理完成後立即寫入文件。

$servers | ForEach-Object{ 

    $connected = Test-Connection $_ -Count 1 -Quiet -ErrorAction SilentlyContinue 
    $state = if($connected) {"$_ responded"} else {"$_ did not respond"} 
    $state | Out-File -Append "c:\temp\LocalAdmin goodhosts $CurrentDate.txt" 

    $group =[ADSI]"WinNT://$_/Administrators,group" 
    $members = $group.Members() | ForEach-Object {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null) } 

    if($connected) 
    { 
     New-Object PSObject -Property @{ 
      DistinguishedName = (Get-ADComputer $_).DistinguishedName 
      Server = $_ 
      Members = $members -join ";" 
     } 
    } 

} | Export-Csv $Output -NoTypeInformation 
+0

接縫工作,除非看起來腳本無法連接到的計算機仍然被寫入到csv,而前一個主機發出的響應信息爲false。管道雖然有意義。我實際上開始瞭解這些東西。而不是在$ servers中使用($ server),您對每行都使用單個條目($ _)。 – user2402045

+0

您可以將新的psobject創建放入IF語句中,該語句檢查相關計算機是否可以連接。 –

+0

工作完美!我將if block修改添加到了原始問題的底部。它可能不是我添加它的最乾淨的方式,但它工作得很好。對我來說有沒有更好的方法來做到這一點? – user2402045