Cara menggunakan komponen ADSI asli untuk menemukan kelompok utama

Terjemahan Artikel Terjemahan Artikel
ID Artikel: 321360 - Melihat produk di mana artikel ini berlaku.
Perbesar semua | Perkecil semua

Pada Halaman ini

RINGKASAN

Artikel ini menjelaskan cara menggunakan komponen antarmuka layanan direktori aktif (ADSI) asli untuk menentukan keanggotaan utama grup pengguna.

INFORMASI LEBIH LANJUT

Bagaimana kelompok utama disimpan pada objek pengguna di direktori aktif

Setiap objek konteks keamanan (seperti pengguna dan grup keamanan) dalam Active Directory memiliki atribut pengenal (SID) keamanan yang terkait dengannya. SID memiliki beberapa komponen, seperti yang dijelaskan dalam referensi "SID komponen" yang termasuk dalam bagian "Referensi" dari artikel ini. Dua komponen ini pada SID adalah relatif pengidentifikasi domain (RID) dan RID khusus untuk objek dalam domain.

Kelompok utama pengguna disimpan (sebagai kelompok menghilangkan di domain pengguna) pada PrimaryGroupID atribut objek pengguna. Kelompok utama pengguna hanya dapat grup yang ada di domain yang sama seperti pengguna, dan kelompok ini telah menjadi kelompok yang pengguna adalah anggota. Juga, ini Grup objek di Active Directory yang memiliki atribut yang disebut PrimaryGroupToken, yang menyimpan RID Group dalam domain.

Windows NT dan Lightweight Directory Access Protocol (LDAP) penyedia memungkinkan pemrogram untuk mengubah pengguna primer grup dengan menetapkan PrimaryGroupID nilai atribut untuk RID kelompok yang pengguna adalah anggota. Jika pengguna tidak anggota grup, pengguna PrimaryGroupID tidak dapat diatur untuk RID kelompok.

Ketika menggunakan Windows NT penyedia di ADSI, kelompok utama disertakan sebagai sebuah entri dalam pengguna IADsUser::Groups Koleksi.

Penyedia LDAP, kelompok utama adalah tidak termasuk sebagai sebuah entri di IADsUser::Groups Koleksi, juga merupakan kelompok dibedakan nama (DN) MemberOf atribut objek pengguna dalam direktori. Kelompok menghilangkan di PrimaryGroupID adalah satu-satunya tempat di mana kelompok utama untuk pengguna direferensikan pada objek pengguna LDAP.

Penyedia tidak mendefinisikan sebuah mekanisme untuk menentukan nama kelompok utama untuk pengguna langsung dari objek pengguna dengan masing-masing mereka. Masalah dibuat lebih rumit oleh kenyataan bahwa setiap objek grup yang disediakan oleh penyedia setiap mendukung kumpulan atribut, sebagai berikut:
  • Windows NT-asalkan kelompok objek tidak mendukung PrimaryGroupToken atribut, atau apakah Windows NT penyedia dukungan cara lain untuk mengambil kelompok menghilangkan dengan menggunakan kode ADSI asli.
  • The PrimaryGroupToken atribut dari penyedia LDAP objek grup adalah atribut yang dihitung. Atribut ini tidak ada pada objek kelompok dalam direktori. Atribut, pada kenyataannya, dibuat ketika diminta oleh klien dengan IADs::GetInfoEx metode panggilan. Hal ini tidak mungkin untuk melakukan pencarian LDAP berdasarkan atribut yang dibangun di Active Directory. Oleh karena itu, Anda tidak dapat mencari dengan menggunakan penyedia LDAP untuk kelompok berdasarkan PrimaryGroupToken atribut yang cocok PrimaryGroupID atribut pada objek pengguna yang kelompok utama yang Anda inginkan untuk menentukan. Ini juga aturan keluar solusi ADSI murni yang tidak bergantung pada objek COM eksternal untuk membantu Anda menentukan grup utama.

Cara untuk menentukan utama kelompok pengguna

