2010-03-18 90 views
1

這是一個PowerShell/AD /交換問題....從PS腳本導出信息到csv

我正在對一些用戶的腳本來檢查他們的一些屬性,但我有麻煩得到這個輸出到CSV。腳本運行良好,並且完全按照我需要的操作執行,屏幕上的輸出很好,我只是無法將其直接導出到csv。

輸入用戶名是一個逗號分隔的TXT文件(例如,「用戶名1,用戶名2,USERNAME3」)

我已經創建自定義PS的對象,增加了他們,然後出口的,但它不工作試點。 ...

任何建議感激地接受..

感謝

喬治

$array = Get-Content $InputPath 

#split the comma delimited string into an array 
$arrayb = $array.Split(","); 

foreach ($User in $arrayb) 
{ 
    #find group memebership 
    Write-Host "AD group membership for $User" 
    Get-QADMemberOf $User 

    #Get Mailbox Info 
    Write-Host "Mailbox info for $User" 
    Get-Mailbox $User | select ServerName, Database, EmailAddresses, PrimarySmtpAddress, WindowsEmailAddress 

    #get profile details 
    Write-Host "Home drive info for $User" 
    Get-QADUser $User| select HomeDirectory,HomeDrive 

    #add space between users 
    Write-Host "" 
    Write-Host "******************************************************" 


} 

Write-Host "End Script" 

EDITED .... 方法我都試過了exproting(只顯示for循環/導出代碼) 方法一

$AllData = @() 

foreach ($User in $arrayb) 
{ 
    #set title for this user 
    #Write-host "Details for $User" 

    #find out their group memebership 
    Write-Host "AD group membership for $User" 
    $AdMemberOf = Get-QADMemberOf $User 
    Write-Host "ad completed" 
    Write-Host "" 
    Write-Host "" 


    #Get Mailbox Info 
    Write-Host "Mailbox info for $User" 
    $ExInfo = Get-Mailbox $User | select ServerName, Database, EmailAddresses, PrimarySmtpAddress, WindowsEmailAddress 
    Write-Host "ex completed" 
    Write-Host "" 
    Write-Host "" 


    #get profile details 
    Write-Host "Home drive info for $User" 
    $HomeInfo = Get-QADUser $User| select HomeDirectory,HomeDrive 
    Write-Host "home drive completed" 

    #add space between users 
    Write-Host "" 
    Write-Host "******************************************************" 


    $ReturnedObj = New-Object PSObject 
    $ReturnedObj | Add-Member NoteProperty -Name "AD Group Membership for $User" -Value $AdMemberOf 
    $ReturnedObj | Add-Member NoteProperty -Name "Exchange details for $User" -Value $ExInfo 
    $ReturnedObj | Add-Member NoteProperty -Name "Home drive info for $User" -Value $HomeInfo 


    Write-Host $ReturnedObj 

    $AllData += $ReturnedObj 


} 
Write-Host "starting csv export" 
Write-Output $AllData |export-csv -Path $OutputPath -notype -force 
Write-Host "End Script" 

方法2

$ExportInfo = @() 


foreach ($User in $arrayb) 
{ 
    $UserInfo = New-Object System.Object 

    #set title for this user 
    $ExportInfo += "Details for $User" 

    #Get Mailbox Info 
    $ExportInfo += Get-Mailbox $User 

    #find out their group memebership 
    $ExportInfo += Get-QADMemberOf $User 

    #get profile details 
    $ExportInfo += Get-QADUser $User| select HomeDirectory,HomeDrive 

    #add space between users 
    $ExportInfo += "" 
    $ExportInfo += "" 


} 

$ExportInfo | Export-Csv -Path $OutputPath ; 

編輯:

感謝來自Stej的建議我現在有以下代碼...仍然無法正常工作。我已經添加了一個檢查來確認用戶是否存在於AD中。第一個問題是獲取用戶AD組成員資格 - 如果我放入一箇中斷點並查看特定用戶AD成員資格的值,則變量的值爲「無法處理參數,因爲參數」obj「的值爲null。將參數「obj」的值更改爲非空值。「不知道是什麼導致了這一點,所以我現在只是忽略了它,並且注意到AD成員關注的其餘部分的工作。

