Como utilizar o atributo PrimaryGroupID para localizar o grupo primário de um utilizador

Traduções de Artigos Traduções de Artigos
Artigo: 297951 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sumário

Este artigo descreve um método eficiente para localizar o grupo primário de um utilizador.

Mais Informação

Fundo

Antes da técnica descrita neste artigo foi desenvolvida, a única forma para determinar o grupo primário do utilizador era para executar uma consulta de ActiveX Data Objects (ADO) dialecto (LIGHTWEIGHT Directory Access Protocol) no Active Directory para pedir todos os objectos grupo no domínio e, em seguida, procurar o conjunto de registos devolvido para procurar o grupo com um PrimaryGroupToken correspondentes PrimaryGroupID do utilizador. Esta consulta pode ser muito morosa, dependendo do número de grupos num determinado domínio.

PrimaryGroupToken de um objecto de grupo é um atributo construído. Isto significa que o atributo não é armazenado no Active Directory mas criado no cliente pelo fornecedor de interfaces de serviços do Active Directory (ADSI). Porque o atributo é construído, não pode ser utilizado num critério de procura numa consulta LDAP.

É possível criar o identificador de segurança (SID) para o primaryGroup tendo em consideração o seguinte:
  • O SID para um grupo/utilizador consiste identificador relativo do domínio de (RID) mais o RID, RELATIVE do grupo/utilizador. Por exemplo, se o SID para este utilizador S-1-111-222-333-efg, o RID para este utilizador é "efg" e RID do domínio é S-1-111-222-333.
  • O atributo PrimaryGroupID num objecto de utilizador/grupo mantém o RID do grupo primário.
  • Grupo primário do utilizador tem de ser um grupo existente no domínio principal do utilizador.
  • O SID para o grupo primário pode ser criado através da concatenação o RID do domínio com o atributo primaryGroupID do objecto de utilizador. Por exemplo, o RID do domínio poderia ser S-1-111-222-333 e o valor de 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 mostra como criar o SID para o grupo primário de um utilizador removendo RID o utilizador a partir do respectivo SID e, em seguida, substituindo-primarygroupID (grupo de principal RID). O código tira partido do objecto IADsSID implementado no ficheiro ADsSecurity.dll. O ficheiro ADsSecurity.dll faz parte de interfaces de serviço do Active Directory (ADSI) software development kit (SDK) 2.5. Para transferir o Active Directory Service Interfaces SDK 2.5, visite o seguinte Web site da Microsoft:
http://technet.microsoft.com/en-us/library/cc749949.aspx
A interface IADsSID fornece um método de script para converter um SID não processado para o formato de idioma de definição de descritor de segurança (SDDL) utilizando a API ConvertSidToStringSid. Esta API só está disponível no Windows 2000 e Windows Server 2003.

De forma a este método a ser utilizado um sistema baseado no Windows NT 4.0, é necessário converter o SID não processado para respectivo equivalente de cadeia através da utilização de algum tipo de mensagem publicitária COM DLL. Um exemplo de como criar o formato SDDL de um SID no Widows NT 4.0 é fornecido no seguinte artigo da base de dados de conhecimento da Microsoft:

286182Como utilizar o Microsoft Visual Basic para converter um SID RAW numa cadeia SID

Passos para criar o SID do grupo primário de um utilizador

  1. Ligar o objecto de utilizador.
  2. Obter a propriedade ObjectSID do objecto de utilizador.
  3. Utilizar o objecto IADsSID para converter o SID do utilizador do respectivo formato binário para é formato SDDL.
  4. Faixa desactivar RID do utilizador do formulário SDDL do SID.
  5. Obter propriedade de PrimaryGroupID do utilizador e convertê-la para uma cadeia de longa não assinada.
  6. Acrescente a representação de cadeia do PrimaryGroupID o SID do utilizador modificado.
  7. Utilize IADsSID para converter o formato SDDL do SID para o Windows NT ou o ADsPath LDAP.
  8. Ligar o ADsPath para obter as informações sobre o grupo primário que pretende.

Script de 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

Artigo: 297951 - Última revisão: 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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