วิธีการใช้คอมโพเนนต์ ADSI ดั้งเดิมในการค้นหาในกลุ่มหลัก

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 321360 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้
ขยายทั้งหมด | ยุบทั้งหมด

เนื้อหาบนหน้านี้

สรุป

บทความนี้อธิบายถึงวิธีการใช้คอมโพเนนต์ดั้งเดิมของ Active Directory บริการอินเทอร์เฟซ (ADSI) เพื่อกำหนดสมาชิกของกลุ่มหลักของผู้ใช้

ข้อมูลเพิ่มเติม

วิธีการจัดเก็บในกลุ่มหลักบนวัตถุผู้ใช้ใน Active Directory

ทุกความปลอดภัยบริบทวัตถุ (เช่นผู้ใช้และกลุ่มการรักษาความปลอดภัย) ใน Active Directory มีแอตทริบิวต์ (SID) ของตัวระบุความปลอดภัยการเชื่อมโยงด้วย SID มีคอมโพเนนต์ต่าง ๆ ตามที่อธิบายไว้ในการรวมไว้ในส่วน "อ้างอิง" ของบทความนี้อ้างอิง "SID คอมโพเนนต์" คอมโพเนนต์เหล่านี้บน SID สองคือตัวระบุที่โดเมนแบบสัมพัทธ์ (RID) และเฉพาะ RID วัตถุภายในโดเมน

กลุ่มหลักของผู้ใช้ที่เก็บ (เป็นกลุ่มของ RID ในโดเมนของผู้ใช้)PrimaryGroupIDแอตทริบิวต์ของวัตถุผู้ใช้ กลุ่มหลักของของผู้ใช้ได้เฉพาะกลุ่มที่มีอยู่ในโดเมนเดียวกันเป็นผู้ใช้ และกลุ่มนี้มี กลุ่มที่ผู้ใช้ที่เป็นสมาชิก นอกจากนี้ นี้กลุ่มวัตถุใน Active Directory มีแอตทริบิวต์ที่เรียกว่าPrimaryGroupTokenซึ่งเก็บ RID สำหรับกลุ่มนี้ภายในโดเมน

โปรแกรมเมอร์เมื่อต้องการเปลี่ยนกลุ่มหลักของของผู้ใช้ โดยการตั้งค่าการอนุญาตให้ผู้ให้บริการ Windows NT และโพรโทคอลการเข้าถึงไดเรกทอรีของ Lightweight (LDAP)PrimaryGroupIDค่าแอตทริบิวต์การ RID ของกลุ่มที่ผู้ใช้ที่เป็นสมาชิก ถ้าผู้ใช้ไม่ได้เป็นสมาชิกของกลุ่ม ผู้ใช้ของPrimaryGroupIDไม่สามารถถูกกำหนดเป็น RID ของกลุ่ม

เมื่อใช้ตัวให้บริการของ Windows NT ใน ADSI กลุ่มหลักที่ถูกรวมเป็นรายการในเว็บไซต์ของผู้ใช้IADsUser::Groupsคอลเลกชัน

ไม่ มีผู้ให้บริการ LDAP กลุ่มหลักไม่การรวมไว้เป็นรายการในการIADsUser::Groupsคอลเลกชัน หรือเป็นส่วนหนึ่งของชื่อ Distinguished (DN) ของกลุ่มของMemberOfแอตทริบิวต์วัตถุผู้ใช้ที่อยู่ในไดเรกทอรี กลุ่มของ RID ในนั้นPrimaryGroupIDis the only place in which the primary group for a user is referenced on the LDAP user object.

Neither provider defines a mechanism to determine the name of the primary group for a user directly from their respective user objects. The problem is made even more complex by the fact that each group object provided by each provider supports a different set of attributes, as follows:
  • The Windows NT-provided group object does not support thePrimaryGroupTokenattribute, nor does the Windows NT provider support any other way to retrieve the group's RID by using native ADSI code.
  • กระบวนการPrimaryGroupTokenattribute of an LDAP provider group object is a calculated attribute. This attribute does not exist on the group object in the directory. The attribute is, in fact, created when it is requested by the client with anIADs::GetInfoExmethod call. It is not possible to perform LDAP searches based on constructed attributes in the Active Directory. Therefore, you cannot search by using the LDAP provider for a group based on thePrimaryGroupTokenattribute that matches thePrimaryGroupIDattribute on the user object whose primary group you want to determine. This also rules out a pure ADSI solution that is not dependent on an external COM object to help you determine the primary group.

Ways to determine the primary group of a user

The following are three known methods to determine the name of the primary group of a user:
  • Build an SID bind string for the group object in the Active Directory from the Domain RID component of the user's SID and the group's RID stored on thePrimaryGroupIDattribute on the user object.

    This is the method described in Microsoft KB article Q297951 (included in the "Reference" section of this article). The major problem with this method is that to build the SID bind string, the programmer must rely on theADsSIDobject to convert the binary security descriptor of the domain object into its SDDL form. กระบวนการADsSIDobject is hosted by the ADsSecurity.dll file, which must be copied to and registered on the client before the code can be successfully run.
  • Use an LDAP query to search for all the groups in a domain and return theirPrimaryGroupTokenแอตทริบิวต์

    This method is a pure LDAP solution. However, the scripted solution is not very efficient because this search returns every group in the domain, even those that the user is not a member of; and because thePrimaryGroupTokenattribute is constructed on the client as the record set is traversed, this search is quite slow. This method can be particularly time consuming if there are a large number of groups in the domain. Examples of how to create LDAP dialect ADO queries abound, and therefore, they are not included in this article.
  • Take advantage of the features of each provider to build a hybrid solution.

    This solution takes advantage of the features of the different providers to determine the primary group of the user. โดยให้ทำตามขั้นตอนต่อไปนี้::
    1. Bind to the user object with the Windows NT provider.

      The Windows NT user object provides a group collection that is guaranteed to contain the primary group of the user. Also, thePrimaryGroupIDof the user object is stored away in a temporary location for use later in this algorithm.
    2. Enumerate theIADsUser::Groupsคอลเลกชัน
    3. Extract theSamAccountNameproperty from the ADsPath for each group in this collection, and then build an LDAP dialect query string to search for all groups with theSamAccountNameproperty listed in this collection, returning theirPrimaryGroupTokenและDistinguishedNameattribute values.
    4. Run the ADO ADSI search, and then loop through the record set, comparing each group'sPrimaryGroupTokenwith thePrimaryGroupIDattribute value cached earlier.
    5. If you find a match, stop and display the Distinguished Name for this group as the primary group for this user.
    6. If you do not find a match, continue looping through the search result.
    The advantages of this method are immediately obvious. All of the objects used are native to ADSI and do not require additional components. Additionally, the enumeration includes only those groups that might be the primary group.

    However, note the following disadvantage: When theIADsUser::Groupscollection is enumerated, the object returned is anIADsinterface to the member in the group. If, for some reason, the user performing the enumeration does not have the necessary permissions to open a particular object, the enumeration stops without indicating an error. The following code illustrates how you can implement the preceding algorithm:
    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::
297951How to use the PrimaryGroupID attribute to find the primary group for a user

คุณสมบัติ

หมายเลขบทความ (Article ID): 321360 - รีวิวครั้งสุดท้าย: 13 มกราคม 2554 - Revision: 3.0
ใช้กับ
  • Microsoft Windows Server 2003 Standard Edition
  • Microsoft Windows 2000 Server
Keywords: 
kbdswadsi2003swept kbinfo kbmt KB321360 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:321360

ให้ข้อเสนอแนะ

 

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