none
Mit PowerShell Gruppenmitglieder eines E-Mail-Funktionspostfachs ermitteln und vollberechtigen RRS feed

  • Frage

  • Servus miteinander,

    wir haben in der neuen Exchange2016 Umgebung das Problem, dass wir der Outlook-Umgebung von AD-Nutzern nicht mehr wie bisher Funktionspostfächer über eine Gruppenzugehörigkeit dieser (Outlook-Umgebung) hinzufügen können (die Gruppe mit den enthaltenen AD-Objekten war bisher auf ein Funktionspostfach vollberechtigt (FullAccess + SendAs)), sodern es ist - zumindest momentan so - notwendig, die AD-Nutzerobjekte direkt auf ein Funktionspostfach zu berechtigen. Damit der Verwaltungsaufwand geringer bleibt und zur Kontrolle pflegen wir weiterhin Berechtigungsgruppen. Zudem hat es den Vorteil, dass beim direkten Berechtigen auf ein Funktionspostfach eines AD-Nutzers dieses Postfach in seiner Outlook-Umgebung automatisch eingebunden wird. Vor allem Letzteres ist momentan das größte Problem, da wir bei der Umstellung < 500 Kolleginnen und Kollegen das Postfach nicht jeweils einzeln mit Primatenarbeit hinzufügen können.

    Zurzeit bastle ich an einem PowerShell-Skript, da Exchange gut mit dieser Skriptsprache zusammenarbeitet.

    Z. B. habe ich es ohne Weiteres geschafft, Gruppenzugehörigenkeiten zu einer gegebenen Berechtigungsgruppe (Mail_*) auszulesen oder die Mitglieder einer Gruppe, die auf ein Postfach berechtigt sind - siehe B).

    Im Großen benötige ich allerdings etwas Hilfe. Ich habe mir die Funktion des Skripts A) wie folgt gedacht:

    1) Zuerst soll das Skript alle AD-Objekte mit dem Namen Postfach_ herauslesen. Das sind unsere AD-Objekte der Funktionspostfächer.
    2) Aus den AD-Objekten soll das Property Mail ausgelesen werden.
    3) Mit diesen Eigenschaften ("Properties"), die die E-Mail-Adresse enthalten, kann ich nun gegen den Exchange-Server ermitteln und die Gruppenmitglieder aus Gruppen, die auf das Postfach berechtigt sind, auslesen.
    4) Im letzten Schritt möchte ich die jeweils ermittelten Mitglieder direkt auf das Funktionspostfach berechtigen mit "SendAs" und "FullAccess".

    Danke vorab für eure Hilfe!

    # A)
    
    Import-Module ActiveDirectory
    $ErrorActionPreference = „Silentlycontinue“
    clear
    
    
    #---------------------------------
    # 1) E-Mail als Property herauslesen aller AD-Objekte mit Namen Postfach_* 
    
    # Problem-Anfang
    $postfach = Get-ADUser -Filter -Name -like "Postfach_" -Properties mail | Where{$_.mail -like "@ATV.Nordschleswig.den" }
    # Problem-Ende
    
    # --------------------------------------
    # 2) Mitglieder direkt vollberechtigen auf das Postfach
    
    write-host „“
    write-host "D a s  S k r i p t  e x t r a h i e r t  d i e  G r u p p e n m i t g l i e d e r  e i n e s  F u n k t i o n s p o s t f a c h s  u n d  b e r e c h t i g t  d i e  g e f u n d e n e n  M i t g l i e d e r  d i r e k t  a u f  d a s  e r m i t t e l t e  P o s t f a c h ."
    write-host „“
    
    $zugriffssteuerungsliste = Get-MailboxPermission $postfach | where {$_.AccessRights -eq „FullAccess“}
    $nutzer =@()
    
    foreach ($eintrag in $zugriffssteuerungsliste)
    {
    [string]$gruppe= $eintrag.User
    $gruppe = $gruppe.split(„\“)[1]
    $mitglieder = Get-ADGroupMember „$gruppe“ -recursive
    
    foreach ($mitglied in $mitglieder)
    {
    $benutzerkonto = $mitglied.SamAccountname
    # Ab hier gibt's wieder Probleme
    Set-MailboxFolderPermission $postfach -user $benutzerkonto -accessrights FullAccess -accessrights SendAs 
    # Problem-Ende
    }
    }
    
    write-host  „“
    write-host "S k r i p t  a b g e a r b e i t e t ." 
    write-host „“

    __________

    # Auslesen von Gruppen anhand der E-Mail-Adresse - funktioniert gut :)
    # B)
    
    $postfach = read-host „Postfach angeben (z. B. Cert@ATV.Nordschleswig.den)“
    $zugriffssteuerungsliste = Get-MailboxPermission $postfach | where {$_.AccessRights -eq „FullAccess“} 
    $nutzer =@()
    
    foreach ($eintrag in $zugriffssteuerungsliste)
    {
    [string]$gruppe= $eintrag.User
    $gruppe = $gruppe.split(„\“)[1]
    $mitglieder = Get-ADGroupMember „$gruppe“ -recursive
    foreach ($mitglied in $mitglieder)
    {
    $name = $mitglied.name
    $sam = $mitglied.SamAccountname
    $dn = $mitglied.distinguishedName
    $nutzer += new-object PSObject -property @{Name=“$name“;sAMAccountName=“$sam“;distinguishedName=“$dn“}
    }
    }
    
    $nutzer | sort-object Name -unique | ft -autosize > ./Gruppenmitglieder.txt
    write-host  „“
    write-host "D a t e i  e r z e u g t . S k r i p t  a b g e a r b e i t e t ." 




    Mittwoch, 17. April 2019 07:21

