Come utilizzare i componenti ADSI nativi per trovare il gruppo primario

Traduzione articoli Traduzione articoli
Identificativo articolo: 321360 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

In questa pagina

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 & ")"
    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
    					

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

ProprietÓ

Identificativo articolo: 321360 - Ultima modifica: lunedý 3 marzo 2008 - Revisione: 5.0
Le informazioni in questo articolo si applicano a:
  • 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
Chiavi:á
kbmt kbdswadsi2003swept kbinfo KB321360 KbMtit
Traduzione automatica articoli
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
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

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