Comment utiliser l'attribut PrimaryGroupID pour trouver le groupe principal d'un utilisateur

Traductions disponibles Traductions disponibles
Numéro d'article: 297951 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

Résumé

Cet article décrit une méthode efficace de trouver le groupe principal d'un utilisateur.

Plus d'informations

Arrière-plan

Avant de la technique décrite dans cet article a été développée, le seul moyen de déterminer le groupe principal d'un utilisateur était pour exécuter une requête LDAP (Lightweight Directory Access Protocol) langage (ActiveX Data Objects) sur Active Directory pour demander de tous les objets de groupe dans le domaine et puis parcourir le jeu d'enregistrements renvoyé pour rechercher le groupe avec un PrimaryGroupToken qui correspondent à la PrimaryGroupID de l'utilisateur. Cette requête peut être très longue, selon le nombre de groupes dans un domaine donné.

Le PrimaryGroupToken d'un objet de groupe est un attribut construit. Cela signifie que l'attribut n'est pas stocké dans l'Active Directory mais est construit sur le client par le fournisseur ADSI (Active Directory Services Interface). Étant donné que l'attribut est construit, il ne peut pas être utilisée dans un critère de recherche dans une requête LDAP.

Il est possible de créer l'identificateur de sécurité (SID) pour le primaryGroup en considérant comme :
  • Le SID pour un groupe/utilisateur est constitué d'identificateur relatif du domaine (RID) ainsi que le maître RID du groupe/utilisateur. Pour exemple, si le SID pour cet utilisateur est S-1-111-222-333-efg, le RID pour cet utilisateur est « efg » et le domaine de RID est S-1-111-222-333.
  • L'attribut PrimaryGroupID sur un objet utilisateur/groupe comporte le RID du groupe principal.
  • Groupe principal de l'utilisateur doit être un groupe qui existe dans le domaine principal l'utilisateur.
  • Le SID pour le groupe principal peut être créée en concaténant le domaine RID avec l'attribut primaryGroupID de l'objet utilisateur. Par exemple, le domaine RID peut être S-1-111-222-333 et la valeur de la primarygroupID peut être abc. Le SID du groupe principal est alors S-1-111-222-333-abc.
Le code fourni dans cet article montre comment créer le SID de groupe principal d'un utilisateur en supprimer RID l'utilisateur de son SID et ensuite remplacer par la primarygroupID (groupe primaire RID). Le code tire parti de l'objet IADsSID implémenté dans le fichier ADsSecurity.dll. Le fichier ADsSecurity.dll fait partie du kit de développement ADSI (Active Directory Service Interfaces) logiciel (SDK) 2.5. Pour télécharger Active Directory Service Interfaces SDK 2.5, reportez-vous au site de Web Microsoft suivant :
http://technet.microsoft.com/en-us/library/cc749949.aspx
L'interface IADsSID fournit une méthode scriptable pour convertir un SID brut dans son format SDDL (Security Descriptor Definition Language) en utilisant l'API ConvertSidToStringSid. Cette API est disponible sur Windows 2000 et Windows Server 2003 uniquement.

Afin que cette méthode à utiliser sur un système Windows NT 4.0, le SID brut doit être converti en son équivalent de chaîne à l'aide d'un type quelconque de wrapper COM DLL. Un exemple illustrant comment créer le formulaire SDDL d'un SID sur Widows NT 4.0 est fourni dans l'article suivant de la base de connaissances Microsoft :

286182 Comment faire pour utiliser Microsoft Visual Basic pour convertir un SID brut en une valeur de type String SID

Étapes pour créer le SID pour le groupe principal d'un utilisateur

  1. Lier à l'objet utilisateur.
  2. Récupérer la propriété ObjectSID de l'objet utilisateur.
  3. Utilisez l'objet IADsSID pour convertir le SID de l'utilisateur de la forme binaire dans est formulaire SDDL.
  4. Supprimer hors RID de l'utilisateur de l'écran SDDL du SID.
  5. Récupération de PrimaryGroupID propriété l'utilisateur et il convertir en une longue chaîne non signée.
  6. Ajouter la représentation de chaîne de la PrimaryGroupID au SID de l'utilisateur modifié.
  7. Utilisez IADsSID pour convertir le formulaire SDDL du SID en son Windows NT ou LDAP ADsPath.
  8. Lier à l'ADsPath pour extraire des qu'informations relatives au groupe principal auquel vous souhaitez.

Script Visual Basic pour trouver le groupe principal d'un ADsPath donnée

'
' 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
				

Propriétés

Numéro d'article: 297951 - Dernière mise à jour: lundi 15 janvier 2007 - Version: 6.2
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Active Directory Service Interfaces 2.5
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
  • Microsoft Visual Basic 6.0 Édition Entreprise 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 sur le système suivant
    • Microsoft Windows NT 4.0
Mots-clés : 
kbmt kbdswadsi2003swept kb32bitonly kbhowto KB297951 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 297951
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

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