將行註釋掉後,腳本運行良好,並在底部有一個斷點,我可以查看$ ExportInfo的值,它們都看起來很好,即它們都已正確保存到變量中。但是,它不會輸出。正如你所看到的,我把一條命令寫到屏幕上,但沒有顯示任何內容。當它試圖執行導出行(即「Export-Csv $ ExportInfo -Path $ OutputPath」)時,出現以下錯誤: 「無法將'System.Object []'轉換爲參數'Delimiter'所需的類型'System.Char' 」不支持指定的方法 在:行:80字符:10 +出口-CSV < < < < $ ExportInfo -Path $ OutputPath 「

我chnaged行以」 $ ExportInfo |出口-CSV - 路徑$ OutputPath「,它現在導出爲CSV ...不知道爲什麼?儘管兩個問題......如上所述,AD組不工作,並且電子郵件地址字段(應該返回像{SMTP:[email protected],smtp:[email protected], smtp:[email protected]和SIP:[email protected]})僅以CSV格式顯示爲「Microsoft.Exchange.Data.ProxyAddressCollection」。再次,在$ ExportInfo檢查,地址是有....

感謝

$ExportInfo = @() 

foreach ($User in $arrayb) 
{ 
    $CheckUser = Get-QADUser -Name $User 

    if (!$CheckUser) 
    { 
     $CountUser++ 
     Write-Warning "############################################" 
     Write-Warning "$user not found in AD" 
     Write-Warning "############################################" 
    } 
    else 
    { 
     $CountUser++ 

     $UserInfo = New-Object System.Object 



     #find out their group memebership 
     Write-Host "AD group membership for $User" 
     #$Temp = Get-QADMemberOf $User 
     #$UserInfo | Add-Member NoteProperty -Name "AD Group Membership" -Value $Temp.Name 

     #set title for this user 
     #Write-host "Details for $User" 

     #Get Mailbox Info 
     Write-Host "Mailbox info for $User" 
     $Temp = Get-Mailbox $User #| select ServerName, Database, EmailAddresses, PrimarySmtpAddress, WindowsEmailAddress 
     $UserInfo | Add-Member NoteProperty -Name "ServerName" -Value $Temp.ServerName 
     $UserInfo | Add-Member NoteProperty -Name "Database" -Value $Temp.Database 
     $UserInfo | Add-Member NoteProperty -Name "Email Addresses" -Value $Temp.EmailAddresses 
     $UserInfo | Add-Member NoteProperty -Name "Primary SMTP" -Value $Temp.PrimarySmtpAddress 
     $UserInfo | Add-Member NoteProperty -Name "Windows Email Address" -Value $Temp.WindowsEmailAddress 
     #$ReturnedObj | Add-Member NoteProperty -Name 





     #get profile details 
     Write-Host "Home drive info for $User" 
     $Temp = Get-QADUser $User #| select HomeDirectory,HomeDrive 
     $UserInfo | Add-Member NoteProperty -Name "Home Directory Location" -Value $Temp.HomeDirectory 
     $UserInfo | Add-Member NoteProperty -Name "Home Drive Mapped To" -Value $Temp.HomeDrive 

     #add space between users 
     Write-Host "" 
     Write-Host "******************************************************" 

     $ExportInfo += $UserInfo 
    }#end else 

} 
Write-Host "blah" 
Write-Host $ExportInfo 
Export-Csv $ExportInfo -Path - $OutputPath 

Write-Host "Number of Users processed: $CountUser" 
+0

這是什麼意思*不工作*和*得到麻煩*?有沒有錯誤信息?該文件是否爲空?你能分享你用於csv導出的代碼嗎? – stej 2010-03-18 16:19:22

回答

1

是否有任何錯誤消息? $error[0]有什麼嗎?這是什麼意思,它是不工作


編輯: 在你的第二個方法創建$UserInfo對象,但你不使用它。我想這是打算被添加到$ExportInfo。而不是你添加裸露的字符串$ExportInfo,這就是爲什麼你給你的csv文件這樣一個奇怪的內容。

