Jak najít primární skupiny používat nativní ADSI součásti

Překlady článku Překlady článku
ID článku: 321360 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Souhrn

Tento článek vysvětluje, jak používat nativní součástí Active Directory Services Interface (ADSI) k určení členství primární skupiny uživatele.

Další informace

Jak primární skupiny je uložen v objektu uživatele ve službě Active Directory

Každý kontext objekt zabezpečení (například uživatelé a skupiny zabezpečení) v aktivním adresáři má atribut identifikátoru (SID) zabezpečení přidružen. SID má několik součástí popsaným zahrnuty v tomto článku v části „ Reference „ odkaz "SID součásti". Dvě tyto součásti na SID jsou relativní identifikátor domény (RID) a konkrétní RID k objektu v rámci domény.

Primární skupina uživatele je uložen na atribut PrimaryGroupID objekt uživatele (jako na skupinu RID v doméně uživatele). Primární skupiny uživatele může být pouze skupiny existuje ve stejné doméně jako uživatel a tato skupina má být skupina je uživatel členem. Také tento objekt skupiny v aktivním adresáři má atribut nazývá PrimaryGroupToken, který ukládá RID této skupiny v rámci domény.

Poskytovatelé WINDOWSNT a Lightweight Directory Access Protocol (LDAP) umožňují programátorům Změna primární skupiny uživatele nastavením hodnoty atributu PrimaryGroupID RID skupinu je uživatel členem. Pokud uživatel není členem skupiny, uživatele PrimaryGroupID nelze nastavit na RID skupiny.

Při používá zprostředkovatele WINDOWSNT v ADSI, primární skupiny je zahrnuta jako položka v kolekci IADsUser::Groups uživatele.

Zprostředkovateli LDAP, je primární skupiny nejsou zahrnuty jako položku v kolekci IADsUser::Groups ani je do skupiny součástí rozlišující název (DN) atribut MemberOf objekt uživatele v adresáři. Do skupiny RID v PrimaryGroupID je místo pouze odkazuje primární skupiny uživatele v objektu uživatele LDAP.

Ani zprostředkovatele definuje mechanismus zjistit název primární skupiny uživatele z jejich objekty příslušného uživatele. Problém je provedené i složitější každý objekt skupiny poskytované každého zprostředkovatele způsobem podporuje různé sady atributů, faktů:
  • Objekt skupiny poskytované WINDOWSNT nepodporuje atribut PrimaryGroupToken ani zprostředkovatel WINDOWSNT podporovat jiným způsobem načíst do skupiny RID pomocí nativního kódu ADSI.
  • Atribut PrimaryGroupToken objekt LDAP Skupina zprostředkovatele je vypočítané atribut. Tento atribut na objekt skupiny v adresáři neexistuje. Atribut, ve skutečnosti vytvořena při je požadované klientem s volání metody IADs::GetInfoEx. Není možné provádět hledání LDAP na základě vytvořený atributy v aktivním adresáři. Proto nelze vyhledávat pomocí zprostředkovatele LDAP pro skupinu na základě PrimaryGroupToken atribut, který odpovídá atribut PrimaryGroupID na objekt uživatele, jehož primární skupinu, kterou chcete zjistit. Tato pravidla také mimo běžný ADSI řešení, která je závislá na externí objektu COM vám pomohou určit primární skupina.

Způsoby určit primární skupiny uživatele

Tři známé metody zjistit název primární skupiny uživatele jsou následující:
  • Sestavení SID řetězec vazba objektu skupiny v aktivním adresáři z komponenty Domain RID číslo SID uživatele a uloženy na atribut PrimaryGroupID na objekt uživatele do skupiny RID.

    Toto je metody popsané v článku znalostní BÁZE Microsoft Q297951 (zahrnuty v tomto článku v části „ Reference „). Hlavní problém touto metodou je, že k sestavení SID řetězec vazba, programátor musí spoléhat na objekt ADsSID popisovač binární zabezpečení objektu domény převést jeho formuláře SDDL. Objekt ADsSID je hostitelem souboru ADsSecurity.dll, který musí být zkopírovány a registrován v počítači klienta před lze úspěšně spustit kód.
  • Dotaz LDAP slouží k hledání pro všechny skupiny v doméně a vrácení jejich atribut PrimaryGroupToken.

    Tato metoda je výhradně řešení LDAP. Skriptované řešení však není velmi efektivní, protože toto hledání vrátí každé skupiny v doméně, i ty uživatel není členem; a protože jako provázán sada záznamů, je atribut PrimaryGroupToken zkonstruovat na klienta, je toto hledání poměrně pomalé. Tato metoda může být zvláště časově náročné Pokud velký počet skupin v doméně. Příklady, jak vytvořit ADO dotazy LDAP dialekt abound a proto jejich nejsou zahrnuty v tomto článku.
  • Využívat výhod funkcí každého zprostředkovatele hybridní řešení.

    Toto řešení využívá funkce různých zprostředkovatelů určit primární skupiny uživatele. Postupujte takto:
    1. Vytvořit vazbu objekt uživatele s poskytovatelem WINDOWSNT.

      Objekt uživatele WINDOWSNT poskytuje kolekce skupiny, které obsahují primární skupina uživatele je zaručena. PrimaryGroupID objektu uživatele je také pryč uložen v dočasné umístění pro použití později v tento algoritmus.
    2. Výčet kolekce IADsUser::Groups.
    3. Vlastnost SamAccountName extrahovat z ADsPath každé skupiny v této kolekci a sestavit řetězec dotazu dialekt LDAP vyhledávání pro všechny skupiny s vlastností SamAccountName uvedené v této kolekci vrácením hodnoty jejich atributu PrimaryGroupToken a DistinguishedName.
    4. Spusťte hledání ADO ADSI a smyčka prostřednictvím sada záznamů každé skupiny PrimaryGroupToken porovnání s hodnotou atributu PrimaryGroupID dříve do mezipaměti.
    5. Najít odpovídající zastavit a zobrazit rozlišující název pro tuto skupinu jako primární skupina tohoto uživatele.
    6. Pokud zjistíte shodu, pokračovat vytváření smyček prostřednictvím výsledek hledání.
    Výhody této metody jsou zřejmé ihned. Všechny objekty používané nativní ADSI a nevyžadují další součásti. Výčet dále obsahuje pouze skupiny, které mohou být primární skupina.

    Uvědomte si však následující Nevýhodou: Při výčtu kolekce IADsUser::Groups objekt vrácený je rozhraní IADs člena ve skupině. Pokud z nějakého důvodu provádění výčtu uživatel nemá potřebná oprávnění k otevření určitého objektu, zastaví výčtu bez označující chybu. Jak implementovat předchozí algoritmus ilustruje následující kód:
    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
    					

Odkazy

Další informace naleznete následujícím článku znalostní databáze Microsoft Knowledge Base:
297951Jak najít primární skupiny uživatele pomocí atributu PrimaryGroupID

Vlastnosti

ID článku: 321360 - Poslední aktualizace: 3. března 2008 - Revize: 5.0
Informace v tomto článku jsou určeny pro produkt:
  • 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
Klíčová slova: 
kbmt kbdswadsi2003swept kbinfo KB321360 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:321360

Dejte nám zpětnou vazbu

 

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