Como usar componentes nativos de ADSI para localizar o grupo primário

Traduções deste artigo Traduções deste artigo
ID do artigo: 321360 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Neste artigo

Sumário

Este artigo explica como usar componentes nativos do Active Directory Services Interface (ADSI) para determinar a participação de grupo primário de um usuário.

Mais Informações

Como o grupo primário é armazenado em um objeto de usuário no Active Directory

Cada objeto de contexto de segurança (como usuários e grupos de segurança) no Active Directory tem um atributo de SID (identificador) de segurança associado a ele. O SID tem vários componentes, conforme descrito na referência "SID componentes" incluída na seção "Referência" deste artigo. Dois desses componentes no SID são o identificador de domínio relativo (RID) e o RID específico objeto dentro do domínio.

O grupo primário de um usuário é armazenado (como o RID do grupo no domínio do usuário) no atributo PrimaryGroupID de um objeto de usuário. Grupo primário do usuário só pode ser um grupo que existe no mesmo domínio que o usuário, e esse grupo deve ser um grupo que o usuário é um membro de. Além disso, este objeto de grupo no Active Directory possui um atributo chamado PrimaryGroupToken , que armazena o RID para esse grupo dentro do domínio.

Provedores do Windows NT e (LIGHTWEIGHT Directory Access Protocol) permitem que os programadores a alterar o grupo primário do usuário definindo o valor do atributo PrimaryGroupID como o RID de um grupo que o usuário é um membro de. Se o usuário não é um membro de um grupo, PrimaryGroupID do usuário não pode ser definido como o RID do grupo.

Quando ele usa o provedor do Windows NT no ADSI, o grupo primário é incluído como uma entrada do usuário IADsUser::Groups coleção.

Com o provedor LDAP, o grupo primário é não incluído como uma entrada na coleção IADsUser::Groups nem é parte do nome distinto (DN) do grupo do atributo MemberOf do objeto de usuário no diretório. RID do grupo em PrimaryGroupID é o local somente no qual o grupo primário para um usuário é referenciado no objeto de usuário LDAP.

Nenhum provedor define um mecanismo para determinar o nome do grupo primário para um usuário diretamente de seus objetos de usuário respectivos. O problema é feito ainda mais complexo pelo fato de que cada objeto de grupo fornecido por cada provedor suporta um conjunto diferente de atributos, da seguinte maneira:
  • O objeto de grupo fornecidos pelo Windows NT não suporta o atributo PrimaryGroupToken nem o provedor de Windows NT dá suporte a qualquer outra maneira de recuperar RID do grupo de usando código nativo de ADSI.
  • O atributo PrimaryGroupToken de um objeto de grupo de provedor LDAP é um atributo calculado. Este atributo não existe no objeto de grupo no diretório. O atributo é, na verdade, criado quando é solicitada pelo cliente com uma chamada de método IADs::GetInfoEx . Não é possível executar pesquisas LDAP com base nos atributos construídos no Active Directory. Portanto, não é possível pesquisar usando o provedor LDAP para um grupo com base no atributo PrimaryGroupToken que coincide com o atributo PrimaryGroupID no objeto de usuário cujo grupo primário que você deseja determinar. Isso também regras uma solução ADSI pura que não é dependente de um objeto COM externo para ajudar a determinar o grupo primário.

Formas de determinar o grupo primário de um usuário

A seguir estão três métodos conhecidos para determinar o nome do grupo primário de um usuário:
  • Crie um SID seqüência de ligação para o objeto de grupo no Active Directory do componente RID do domínio de RID do grupo armazenados no atributo a PrimaryGroupID no objeto de usuário e o SID do usuário.

    Este é o método descrito no artigo Microsoft Q297951 (incluído na seção "Referência" deste artigo). O principal problema com esse método é que, para criar o SID seqüência de ligação, o programador deve contar com o objeto ADsSID para converter o descritor de binários de segurança do objeto de domínio em seu formulário SDDL. O objeto ADsSID é hospedado pelo arquivo ADsSecurity.dll, que deve ser copiado para e registrado no cliente antes que o código pode ser executado com êxito.
  • Use uma consulta LDAP para procurar por todos os grupos em um domínio e retornar seu atributo PrimaryGroupToken .

    Esse método é uma solução LDAP pura. No entanto, a solução de script não é muito eficiente porque esta pesquisa retorna todos os grupos no domínio, mesmo aqueles que o usuário não é um membro do; e como o atributo PrimaryGroupToken é construído no cliente como o conjunto de registros é partilhado com, esta pesquisa é muito lenta. Esse método pode ser muito demorado se houver um grande número de grupos no domínio. Exemplos de como criar consultas ADO LDAP dialeto abound e, portanto, não são incluídas neste artigo.
  • Aproveite os recursos de cada provedor para criar uma solução híbrida.

    Esta solução aproveita os recursos de diferentes provedores para determinar o grupo primário do usuário. Para fazer isso, execute as seguintes etapas:
    1. Vincular a no objeto de usuário com o provedor do Windows NT.

      O objeto de usuário do Windows NT fornece uma coleção de grupo é garantida para conter o grupo primário do usuário. Além disso, o PrimaryGroupID do objeto de usuário é armazenado fora em um local temporário para uso posterior nesse algoritmo.
    2. Enumere a coleção IADsUser::Groups .
    3. Extrair a propriedade SamAccountName o ADsPath para cada grupo neste conjunto e em seguida, crie uma seqüência de consulta LDAP dialeto para procurar por todos os grupos com a propriedade SamAccountName listada nesta coleção, retornando seus valores de atributo PrimaryGroupToken e DistinguishedName .
    4. Execute a pesquisa de ADSI ADO e, em seguida, percorra o conjunto de registro, comparando PrimaryGroupToken cada grupo com o valor de atributo PrimaryGroupID armazenados em cache anteriormente.
    5. Se você encontrar uma correspondência, parar e exibir o nome distinto para este grupo como grupo primário para este usuário.
    6. Se você não encontrar uma correspondência, continue loop o resultado da pesquisa.
    As vantagens desse método são imediatamente óbvias. Todos os objetos usados são nativos a ADSI e não exigem componentes adicionais. Além disso, a enumeração inclui apenas daqueles grupos que podem ser o grupo primário.

    No entanto, observe a seguir desvantagem: quando a coleção IADsUser::Groups é enumerada, o objeto retornado é uma interface IADs para o membro do grupo. Se, por algum motivo, o usuário executar a enumeração não tiver as permissões necessárias para abrir um objeto específico, a enumeração interrompe sem indicando um erro. O código a seguir ilustra como você pode implementar o 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
    					

Referências

Para obter mais informações, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
297951Como usar o atributo PrimaryGroupID para localizar o grupo primário de um usuário

Propriedades

ID do artigo: 321360 - Última revisão: segunda-feira, 3 de março de 2008 - Revisão: 5.0
A informação contida neste artigo aplica-se 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
Palavras-chave: 
kbmt kbdswadsi2003swept kbinfo KB321360 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 321360

Submeter comentários

 

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