none
PowerShell - Aus dem AD die Gruppenmitgliedschaft eines Nutzers lesen RRS feed

  • Frage

  • Hallo beisammen,

    da mir die Praxis fehlt und mich Stück für Stück der Thematik annähere, wollte ich auf diesem Weg ein paar Meinungen abholen. Zum Problem:

    Aus einem Gruppenrichtlinien- und Software-Verteilungsprogramm (DSM) soll ein PS-Skript aufgerufen werden. Es soll der Parameter %USERNAME% mitgegeben werden. Das Skript aufzurufen funktioniert simpel per EXECUTE(Pfad und Dateiname). Auch wird der Nutzername mitgegeben als Parameter.

    Das PowerShell-Skript soll nun mit dem Parameter (= Nutzername) die Gruppenmitgliedschaften aus dem ActiveDirectory eruieren; speziell die Mitgliedschaften, die mit Mail_ beginnen. Im Anschluss soll nun dem User seine Mail-Postfächer zugeordnet werden, in etwa:

    Set('Variable0','Hilfe@Fischerverein-Ratibor.de')
    Execute('%_tmpPF%\AddPF.bat %Variable0% %_tmpPF%')

    Bisher haben wir uns beholfen, dass wir mit der Ermittlung von %USERNAME% die Gruppenmitgliedschaften einzeln abprüfen mit langen If-Abprüfungen. Dies ist sehr fehleranfällig und funktioniert nicht zuverlässig; weswegen wir nur den User-Name übergeben möchten per Execute des PW-Skripts. Danke erst mal!

    Heuristiker

    Freitag, 10. März 2017 12:51

Antworten

  • Ich würde in so einem Fall dann doch auf den Komfort der AD-Cmdlets verzichten und den ADSI-Provider bemühen.
    #https://gallery.technet.microsoft.com/scriptcenter/f7b246a4-95a2-4408-b1a1-73b53003883c
    #https://social.technet.microsoft.com/wiki/contents/articles/4231.working-with-active-directory-using-powershell-adsi-adapter.aspx

    Function Get-DistinguishedName ($strUserName)
    {  
       $searcher = New-Object System.DirectoryServices.DirectorySearcher([ADSI]'')
       $searcher.Filter = "(&(objectClass=User)(samAccountName=$strUserName))"
       $result = $searcher.FindOne()
     
       Return $result.GetDirectoryEntry().DistinguishedName
    }

    $userdn = Get-DistinguishedName ($env:USERNAME)

    $user = [ADSI]"LDAP://$userdn"
    $groups = $User.MemberOf | ForEach-Object {[ADSI]"LDAP://$_"} | Where {$_.cn -like "MAIL_*"}

    foreach ($group in $groups)
    {
        #Hier kann nun beliebiger Code folgen der etwas mit den Gruppenmitgliedschaften anstellen soll
        Write-Host $group.cn
    }

    Besser? :D ;)


    Freundliche Grüße

    Sandro
    MCSA: Windows Server 2012
    Fachinformatiker Fachrichtung Systemintegration (IHK, 07/2013)






    Dienstag, 14. März 2017 07:17