Berikut adalah tiga cara untuk menentukan nama kelompok utama pengguna:
  • Membangun SID mengikat tali untuk kelompok objek di Active Directory dari Domain menghilangkan komponen SID pengguna dan grup menghilangkan disimpan di PrimaryGroupID atribut pada objek pengguna.

    Ini adalah metode yang dijelaskan dalam artikel Microsoft KB Q297951 (disertakan dalam bagian "Referensi" di artikel ini). Masalah utama dengan metode ini adalah bahwa untuk membangun SID mengikat tali, programmer harus mengandalkan ADsSID objek untuk mengubah kata kunci keamanan biner objek domain ke dalam bentuk SDDL. The ADsSID objek diselenggarakan oleh berkas ADsSecurity.dll, yang harus disalin ke dan terdaftar pada klien sebelum kode dapat berhasil menjalankan.
  • Menggunakan query LDAP untuk mencari semua kelompok dalam domain dan kembali mereka PrimaryGroupToken atribut.

    Metode ini adalah solusi LDAP murni. Namun, naskah solusi ini tidak sangat efisien karena pencarian ini kembali setiap kelompok di domain, bahkan orang-orang yang pengguna tidak anggota; dan karena PrimaryGroupToken atribut dibangun pada klien seperti set rekaman dilalui, pencarian ini sangat lambat. Metode ini dapat menjadi sangat memakan waktu jika ada sejumlah besar kelompok-kelompok di domain. Contoh tentang bagaimana untuk membuat LDAP dialek ADO pertanyaan abound, dan oleh karena itu, mereka tidak termasuk dalam artikel ini.
  • Mengambil keuntungan dari fitur setiap penyedia untuk membangun solusi hibrida.

    Solusi ini mengambil keuntungan dari fitur berbagai penyedia untuk menentukan kelompok utama pengguna. Untuk melakukannya, ikuti langkah-langkah berikut:
    1. Mengikat ke objek pengguna dengan penyedia Windows NT.

      Objek pengguna Windows NT menyediakan koleksi kelompok yang dijamin untuk mengandung kelompok utama pengguna. Juga, PrimaryGroupID pengguna objek disimpan jauh dalam lokasi sementara untuk digunakan kemudian dalam algoritma ini.
    2. Menghitung IADsUser::Groups Koleksi.
    3. Ekstrak SamAccountName properti dari ADsPath untuk masing-masing kelompok dalam koleksi ini, dan kemudian membangun dialek LDAP string permintaan untuk mencari semua kelompok dengan SamAccountName properti tercantum dalam koleksi ini, kembali mereka PrimaryGroupToken dan DistinguishedName nilai atribut.
    4. Menjalankan pencarian ADO ADSI, dan kemudian loop melalui set rekaman, membandingkan masing-masing kelompok PrimaryGroupToken dengan PrimaryGroupID nilai atribut cache sebelumnya.
    5. Jika Anda menemukan sebuah pertandingan, berhenti dan menampilkan nama terkemuka untuk kelompok ini sebagai kelompok utama untuk pengguna ini.
    6. Jika Anda tidak menemukan pertandingan, Lanjutkan perulangan melalui hasil pencarian.
    Keuntungan dari metode ini segera jelas. Semua benda-benda yang digunakan asli untuk ADSI dan tidak memerlukan komponen tambahan. Selain itu, para enumerasi termasuk hanya grup yang mungkin kelompok utama.

    Namun, perhatikan kerugian berikut: ketika IADsUser::Groups Koleksi dihitung, objek yang kembali IADs sehingga antarmuka untuk anggota dalam kelompok. Jika, untuk beberapa alasan, pengguna melakukan pencacahan tidak memiliki izin yang diperlukan untuk membuka objek tertentu, pencacahan berhenti tanpa menunjukkan kesalahan. Kode berikut menggambarkan bagaimana Anda dapat menerapkan algoritma sebelumnya:
    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
    					

REFERENSI

Untuk informasi selengkapnya, klik nomor artikel berikut untuk melihat artikel di Pangkalan Pengetahuan Microsoft:
297951Cara menggunakan atribut PrimaryGroupID untuk menemukan kelompok utama untuk pengguna

Properti

ID Artikel: 321360 - Kajian Terakhir: 26 September 2011 - Revisi: 2.0
Berlaku bagi:
  • Microsoft Windows Server 2003, Standard Edition (32-bit x86)
  • Microsoft Windows 2000 Server
Kata kunci: 
kbdswadsi2003swept kbinfo kbmt KB321360 KbMtid
Penerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:321360

Berikan Masukan

 

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