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

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

Neste artigo

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:
http://technet.microsoft.com/en-us/library/cc749949.aspx
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         = 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
				

Propriedades

ID do artigo: 297951 - Última revisão: segunda-feira, 15 de janeiro de 2007 - Revisão: 6.2
A informação contida neste artigo aplica-se a:
  • 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 nas seguintes plataformas
    • Microsoft Windows NT 4.0
Palavras-chave: 
kbmt kbdswadsi2003swept kb32bitonly kbhowto KB297951 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: 297951

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