Come utilizzare l'attributo PrimaryGroupID per trovare il gruppo primario per un utente

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

In questa pagina

Sommario

Questo articolo viene descritto un metodo efficiente di trovare il gruppo primario di un utente.

Informazioni

Sfondo

Prima è stata sviluppata la tecnica descritta in questo articolo, l'unico modo per determinare il gruppo primario di un utente era per eseguire una query di ActiveX Data Objects (ADO) del sottolinguaggio LDAP (Lightweight Directory Access Protocol) su Active Directory per richiedere tutti gli oggetti gruppo nel dominio e quindi scorrere il recordset restituito per cercare il gruppo con un PrimaryGroupToken corrispondente il PrimaryGroupID dell'utente. Questa query può richiedere molto tempo, in base al numero di gruppi in un determinato dominio.

Il PrimaryGroupToken di un oggetto gruppo è un attributo costruito. Ciò significa che l'attributo non memorizzato in Active Directory, ma viene creato sul client dal provider ADSI (Active Directory Services Interface). Poiché l'attributo viene creato, Impossibile utilizzare in un criterio di ricerca in una query LDAP.

È possibile creare l'identificatore di protezione (SID) per il primaryGroup prendendo in considerazione le seguenti operazioni:
  • Il SID per un gruppo/utente è costituito da identificatore relativo del dominio (RID) più il RID dell'utente/gruppo. Per esempio, se il SID per l'utente è S-1-111-222-333-efg, il RID per questo utente è "efg" e RID del dominio è S-1-111-222-333.
  • L'attributo di PrimaryGroupID su un oggetto utente o il gruppo contiene il RID del gruppo primario.
  • Gruppo primario di un utente deve essere un gruppo di esistente nel dominio principale dell'utente.
  • Il SID per il gruppo primario può essere generato tramite la concatenazione del dominio RID con l'attributo primaryGroupID dell'oggetto utente. Ad esempio, il RID del dominio potrebbe essere S-1-111-222-333 e il valore del primarygroupID potrebbe corrispondere a abc. Il SID del gruppo primario sarà quindi S-1-111-222-333-abc.
Il codice di esempio fornito in questo articolo viene illustrato come generare il SID per il gruppo primario di un utente, rimozione RID dell'utente dal relativo SID e sostituirlo con il primarygroupID (gruppo primario RID). Il codice sfrutta l'oggetto IADsSID implementata nel file ADsSecurity.dll. Il file ADsSecurity.dll fa parte di (Active Directory Service INTERFACES) software development kit (SDK) 2.5. Per scaricare Active Directory Service Interfaces SDK 2.5, il seguente sito Microsoft Web:
http://technet.microsoft.com/en-us/library/cc749949.aspx
L'interfaccia di IADsSID fornisce un metodo di script per la conversione di un SID non elaborato in formato SDDL (Security Descriptor Definition Language) utilizzando l'API ConvertSidToStringSid. Questa API è solo disponibile in Windows 2000 e Windows Server 2003.

Affinché questo metodo per essere utilizzato su un sistema basato su Windows NT 4.0, il SID non elaborato deve essere convertito in un equivalente di stringa mediante l'utilizzo di un tipo di DLL del wrapper COM. Un esempio di come creare form di un SID SDDL in Windows NT 4.0 è fornito nell'articolo della Microsoft Knowledge Base riportato di seguito riportato:

286182Utilizzo di Microsoft Visual Basic per convertire un SID non elaborato in una stringa SID

Procedura per creare il SID per il gruppo primario di un utente

  1. Associare l'oggetto utente.
  2. Recuperare la proprietà ObjectSID dell'oggetto utente.
  3. Utilizzo oggetto IADsSID da convertire il SID dell'utente dal formato binario in è formato SDDL.
  4. Rimuovere la disconnessione RID dell'utente dal modulo SDDL del SID.
  5. Proprietà PrimaryGroupID dell'utente di recuperare e convertirlo in una stringa long senza segno.
  6. Aggiungere la rappresentazione di stringa del PrimaryGroupID il SID utente modificato.
  7. Consente di utilizzare IADsSID per convertire il formato SDDL del SID nel Windows NT o ADsPath LDAP.
  8. Consente di associazione per il valore ADsPath per recuperare le informazioni sul gruppo primario che si desidera.

Visual Basic Script per individuare il gruppo primario per un determinato ADsPath