Alle Antworten

  • In Deinem Post fehlt quasi die Frage, bzw. wozu sollen wir uns denn äußern?

    Wenn Du schon Code hast, kannst Du den hier posten und eine möglichst konkrete Frage dazu stellen.  ;-)


    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''

    Freitag, 10. März 2017 13:02
  • Ich verstehe. ;) Das ist auch etwas schwer zu verstehen, wie ich es schrieb.

    Grundsätzlich will ich mit der PowerShell die die MAIL_*-Gruppenmitgliedschaften eines AD-Users abfragen und seine Mitgliedschaften jeweils in eine eigene Variable oder in ein Array schreiben, um es im Anschluss an ein Programm zur Weiterverarbeitung durchzureichen. 

    $strUserName = "Gust.Bayrhammer"
    $strUser = get-qaduser -SamAccountName $strUserName
    $Mitgliedschaft = $strUser.memberof

    Dabei sind MAIL_* unsere Mail-Postfächer (verschiedene), die ich bei ihm einrichten möchte.

    Wie setze ich aber diese Postfächer aus dem AD heraus?

    Freitag, 10. März 2017 13:39
  • Wow ich hätte ernsthaft gedacht es geht um den Aufruf des Scripts mit parametern.
     

    > Das ist auch etwas schwer zu verstehen, wie ich es schrieb.


    Ja und ist es immer noch. :-) Was bedeutet "Wie setze ich aber diese Postfächer aus dem AD heraus"?
    Meinst du aus dem Script heraus?


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Code Manager v5: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Freitag, 10. März 2017 13:46
    Moderator
  • Heuristiker,

    ich nehme an du möchtest einem neuen User div. Postfächer im Outlook zuordnen bzw. einbinden?

    Wenn du den neuen User bei den shared Postfächern "Full Access" gibst wird dieses automatisch bei ihm eingebunden.

    get-mailboxpermission


    Chris


    Freitag, 10. März 2017 19:31
  • Im Grunde möchte ich ein Skript schreiben, welches den Benutzernamen des Users übergeben bekommt, welches anschließend das AD abfragt, in welchen MAIL_-Gruppen der User eingetragen ist und diese MAIL_-Postfächer dann zuweist.

    Und für dieses Problem benötige ich Vorschläge, wie das Skript zu schreiben ist.

    Ich merke, es ist schwierig, ein Problem zu formulieren. :D Deshalb herzlichen Dank, dass ihr schon mal das Geschriebene auch verstehen und mir helfen wollt.

    Danke! :)

    Montag, 13. März 2017 07:29
  • und diese MAIL_-Postfächer dann zuweist.

    Was meinst Du mit zuweisen? Die Gruppenmitgliedschaft im AD scheint ja schon zu existieren.

    Meinst Du die Einbindung in Outlook?

    Wo wird das Skript laufen? Server, Admin-PC oder beim User selbst?


    Freundliche Grüße

    Sandro
    MCSA: Windows Server 2012
    Fachinformatiker Fachrichtung Systemintegration (IHK, 07/2013)



    Montag, 13. März 2017 07:33
  • Genau; die Einbundung des Postfachs in Outlook.

    Lokal auf der User-Maschine.

    Danke!

    Montag, 13. März 2017 09:14
  • Habt Ihr einen Exchange Server? Was für Postfächer sind das? Freigegebene Postfächer bindet Outlook automatisch ein (siehe Antwort von Chris).

    Wenn es Benutzerpostfächer sind, haben die MAIL_* Gruppen die entsprechenden Berechtigungen zum Öffnen des Postfachs oder muss da ein Service-Benutzer zur Authentifizierung mit übergeben werden?


    Freundliche Grüße

    Sandro
    MCSA: Windows Server 2012
    Fachinformatiker Fachrichtung Systemintegration (IHK, 07/2013)



    Montag, 13. März 2017 09:23
  • $strUserName = "Gust.Bayrhammer"

    $strUser = get-qaduser -SamAccountName $strUserName
    $Mitgliedschaft = $strUser.memberof

    Die Fehler solltest Du natürlich nicht mit kopieren ;)

    http://stackoverflow.com/questions/5072996/how-to-get-all-groups-that-a-user-is-a-member-of


    Hier mal ein Anfang für Dich zum experimentieren:

    $username = "hans.wurst"
    $memberof = Get-ADPrincipalGroupMembership -Identity $username | where {$_.name -like "MAIL_*"}
    
    foreach($group in $memberof)
    {
        #Hier kann nun beliebiger Code folgen der etwas mit den Gruppenmitgliedschaften anstellen soll, bspw. Einbindung der Postfaecher in Outlook
        Write-Host $group.name
    }

    Freundliche Grüße

    Sandro
    MCSA: Windows Server 2012
    Fachinformatiker Fachrichtung Systemintegration (IHK, 07/2013)




    Montag, 13. März 2017 09:39
  • Hallo Sandro,

    das hilft mir schon mal weiter zum Experimentieren!

    Ist ein ExchangeServer. Das Problem ist, dass über unsere Softwareverteilung die Postfächer - wir haben mehrere - nicht automatisiert zugewiesen werden.

    Montag, 13. März 2017 10:04
  • wie Sandro geschrieben hat...

    #Hier kann nun beliebiger Code folgen

    Add-Mailboxpermission und der User bekommt automatisch das Postfach hinzugefügt.

    https://technet.microsoft.com/en-us/library/bb124097(v=exchg.160).aspx


    Chris

    Montag, 13. März 2017 10:54
  • Add-Mailboxpermission und der User bekommt automatisch das Postfach hinzugefügt.

    Ich denke eher in den Postfächern sind die Gruppen "MAIL_PostfachXYZ" hinterlegt, ansonsten wäre diese Gruppenmitgliedschaft beim User im AD ja sinnlos.

    Auf die Frage ob Shared oder Benutzerpostfach gab's ja noch keine Antwort ...


    Freundliche Grüße

    Sandro
    MCSA: Windows Server 2012
    Fachinformatiker Fachrichtung Systemintegration (IHK, 07/2013)


    Montag, 13. März 2017 10:57
  • Wenn das Script auf den User-Workstations laufen soll, bedenke bitte auch das dann die RSAT Tools überall installiert sein müssen - sonst gibt es die AD-CmdLets nicht.

    Bei Windows 7 müssen diese zusätzlich nach der Installation noch explizit in den Features aktiviert werden.


    Freundliche Grüße

    Sandro
    MCSA: Windows Server 2012
    Fachinformatiker Fachrichtung Systemintegration (IHK, 07/2013)




    Montag, 13. März 2017 11:39
  • Wenn das Script auf den User-Workstations laufen soll, bedenke bitte auch das dann die RSAT Tools überall installiert sein müssen - sonst gibt es die AD-CmdLets nicht.

    Bei Windows 7 müssen diese zusätzlich nach der Installation noch explizit in den Features aktiviert werden.


    ...das wäre dann aber aus Kanonen auf Spatzen schießen, nicht? Ich würde in so einem Fall dann doch auf den Komfort der AD-Cmdlets verzichten und den ADSI-Provider bemühen. Oder, wenn die betreffenden "User" die Rechte dafür haben, die AD-Cmdlets per Remoting auf einem DC oder Management Server starten...

    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> http://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    Montag, 13. März 2017 17:08
  • ...das wäre dann aber aus Kanonen auf Spatzen schießen, nicht? Ich würde in so einem Fall dann doch auf den Komfort der AD-Cmdlets verzichten und den ADSI-Provider bemühen. Oder, wenn die betreffenden "User" die Rechte dafür haben, die AD-Cmdlets per Remoting auf einem DC oder Management Server starten...

    Man schießt so oft mit zu großen Kalibern auf kleine Ziele. Das MSU lässt sich ja zentral verteilen.

    ... aber ja, stimmt natürlich. :)


    Freundliche Grüße

    Sandro
    MCSA: Windows Server 2012
    Fachinformatiker Fachrichtung Systemintegration (IHK, 07/2013)




    Montag, 13. März 2017 18:04
  • Ich würde in so einem Fall dann doch auf den Komfort der AD-Cmdlets verzichten und den ADSI-Provider bemühen.
    #https://gallery.technet.microsoft.com/scriptcenter/f7b246a4-95a2-4408-b1a1-73b53003883c
    #https://social.technet.microsoft.com/wiki/contents/articles/4231.working-with-active-directory-using-powershell-adsi-adapter.aspx

    Function Get-DistinguishedName ($strUserName)
    {  
       $searcher = New-Object System.DirectoryServices.DirectorySearcher([ADSI]'')
       $searcher.Filter = "(&(objectClass=User)(samAccountName=$strUserName))"
       $result = $searcher.FindOne()
     
       Return $result.GetDirectoryEntry().DistinguishedName
    }

    $userdn = Get-DistinguishedName ($env:USERNAME)

    $user = [ADSI]"LDAP://$userdn"
    $groups = $User.MemberOf | ForEach-Object {[ADSI]"LDAP://$_"} | Where {$_.cn -like "MAIL_*"}

    foreach ($group in $groups)
    {
        #Hier kann nun beliebiger Code folgen der etwas mit den Gruppenmitgliedschaften anstellen soll
        Write-Host $group.cn
    }

    Besser? :D ;)


    Freundliche Grüße

    Sandro
    MCSA: Windows Server 2012
    Fachinformatiker Fachrichtung Systemintegration (IHK, 07/2013)






    Dienstag, 14. März 2017 07:17
  • Wenn Deine Frage damit beantwortet ist, markiere hilfreiche Antworten doch bitte noch als solche mit einem Klick auf "Abstimmen" und Lösung(en) mit einem Klick auf "Als Antwort markieren".

    Freundliche Grüße

    Sandro
    MCSA: Windows Server 2012
    Fachinformatiker Fachrichtung Systemintegration (IHK, 07/2013)


    Donnerstag, 16. März 2017 12:08
  • In der letzten For-Each-Schleife müssten nun die dem Nutzer zugewiesenen Postfächer (MAIL_*) mit folgendem Befehl hinzugefügt werden:

    Add-MailboxPermission -Identity $group.cn -User user -AccessRights FullAccess -InheritanceType All;

    ; falls ich das korrekt so ausführen könnte.

    Montag, 20. März 2017 12:28
  • In der letzten For-Each-Schleife müssten nun die dem Nutzer zugewiesenen Postfächer (MAIL_*) mit folgendem Befehl hinzugefügt werden:

    Add-MailboxPermission -Identity $group.cn -User user -AccessRights FullAccess -InheritanceType All;

    ; falls ich das korrekt so ausführen könnte.

    Und was ist dazu Deine Frage? ;)

    Freundliche Grüße

    Sandro
    MCSA: Windows Server 2012
    Fachinformatiker Fachrichtung Systemintegration (IHK, 07/2013)


    Montag, 20. März 2017 12:46
  • Ich habe lediglich laut gedacht; danke für deine Denkanstöße. :D
    Montag, 20. März 2017 14:18
  • Und warum hinterlegst Du nicht einfach die jeweilige MAIL* Gruppe in den Postfach Berechtigungen? Dann sparst Du Dir den Käse die User an 2 Stellen zu hinterlegen...

    Freundliche Grüße

    Sandro
    MCSA: Windows Server 2012
    Fachinformatiker Fachrichtung Systemintegration (IHK, 07/2013)


    Montag, 20. März 2017 16:23
  • Erläutere mir bitte diesen Lösungsansatz. Das Standardpostfach des Domain-Users wird automatisiert hinzugefügt; die Funktionspostfächer allerdings nicht. Diese werden bisher per Hand hinzugefügt.
    Dienstag, 21. März 2017 05:52
  • Erläutere mir bitte diesen Lösungsansatz. Das Standardpostfach des Domain-Users wird automatisiert hinzugefügt; die Funktionspostfächer allerdings nicht. Diese werden bisher per Hand hinzugefügt.

    Wie ich verstanden habe hast Du ein AD + Exchange zur Verfügung.

    Du möchtest die Funktionspostfächer bei den Benutzern in Outlook lokal einbinden.

    Meine Herangehensweise wäre jetzt:

    - AD-Gruppe anlegen bspw: MAIL_CHEF_FULLACCESS; _CALENDARONLY; usw.

    - Diese Gruppe hinterlege ich beim Postfach chef@firma.de mit den entsprechenden Berechtigungen

    Soll jetzt ein Mitarbeiter Zugriff auf das Postfach bekommen, dann füge ich max.mustermann nur der AD Gruppe MAIL_CHEF_FULLACCESS hinzu und fertig.


    Freundliche Grüße

    Sandro
    MCSA: Windows Server 2012
    Fachinformatiker Fachrichtung Systemintegration (IHK, 07/2013)




    Dienstag, 21. März 2017 07:26
  • Sinnvoller Vorschlag; das werde ich ausprobieren und würde mich ja freuen, wenn ich es auch auf diesem Weg ermöglichen kann ohne Skriptspielchen. Der Grund, warum ich erst mal das Skript fertigstellen möchte, ist die Anforderung, es erst mal so zu versuchen.

    Danke für die Hilfe! :)

     
    Dienstag, 21. März 2017 07:55
  • Sinnvoller Vorschlag;

    Danke ;)
    das werde ich ausprobieren und würde mich ja freuen, wenn ich es auch auf diesem Weg ermöglichen kann ohne Skriptspielchen.
    Wenn es klappt, freue ich mich über einen Klick auf "Abstimmen" für eine hilfreiche Antwort und/oder "Als Antwort markieren" wenn es Dein Thema ebenfalls beantwortet ;)
    Der Grund, warum ich erst mal das Skript fertigstellen möchte, ist die Anforderung, es erst mal so zu versuchen.
    Sehr guter Vorsatz! Auch wenn es am Ende vielleicht nicht zum Einsatz kommt, hast Du auf jeden Fall was dabei gelernt.

    Danke für die Hilfe! :)

    Sehr gern!

    Freundliche Grüße

    Sandro
    MCSA: Windows Server 2012
    Fachinformatiker Fachrichtung Systemintegration (IHK, 07/2013)


    Dienstag, 21. März 2017 07:59
  • das werde ich ausprobieren und würde mich ja freuen, wenn ich es auch auf diesem Weg ermöglichen kann ohne Skriptspielchen.
    Wenn es klappt, freue ich mich über einen Klick auf "Abstimmen" für eine hilfreiche Antwort und/oder "Als Antwort markieren" wenn es Dein Thema ebenfalls beantwortet ;)

    Done =)
    Dienstag, 21. März 2017 08:16
  • Der Thread wurde geteilt Martin, scheinbar hat sich das mit deiner Antwort überschnitten. Kann du sie hier noch mal posten bitte: LINK

     


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Code Manager v5: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Donnerstag, 23. März 2017 14:49
    Moderator