Bạn hiện đang ngoại tuyến, hãy chờ internet để kết nối lại

Làm thế nào để sử dụng các thành phần ADSI bản xứ để tìm các nhóm chính

Hỗ trợ cho Windows Server 2003 đã kết thúc vào ngày 14 tháng 7 năm 2015

Microsoft đã kết thúc hỗ trợ cho Windows Server 2003 vào ngày 14 tháng 7 năm 2015. Thay đổi này đã ảnh hưởng đến các bản cập nhật phần mềm và tùy chọn bảo mật của bạn. Tìm hiểu ý nghĩa của điều này với bạn và cách thực hiện để luôn được bảo vệ.

QUAN TRỌNG: Bài viết này được dịch bằng phần mềm dịch máy của Microsoft chứ không phải do con người dịch. Microsoft cung cấp các bài viết do con người dịch và cả các bài viết do máy dịch để bạn có thể truy cập vào tất cả các bài viết trong Cơ sở Kiến thức của chúng tôi bằng ngôn ngữ của bạn. Tuy nhiên, bài viết do máy dịch không phải lúc nào cũng hoàn hảo. Loại bài viết này có thể chứa các sai sót về từ vựng, cú pháp hoặc ngữ pháp, giống như một người nước ngoài có thể mắc sai sót khi nói ngôn ngữ của bạn. Microsoft không chịu trách nhiệm về bất kỳ sự thiếu chính xác, sai sót hoặc thiệt hại nào do việc dịch sai nội dung hoặc do hoạt động sử dụng của khách hàng gây ra. Microsoft cũng thường xuyên cập nhật phần mềm dịch máy này.

Nhấp chuột vào đây để xem bản tiếng Anh của bài viết này:321360
TÓM TẮT
Bài viết này giải thích cách sử dụng bản địa của các thành phần hoạt động thư mục dịch vụ giao diện (ADSI) để xác định các thành viên nhóm chính của người dùng.
THÔNG TIN THÊM

Làm thế nào các nhóm chính được lưu trữ trên một đối tượng người dùng Active Directory

Mỗi đối tượng bối cảnh an ninh (ví dụ như người dùng và các nhóm bảo mật) trong Active Directory có một định danh (SID) bảo mật thuộc tính liên kết với nó. SID có một số thành phần, như được diễn tả trong tài liệu "SID thành phần" bao gồm trong phần "Tham khảo" của bài viết này. Hai trong số các thành phần vào SID là tên miền tương đối mã định danh (RID) và cụ thể RID đối tượng trong tên miền.

Các nhóm chính của người dùng được lưu trữ (như nhóm của thoát trong vùng của người dùng) trên các PrimaryGroupID thuộc tính của một đối tượng người dùng. Nhóm chính của người dùng chỉ có thể là một nhóm mà tồn tại trong cùng một tên miền như là người dùng, và nhóm này đã là một nhóm người dùng là thành viên của. Ngoài ra, điều này Nhóm đối tượng Active Directory có một thuộc tính được gọi là PrimaryGroupToken, mà các cửa hàng RID cho nhóm này trong tên miền.

Windows NT và Lightweight Directory Access Protocol (LDAP) mà nhà cung cấp cho phép lập trình để thay đổi nhóm chính của người dùng bằng cách thiết lập các PrimaryGroupID giá trị thuộc tính để RID một nhóm người dùng là thành viên của. Nếu người dùng không phải là thành viên của một nhóm, người sử dụng PrimaryGroupID không thể đặt để RID của nhóm.

Khi nó sử dụng các nhà cung cấp Windows NT trong ADSI, các nhóm chính là bao gồm như là một mục nhập của người dùng IADsUser::Groups bộ sưu tập.

Với nhà cung cấp LDAP, nhóm chính là không bao gồm như là một mục nhập trong các IADsUser::Groups bộ sưu tập, cũng không phải là một phần của nhóm tên phân biệt (DN) của các MemberOf thuộc tính của đối tượng người dùng trong thư mục. Nhóm của thoát trong các PrimaryGroupID là nơi duy nhất mà trong đó các nhóm chính cho một người sử dụng được tham chiếu trên đối tượng người dùng LDAP.

Nhà cung cấp không phải định nghĩa một cơ chế để xác định tên của nhóm chính cho một người sử dụng trực tiếp từ các đối tượng người dùng tương ứng của họ. Vấn đề làm phức tạp hơn bởi thực tế rằng từng nhóm đối tượng được cung cấp bởi nhà cung cấp mỗi hỗ trợ một tập khác nhau của thuộc tính, như sau:
  • Windows NT cung cấp nhóm đối tượng không hỗ trợ các PrimaryGroupToken thuộc tính, và cũng không hiện Windows NT nhà cung cấp hỗ trợ bất kỳ cách nào khác để lấy các nhóm của thoát bằng cách sử dụng bản địa ADSI mã.
  • Các PrimaryGroupToken thuộc tính của một đối tượng nhóm LDAP mà nhà cung cấp là một thuộc tính được tính. Thuộc tính này không có trên đối tượng nhóm trong thư mục. Các thuộc tính được, trên thực tế, tạo ra khi nó được yêu cầu của khách hàng với một IADs::GetInfoEx phương pháp gọi. Nó là không thể thực hiện tìm kiếm LDAP dựa trên thuộc tính xây dựng trong Active Directory. Vì vậy, bạn không thể tìm kiếm bằng cách sử dụng các nhà cung cấp LDAP cho một nhóm dựa trên các PrimaryGroupToken thuộc tính phù hợp với các PrimaryGroupID thuộc tính vào đối tượng người dùng mà nhóm chính bạn muốn xác định. Điều này cũng quy tắc ra một giải pháp ADSI tinh khiết mà không phải là phụ thuộc vào một đối tượng COM bên ngoài để giúp bạn xác định các nhóm chính.

