none
AD Attribute auslesen RRS feed

  • Frage

  • Hallo,

    ich möchte aus dem AD alle Benutzer mit allen Attributen auslesen, dabei sollen auch die Attribute mit ausgelesen werden, die bei der Schemaerweiterung von Exchange erstellt werden (Postfachattribute).

    Um die Attribute des Postfächer der Benutzer auszulesen habe ich folgenden Befehl genommen:

    Get-Mailbox -ResultSize Unlimited | Where { $_.Name -like "*"} | Select * | Export-Csv "C:\Export_M
    ailboxUser.csv" -encoding "UTF8"

    Zum auslesen der AD Attribute folgenden Befehl:

    Get-User -Filter * -Properties * | Export-Csv "C:\Export_User.csv" -encoding "UTF8"

    Hier eine Liste aller Attribute.

    http://technet.microsoft.com/de-de/library/bb738155(v=exchg.150).aspx

    In der Liste ist mir aufgefallen, das es Attribute gibt (zb distinguishedName), die von beiden CmdLets abgefragt werden.

    Da ist mir die Idee gekommen, die Ausgaben zu vergleichen und dann alle Attribute des Benutzers zusammen in eine CSV zu exportieren. Leider fehlt mit aber hierzu der Ansatz.

    Würde in diesem Fall eine Foreach-Schleife mit den Cmdlets zusammen funktionieren?

    Meine Idee:

    Ein Array mit allen distinguishedName füllen und dann mittels einer Schleife über das Array iterieren und für jeden Benutzer einzeln die beiden Cmdlets ausführen. Aber wie kann ich dann beide Ausgaben in die CSV schreiben, ohne einen Zeilenumbruch?


    Freitag, 5. September 2014 12:00

Antworten

  • Du weist schon das solche Stern * oder all Attribute anfragen die Server sehr belasten und das man das vermeiden sollte!?

    eine ForEach() {} Schleife ist für CSV Export schlecht geeignet besser ist da das ForEach-Object {} cmdlet zu benutzen.

    PowerShell erzeugt und verarbeitet Objekte.
    Der Trick hier ist alle benötigten Daten in einem Objekt "zusammen zu bauen".

    Ungetestet!

    Get-Mailbox -ResultSize Unlimited | Where-Object { $_.Name -like '*'} | Select-Object * | ForEach-Object {
    
      # Das Aktuell verarbeitete Objekt befindet sich in der Automatisch generierten Variable mit dem Namen $_
      $MailboxUser = $_
    
      $ADUser = Get-ADUser -Identity $MailboxUser.distinguishedName -Properties *
    
      # Daten von $ADUser an das Objekt von $MailboxUser 'ankleben'
       ForEach($Property in $ADUser.psobject.properties) {
         
           Add-Member -InputObject $MailboxUser -MemberType NoteProperty -Name $Property.Name -Value $Property.Value
    
       }
    
       # $MailboxUser in die Pipeline ausgeben
       $MailboxUser
    
    } | Export-Csv 'C:\Export_MailboxUser.csv' -encoding 'UTF8' # CSV erzeugen


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Freitag, 5. September 2014 13:10

