none
Fehler bei get-adgroupmember RRS feed

  • Frage

  • Hallo mal wieder allezusammen,

    unten der scriptcode.

    Was soll das script machen:

    - ich gebe einen teil eines AD Gruppennamens mit *text* ein und es werden alle Gruppen ausgegeben, das klappt auch.

    In der $adgrp steht dann z.B:

    SI-LS-DAT-O.95820

    SI-LS-DAT-O.AVB-95800

    SI-LS-DAT-O.AVB-95800_L

    SI-LS-DAT-O.AVN-95810

    SI-LS-DAT-O.AVN-95810_L

    SI-LS-DAT-O.AVN1-95811

    das sind auch die Samaccountnamen die ich  haben wollte , suche war nach *958*.

    Was ich davon nun haben mag sind die member der einzelnen gruppen, dafür ja das get-adgroupmember.

    was ich kriege ist eine Fehlermeldung:

    ----------------------------------------------------------------------------------------

    Get-ADGroupMember : Der Vorgang wurde erfolgreich beendet

    Bei W:\AD_Aufraeumen\Scripte\get_grp_search.ps1:7 Zeichen:27

    + $list1 = Get-ADGroupMember <<<< "$item2" -Recursive|Select-Object Samaccountname

    + CategoryInfo : NotSpecified: (SI-LS-DAT-O.BER4-95894_L:ADGroup) [Get-ADGroupMember], ADExcep

    tion

    + FullyQualifiedErrorId : Der Vorgang wurde erfolgreich beendet,Microsoft.ActiveDirectory.Management.Co

    mmands.GetADGroupMember

    ----------------------------------------------------------------------------------------

    daraus werd ich nicht schlau...erfolgreich aber dann doch nicht?? wie jetzt?

    THXS @ all

    $adgrp = @()
    $search = read-host -prompt "Teil des Gruppennamens"
    $adgrp = Get-ADGroup -Filter {Samaccountname -like $search}|Select-Object Samaccountname 
    $adgrp 
    foreach($item in $adgrp){
    $item2 = $item.Samaccountname
    $list1 = Get-ADGroupMember "$item2" -Recursive|Select-Object Samaccountname
    $list2 += $list1
    }
    $list2

    Mittwoch, 28. März 2012 10:30

Antworten

  • Ich kann den Fehler hier nicht reproduzieren. Deshalb vermute ich, dass die Gruppe die den Fehler verursacht (SI-LS-DAT-O.BER4-95894_L) keinen Member hat.
    Überprüf das mal!

    Dann müsste es so Funktionieren, hier werden nur Gruppen geholt die auch member haben:

    $ArrayList = New-Object System.Collections.ArrayList
    
    $adgrp = @()
    $search = read-host -prompt "Teil des Gruppennamens"
    $adgrp = Get-ADGroup -LDAPFilter "(&(member=*) (Samaccountname=*$search*))" -SearchBase "OU=Groups,OU=xxx,OU=xxx,OU=Domain Resources,DC=xxxx" | Select-Object Samaccountname 
    $adgrp 
    foreach($item in $adgrp){
        $ArrayList.AddRange(@(Get-ADGroupMember $item.Samaccountname -Recursive | Select-Object Samaccountname))
    }
    $ArrayList

    Wenn ich dir noch ein paar Tipps geben kann….
    Dein Script wird aus mehreren Gründen sehr langsam laufen.

    1. Wenn man das AD durchsucht sollte man IMMER die kleinste -SearchBase angeben (OU). Sonnst wird immer das gesamte AD durchsucht und du beschäftigst die Domänen-Server unnötig!

    2. Ein Like Filter ( "*suchen*" ) ist Gift für die Server! Da jedes Objekt angefasst werden muss! Die beste Suche ist die "suche*" (Anfang bekannt) da der Server nur noch Objekte anfasst die mit "suche" beginnen. Die "*suche" (Ende bekannt) geht auch noch, ist aber für die Server auch schwierig, da meist nach dem Anfang Indexiert wird !

    3. In PowerShell kann man einem Array mit += ein neues Glied anhängen. Das ist ebenfalls sehr langsam:
        3.1. PowerShell muss ein neues Array erstellen das Grösser ist als das Alte
        3.2. Alle Elemente des Alten Arrays werden in das neue Array kopiert
        3.3. Die neuen zusätzlichen Elemente werden gefüllt
        3.4. Das Alte Array wird freigegeben (zerstört) und das neue Array wird referenziert

    Da nimmt man am besten eine Arraylist (wie in meinem Beispiel)
    http://msdn.microsoft.com/de-de/library/system.collections.arraylist.aspx

    Auch wenn die LDAP Abfrage-Sprache eventuell neue erlernt werden muss, ziehe ich diese aus folgenden Gründen vor:
    -    Man findet sehr viele erprobte Beispiele im Netz
    -    Die abfragen werden vom Domänenserver optimiert und ausgeführt, dadurch sind sie sehr effizient.
    -    Der Server erledigt das Filtern, dadurch wird die Netzwerk Übertragung minimiert.
    -    LDAP Querys sind oft schneller als der PowerShell Filter

    Active Directory and PowerShell – Speed Up Your Filtering
    http://www.adminnation.com/2011/08/30/active-directory-and-powershell-%E2%80%93-speed-up-your-filtering/

    Creating More Efficient Microsoft Active Directory-Enabled Applications
    http://msdn.microsoft.com/en-us/library/ms808539.aspx

    LDAP Filter syntax
    http://www.selfadsi.org/ldap-filter.htm


    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '





    • Bearbeitet Peter Kriegel Freitag, 30. März 2012 12:26
    • Als Antwort markiert T.Haag Montag, 2. April 2012 10:33
    Mittwoch, 28. März 2012 13:59