Cách để xác định các nhóm chính của người dùng

Sau đây là ba phương pháp được biết đến để xác định tên của các nhóm chính của người dùng:
  • Xây dựng một SID ràng buộc dây cho đối tượng nhóm trong thư mục hoạt động từ các thành phần tên miền thoát SID của người dùng và nhóm của thoát được lưu trữ trên các PrimaryGroupID thuộc tính vào đối tượng người dùng.

    Đây là phương pháp được diễn tả trong bài viết Microsoft KB Q297951 (bao gồm trong phần "Tham khảo" của bài viết này). Vấn đề lớn với phương pháp này là để xây dựng SID ràng buộc dây, các lập trình viên phải dựa trên các ADsSID đối tượng để chuyển đổi mô tả bảo mật nhị phân của đối tượng miền thành dạng SDDL. Các ADsSID đối tượng được tổ chức bởi các tập tin ADsSecurity.dll, mà phải được sao chép vào và đăng ký trên các khách hàng trước khi mã có thể được chạy thành công.
  • Sử dụng một truy vấn LDAP để tìm kiếm tất cả các nhóm trong một tên miền và lợi nhuận của họ PrimaryGroupToken thuộc tính.

    Phương pháp này là một giải pháp LDAP tinh khiết. Tuy nhiên, giải pháp script là không rất hiệu quả, vì này tìm kiếm trả về mỗi nhóm trong phạm vi, ngay cả những người sử dụng không phải là một thành viên của; và bởi vì các PrimaryGroupToken thuộc tính được xây dựng trên máy khách khi thiết lập kỷ lục ngang, tìm kiếm này là hơi chậm. Phương pháp này có thể đặc biệt là thời gian nếu có một số lớn các nhóm trong tên miền. Ví dụ về làm thế nào để tạo ra phương ngữ LDAP ADO truy vấn rất nhiều, và vì thế, họ không được bao gồm trong bài viết này.
  • Hãy tận dụng các tính năng của mỗi nhà cung cấp để xây dựng một giải pháp lai.

    Giải pháp này tận dụng các tính năng của các nhà cung cấp khác nhau để xác định các nhóm chính của người dùng. Để thực hiện việc này, hãy làm theo những bước sau:
    1. Ràng buộc đối tượng người sử dụng với các nhà cung cấp Windows NT.

      Đối tượng người dùng Windows NT cung cấp một bộ sưu tập nhóm đó bảo đảm để chứa nhóm chính của người dùng. Ngoài ra, các PrimaryGroupID của người sử dụng đối tượng được lưu trữ đi trong một vị trí tạm thời để sử dụng sau này trong thuật toán này.
    2. Liệt kê các IADsUser::Groups bộ sưu tập.
    3. Giải nén các SamAccountName bất động sản từ ADsPath cho mỗi nhóm trong bộ sưu tập, và sau đó xây dựng một phương ngữ LDAP chuỗi truy vấn tìm kiếm cho tất cả các nhóm với các SamAccountName bất động sản được liệt kê trong bộ sưu tập, trở về của họ PrimaryGroupTokenDistinguishedName giá trị thuộc tính.
    4. Chạy tìm kiếm ADO ADSI, và sau đó lặp qua việc thiết lập kỷ lục, so sánh mỗi nhóm PrimaryGroupToken với các PrimaryGroupID giá trị thuộc tính lưu trữ trước đó.
    5. Nếu bạn tìm thấy một trận đấu, dừng và hiển thị tên phân biệt đối với nhóm này là nhóm chủ yếu cho người dùng này.
    6. Nếu bạn không tìm thấy một trận đấu, tiếp tục việc lặp qua kết quả tìm kiếm.
    Những lợi thế của phương pháp này là hiển nhiên ngay lập tức. Tất cả các đối tượng được sử dụng có nguồn gốc từ ADSI và không yêu cầu các thành phần bổ sung. Ngoài ra, đếm bao gồm chỉ các nhóm có thể là nhóm chính.

    Tuy nhiên, lưu ý những bất lợi sau: khi các IADsUser::Groups bộ sưu tập được liệt kê, các đối tượng quay trở lại là một IADs giao diện cho thành viên trong nhóm. Nếu vì một số lý do, người sử dụng thực hiện đếm không có các quyền cần thiết để mở một đối tượng cụ thể, liệt kê điểm dừng mà không chỉ ra một lỗi. Các mã sau đây minh hoạ làm thế nào bạn có thể thực hiện các thuật toán trước:
    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 & ")"nextQueryFilter = 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, oRecordsetSet oConnection = CreateObject("ADODB.Connection")Set oCommand = CreateObject("ADODB.Command")oConnection.Provider = "ADsDSOObject"oConnection.Open "Active Directory Provider"Set oCommand.ActiveConnection = oConnectionoCommand.CommandText = QueryStringoCommand.Properties("Page Size") = 900Set 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.moveNextWendSet oRecordset = NothingSet oCommand = NothingSet 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					
THAM KHẢO
Để biết thêm thông tin, hãy bấm vào số bài viết sau để xem bài viết trong Cơ sở Kiến thức Microsoft:
297951Làm thế nào để sử dụng các thuộc tính PrimaryGroupID để tìm các nhóm chính cho một người sử dụng

Cảnh báo: Bài viết này được dịch tự động

Thuộc tính

ID Bài viết: 321360 - Xem lại Lần cuối: 08/27/2011 14:23:00 - Bản sửa đổi: 2.0

Microsoft Windows Server 2003, Standard Edition (32-bit x86), Microsoft Windows 2000 Server

  • kbdswadsi2003swept kbinfo kbmt KB321360 KbMtvi
Phản hồi