Alle Antworten

  • Du weist schon das solche Stern * oder all Attribute anfragen die Server sehr belasten und das man das vermeiden sollte!?

    eine ForEach() {} Schleife ist für CSV Export schlecht geeignet besser ist da das ForEach-Object {} cmdlet zu benutzen.

    PowerShell erzeugt und verarbeitet Objekte.
    Der Trick hier ist alle benötigten Daten in einem Objekt "zusammen zu bauen".

    Ungetestet!

    Get-Mailbox -ResultSize Unlimited | Where-Object { $_.Name -like '*'} | Select-Object * | ForEach-Object {
    
      # Das Aktuell verarbeitete Objekt befindet sich in der Automatisch generierten Variable mit dem Namen $_
      $MailboxUser = $_
    
      $ADUser = Get-ADUser -Identity $MailboxUser.distinguishedName -Properties *
    
      # Daten von $ADUser an das Objekt von $MailboxUser 'ankleben'
       ForEach($Property in $ADUser.psobject.properties) {
         
           Add-Member -InputObject $MailboxUser -MemberType NoteProperty -Name $Property.Name -Value $Property.Value
    
       }
    
       # $MailboxUser in die Pipeline ausgeben
       $MailboxUser
    
    } | Export-Csv 'C:\Export_MailboxUser.csv' -encoding 'UTF8' # CSV erzeugen


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Freitag, 5. September 2014 13:10
  • Hallo, vielen danke für die schnelle Antwort und den Denkanstoß mit dem Skript.

    Leider gibt es das Problem, dass die Cmdlets auch gleiche Attribute abfragen und beim zusammenfügen dabei folgende Fehlermeldungen entstehen:

    Add-Member : Es kann kein Element mit dem Namen "DisplayName" hinzugefügt werden, da bereits ein Element mit diesem Nam
    en vorhanden ist. Wenn Sie das Element trotzdem überschreiben möchten, verwenden Sie dafür den Force-Parameter.
    Bei C:\export_AllUserAttribut.ps1:11 Zeichen:18
    +        Add-Member <<<<  -InputObject $MailboxUser -MemberType NoteProperty -Name $Property.Name -Value $Property.Valu
    e
        + CategoryInfo          : InvalidOperation: (@{Database=H-N;...; Description=}:PSObject) [Add-Member], InvalidOper
       ationException
        + FullyQualifiedErrorId : MemberAlreadyExists,Microsoft.PowerShell.Commands.AddMemberCommand

    Wie in der Fehlermeldung beschrieben, habe ich das Skript mit dem Parameter -Force ergänzt:

    Get-Mailbox -ResultSize Unlimited | Where-Object { $_.Name -like '*'} | Select-Object * | ForEach-Object {
    
      # Das Aktuell verarbeitete Objekt befindet sich in der Automatisch generierten Variable mit dem Namen $_
      $MailboxUser = $_
    
      $ADUser = Get-ADUser -Identity $MailboxUser.distinguishedName -Properties *
    
      # Daten von $ADUser an das Objekt von $MailboxUser 'ankleben'
       ForEach($Property in $ADUser.psobject.properties) {
         
           Add-Member -InputObject $MailboxUser -MemberType NoteProperty -Name $Property.Name -Value $Property.Value -Force
    
       }
    
       # $MailboxUser in die Pipeline ausgeben
       $MailboxUser
    
    } | Export-Csv 'C:\Export_MailboxUser.csv' -encoding 'UTF8' # CSV erzeugen

    Im weiteren Schritt wird die Csv bearbeitet und geändert. Als nächstes müssen die geänderten Attribute zurückgeschrieben werden. Hierzu müssen die Attribute wieder den Cmdlets zugeordnet werden.

    Andy

    Montag, 8. September 2014 11:42
  • In diesem Fall kannst du den Fehler, mit den doppelten Einträgen, einfach mit  -ErrorAction SilentlyContinue unterdrücken.

    Get-Mailbox -ResultSize Unlimited | Where-Object { $_.Name -like '*'} | Select-Object * | ForEach-Object {
    
      # Das Aktuell verarbeitete Objekt befindet sich in der Automatisch generierten Variable mit dem Namen $_
      $MailboxUser = $_
    
      $ADUser = Get-ADUser -Identity $MailboxUser.distinguishedName -Properties *
    
      # Daten von $ADUser an das Objekt von $MailboxUser 'ankleben'
       ForEach($Property in $ADUser.psobject.properties) {
         
           Add-Member -InputObject $MailboxUser -MemberType NoteProperty -Name $Property.Name -Value $Property.Value -Force -ErrorAction SilentlyContinue
    
       }
    
       # $MailboxUser in die Pipeline ausgeben
       $MailboxUser
    
    } | Export-Csv 'C:\Export_MailboxUser.csv' -encoding 'UTF8' # CSV erzeugen


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+


    Montag, 8. September 2014 12:30
  • Ja, danke.

    Das wäre eine weitere Alternative.

    Montag, 8. September 2014 12:32
  • Welche anderen Alternativen hast du denn?
    Ist dein Problem damit gelöst?

    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Montag, 8. September 2014 14:26