Você está offline; aguardando reconexão

Como usar o atributo PrimaryGroupID para localizar o grupo primário de um usuário

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: 297951
Sumário
Este artigo descreve um método eficiente de encontrar o grupo primário de um usuário.
Mais Informações

Plano de fundo

Antes da técnica descrita neste artigo foi desenvolvida, a única maneira para determinar o grupo primário do usuário era executar uma consulta de ActiveX Data Objects (ADO) do dialeto (LIGHTWEIGHT Directory Access Protocol) contra o Active Directory para solicitar todos os objetos grupo no domínio e, em seguida, procurar por meio do conjunto de registros retornado para procurar o grupo com um PrimaryGroupToken correspondência PrimaryGroupID do usuário. Esta consulta pode ser muito demorada, dependendo do número de grupos em um determinado domínio.

PrimaryGroupToken de um objeto de grupo é um atributo construído. Isso significa que o atributo não é armazenado no Active Directory, mas é construído no cliente pelo provedor de ADSI (Active Directory Services Interface). Porque o atributo é construído, ele não pode ser usado em um critério de pesquisa em uma consulta LDAP.

É possível criar o identificador de segurança (SID) para o primaryGroup considerando o seguinte:
  • O SID para um grupo/usuário consiste identificador relativo do domínio (RID) mais o RID do usuário/grupo. Por exemplo, se o SID para este usuário é S-1-111-222-333-efg, o RID para esse usuário é "efg" e RID do domínio está S-1-111-222-333.
  • O atributo PrimaryGroupID em um objeto de usuário/grupo contém o RID do grupo primário.
  • Grupo primário do usuário deve ser um grupo que existe no domínio primário do usuário.
  • O SID para o grupo primário pode ser criado pela concatenação do RID do domínio com o atributo primaryGroupID do objeto de usuário. Por exemplo, o RID do domínio poderia ser S-1-111-222-333 e o valor da primarygroupID poderia ser abc. O SID do grupo primário, em seguida, seria S-1-111-222-333-abc.
O código de exemplo fornecido neste artigo ilustra como criar o SID para o grupo primário de um usuário removendo RID do usuário de seu SID e substituí-lo com primarygroupID (grupo primário RID). O código aproveita o objeto IADsSID implementado no arquivo ADsSecurity.dll. O arquivo ADsSecurity.dll é parte do Active Directory Service Interfaces (ADSI) software development kit (SDK) 2.5. Para baixar o Active Directory Service Interfaces SDK 2.5, visite o seguinte site da Microsoft: A interface IADsSID fornece um método para converter um SID bruto em seu formulário SDDL (Security Descriptor Definition Language) usando a API ConvertSidToStringSid programável. Essa API só está disponível no Windows 2000 e no Windows Server 2003.

Em ordem para este método a ser usado em um sistema baseado no Windows NT 4.0, o SID bruto deve ser convertido em sua contraparte de seqüência de caracteres através do uso de algum tipo de wrapper COM DLL. Um exemplo de como criar o formulário SDDL de um SID no Windows NT 4.0 é fornecido no seguinte artigo da Base de dados de Conhecimento Microsoft:

286182Como usar o Microsoft Visual Basic para converter um SID bruto em uma cadeia de caracteres SID

Etapas para criar o SID para o grupo primário de um usuário

  1. Ligar ao objeto usuário.
  2. Recupere a propriedade ObjectSID do objeto de usuário.
  3. O objeto IADsSID para converter o SID do usuário de seu formato binário em uso é formulário SDDL.
  4. Remover logoff RID do usuário do formulário SDDL do SID.
  5. Recuperar a propriedade de PrimaryGroupID do usuário e o convertemos em uma seqüência de caracteres longa não assinada.
  6. Acrescente a representação de seqüência de caracteres da PrimaryGroupID o SID do usuário modificado.
  7. Use IADsSID para converter o formulário SDDL do SID em seu Windows NT ou o ADsPath LDAP.
  8. Vincule o ADsPath para recuperar as informações sobre o grupo primário que você deseja.

Script do Visual Basic para localizar o grupo primário para um dado 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         = 0const ADS_SID_HEXSTRING	  = 1const ADS_SID_SAM         = 2const ADS_SID_UPN         = 3const ADS_SID_SDDL        = 4const ADS_SID_WINNT_PATH  = 5const ADS_SID_ACTIVE_DIRECTORY_PATH = 6const 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 ifend function'=================================================' Main Script'' Assumes that the first argument is a WinNT or' LDAP user path'set args = WScript.ArgumentsWScript.Echo "Start: "& Nowset 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_PATHelse  '  ' WinNT Path, working with the WinNT provider  '  ADS_SID_Constant = ADS_SID_WINNT_PATHend 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 = Nothingelse   '   ' Its a WinNT path, retrieve the ADsPath for the WinNT object   '   strPrimaryGroupADsPath = ADsSID.GetAs( ADS_SID_Constant )end ifWScript.Echo "Primary group ADS Path for user : " & userADsPathWScript.Echo "Is: " & strPrimaryGroupADsPathWScript.Echo "Finished: " & Now				

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 297951 - Última Revisão: 01/15/2007 09:08:14 - Revisão: 6.2

Microsoft Active Directory Service Interfaces 2.5, Microsoft Visual Basic Enterprise Edition for Windows 6.0, Microsoft Visual Basic 6.0 Enterprise Edition Service Pack 3, Microsoft Visual Basic 6.0 Enterprise Edition Service Pack 4, Microsoft Visual Basic 6.0 Enterprise Edition Service Pack 5, Microsoft Active Directory Client Extension

  • kbmt kbdswadsi2003swept kb32bitonly kbhowto KB297951 KbMtpt
Comentários
lay:none;" onerror="var m=document.createElement('meta');m.name='ms.dqp0';m.content='true';document.getElementsByTagName('head')[0].appendChild(m);" onload="var m=document.createElement('meta');m.name='ms.dqp0';m.content='false';document.getElementsByTagName('head')[0].appendChild(m);" src="http://c1.microsoft.com/c.gif?">