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

Résumé

Cet article décrit une méthode efficace de recherche du groupe principal d’un utilisateur.

Plus d'informations

Arrière-plan

Avant la technique décrite dans cet article a été développée, le seul moyen de déterminer le groupe principal d’un utilisateur a été pour exécuter une requête d’objets ADO (ActiveX Data Objects) de dialecte Lightweight Directory Access Protocol (LDAP) sur Active Directory et demande à tous les objets de groupe dans le domaine, puis parcourir l’objet recordset retourné pour rechercher le groupe avec un PrimaryGroupToken qui correspond à la PrimaryGroupID de l’utilisateur. Cette requête peut prendre beaucoup de temps, en fonction du nombre de groupes dans un domaine donné.

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

Il est possible de générer l’identificateur de sécurité (SID) pour le primaryGroup en prenant en compte les éléments suivants :

  • Le SID de l’utilisateur ou le groupe est constitué identificateur relatif du domaine (RID) ainsi que le RID de l’utilisateur ou le groupe. Par exemple, si le SID de cet utilisateur est S-1-111-222-333-efg, le RID pour cet utilisateur est « efg » et RID du domaine est S-1-111-222-333.
  • L’attribut PrimaryGroupID sur un objet de groupe d’utilisateurs conserve le RID du groupe principal.
  • Groupe principal d’un utilisateur doit être un groupe qui existe dans le domaine de l’utilisateur principal.
  • Le SID du groupe primaire peut être construit en concaténant le RID du domaine avec l’attribut primaryGroupID de l’objet utilisateur. Par exemple, le RID du domaine peut être S-1-111-222-333 et la valeur de la primarygroupID pourrait être abc. Le SID du groupe primaire serait alors S-1-111-222-333-abc.
L’exemple de code fourni dans cet article illustre comment générer le SID pour le groupe principal d’un utilisateur en supprimant des RID de l’utilisateur à partir de son SID, puis le remplaçant par le primarygroupID (groupe principal 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 (SDK) 2.5 Active Directory Service Interfaces (ADSI). Pour télécharger l’Active Directory Service Interfaces SDK 2.5, visitez le site Web de Microsoft à l’adresse suivante :

L’interface de IADsSID fournit une méthode contenant un script pour la conversion d’un SID brut dans son formulaire de descripteur définition du langage SDDL (Security) à l’aide de l’API ConvertSidToStringSid. Cette API est uniquement disponible sur Windows 2000 et Windows Server 2003.

Dans l’ordre de cette méthode peut être utilisée sur un système basé sur Windows NT 4.0, le SID brut doit être converti dans son équivalent de la chaîne à l’aide d’un type de wrapper de COM DLL. Un exemple de génération de la forme SDDL d’un SID de Windows NT 4.0 est fourni dans l’article suivant de la Base de connaissances Microsoft :

286182 comment utiliser Microsoft Visual Basic pour convertir un brut SID en SID chaîne

Étapes pour construire 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 à partir de sa forme binaire en est la forme SDDL.
  4. Retirez le RID de l’utilisateur à partir de la forme SDDL de l’identificateur de sécurité.
  5. Récupérer la propriété PrimaryGroupID de l’utilisateur et le convertir en une chaîne de type long non signée.
  6. Ajoutez la représentation sous forme de chaîne de la PrimaryGroupID pour le SID de l’utilisateur modifié.
  7. IADsSID permet de convertir la forme SDDL du SID dans son chemin ADsPath LDAP ou de Windows NT.
  8. Lier à l’attribut ADsPath pour récupérer les informations sur le groupe principal que vous souhaitez.

Script Visual Basic pour localiser le groupe principal d’un ADsPath donné

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

ID d'article : 297951 - Dernière mise à jour : 26 janv. 2017 - Révision : 1

Commentaires