如何使用 PrimaryGroupID 属性来查找的用户的主要组

文章翻译 文章翻译
文章编号: 297951 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

概要

本文介绍了一种查找用户的主要组的有效方法。

更多信息

背景

本文中介绍的技术开发之前,以确定用户的主要组的唯一方法是执行轻型目录访问协议 (LDAP) 方言 ActiveX 数据对象 (ADO) 查询对 Active Directory 到请求的所有域中, 组对象,然后浏览到要搜索带有匹配用户的 PrimaryGroupID PrimaryGroupToken 组返回的记录集。 此查询可以是非常耗时,具体取决于给定域中的组的数目。

一组对象 PrimaryGroupToken 是一个构造的属性。这意味着属性不存储在 Active Directory 中,但 Active Directory 服务接口 (ADSI) 提供程序在客户端上构造。由于构造的该属性,因此它不能使用 LDAP 查询在一个搜索条件中。

它是可以通过考虑以下为该 primaryGroup 生成安全标识符 (SID):
  • 一组/用户的 SID 在另外的组/用户 RID 包含域的相对标识号 (RID)。 例如,如果此用户是"efg"和域的 RID,此用户的 SID 是 S-1-111-222-333-efg,RID 为 S-1-111-222-333。
  • 用户/组对象上的 PrimaryGroupID 属性保留主要组的 RID。
  • 用户的主要组必须存在于用户的主要域的组。
  • 可以通过串联域 RID 与用户对象的 primaryGroupID 属性生成主要组的 SID。 例如对于域 RID 可能是 S-1-111-222-333 的并且该 primarygroupID 的值可能会 abc。主要组的 SID 都将 S-1-111-222-333-abc。
本文中提供的代码示例阐释了如何通过从其 SID 中删除用户的 RID,然后将它替换 primarygroupID (主要组 RID) 生成的用户的主要组的 SID。 该代码利用 IADsSID 对象 ADsSecurity.dll 文件中实现。ADsSecurity.dll 文件属于 Active Directory 服务接口 (ADSI) 软件开发工具包 (SDK) 2.5。要下载 Active Directory 服务接口 SDK 2.5,请访问下面的 Microsoft 网站:
http://technet.microsoft.com/en-us/library/cc749949.aspx
IADsSID 界面提供了用于将原始 SID 转换通过使用 ConvertSidToStringSid API 的安全描述符定义语言 (SDDL) 形式的可脚本化方法。 此 API 是仅在 Windows 2000 和 Windows Server 2003 上可用。

为了在基于 Windows NT 4.0 的系统上使用此方法必须将原始 SID 转换为通过某种类型的 COM 包装 DLL 使用的字符串对应。 下面的 Microsoft 知识库文章中提供了如何构建一个 SID 的 SDDL 形式页首孤行 NT 4.0 上的一个示例:

286182如何使用 Microsoft Visual Basic 将原始 SID 转换成 String SID

生成的用户主要组的 SID 的步骤

  1. 绑定到用户对象。
  2. 检索 ObjectSID 的用户对象的属性。
  3. 使用 IADsSID 对象要转换到其二进制窗体中的用户的 SID 是 SDDL 形式。
  4. 从 SDDL 形式的 SID 的用户的 RID 关闭最小化。
  5. 检索用户的 PrimaryGroupID 属性并将其转换为无符号的长字符串。
  6. 将该 PrimaryGroupID 的字符串表示形式追加到已修改的用户 SID。
  7. 使用 IADsSID SID 的 SDDL 形式转换为其 Windows NT 或 LDAP ADsPath。
  8. 绑定到该 ADsPath 以检索有关所需的主要组的任何信息。

Visual Basic 脚本,以查找为给定的 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
				

属性

文章编号: 297951 - 最后修改: 2007年1月15日 - 修订: 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?当用于
    • Microsoft Windows NT 4.0
关键字:?
kbmt kbdswadsi2003swept kb32bitonly kbhowto KB297951 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 297951
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

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