Wie Sie systemeigene ADSI-Komponenten, um die primäre Gruppe zu finden

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 321360 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Auf dieser Seite

Zusammenfassung

In diesem Artikel erläutert die systemeigene Active Directory Services Interface (ADSI)-Komponenten verwenden, um die primäre Gruppenmitgliedschaft eines Benutzers zu bestimmen.

Weitere Informationen

Wie die primäre Gruppe für ein Benutzerobjekt in Active Directory gespeichert wird

Jedes Objekt Kontext Sicherheit (z. B. Benutzer und Sicherheitsgruppen) in Active Directory hat ein Security-ID (SID)-Attribut zugeordnet. Die SID hat mehrere Komponenten, wie in der "SID-Komponenten" Verweis im Abschnitt "Reference" dieses Artikels enthalten beschrieben. Zwei dieser Komponenten auf der SID sind die Domäne relativen ID (RID) und die RID spezifisch auf das Objekt innerhalb der Domäne.

Die primäre Gruppe eines Benutzers wird auf dem PrimaryGroupID -Attribut eines Benutzerobjekts (als RID der Gruppe in Domäne des Benutzers) gespeichert. Primäre Gruppe eines Benutzers kann nur eine Gruppe, die in derselben Domäne wie der Benutzer vorhanden ist, und diese Gruppe hat eine Gruppe sein, der der Benutzer Mitglied ist. Außerdem enthält diese Gruppe -Objekt in der Active Directory ein Attribut namens PrimaryGroupToken , der die RID für diese Gruppe innerhalb der Domäne gespeichert.

Windows NT und (LIGHTWEIGHT Directory Access Protocol) können Programmierer primäre Gruppe eines Benutzers durch Festlegen den PrimaryGroupID -Attribut-Wert auf die RID der einer Gruppe, der Benutzer Mitglied ist, ändern. Wenn der Benutzer nicht Mitglied einer Gruppe ist, kann nicht auf die RID der Gruppe des Benutzers PrimaryGroupID festgelegt werden.

Wenn Sie den Windows NT-Anbieter in ADSI verwendet, ist die primäre Gruppe als einen Eintrag in IADsUser::Groups -Auflistung des Benutzers enthalten.

Mit dem LDAP-Anbieter die primäre Gruppe ist, nicht als Eintrag in der IADsUser::Groups -Auflistung enthalten, noch ist die Gruppe Unterscheidungsname (DN) Teil des MemberOf -Attributs des Benutzerobjekts im Verzeichnis. Die Gruppe RID in PrimaryGroupID ist der nur Ort, die in dem die primäre Gruppe eines Benutzers auf dem LDAP-Benutzerobjekt verwiesen wird.

Keine Anbieter definiert einen Mechanismus um den Namen der primären Gruppe für einen Benutzer direkt von Ihrer jeweiligen Benutzerobjekte zu ermitteln. Das Problem noch komplexere durch die Tatsache besteht, dass jedes Objekt-Gruppe Jeder Anbieter bereitgestellten wie folgt einen anderen Satz von Attributen, unterstützt:
  • Die Windows NT bereitgestellte Gruppenobjekt unterstützt nicht das PrimaryGroupToken -Attribut, noch unterstützt der Windows NT-Anbieter eine andere Weise der Gruppe RID mithilfe von systemeigenen ADSI-Code abzurufen.
  • Das PrimaryGroupToken -Attribut eines LDAP-Anbieter Gruppenobjekts ist ein berechneter Attribut. Dieses Attribut ist für das Objekt Gruppe im Verzeichnis nicht vorhanden. Das Attribut ist, tatsächlich erstellt, wenn es vom Client mit einem Methodenaufruf IADs::GetInfoEx angefordert wird. Es ist nicht möglich LDAP-Suchvorgänge auf Grundlage von konstruierten Attributen in Active Directory ausführen. Daher können nicht durchsucht mithilfe des LDAP-Anbieters für eine Gruppe basierend auf dem das PrimaryGroupID -Attribut des Benutzerobjekts übereinstimmt, deren primäre Gruppe Sie bestimmen möchten PrimaryGroupToken -Attribut werden. Diese Regeln auch außerhalb einer reinen ADSI Lösung, die nicht von einem externen COM-Objekt zu bestimmen, die primäre Gruppe abhängig ist.

