Come utilizzare i componenti ADSI nativi per trovare il gruppo primario

Il supporto per Windows Server 2003 è terminato il 14 luglio 2015.

Microsoft ha sospeso il supporto per Windows Server 2003 in data 14 luglio 2015. Questa modifica ha interessato gli aggiornamenti software e le opzioni di sicurezza. Ulteriori informazioni su come continuare a essere protetti.

Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell’utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell’utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.

Clicca qui per visualizzare la versione originale in inglese dell’articolo: 321360
Sommario
In questo articolo viene illustrato come utilizzare componenti nativi di Active Directory Services Interface (ADSI) per determinare l'appartenenza di gruppo primario di un utente.
Informazioni

Come si trova il gruppo primario in un oggetto utente in Active Directory

Ogni oggetto di contesto di protezione (ad esempio utenti e gruppi di protezione) in Active Directory ha un attributo di identificatore (SID, Security Identifier) di protezione associato. Il SID presenta numerosi componenti, come descritto nel riferimento "Componenti SID" incluso nella sezione "Riferimenti" di questo articolo. Due di questi componenti sul SID sono l'identificatore relativo (RID) di dominio e lo specifici RID all'oggetto all'interno del dominio.

Il gruppo primario di un utente viene memorizzato (come RID del gruppo nel dominio dell'utente) per l'attributo PrimaryGroupID di un oggetto utente. Gruppo primario di un utente può essere solo un gruppo di nello stesso dominio dell'utente, e deve essere un gruppo che l'utente è un membro di questo gruppo. Inoltre, questo oggetto di gruppo in Active Directory possiede un attributo denominato PrimaryGroupToken , che memorizza il RID per questo gruppo all'interno del dominio.

Provider sia Windows NT e LDAP (Lightweight Directory Access Protocol) consentono ai programmatori di modificare il gruppo primario di un utente impostando il valore dell'attributo PrimaryGroupID il RID di un gruppo che l'utente è un membro di. Se l'utente non è un membro di un gruppo, PrimaryGroupID dell'utente Impossibile impostare per il RID del gruppo.

Quando utilizza il provider di Windows NT in ADSI, il gruppo primario è incluso come una voce IADsUser::Groups insieme dell'utente.

Con il provider LDAP, il gruppo primario è non incluso come una voce dell'insieme IADsUser::Groups , né è parte del nome distinto (DN) del gruppo dell'attributo MemberOf dell'oggetto utente nella directory. RID del gruppo nel PrimaryGroupID è l'unico punto in cui viene fatto riferimento il gruppo primario per un utente sull'oggetto utente LDAP.

Nessuno dei due provider definisce un meccanismo per determinare il nome del gruppo primario per un utente direttamente dai propri oggetti utente corrispondenti. Il problema viene effettuato anche più complesso dal fatto che ogni oggetto di gruppo fornito da ogni provider supporta un insieme diverso di attributi, come illustrato di seguito:
  • L'oggetto gruppo fornito da Windows NT non supporta l'attributo PrimaryGroupToken , né il provider di Windows NT supporta qualsiasi altro modo per recuperare RID del gruppo utilizzando il codice ADSI nativo.
  • L'attributo di PrimaryGroupToken di un oggetto gruppo di provider LDAP è un attributo calcolato. Questo attributo non esiste sull'oggetto gruppo nella directory. L'attributo è, in effetti, creata quando viene richiesto dal client con una chiamata al metodo IADs::GetInfoEx . Non è possibile eseguire ricerche LDAP in base agli attributi costruiti in Active Directory. Di conseguenza, non è possibile cercare utilizzando il provider di LDAP per un gruppo in base all'attributo di PrimaryGroupToken che corrisponda all'attributo PrimaryGroupID sull'oggetto utente cui gruppo primario che si desidera determinare. Le regole anche una soluzione di ADSI pure che non dipende da un oggetto COM esterno che consentono di determinare il gruppo primario.

Metodi per determinare il gruppo primario di un utente

Di seguito sono tre i metodi conosciuti per determinare il nome del gruppo primario di un utente:
  • Creare un SID in stringa di binding per l'oggetto gruppo in Active Directory dal componente RID del dominio del SID dell'utente e RID del gruppo che presenti l'attributo PrimaryGroupID sull'oggetto utente.

    Questo è il metodo descritto nell'articolo Microsoft Q297951 (incluso nella sezione "Riferimenti" di questo articolo). Il problema principale con questo metodo è che per generare il SID in stringa di associazione, il programmatore deve utilizzino sull'oggetto ADsSID per convertire il descrittore di protezione binario dell'oggetto del dominio in formato SDDL. L'oggetto di ADsSID è ospitato dal file ADsSecurity.dll, che deve essere copiato e registrato sul client prima che il codice può essere eseguito correttamente.
  • Consente di utilizzare una query LDAP per cercare tutti i gruppi in un dominio e restituire l'attributo PrimaryGroupToken .

    Questo metodo è una soluzione LDAP pura. Tuttavia, la soluzione di script non è molto efficiente poiché la ricerca restituisce tutti i gruppi nel dominio, anche quelli che l'utente non è un membro di, e poiché l'attributo PrimaryGroupToken viene creato sul client come set di record viene attraversato, la ricerca è molto lenta. Questo metodo può essere particolarmente tempo se non esistono un numero elevato di gruppi nel dominio. Esempi di come creare query di ADO di sottolinguaggio LDAP abound e di conseguenza, non sono inclusa in questo articolo.
  • Sfruttare le funzionalità di ciascun provider per creare una soluzione ibrida.

    Questa soluzione sfrutta le funzionalità di diversi provider per determinare il gruppo primario dell'utente. Per effettuare questa operazione, attenersi alla seguente procedura:
    1. Consente di associare all'oggetto utente con il provider di Windows NT.

      L'oggetto utente di Windows fornisce un insieme di gruppo che è garantito che contiene il gruppo primario dell'utente. Inoltre, il PrimaryGroupID dell'oggetto utente è stoccaggio memorizzati in una posizione temporanea per l'utilizzo più avanti in questo algoritmo.
    2. Enumerare l'insieme IADsUser::Groups .
    3. Estrarre la proprietà SamAccountName dall'ADsPath per ogni gruppo in questo insieme e generare una stringa di query sottolinguaggio LDAP per cercare tutti i gruppi con la proprietà SamAccountName elencata in questo insieme, restituendo i valori di attributo PrimaryGroupToken e DistinguishedName .
    4. Eseguire la ricerca di ADSI ADO e quindi scorrere il set di record, confronto PrimaryGroupToken di ogni gruppo con il valore di attributo PrimaryGroupID memorizzati nella cache versioni precedenti.
    5. Se si trova una corrispondenza, arrestare e visualizzare il nome distinto per questo gruppo come gruppo primario per questo utente.
    6. Se non si trova una corrispondenza, è necessario continuare scorrono in ciclo i risultati della ricerca.
    I vantaggi di questo metodo sono immediatamente evidenti. Tutte gli oggetti utilizzati sono native di ADSI e non richiedono ulteriori componenti. Inoltre, l'enumerazione include solo i gruppi che potrebbero essere il gruppo primario.

    Si noti tuttavia lo svantaggio seguente: quando viene enumerato l'insieme IADsUser::Groups , l'oggetto restituito è un'interfaccia IADs il membro del gruppo. Se per qualche motivo, l'utente che esegue l'enumerazione non è di autorizzazioni necessari aprire un oggetto particolare, l'enumerazione viene interrotta senza indicante un errore. Nel codice seguente viene illustrato come è possibile implementare l'algoritmo precedente:
    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 & ")"nextQueryFilter = 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, oRecordsetSet oConnection = CreateObject("ADODB.Connection")Set oCommand = CreateObject("ADODB.Command")oConnection.Provider = "ADsDSOObject"oConnection.Open "Active Directory Provider"Set oCommand.ActiveConnection = oConnectionoCommand.CommandText = QueryStringoCommand.Properties("Page Size") = 900Set 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.moveNextWendSet oRecordset = NothingSet oCommand = NothingSet 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					
Riferimenti
Per ulteriori informazioni, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
297951Come utilizzare l'attributo PrimaryGroupID per trovare il gruppo primario per un utente

Avviso: questo articolo è stato tradotto automaticamente

Proprietà

ID articolo: 321360 - Ultima revisione: 03/03/2008 17:30:05 - Revisione: 5.0

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

  • kbmt kbdswadsi2003swept kbinfo KB321360 KbMtit
Feedback