那應該怎麼做正確:

$UserInfo = New-Object System.Object 

$ReturnedObj | Add-Member NoteProperty -Name "User Name" -Value $user.Name 
$ReturnedObj | Add-Member NoteProperty -Name "User otherValue" -Value $user.othValue 

#Get Mailbox Info 
$mailBox = Get-Mailbox $User 
$ReturnedObj | Add-Member NoteProperty -Name "User Mail box size" -Value $mailBox.Size 
$ReturnedObj | Add-Member NoteProperty -Name "User Mail box -count of messages" -Value $user.countOfMessages 

... # and so on 
$ExportInfo += $ReturnedObj 

需要注意的是,你要導出爲CSV 的對象必須有類型的字符串,整數,布爾變量的性質等不是由對象,如$User或由Get-Mailbox $User返回的那些。 csv中的值必須是原始的。這就是原因。

這適用於您的第一個示例,其中NoteProperty的值爲$AdMemberOf。這是無法導出到csv的對象本身。您必須爲$AdMemberOf的每個有趣屬性創建一堆屬性。

+0

我的錯誤,第二個方法,現予以更正...漂亮的基本錯誤,但unfortuantely它只是因爲我已經用代碼這麼多的擺弄 從上面的兩個輸出是: #TYPE System.String 長度 這是導出的csv中的Cells A1,2,3。 – George 2010-03-19 13:00:06

1

原來我需要使用一些foreach循環得到我所需要的信息....所以:

foreach($user in $array) 
{ 
$temp = Get-QADUser -Name $User 

if (!$temp) 
{ 
    $log += "????????????????" + "`n" 
    $log += "$user not found in AD" + "`n" 
    $log += "????????????????" + "`n" 
} 
else 
{ 
    #find out their group memebership 
    $log += "AD group membership for $User" + "`n" 
    $temp = Get-QADMemberOf $User 

    foreach ($drive in $temp) 
    { 
     $temp2 = $drive 
     $temp2 = $temp2.Substring(6) 
     $log += "`t" + $drive + "`n" 
}#end foreach for drive loop 

$temp = Get-Mailbox $User 

if ($temp.RecipientType -like "UserMailbox") 
{ 
    $log += "Mailbox info for $User" + "`n" 
    #$log += Get-Mailbox $User | select ServerName, Database, EmailAddresses, PrimarySmtpAddress, WindowsEmailAddress 
    $log += "Email Server: " + $temp.ServerName + "`n" 
    $log += "Email Database: " + $temp.Database + "`n" 
    $log += "Primary SMTP: " + $temp.PrimarySmtpAddress + "`n" 
    $log += "Windows Email Address: "+ $temp.WindowsEmailAddress + "`n" 
    #$log += "`n" 

    foreach ($e in $temp.EmailAddresses) 
    { 
     $log += "`t" + "Email Addresses: " + $e + "`n" 
    } 

} 
else 
{ 
    $log += "########" + "`n" 
    $log += "$User is not a MailboxUser, IE no Exchange Mailbox" + "`n" 
    $log += "########" + "`n" 
} 


$log += "Home drive info for $User" + "`n" 
$temp = Get-QADUser $User| select HomeDirectory,HomeDrive 
$log += "Home Directory: " + $temp.HomeDirectory + "`n" 
$log += "Home Drive Letter: " + $temp.HomeDrive + "`n" 

$tempvar = [string] $temp.HomeDirectory 

if ($tempvar -eq "") 
{ 
    $noHomedirectory += $User + "`n" 
    $countNoHOmeDirectory ++ 
} 
}#end of the main if/else to determine if the AD account exists 

$OutputPath = "C:\SomeFolder\"+"User_Report_"+([datetime]::Now).tostring("yyyyMMddhhmmss")+".txt" 

$log | Out-File -FilePath $OutputPath 

我然後轉儲所有specifc日誌(如$ noHomeDirectory等)中的身體電子郵件,附上上面導出的完整日誌,併發送給我自己。

感謝大家以上的建議,並抱歉在回覆的答案延遲...