Möglichkeiten, die primäre Gruppe eines Benutzers zu bestimmen.

Im folgenden werden drei bekannte Methoden, um den Namen der primären Gruppe eines Benutzers zu ermitteln:
  • Erstellen einer SID binden Zeichenfolge für das Gruppenobjekt in Active Directory aus der Domäne RID-Komponente der SID des Benutzers und der Gruppe RID auf dem PrimaryGroupID -Attribut des Benutzerobjekts gespeichert.

    Dies ist die Methode in Microsoft KB-Artikel Q297951 (enthalten in der in diesem Artikel im Abschnitt "Reference") beschrieben. Das Hauptproblem bei dieser Methode ist, dass die SID binden Zeichenfolge erstellen, der Programmierer für das ADsSID -Objekt auf die binäre Sicherheitsbeschreibung das Domänenobjekt in seiner SDDL-Form konvertieren angewiesen. Das ADsSID -Objekt wird durch die Datei ADsSecurity.dll gehostet, die kopiert und auf dem Client registriert, bevor der Code erfolgreich ausgeführt werden kann werden müssen.
  • Verwenden Sie eine LDAP-Abfrage, um zu für alle Gruppen in einer Domäne suchen und deren PrimaryGroupToken -Attribut zurückgeben.

    Diese Methode ist eine reine LDAP-Lösung. Die skriptgesteuerte Lösung ist jedoch nicht sehr effizient, da diese Suche jede Gruppe in der Domäne auch zurückgibt, dass der Benutzer nicht Mitglied; und da das PrimaryGroupToken -Attribut auf dem Client erstellt wird, wie die Datensatzgruppe durchlaufen wird, diese Suche sehr langsam ist. Diese Methode, insbesondere zeitaufwändig Wenn eine große Anzahl von Gruppen in der Domäne. Beispiele zum Erstellen von LDAP-Dialekt ADO-Abfragen von abound und daher werden nicht einbezogen in diesem Artikel.
  • Nutzen Sie die Features der einzelnen Anbieter zum Erstellen einer hybriden Lösung.

    Diese Lösung nutzt die Features von verschiedenen Anbietern die primäre Gruppe des Benutzers zu ermitteln. Gehen Sie hierzu folgendermaßen vor:
    1. Binden Sie an das Benutzerobjekt mit dem Windows NT-Anbieter.

      Das Windows NT-Benutzerobjekt stellt eine Gruppe-Auflistung, die garantiert die primäre Gruppe des Benutzers enthalten. Außerdem wird PrimaryGroupID des Benutzerobjekts Einlagerung in einen temporären Speicherort für die Verwendung weiter unten in diesem Algorithmus gespeichert.
    2. Durchlaufen Sie die IADsUser::Groups -Auflistung.
    3. Extrahieren Sie die SamAccountName -Eigenschaft aus den ADsPath für jede Gruppe in dieser Auflistung und erstellen Sie eine LDAP-Dialekt-Abfragezeichenfolge mit den in dieser Auflistung, deren Attributwerte PrimaryGroupToken und DistinguishedName zurückgeben aufgeführte SamAccountName -Eigenschaft für alle Gruppen zu suchen.
    4. Führen Sie die ADO-ADSI-Suche, und durchlaufen Sie die Datensatzgruppe, vergleichen jede Gruppe PrimaryGroupToken mit der PrimaryGroupID -Attributwert zuvor zwischengespeicherte.
    5. Wenn Sie eine Übereinstimmung gefunden, beenden Sie und zeigen Sie den Distinguished Name für diese Gruppe als primäre Gruppe für diesen Benutzer an.
    6. Wenn Sie keine Übereinstimmung gefunden, weiterhin das Suchergebnis durchlaufen.
    Die Vorteile dieser Methode sind sofort offensichtlich. Alle verwendeten Objekte sind systemeigen auf ADSI und erfordern keine zusätzliche Komponenten. Darüber hinaus enthält die Enumeration nur die Gruppen, die möglicherweise die primäre Gruppe.

    Beachten Sie jedoch den folgenden Nachteil: bei die IADsUser::Groups -Auflistung aufgelistet ist, ist das zurückgegebene Objekt eine IADs -Schnittstelle auf den Member in der Gruppe. Wenn aus irgendeinem Grund der Benutzer, der Enumeration nicht die notwendigen Berechtigungen zum Öffnen eines bestimmten Objekts verfügt, wird die Enumeration ohne dass einen Fehler beendet. Der folgende Code veranschaulicht, wie Sie den vorherigen Algorithmus implementieren können:
    dim oUsr 
    dim oGrp 
    
    '
    ' ToDo: Change the following variables to specific values for your domain.
    ' 
    DomainName = "myDomain"
    UserLoginName = "myUserLoginName"
    
    '
    ' Bind to the user object with the Windows NT provider.
    ' 
    set oUsr = GetObject("WinNT://" & DomainName & "/" & UserLoginName & ",user") 
    set grp = oUsr.Groups 
    GrpID = oUsr.PrimaryGroupID 
    GrpName = "" 
    
    '
    ' Building Query Filter for the search for all the groups that the user is a member of.
    '
    QueryFilter = "(|"
    for each Item in Grp 
       NT4Name = replace(Item.ADsPath,"WinNT://","") 
       tempArray = split(nt4Name,"/") 
       NT4Name = tempArray(1)
       QueryFilter = QueryFilter & "(samAccountName=" & NT4Name & ")"
    next
    QueryFilter = QueryFilter & ")"
    
    '
    ' Building LDAP dialect Query String.
    '
    QueryString = "<LDAP://" & DomainName & ">;" & QueryFilter & ";PrimaryGroupToken,distinguishedName;subtree"
    
    '
    ' Performing Query against the Active Directory for all the groups that 
    ' the user belongs to and retrieving the RID of the group object off
    ' the PrimaryGroupToken attribute on the user.
    '
    Dim oConnection, oCommand, oRecordset
    Set oConnection = CreateObject("ADODB.Connection")
    Set oCommand = CreateObject("ADODB.Command")
    
    oConnection.Provider = "ADsDSOObject"
    oConnection.Open "Active Directory Provider"
    
    Set oCommand.ActiveConnection = oConnection
    oCommand.CommandText = QueryString
    oCommand.Properties("Page Size") = 900
    
    Set oRecordset = oCommand.Execute
    
    '
    ' Looping through all the records in the search result to determine whether
    ' any of these group's PrimaryGroupToken attribute value match the 
    ' PrimaryGroupID attribute value stored on the user object.
    '
    While ((NOT oRecordset.EOF) and (Not bGroupFound))
      if (GrpID = oRecordset.Fields("PrimaryGroupToken").value) then
        GrpName = oRecordset.Fields("DistinguishedName").Value
        bGroupFound = True 
      End If
      oRecordset.moveNext
    Wend
    
    Set oRecordset = Nothing
    Set oCommand = Nothing
    Set oConnection = Nothing
    
    '
    ' Displaying Results of the search.
    ' 
    if( bGroupFound ) then 
       WScript.Echo "Primary Group for " & oUsr.AdsPath 
       WScript.Echo "Is: " & GrpName 
    else 
       WScript.Echo "Primary Group Not Found" 
    end if
    					

Informationsquellen

Weitere Informationen finden Sie im folgenden Artikel der Microsoft Knowledge Base:
297951Wie Sie das PrimaryGroupID-Attribut, um die primäre Gruppe für einen Benutzer zu finden

Eigenschaften

Artikel-ID: 321360 - Geändert am: Montag, 3. März 2008 - Version: 5.0
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Windows Server 2003, Standard Edition (32-bit x86)
  • Microsoft Windows 2000 Server
  • Microsoft Active Directory Service Interfaces 2.5
  • Microsoft Active Directory Client Extension
Keywords: 
kbmt kbdswadsi2003swept kbinfo KB321360 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 321360
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com