2010-03-18 5 views
1

Ceci est un Powershell/AD/question d'échange ....Exportation d'informations à partir du script PS à csv

Je suis en cours d'exécution d'un script contre un certain nombre d'utilisateurs de vérifier certains de leurs attributs mais je vais avoir du mal obtenir ceci à la sortie au CSV. Le script fonctionne bien et fait exactement ce dont j'ai besoin, la sortie à l'écran est bonne, j'ai juste du mal à l'exporter directement dans csv.

L'entrée est un fichier txt séparé par des virgules de noms d'utilisateurs (par exemple, « username1, username2, USERNAME3 »)

Je l'ai expérimenté avec la création d'objets ps personnalisés, ajoutant et exporter ensuite ceux mais sa ne fonctionne pas. ...

Toutes les suggestions reçues avec gratitude ..

Merci

George

$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" 

ÉDITÉ .... Méthodes J'ai essayé de exproting (ne montrant que la boucle for/code d'exportation) Method1

$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" 

Method2

$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 ; 

ÉDITÉ:

Merci à suggestion de Stej J'ai maintenant le code ci-dessous ... Ne fonctionne toujours pas correctement. J'ai ajouté une vérification pour confirmer que l'utilisateur existe également dans AD. Le premier problème est d'obtenir l'adhésion d'un groupe AD d'utilisateur - si je mets un point d'arrêt et regarde la valeur d'une adhésion spécifique d'AD d'utilisateur, la valeur dans varialbe est erreur "Impossible de traiter l'argument parce que la valeur de l'argument" obj "est Remplacez la valeur de l'argument "obj" par une valeur non nulle. " Je n'ai aucune idée de ce qui en est la cause, alors je l'ai ignoré pour l'instant et j'ai commenté ces lignes pour que l'AD puisse se concentrer sur le travail. Avec les lignes commentées, le script fonctionne bien et encore, avec un point d'arrêt en bas, je peux regarder la valeur de $ ExportInfo et ils ont tous l'air bien, c'est à dire qu'ils ont tous été enregistrés dans la variable correctement. Cependant, il ne sera pas sorti. Comme vous pouvez le voir, j'ai mis une commande pour que $ ExportInfo soit écrit à l'écran mais cela ne montre rien. Quand il tente d'exécuter la ligne Export (c.-à-d. "Export-Csv $ ExportInfo -Path $ OutputPath"), il commet des erreurs avec: "Impossible de convertir 'System.Object []' vers le type 'System.Char' requis par le paramètre 'Delimiter . » la méthode spécifiée est pas pris en charge a: ligne: 80 ombles:. 10 + Export-Csv < < < < $ ExportInfo -Path $ OutputPath "

Je chnaged la ligne" $ ExportInfo | Export-Csv - Path $ OutputPath "et il exporte maintenant vers CSV ... Aucune idée pourquoi ??? Deux problèmes cependant ... comme indiqué ci-dessus, les groupes AD ne fonctionnent pas et le champ Email Addresses (qui devrait retourner quelque chose comme {SMTP: [email protected], smtp: [email protected], smtp: [email protected] et SIP: [email protected]}) apparaît juste dans le fichier CSV sous la forme "Microsoft.Exchange.Data.ProxyAddressCollection". Encore une fois, la vérification de $ ExportInfo, les adresses sont là ....

Merci

$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

Qu'est-ce que cela signifie * ne ne fonctionne pas * et * obtenir ennuis *? Y a-t-il un message d'erreur? Le fichier est-il vide? Pouvez-vous partager le code que vous utilisez pour l'exportation csv? – stej

Répondre

1

Y at-il un message d'erreur? Y at-il quelque chose dans $error[0]?Qu'est-ce que cela signifie que c'est ne fonctionne pas?


Modifié: Dans votre deuxième méthode que vous créez objet $UserInfo, mais vous ne l'utilisez pas. Je suppose qu'il était destiné à être ajouté à $ExportInfo. Au lieu de cela, vous ajoutez des chaînes nues à $ExportInfo et c'est pourquoi vous avez donné un contenu si étrange de votre fichier csv.

Comment ça doit être fait correctement:

$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 

Notez que les objets que vous souhaitez exporter au format CSV doivent avoir des propriétés de chaînes de type, entiers, bools etc. objets non composés comme $User ou ceux retournés par Get-Mailbox $User. Les valeurs dans csv doivent être primitives. C'est la raison.

Ceci s'applique à votre premier exemple où vous ajoutez NoteProperty avec la valeur $AdMemberOf. C'est l'objet lui-même qui ne peut pas être exporté vers csv. Vous devez créer des tas de propriétés pour chaque propriété intéressante de $AdMemberOf.

+0

Mon erreur, 2ème méthode maintenant corrigé ... Jolie erreur élémentaire, mais unfortuantely est juste parce que je me tripotait le code tant La sortie de deux ci-dessus est: #TYPE System.String Longueur Il s'agit des cellules A1,2,3 du fichier csv exportées. – George

1

se sont avérés je besoin d'utiliser certaines boucles foreach pour obtenir les informations dont je avais besoin .... Donc:

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 

je vide puis tous les journaux spécifques (par exemple $ noHomeDirectory etc.) dans le corps d'un email, joignez le journal complet exporté ci-dessus et envoyez-le moi-même.

Merci pour les suggestions de chacun ci-dessus et désolé pour le retard dans la réponse de retour affichage ...