Cómo utilizar componentes nativos de ADSI para encontrar el grupo principal

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

En esta página

Resumen

En este artículo explica cómo utilizar componentes nativos de interfaz de servicios de Active Directory (ADSI) para determinar la pertenencia de grupo principal de un usuario.

Más información

Cómo el grupo principal se almacena en un objeto de usuario en Active Directory

Cada objeto de contexto de seguridad (como usuarios y grupos de seguridad) en Active Directory tiene un atributo de identificador (SID) de seguridad asociado con él. El SID tiene varios componentes, como se describe en la referencia de "Componentes de SID" incluida en la sección "Referencias" de este artículo. Dos de estos componentes en el SID son el identificador relativo (RID) de dominio y el específico RID al objeto dentro del dominio.

El grupo principal de un usuario se almacena (como RID del grupo en dominio del usuario) en el atributo PrimaryGroupID de un objeto de usuario. Grupo principal de un usuario sólo puede ser un grupo que existe en el mismo dominio que el usuario, y este grupo tiene que ser un grupo que el usuario es un miembro de. Además, este objeto de grupo en Active Directory tiene un atributo denominado PrimaryGroupToken , que almacena el RID para este grupo dentro del dominio.

Proveedores de Windows NT y Protocolo ligero de acceso a directorios (LDAP) permiten a los programadores cambiar grupo principal del usuario si establece el valor del atributo PrimaryGroupID en el RID de un grupo que el usuario es un miembro de. Si el usuario no es un miembro de un grupo, PrimaryGroupID del usuario no puede establecerse en el RID del grupo.

Cuando utiliza el proveedor de Windows NT en ADSI, el grupo principal se incluye como una entrada de colección de IADsUser::Groups del usuario.

Con el proveedor LDAP, el grupo principal es no se incluye como una entrada en la colección IADsUser::Groups ni es parte de nombre completo (DN) del grupo del atributo MemberOf del objeto de usuario en el directorio. RID del grupo en el PrimaryGroupID es el lugar sólo en el que se hace referencia el grupo principal para un usuario en el objeto de usuario LDAP.

Ningún proveedor define un mecanismo para determinar el nombre del grupo principal para un usuario directamente desde sus objetos de usuario respectivos. El problema se hace aún más complejo en el hecho de que cada objeto de grupo proporcionado por cada proveedor admite un conjunto diferente de atributos, como sigue:
  • El objeto de grupo proporcionado por Windows NT no admite el atributo PrimaryGroupToken ni el proveedor de Windows NT admite cualquier otra forma de recuperar RID del grupo mediante código nativo de ADSI.
  • El atributo de PrimaryGroupToken de un objeto de grupo del proveedor LDAP es un atributo calculado. Este atributo no existe en el objeto de grupo en el directorio. El atributo es, de hecho, crean cuando se solicita el cliente con una llamada de método IADs::GetInfoEx . No es posible realizar búsquedas LDAP basadas en atributos construidos en Active Directory. Por lo tanto, no puede buscar mediante el proveedor LDAP para un grupo de basándose en el atributo PrimaryGroupToken que coincide con el atributo PrimaryGroupID en el objeto de usuario cuyo grupo principal que desea determinar. Esta regla también una solución de ADSI pura que no es dependiente de un objeto COM externo para ayudarle a determinar el grupo principal.

Formas de determinar el grupo principal de un usuario

Existen tres métodos conocidos para determinar el nombre del grupo principal de un usuario:
  • Generar a un SID de cadena de enlace para el objeto de grupo en Active Directory desde el componente dominio RID del SID del usuario y RID del grupo almacenados en el atributo PrimaryGroupID en el objeto de usuario.

    Éste es el método descrito en artículo de Microsoft KB Q297951 (incluido en la sección "Referencia" de este artículo). El principal problema con este método es que para generar al SID de cadena de enlace, el programador debe confiar en el objeto ADsSID para convertir el descriptor de seguridad binario del objeto de dominio en su formato SDDL. El objeto ADsSID está alojado por el archivo ADsSecurity.dll, que se debe copiar a y registrado en el cliente antes de ejecutar el código correctamente.
  • Utilice una consulta LDAP para buscar todos los grupos de un dominio y devolver su atributo PrimaryGroupToken .

    Este método es una solución pura de LDAP. Sin embargo, la solución de secuencias de comandos no es muy eficaz porque esta búsqueda devuelve cada grupo en el dominio, incluso aquellos que el usuario no es un miembro de; y porque el atributo PrimaryGroupToken se construye en el cliente como recorre el conjunto de registros, esta búsqueda es bastante lenta. Este método puede ser especialmente mucho tiempo si hay un gran número de grupos del dominio. Ejemplos de cómo crear consultas de ADO de dialecto LDAP abundan y, por lo tanto, no se incluyen en este artículo.
  • Aprovechar las características de cada proveedor para crear una solución híbrida.

    Esta solución aprovecha las características de los diferentes proveedores para determinar el grupo principal del usuario. Para ello, siga estos pasos:
    1. Enlazar al objeto de usuario con el proveedor de Windows NT.

      El objeto de usuario de Windows proporciona una colección de grupo que se garantiza que contiene el grupo principal del usuario. Además, el PrimaryGroupID del objeto de usuario se almacena inmediatamente en una ubicación temporal para utilizarlo más adelante en este algoritmo.
    2. Enumerar la colección IADsUser::Groups .
    3. Extraiga la propiedad SamAccountName desde el ADsPath de cada grupo en esta colección y, a continuación, generar una cadena de consulta de dialecto LDAP para buscar todos los grupos con la propiedad SamAccountName enumerada en esta colección y devuelve los valores de atributo PrimaryGroupToken y DistinguishedName .
    4. Ejecute la búsqueda de ADSI de ADO y, a continuación, recorrer el conjunto de registro, comparación de cada grupo PrimaryGroupToken con el valor de atributo PrimaryGroupID caché anteriormente.
    5. Si encuentra a una coincidencia, detener y mostrar el nombre completo para este grupo como el grupo primario para este usuario.
    6. Si no encuentra a una coincidencia, continúe recorriendo el resultado de la búsqueda.
    Las ventajas de este método son inmediatamente obvias. Todos los objetos utilizados son nativos de ADSI y no requieren componentes adicionales. Además, la enumeración incluye sólo los grupos que pueden ser el grupo principal.

    Sin embargo, tenga en cuenta la desventaja siguiente: cuando se enumera la colección IADsUser::Groups , el objeto devuelto es una interfaz IADs para el miembro del grupo. Si, por algún motivo, el usuario que realiza la enumeración no tiene los permisos necesarios abrir un objeto determinado, la enumeración se detiene sin indicar un error. El código siguiente muestra cómo puede implementar el algoritmo anterior:
    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
    					

Referencias

Para obtener más información, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
297951Cómo utilizar el atributo PrimaryGroupID para buscar el grupo principal de un usuario

Propiedades

Id. de artículo: 321360 - Última revisión: lunes, 3 de marzo de 2008 - Versión: 5.0
La información de este artículo se refiere 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
Palabras clave: 
kbmt kbdswadsi2003swept kbinfo KB321360 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): 321360

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