none
Auslesen der Berechtigungen von freigegebenen Postfächern (Exchange 2013) RRS feed

  • Frage

  • Hallo,

    ich möchte aus allen freigegeben Postfächern die Berechtigungen auslesen und später in eine Datei schreiben.

    Die Ausgabe (erstmal am Bildschirm) sollte so aussehen:

    Postfachame User Berechtigung

    Also z.b.
    info@xy.de Hubert_K FullAccess

    Was ich mit meinem Skript erhalte ist allerdings :

    info@xy.de @{AccessRights=Microsoft.Exchange.Management.RecipientTasks.MailboxRights[]; User=Domain\Hubert_K}

    Mit einem -ExpandProperty bei dem Select Object in der Zeile

    $a=@(Get-MailBoxPermission $($_) | select AccessRights, User)

    funktioniert es nur, wenn ich nur einen Parameter (z.B. User) angebe.

    Eigentlich sollte doch $a als Array und somit jeder Parameter einzeln abfragbar sein? Dies funktioniet jedoch leider nicht.

    Vielen Dank schon mal für jede Hilfe.

    Mein bisheriges Skript:

    $Mb_Name=Get-Mailbox | where {$_.RecipientTypeDetails -eq "SharedMailBox"} | Select -ExpandProperty Name
      
      #Durchlaufen aller gefundenen Postfächer
      $Mb_Name | % {
      
       
         #Berechtigungen ermitteln
         $a=@(Get-MailBoxPermission $($_) | select AccessRights, User)
              
         $a | % {
           if ($_-ne $null)
           {
             $Ges=$Akt_Name + "`t$($_[0])"
        
            Write-Output  $Ges
          }
         }
         $a=$null
        }

    Freitag, 10. Oktober 2014 09:13

Antworten

  • Ach ja!

    Wenn die Eckigen Klammer [] in PowerShell direkt hinter einer Typ-Bezeichnung stehen z.B. String[] , dann heißt das, es ist ein LISTE (ein Array) das einzelne Strings also Texte enthält.

    Int[] z.B. ist ein Array mit Zahlen.

    In einem Array können 0 oder mehrere Werte stehen.

    in unserem Fall ist Microsoft.Exchange.Managemet.RecipientTasks.MailboxRights[] eine Liste von Rechten und diese Liste muss vereinzelt werden.

    der Operator -join kann aus einer Liste die einzelnen Werte zu einem Text zusammenbauen.

    Dabei kann man ein Trennzeichen angeben. Dafür nutze ich das Komma.

    #Durchlaufen aller gefundenen Postfächer
    Get-Mailbox | Where-Object {$_.RecipientTypeDetails -eq "SharedMailBox"} |
      Select-Object -ExpandProperty Name | ForEach-Object {
      
      # Das Objekt das Aktuell in der Pipeline von ForEach-Object verarbeitet wird,
      # liegt in der Automatisch generierten Variable mit dem Namen $_
      # Das Objekt wird in die Variable $MBName übertragen (gerettet),
      # weil die $_ Variable in der nächsten Pipline wieder 'überschrieben' wird
      $MBName = $_
      
      #Berechtigungen ermitteln
      Get-MailBoxPermission $MBName | Select-Object AccessRights, User | ForEach-Object {
        
          # Das Objekt das Aktuell in der Pipeline von ForEach-Object verarbeitet wird,
          # liegt in der Automatisch generierten (neuen) Variable mit dem Namen $_
          # Objekte die $Null sind gibt es hier nicht!!!
    
          
          # PowerShell sollte immer Objekte Verarbeiten und auch Objekte als Ergebnis liefern
          # Wir bauen ein komplett neues Objekt mit den gesammelten Daten
          # dies geht auch eleganter, aber das ist nun einfacher zu verstehen
    
          # neues leeres Objekt erstellen
          $Result = New-Object -TypeName PsObject
          
          # Das Property MBName wird an das Objekt angehängt
          Add-Member -InputObject $Result -Name 'MBName' -Value $MBName
    
          # Das Property User wird an das Objekt angehängt
          Add-Member -InputObject $Result -Name 'User' -Value $_.User
    
          # Das Property AccessRights wird an das Objekt angehängt
          Add-Member -InputObject $Result -Name 'AccessRights' -Value ($_.AccessRights -join ',')
    
          # Das neu erzeugte Objekt wird als Ergebnis in die Pipeline gelegt
          Write-Output  $Result
      }
    }


    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+

    • Als Antwort markiert RocknRollMan Montag, 13. Oktober 2014 09:53
    Montag, 13. Oktober 2014 06:26

