如何才能找到主组中使用本机的 ADSI 组件

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

本文内容

概要

本文介绍了如何使用本机的 Active Directory 服务接口 (ADSI) 组件以确定用户的主要组成员身份。

更多信息

主要组在 ds 中的用户对象上的存储方式

在 ds 中的每个安全上下文对象 (如用户和安全组) 都有一个与其关联的安全标识符 (SID) 属性。SID 组件引用包括在本文的"参考"部分中所述,SID 具有几个的组件。这些组件上 SID 的两个是域相对标识符 (RID) 和 RID 特定于域中对象。

用户的主要组 (作为组的用户的域中的 RID) 存储在用户对象的 PrimaryGroupID 属性上。用户的主要组只能是一组用户,相同的域中存在,并且此组是组的成员的用户。此外,在 ds 中的此 对象都有一个称为 PrimaryGroupToken,它存储了域内此组的 RID 的属性。

Windows 2000 及轻型目录访问协议 (LDAP) 提供程序允许程序员通过 PrimaryGroupID 属性值设置为该用户是的成员的组的 RID 更改用户的主要组。如果用户不是组的成员,则用户的 PrimaryGroupID 不能设置为组的 RID。

在 ADSI 中,它使用 Windows NT 提供程序,主要组时作为用户的 IADsUser::Groups 集合中的项。

与 LDAP 提供程序主要组是 包含 IADsUser::Groups 集合中的项目,也不是组的可分辨名称 (DN) 一部分的目录中的用户对象 MemberOf 属性。在 $ PrimaryGroupID 中的组的 RID 是 LDAP 用户对象,所引用的用户主要组的唯一位置。

这两个提供程序定义了一种机制,以确定用户直接从其各自的用户对象的主要组的名称。由每个提供商提供的每个组对象,如下所示支持一组不同的属性,事实甚至更复杂问题:
  • 提供 Windows NT 组对象不支持 PrimaryGroupToken 属性,也不 Windows NT 提供程序不支持通过使用 ADSI 的本机代码检索组的 RID 的任何其他方式一次。
  • LDAP 提供程序组对象的 PrimaryGroupToken 属性是计算的属性。在目录中的组对象上不存在此属性。它一种 IADs::GetInfoEx 的方法调用与客户端请求时,事实上,是,创建属性。 不能执行基于在 ds 中构造的属性的 LDAP 搜索。因此,不能通过为基于 PrimaryGroupToken 属性匹配 PrimaryGroupID 属性,您需要确定其主要组在用户对象上的一组使用 LDAP 提供程序进行搜索。这还出纯 ADSI 解决方案不依赖于外部 COM 对象以帮助您确定主要组的规则。

方法来确定用户的主要组

以下是确定用户的主要组的名称已知的三种方法:
  • 从域的 RID 的组件的用户的 SID 和存储在用户对象上的 PrimaryGroupID 属性上的组的 RID 的 Active Directory 中组对象的绑定字符串生成一个 SID。

    这是在 Microsoft 知识库文章 Q297951 (包含在本文的"参考"部分中) 中所述的方法。使用此方法,主要问题是生成 SID 绑定字符串,程序员必须依赖 ADsSID 对象将转换成其 SDDL 形式的域对象的二进制安全描述符。ADsSID 对象所承载的必须复制到并成功运行代码之前在客户端上注册了 ADsSecurity.dll 文件。
  • 若要搜索的域中的所有组并返回其 PrimaryGroupToken 属性使用 LDAP 查询。

    此方法是纯的 LDAP 解决方案。但是,脚本的解决方案并不很有效,因为此搜索返回的每个组,即使用户不是的 ; 成员,并根据遍历记录集是在客户端上构造 PrimaryGroupToken 属性,因为此搜索是非常慢到域中。此方法可以是非常耗时如果有大量的域中的组。 示例,说明如何创建 LDAP 方言 ADO 查询大量,并因此,它们不包括在此项目中。
  • 利用生成混合解决方案的每个提供程序的功能。

    本解决方案利用不同的提供程序,以确定用户的主要组的功能。若要这样做,请按照下列步骤操作:
    1. 与 Windows NT 提供程序,将绑定到用户对象。

      Windows NT 用户对象提供了一个组集合,它将保证包含用户的主要组。此外,在更高版本在这种算法中使用一个临时位置即可存储的用户对象的 PrimaryGroupID
    2. 枚举 IADsUser::Groups 集合。
    3. 从此集中的每个组的 ADsPath 提取 SamAccountName 属性,然后生成与 SamAccountName 属性列出此集合中返回其 PrimaryGroupTokenDistinguishedName 属性值中搜索所有组的一个 LDAP 方言查询字符串。
    4. 运行 ADO ADSI 的搜索,然后依次通过将每个组的 PrimaryGroupToken 与前面缓存 PrimaryGroupID 属性值进行比较,记录集。
    5. 如果找到匹配项,停止并显示此组的可分辨名称为此用户的主要组。
    6. 如果找不到匹配项,继续搜索结果中循环。
    此方法的优点是立刻显而易见。所有使用该对象是 ADSI 的本机和不需要附加组件。此外,枚举了这些组的可能是主要组。

    但是,请注意以下缺点: 返回该对象时将枚举 IADsUser::Groups 集合,是组中成员的 IADs 界面。如果由于某种原因执行枚举用户没有所需的权限打开某个特定对象,枚举停止不指示错误。下面的代码阐释如何,您可以实现上述算法:
    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 & ")"
    next
    QueryFilter = 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, oRecordset
    Set oConnection = CreateObject("ADODB.Connection")
    Set oCommand = CreateObject("ADODB.Command")
    
    oConnection.Provider = "ADsDSOObject"
    oConnection.Open "Active Directory Provider"
    
    Set oCommand.ActiveConnection = oConnection
    oCommand.CommandText = QueryString
    oCommand.Properties("Page Size") = 900
    
    Set 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.moveNext
    Wend
    
    Set oRecordset = Nothing
    Set oCommand = Nothing
    Set 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
    					

参考

有关详细的信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
297951如何使用 PrimaryGroupID 属性来查找的用户的主要组

属性

文章编号: 321360 - 最后修改: 2008年3月3日 - 修订: 5.0
这篇文章中的信息适用于:
  • Microsoft Windows Server 2003 Standard Edition
  • Microsoft Windows 2000 Server
  • Microsoft Active Directory Service Interfaces 2.5
  • Microsoft Active Directory Client Extension
关键字:?
kbmt kbdswadsi2003swept kbinfo KB321360 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 321360
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