Alle Antworten

  • Ich kann den Fehler hier nicht reproduzieren. Deshalb vermute ich, dass die Gruppe die den Fehler verursacht (SI-LS-DAT-O.BER4-95894_L) keinen Member hat.
    Überprüf das mal!

    Dann müsste es so Funktionieren, hier werden nur Gruppen geholt die auch member haben:

    $ArrayList = New-Object System.Collections.ArrayList
    
    $adgrp = @()
    $search = read-host -prompt "Teil des Gruppennamens"
    $adgrp = Get-ADGroup -LDAPFilter "(&(member=*) (Samaccountname=*$search*))" -SearchBase "OU=Groups,OU=xxx,OU=xxx,OU=Domain Resources,DC=xxxx" | Select-Object Samaccountname 
    $adgrp 
    foreach($item in $adgrp){
        $ArrayList.AddRange(@(Get-ADGroupMember $item.Samaccountname -Recursive | Select-Object Samaccountname))
    }
    $ArrayList

    Wenn ich dir noch ein paar Tipps geben kann….
    Dein Script wird aus mehreren Gründen sehr langsam laufen.

    1. Wenn man das AD durchsucht sollte man IMMER die kleinste -SearchBase angeben (OU). Sonnst wird immer das gesamte AD durchsucht und du beschäftigst die Domänen-Server unnötig!

    2. Ein Like Filter ( "*suchen*" ) ist Gift für die Server! Da jedes Objekt angefasst werden muss! Die beste Suche ist die "suche*" (Anfang bekannt) da der Server nur noch Objekte anfasst die mit "suche" beginnen. Die "*suche" (Ende bekannt) geht auch noch, ist aber für die Server auch schwierig, da meist nach dem Anfang Indexiert wird !

    3. In PowerShell kann man einem Array mit += ein neues Glied anhängen. Das ist ebenfalls sehr langsam:
        3.1. PowerShell muss ein neues Array erstellen das Grösser ist als das Alte
        3.2. Alle Elemente des Alten Arrays werden in das neue Array kopiert
        3.3. Die neuen zusätzlichen Elemente werden gefüllt
        3.4. Das Alte Array wird freigegeben (zerstört) und das neue Array wird referenziert

    Da nimmt man am besten eine Arraylist (wie in meinem Beispiel)
    http://msdn.microsoft.com/de-de/library/system.collections.arraylist.aspx

    Auch wenn die LDAP Abfrage-Sprache eventuell neue erlernt werden muss, ziehe ich diese aus folgenden Gründen vor:
    -    Man findet sehr viele erprobte Beispiele im Netz
    -    Die abfragen werden vom Domänenserver optimiert und ausgeführt, dadurch sind sie sehr effizient.
    -    Der Server erledigt das Filtern, dadurch wird die Netzwerk Übertragung minimiert.
    -    LDAP Querys sind oft schneller als der PowerShell Filter

    Active Directory and PowerShell – Speed Up Your Filtering
    http://www.adminnation.com/2011/08/30/active-directory-and-powershell-%E2%80%93-speed-up-your-filtering/

    Creating More Efficient Microsoft Active Directory-Enabled Applications
    http://msdn.microsoft.com/en-us/library/ms808539.aspx

    LDAP Filter syntax
    http://www.selfadsi.org/ldap-filter.htm


    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '





    • Bearbeitet Peter Kriegel Freitag, 30. März 2012 12:26
    • Als Antwort markiert T.Haag Montag, 2. April 2012 10:33
    Mittwoch, 28. März 2012 13:59
  • Ich bin inzwischen ein wenig weitergekommen und habe das mit einem selbst erstellten Objekt gelöst.

    Den Ansatz von Peter will ich aber gerne auch mal ausprobieren, allein mir fehlt gerade ein wenig die Zeit.

    V ielen Dank auch für die Tips und die Basics :-) zum ordentlichen scripten im powershell.

    Werd das ganze wohl bei Gelegenheit noch ein wenig optimieren / Umschreiben.

    Thxs @Peter

    Grüße

    Thomas

    Montag, 2. April 2012 10:37