Cómo utilizar el atributo PrimaryGroupID para buscar el grupo principal de un usuario

Seleccione idioma Seleccione idioma
Id. de artículo: 297951 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

Este artículo describe un método eficaz de encontrar el grupo principal de un usuario.

Más información

Fondo

Antes de que se desarrolló la técnica descrita en este artículo, la única forma para determinar el grupo principal del usuario era realizar una consulta de ActiveX Data Objects (ADO) de dialecto de Protocolo ligero de acceso a directorios (LDAP) en Active Directory para solicitar todos los objetos grupo en el dominio y, a continuación, examinar el conjunto de registros devuelto para buscar el grupo con un PrimaryGroupToken que coincidan con PrimaryGroupID del usuario. Esta consulta puede llevar mucho tiempo, dependiendo del número de grupos en un dominio dado.

PrimaryGroupToken de un objeto de grupo es un atributo construido. Esto significa que el atributo no está almacenado en Active Directory, pero se construye en el cliente por el proveedor de interfaz de servicios de Active Directory (ADSI). Porque el atributo se construye, no se puede utilizar un criterio de búsqueda en una consulta LDAP.

Es posible crear el identificador de seguridad (SID) para el primaryGroup teniendo en cuenta lo siguiente:
  • El SID para un usuario de grupo consta de identificadores relativos del dominio (RID) más el RID del grupo o usuario. Por ejemplo, si el SID para este usuario es S-1-111-222-333-efg, el RID para este usuario es "efg" y de RID del dominio es S-1-111-222-333.
  • El atributo PrimaryGroupID en un objeto de usuario o grupo contiene el RID del grupo principal.
  • Grupo principal del usuario debe ser un grupo que existe en el dominio principal del usuario.
  • El SID para el grupo principal se puede generar concatenando el RID del dominio con el atributo de primaryGroupID del objeto de usuario. Por ejemplo, el RID del dominio se puede convertir S-1-111-222-333 y el valor de la primarygroupID podría ser abc. El SID del grupo principal, a continuación, sería S-1-111-222-333-abc.
El código de ejemplo proporcionado en este artículo muestra cómo generar al SID para el grupo principal de un usuario, se quitan RID del usuario de su SID y reemplazando después con la primarygroupID (grupo RID principal). El código aprovecha el objeto IADsSID implementado en el archivo ADsSecurity.dll. El archivo ADsSecurity.dll es parte del kit de desarrollo de software (SDK) 2.5 de interfaces de servicio de Active Directory (ADSI). Para descargar 2.5 de Active Directory Service Interfaces SDK, visite el siguiente sitio Web de Microsoft:
http://technet.microsoft.com/en-us/library/cc749949.aspx
La interfaz IADsSID proporciona un método de secuencias de comandos para convertir a un SID sin formato en su formulario de lenguaje de definición de descriptores de seguridad (SDDL) mediante la API ConvertSidToStringSid. Esta API sólo está disponible en Windows 2000 y Windows Server 2003.

En orden para este método para usarse en un sistema basado en Windows NT 4.0, se debe convertir el SID original en su equivalente de cadena mediante el uso de algún tipo de contenedor COM DLL. Un ejemplo de cómo generar el formulario SDDL de un SID en Windows NT 4.0 se proporciona en el siguiente artículo de Microsoft Knowledge Base:

286182Cómo utilizar Microsoft Visual Basic para convertir a un SID RAW en una cadena SID

Pasos para crear al SID para el grupo principal de un usuario

  1. Enlazar con el objeto de usuario.
  2. Recupere la propiedad ObjectSID del objeto de usuario.
  3. El objeto de IADsSID para convertir al SID del usuario de su forma binaria en uso es formulario SDDL.
  4. Quitar los RID del usuario desde el formulario SDDL del SID.
  5. Recuperar PrimaryGroupID propiedad del usuario y convertirlo en una cadena larga sin signo.
  6. Anexar la representación de cadena de la PrimaryGroupID al SID de usuario modificado.
  7. Utilice IADsSID para convertir el formato SDDL el SID en su Windows NT o ADsPath LDAP.
  8. Enlazar el ADsPath para recuperar cualquier información sobre el grupo principal que desee.

Visual Basic Script para encontrar el grupo principal para un determinado 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
				

Propiedades

Id. de artículo: 297951 - Última revisión: lunes, 15 de enero de 2007 - Versión: 6.2
La información de este artículo se refiere a:
  • Microsoft Active Directory Service Interfaces 2.5
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
  • Service Pack 3 de Microsoft Visual Basic 6.0 Enterprise Edition
  • Service Pack 4 de Microsoft Visual Basic 6.0 Enterprise Edition
  • Microsoft Visual Basic 6.0 Enterprise Edition Service Pack 5
  • Microsoft Active Directory Client Extension sobre las siguientes plataformas
    • Microsoft Windows NT 4.0
Palabras clave: 
kbmt kbdswadsi2003swept kb32bitonly kbhowto KB297951 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 297951

Enviar comentarios

 

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