Jak najít primární skupiny pomocí nativní ADSI součásti

Souhrn

Tento článek vysvětluje, jak používat nativní součásti služby rozhraní ADSI (Active Directory) 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ý zabezpečení kontextu objekt (například uživatele a skupiny zabezpečení) ve službě Active Directory má atribut zabezpečení identifikátor (SID) s ním spojené. SID má několik součástí, jak je popsáno v odkaz na "SID součásti" v části "Odkazy" tohoto článku. 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žena (jako do skupiny RID v doméně uživatele) na atribut PrimaryGroupId označuje objekt 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, jejímž je uživatel členem. Také tento objekt skupiny ve službě Active Directory má atribut nazývá PrimaryGroupToken, který ukládá RID této skupiny v rámci domény.

Windows NT a Lightweight Directory Access Protocol (LDAP) poskytovatelé umožňují programátorům Změna primární skupiny uživatele nastavením hodnoty atributu PrimaryGroupId označuje RID skupiny, jejímž je uživatel členem. Pokud uživatel není členem skupiny, nelze nastavit uživatele PrimaryGroupId označuje RID skupiny.

Při zprostředkovatele systému Windows NT používá v rozhraní ADSI, primární skupiny je zahrnut jako položka v kolekci IADsUser::Groups uživatele.

Zprostředkovatel protokolu LDAP je primární skupiny není zahrnuta jako položka v kolekci IADsUser::Groups ani je součástí skupiny rozlišující název (DN) atribut MemberOf objekt uživatele v adresáři. Do skupiny RID v PrimaryGroupId označuje je jediným místem, kde se odkazuje primární skupiny uživatele v objektu uživatele LDAP.

Žádný ze zprostředkovatele definuje mechanismus zjistit název primární skupiny uživatele přímo z jejich příslušných uživatelských objektů. Problém je provedena i složitější tím, že každý objekt skupiny poskytované každý zprostředkovatel podporuje sadu atributů, takto:

  • Objekt skupiny poskytované Windows NT nepodporuje atribut PrimaryGroupToken ani nepodporuje zprostředkovatele Windows NT jiným způsobem načíst do skupiny RID pomocí nativního kódu ADSI.
  • Atribut PrimaryGroupToken objekt LDAP Skupina zprostředkovatele je vypočtený atribut. Tento atribut na objekt skupiny v adresáři neexistuje. Atribut je, ve skutečnosti vytvořena v případě požadavku klienta voláním metody IADs::GetInfoEx . Není možné provádět hledání LDAP na základě vypočtené atributů ve službě Active Directory. Proto nelze vyhledávat pomocí zprostředkovatele LDAP pro skupinu na základě atributu PrimaryGroupToken odpovídající atribut PrimaryGroupId označuje objekt uživatele, jehož primární skupinu chcete zjistit. To také vylučuje čisté řešení rozhraní ADSI, které není závislá na externího objektu COM vám pomohou určit primární skupiny.

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

Tři známé metody, chcete-li zjistit název primární skupiny uživatele jsou následující:

  • Vytvořte identifikátor SID řetězec vazba objektu skupiny ve službě Active Directory z komponenty RID domény uživatele SID a RID skupiny uloženy na atribut PrimaryGroupId označuje objekt uživatele.

    Toto je metoda popsaná v článku znalostní báze Microsoft KB Q297951 (zahrnuta v části "Odkazy" tohoto článku). Hlavní problém při použití této metody je, že k sestavení SID řetězec vazba musí programátor spoléhat na objekt ADsSID popisovač binární zabezpečení objektu domény převést do svého formuláře SDDL. Objekt ADsSID je hostitelem souboru ADsSecurity.dll, který musí být zkopírovány do a zaregistrován v klientském počítači před lze úspěšně spustit kód.
  • Dotaz LDAP můžete použijte k hledání pro všechny skupiny v doméně a vrátit jejich atribut PrimaryGroupToken .

    Tato metoda je čistá řešení LDAP. Skriptované řešení však není velmi efektivní, protože toto hledání vrátí všechny skupiny v doméně, i ty, které uživatel není členem; a protože atribut PrimaryGroupToken je vytvořen v klientském počítači jako sady záznamů je provázán, tento typ vyhledávání je velmi pomalé. Tento způsob může být zvláště časově náročné pokud existuje velký počet skupin v doméně. Příklady, jak vytvořit ADO dotazy LDAP dialekt abound a proto nejsou zahrnuty v tomto článku.
  • Využijte výhod funkcí každého poskytovatele za účelem vytvoření hybridní řešení.

    Toto řešení využívá funkce různých poskytovatelů určit primární skupiny uživatele. Chcete-li to provést, postupujte takto:
    1. Vytvoření vazby k objektu uživatele s poskytovatelem systému Windows NT.

      Objekt uživatele systému Windows NT obsahuje skupiny kolekce, které obsahují primární skupina uživatele je zaručeno. PrimaryGroupId označuje objektu uživatele je také pryč uložen v dočasné umístění pro pozdější použití v tento algoritmus.
    2. Vytvořit výčet kolekce IADsUser::Groups .
    3. Vlastnost SamAccountName extrahovat z ADsPath každé skupiny v této kolekci a potom vytvořit řetězec dotazu LDAP dialekt vyhledat všechny skupiny vlastnost SamAccountName uvedené v této kolekci vrátí hodnoty jejich atributu PrimaryGroupToken a DistinguishedName .
    4. Spustit hledání ADO ADSI a potom projděte sady záznamů každé skupiny PrimaryGroupToken porovnání s hodnotou atributu PrimaryGroupId označuje dříve do mezipaměti.
    5. Pokud je nalezena shoda, zastavit a zobrazit rozlišující název pro tuto skupinu jako primární skupina tohoto uživatele.
    6. Jestliže shoda nalezena, pokračujte opakování prostřednictvím výsledky hledání.
    Výhody této metody jsou ihned zřejmé. Všechny objekty používané nativní ADSI a nevyžadují žádné další součásti. Dále obsahuje výčet pouze těch skupin, které mohou být primární skupina.

    Uvědomte si však následující nevýhody: 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. Následující kód ukazuje, jak lze implementovat předchozí algoritmus:

    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 získáte v následujícím článku znalostní báze Microsoft Knowledge Base:

Jak najít primární skupiny uživatele pomocí atributu PrimaryGroupId označuje 297951

Vlastnosti

ID článku: 321360 - Poslední kontrola: 16. 1. 2017 - Revize: 1

Váš názor