Alle Antworten

  • Moin,

    auf die Eigenarten Deiner Skripte wie das DOS-Umleiten einer Tabelle in Datei werde ich jetzt nicht eingehen, das wirst Du  alles schon noch lernen. Aber. Du liest richtigerweise die ADPermissions aus, zum Setzen verwendest Du aber plötzlich Set-MailboxFolderPermission statt Add-ADPermission. Das sind zwei Paar Schuhe und zueinander nicht kompatibel. Und Du kannst auch nicht ein und denselben Parameter in einem Aufruf zweimal verwenden, sondern musst ihm zwei Werte übergeben.


    Evgenij Smirnov

    http://evgenij.smirnov.de

    Donnerstag, 18. April 2019 05:13
  • Hallo,

    wie Evgenij schon geschrieben hat brauchst du dazu 2 verschiedene Aufrufe, wir machen das mit diesen beiden:

    #   "Senden als" Berechtigung
    Add-ADPermission -Identity $CName -User $UserID -AccessRights 'ExtendedRight' -ExtendedRights 'send as'
    
    #   Zugriffsberechtigung "FullAccess"
    Add-MailboxPermission -Identity $CName -User $UserID -AccessRights 'FullAccess' -InheritanceType 'All'

    Grüße
    Klaus

    Donnerstag, 18. April 2019 06:05
  • Vielen Dank schon mal für eure Antworten! Ich bin eigentlich fast zufrieden, allerdings wirft PowerShell noch Exceptions. Vllt. sehe ich den Wald vor lauter Bäumen nicht.

    $postfach = read-host „Postfach angeben (z. B. Foo@foo.de)“
    $zugriffssteuerungsliste = Get-MailboxPermission $postfach | where {$_.AccessRights -eq „FullAccess“}
    $nutzer =@()
    
    foreach ($eintrag in $zugriffssteuerungsliste)
    {
    [string]$gruppe= $eintrag.User
    $gruppe = $gruppe.split(„\“)[1]
    $mitglieder = Get-ADGroupMember „$gruppe“ -recursive
    foreach ($mitglied in $mitglieder)
    {
    
    $name = $mitglied.name
    $benutzerkonto = $mitglied.SamAccountname
    $dn = $mitglied.distinguishedName
    $nutzer += new-object PSObject -property @{Name=“$name“;sAMAccountName=“$benutzerkonto“;distinguishedName=“$dn“}
    
    # Berechtigung "Senden als" 
    Add-ADPermission -Identity $dn -User $benutzerkonto -AccessRights 'ExtendedRight' -ExtendedRights 'send as'
    
    # Berechtigung "FullAccess"
    Add-MailboxPermission -Identity $dn -User $benutzerkonto -AccessRights 'FullAccess' -InheritanceType 'All'
    
    }
    }
    
    $nutzer | sort-object Name -unique | ft -autosize
    write-host  „“
    read-host "S k r i p t  a b g e a r b e i t e t . B i t t e  E i n g a b e t a s t e  d r ü c k e n" 
    write-host „“


    • Bearbeitet Heuristiker Donnerstag, 18. April 2019 07:37
    Donnerstag, 18. April 2019 07:36
  • Helfen würde jetzt aber wo PowerShell welche Exception schmeißt :-)
    Donnerstag, 18. April 2019 09:44
  • Helfen würde jetzt aber wo PowerShell welche Exception schmeißt :-)

    :-)

    Bei der Anforderung von OU=Test,OU=HV-NY,OU=Benutzer,OU=Standorte W7,OU=***,DC=***,DC=bayern,DC=de von **** wurde ein Verweis auf *** empfangen. Sie haben den falschen Server für diesen Vorgang angegeben. Filter = (&(name=CN=Anonymous\5c, Anno \28B***\29,OU=***,OU=***,OU=Benutzer,OU=Standorte W7,OU=***,DC=***,DC=bayern,DC=de)(!(msExchCU=*))).
        + CategoryInfo          : NotSpecified: (:) [Add-ADPermission], ADReferralException
        + FullyQualifiedErrorId : [Server=***,TimeStamp=18.04.2019 11:04:28] [FailureCategory=Cmdlet-ADReferralException] 7964CFCF,Microsoft.Exchange.Management.RecipientTasks.AddADPermission

    Der angeforderte Suchstamm '****.de/BSV/Standorte W7/Benutzer/*****-NY/***' liegt außerhalb des Bereichs für diesen Vorgang. Außerhalb von Bereich '***' können keine Suchvorgänge ausgeführt werden.
        + CategoryInfo          : NotSpecified: (:) [Add-MailboxPermission], ADOperationException
        + FullyQualifiedErrorId : [Server=***,TimeStamp=18.04.2019 11:04:28] [FailureCategory=Cmdlet-ADOperationException] D4EF42EE,Microsoft.Exchange.Management.RecipientTasks.AddMailboxPermission

    ...

    Donnerstag, 18. April 2019 11:09
  • Du nimmst aber schon die PowerShell von Exchange? (gelbe Schrift..)

    Oder innerhalb eines Scriptes?

    Vielleicht hilft dir dieser Beitrag bei mir weiter:
    https://www.msxforum.de/community/index.php/Thread/16489-Verteilergruppe-f%C3%BCr-verschachtelte-Gruppen/?postID=92772#post92772

    ;)


    Gruß Norbert

    Donnerstag, 18. April 2019 11:48
    Moderator
  • Hallo,

    vermutlich brauchst du dann noch dieses Kommando, damit im gesamten AD gesucht wird:

    Set-ADServerSettings -ViewEntireForest $true

    Donnerstag, 18. April 2019 11:50
  • Du nimmst aber schon die PowerShell von Exchange? (gelbe Schrift..)

    Oder innerhalb eines Scriptes?

    Vielleicht hilft dir dieser Beitrag bei mir weiter:
    https://www.msxforum.de/community/index.php/Thread/16489-Verteilergruppe-f%C3%BCr-verschachtelte-Gruppen/?postID=92772#post92772

    ;)


    Gruß Norbert

    Hallo Norbert,

    genau! Ich führe das Skript direkt in der Exchange-PowerShell aus. Der Beitrag hat mir jedoch nicht wie gehofft weitergeholfen.

    KSV43, leider nein. :-) Deshalb führe ich es auch auf der Exchange-Ebene aus.

    VG



    • Bearbeitet Heuristiker Donnerstag, 18. April 2019 13:41
    Donnerstag, 18. April 2019 13:27
  • OK, schade - nach meinem Oster-Kurzurlaub kann ich mich damit beschäftigen.

    Evgenij hat bestimmt die eine oder andere Idee.. ;)


    Gruß Norbert


    Donnerstag, 18. April 2019 21:58
    Moderator
  • OK, schade - nach meinem Oster-Kurzurlaub kann ich mich damit beschäftigen.

    Evgenij hat bestimmt die eine oder andere Idee.. ;)


    Gruß Norbert


    Moin,

    meine erste Idee wäre, den User nicht als nackten SAMAccountName zu übergeben,sondern als was definitives wie UPN oder am besten DN.

    Ich hatte sowas vor zwei Jahren beim Kunden auch machen müssen. Werde schauen, ob ich das Skript noch find. Aber da war es Multi-Forest, so dass wir bestimmt den DN genommen haben, damit er nicht suchen muss.


    Evgenij Smirnov

    http://evgenij.smirnov.de

    Freitag, 19. April 2019 05:16
  • Evgenij Smirnov

    Hallo Evgenij,

    das Herzstück meines Skripts sieht jetzt wie folgt aus:

    $postfach = read-host „Postfach angeben (z. B. Cert@Firma.de)“
    $zugriffssteuerungsliste = Get-MailboxPermission $postfach | where {$_.AccessRights -eq „FullAccess“}
    $nutzer =@()
    
    foreach ($eintrag in $zugriffssteuerungsliste)
    {
    [string]$gruppe= $eintrag.User
    $gruppe = $gruppe.split(„\“)[1]
    $mitglieder = Get-ADGroupMember „$gruppe“ -recursive
    foreach ($mitglied in $mitglieder)
    {
    
    $name = $mitglied.name
    $benutzerkonto = $mitglied.SamAccountname
    $dn = $mitglied.distinguishedName
    $nutzer += new-object PSObject -property @{Name=“$name“;sAMAccountName=“$benutzerkonto“;distinguishedName=“$dn“}
    
    # Berechtigung "Senden als" 
    Add-ADPermission -Identity $dn -User $benutzerkonto -AccessRights 'ExtendedRight' -ExtendedRights 'send as'
    
    # Berechtigung "FullAccess"
    Add-MailboxPermission -Identity $dn -User $benutzerkonto -AccessRights 'FullAccess' -InheritanceType 'All'
    
    }
    }

    Ich glaube, das Einzige, was jetzt noch fehlt, liegt an Add-MailboxPermissions. Sehe ich das richtig, dass Powershell an dieser Stelle gar keine Reverenz hat auf das Postfach-Objekt, z. B. 

    Add-MailboxPermission TO CERT@FIRMA.DE -Identity $dn -User $benutzerkonto -AccessRights 'FullAccess' -InheritanceType 'All'

    D. h. PowerShell weiß nicht, wohin mit den Berechtigungen? Wie sollte ich das nun am besten umsetzen?


    Donnerstag, 9. Mai 2019 09:13