Alle Antworten

  • Hallo RocknRoller!

    Ich habe keine Exchange Erfahrung und kann den Code nicht bei mir testen.
    Also helfe ich dir im Blindflug.

    Dir fehlen sehr viel Grundlagen im Umgang mit Objekten und dem ForEach-Object Cmdlet.

    Der Code müsste ungefähr so gehen:

    #Durchlaufen aller gefundenen Postfächer
    Get-Mailbox | Where-Object {$_.RecipientTypeDetails -eq "SharedMailBox"} |
      Select-Object -ExpandProperty Name | ForEach-Object {
      
      # Das Objekt das Aktuell in der Pipeline von ForEach-Object verarbeitet wird,
      # liegt in der Automatisch generierten Variable mit dem Namen $_
      # Das Objekt wird in die Variable $MBName übertragen (gerettet),
      # weil die $_ Variable in der nächsten Pipline wieder 'überschrieben' wird
      $MBName = $_
      
      #Berechtigungen ermitteln
      Get-MailBoxPermission $MBName | Select-Object AccessRights, User | ForEach-Object {
        
          # Das Objekt das Aktuell in der Pipeline von ForEach-Object verarbeitet wird,
          # liegt in der Automatisch generierten (neuen) Variable mit dem Namen $_
          # Objekte die $Null sind gibt es hier nicht!!!
    
          
          # PowerShell sollte immer Objekte Verarbeiten und auch Objekte als Ergebnis liefern
          # Wir bauen ein komplett neues Objekt mit den gesammelten Daten
          # dies geht auch eleganter, aber das ist nun einfacher zu verstehen
    
          # neues leeres Objekt erstellen
          $Result = New-Object -TypeName PsObject
          
          # Das Property MBName wird an das Objekt angehängt
          Add-Member -InputObject $Result -Name 'MBName' -Value $MBName
    
          # Das Property User wird an das Objekt angehängt
          Add-Member -InputObject $Result -Name 'User' -Value $_.User
    
          # Das Property AccessRights wird an das Objekt angehängt
          Add-Member -InputObject $Result -Name 'AccessRights' -Value $_.AccessRights.TosString()
    
          # Das neu erzeugte Objekt wird als Ergebnis in die Pipeline gelegt
          Write-Output  $Result
      }
    }

    Es gibt in der PowerShell 2 verschiedene ForEach Konstrukte!

    lies dir dazu auch mal meinen Artikel dazu durch:

    http://www.admin-source.de/BlogDeu/905/powershell-foreach-und-foreach-object

    Lies bitte dazu :

    Get-Help about_Foreach
    und
    Get-Help ForEach-Object



    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, 10. Oktober 2014 11:28
  • Hallo Peter,

    erstmal vielen Dank für Deine prompte Hilfe.

    Du hast recht, ich stehe noch ziemlich am Anfang mit Powershell.

    In dem von Dir umgeschriebenen Skript habe ich bei Add-Member noch den Parameter -Membertype einfügen müssen.

    Add-Member -Membertype NoteProperty -InputObject $Result -Name 'MBName' -Value $MBName


    Damit schaut das Ergebnis schon recht brauchbar aus. Lediglich bei Accessrights wird mir nicht der Wert sondern

    AccessRights : Microsoft.Exchange.Managemet.RecipientTasks.MailboxRights[]

    zurückgegeben.

    Dass muss ich mir noch nächste Woche ansehen.


    Freitag, 10. Oktober 2014 14:02
  • Ach ja!

    Wenn die Eckigen Klammer [] in PowerShell direkt hinter einer Typ-Bezeichnung stehen z.B. String[] , dann heißt das, es ist ein LISTE (ein Array) das einzelne Strings also Texte enthält.

    Int[] z.B. ist ein Array mit Zahlen.

    In einem Array können 0 oder mehrere Werte stehen.

    in unserem Fall ist Microsoft.Exchange.Managemet.RecipientTasks.MailboxRights[] eine Liste von Rechten und diese Liste muss vereinzelt werden.

    der Operator -join kann aus einer Liste die einzelnen Werte zu einem Text zusammenbauen.

    Dabei kann man ein Trennzeichen angeben. Dafür nutze ich das Komma.

    #Durchlaufen aller gefundenen Postfächer
    Get-Mailbox | Where-Object {$_.RecipientTypeDetails -eq "SharedMailBox"} |
      Select-Object -ExpandProperty Name | ForEach-Object {
      
      # Das Objekt das Aktuell in der Pipeline von ForEach-Object verarbeitet wird,
      # liegt in der Automatisch generierten Variable mit dem Namen $_
      # Das Objekt wird in die Variable $MBName übertragen (gerettet),
      # weil die $_ Variable in der nächsten Pipline wieder 'überschrieben' wird
      $MBName = $_
      
      #Berechtigungen ermitteln
      Get-MailBoxPermission $MBName | Select-Object AccessRights, User | ForEach-Object {
        
          # Das Objekt das Aktuell in der Pipeline von ForEach-Object verarbeitet wird,
          # liegt in der Automatisch generierten (neuen) Variable mit dem Namen $_
          # Objekte die $Null sind gibt es hier nicht!!!
    
          
          # PowerShell sollte immer Objekte Verarbeiten und auch Objekte als Ergebnis liefern
          # Wir bauen ein komplett neues Objekt mit den gesammelten Daten
          # dies geht auch eleganter, aber das ist nun einfacher zu verstehen
    
          # neues leeres Objekt erstellen
          $Result = New-Object -TypeName PsObject
          
          # Das Property MBName wird an das Objekt angehängt
          Add-Member -InputObject $Result -Name 'MBName' -Value $MBName
    
          # Das Property User wird an das Objekt angehängt
          Add-Member -InputObject $Result -Name 'User' -Value $_.User
    
          # Das Property AccessRights wird an das Objekt angehängt
          Add-Member -InputObject $Result -Name 'AccessRights' -Value ($_.AccessRights -join ',')
    
          # Das neu erzeugte Objekt wird als Ergebnis in die Pipeline gelegt
          Write-Output  $Result
      }
    }


    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+

    • Als Antwort markiert RocknRollMan Montag, 13. Oktober 2014 09:53
    Montag, 13. Oktober 2014 06:26
  • Hallo Peter,

    vielen Dank für Deine Hilfe.

    So funktioniert alles und ich habe einiges dazu gelernt.

    Montag, 13. Oktober 2014 09:57