Você está offline; aguardando reconexão

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

O suporte para o Windows Server 2003 termina em 14 de julho de 2015.

A Microsoft terminou o suporte para o Windows Server 2003 em 14 de julho de 2015. Esta alteração afetou as suas atualizações de software e opções de segurança. Saiba o que isto significa para você e como permanecer protegido.

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
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 & ")"nextQueryFilter = 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, oRecordsetSet oConnection = CreateObject("ADODB.Connection")Set oCommand = CreateObject("ADODB.Command")oConnection.Provider = "ADsDSOObject"oConnection.Open "Active Directory Provider"Set oCommand.ActiveConnection = oConnectionoCommand.CommandText = QueryStringoCommand.Properties("Page Size") = 900Set 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.moveNextWendSet oRecordset = NothingSet oCommand = NothingSet 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

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 321360 - Última Revisão: 03/03/2008 17:30:05 - Revisão: 5.0

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

  • kbmt kbdswadsi2003swept kbinfo KB321360 KbMtpt
Comentários
html>