'
' The following VBS code illustrates how to determine the primary group
' given an ADsPath as a single argument. The script determines if the
' string passed is a WinNT or LDAP path and then uses the appropriate
' method for retrieving the Primary Group path.
'
' ADsSecurity Constants
'
const ADS_SID_RAW         = 0
const ADS_SID_HEXSTRING	  = 1
const ADS_SID_SAM         = 2
const ADS_SID_UPN         = 3
const ADS_SID_SDDL        = 4
const ADS_SID_WINNT_PATH  = 5
const ADS_SID_ACTIVE_DIRECTORY_PATH = 6
const ADS_SID_SID_BINDING = 7
'-------------------------------------------------
' Function StrRID returns and unsigned long of
' the given RID value
' 
' If the most significant bit is set in a VB Long
' then VB will interpret the value as a negative number
' and CStr will convert the unsigned long into a string with a leading
' "-" sign.
'
' This function checks to see if the most significant bit
' is set, then tricks the CStr function into outputting
' and unsigned long value by using a double float value
' to store the RID value, then uses the CStr function to get the
' string version.
'
function StrRID( inVal )
  dim dLocal
  if( (inVal and &H80000000) <> 0 ) then
    dLocal = CDbl((inval and &H7FFFFFFF))
    dLocal = dLocal + 2^31
    StrRID = cstr(dLocal)
  else
    StrRID = Cstr(inVal)
  end if
end function
'=================================================
' Main Script
'
' Assumes that the first argument is a WinNT or
' LDAP user path
'
set args = WScript.Arguments
WScript.Echo "Start: "& Now
set ADsSid = CreateObject("ADsSID")
'
' Determine if we are using the LDAP or WinNT providers
'
userAdsPath = args(0)
if( InStr(userAdsPath,"LDAP") <> 0 ) then
  '
  ' LDAP ADS Path, need to work with the an Active Directory Path
  '
  ADS_SID_Constant = ADS_SID_ACTIVE_DIRECTORY_PATH
else
  '
  ' WinNT Path, working with the WinNT provider
  '
  ADS_SID_Constant = ADS_SID_WINNT_PATH
end if
'  
' Initialize the IADsSID object and retrieve
' the SDDL form of the SID
'
ADsSID.SetAs ADS_SID_Constant, CStr(userADsPath)
DomainSID = ADsSID.GetAs(ADS_SID_SDDL)
'
' We have the SDDL form of the user's SID.
' Remove the user's RID ( the last sub authority)
' up to the "-"
'
DomainSID = mid(DomainSID,1,(InStrREV(DomainSID,"-")))
'
' Bind to the user object to retrieve the PrimaryGroupID.
' Build the SID of the Primary group
' from the domainSID and the Primary Group RID in
' the PrimaryGroupID.
'
set obj = GetObject(userADsPath)
lngGroupID = obj.Get("primaryGroupID")
strGroupRID = StrRID( lngGroupID )
DomainSID = DomainSID & strGroupRID
'
' Use ADsSID to retrieve a WinNT path or 
' a SID Bind string to locate the LDAP path
'
ADsSID.SetAs ADS_SID_SDDL, CStr(DomainSID)
if( ADS_SID_Constant = ADS_SID_ACTIVE_DIRECTORY_PATH ) then
   '
   ' With the LDAP provider, build a SID bind string and
   ' retrieve the Group object via this bind string
   '
   SIDBindStr = ADsSID.GetAs(ADS_SID_HEXSTRING)
   SIDBindStr = "LDAP://<SID=" & SIDBindStr & ">"
   set oGrp = GetObject(SIDBindStr)
   strPrimaryGroupADsPath = oGrp.Get("DistinguishedName")
   set oGrp = Nothing
else
   '
   ' Its a WinNT path, retrieve the ADsPath for the WinNT object
   '
   strPrimaryGroupADsPath = ADsSID.GetAs( ADS_SID_Constant )
end if
WScript.Echo "Primary group ADS Path for user : " & userADsPath
WScript.Echo "Is: " & strPrimaryGroupADsPath
WScript.Echo "Finished: " & Now
				

Proprietà

Identificativo articolo: 297951 - Ultima modifica: lunedì 15 gennaio 2007 - Revisione: 6.2
Le informazioni in questo articolo si applicano a:
  • Microsoft Active Directory Service Interfaces 2.5
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
  • Microsoft Visual Basic 6.0 Enterprise Edition Service Pack 3
  • Microsoft Visual Basic 6.0 Enterprise Edition Service Pack 4
  • Microsoft Visual Basic 6.0 Enterprise Edition Service Pack 5
  • Microsoft Active Directory Client Extension alle seguenti piattaforme
    • Microsoft Windows NT 4.0
Chiavi: 
kbmt kbdswadsi2003swept kb32bitonly kbhowto KB297951 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: 297951
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