Bu makalede, yerel bir Active Directory Hizmetleri arabirimi (ADSI) bileşenleri bir kullanıcının birincil grubu üyeliğini belirlemek için nasıl kullanılacağı açıklanır.
Birincil grup, bir kullanıcı nesnesi Active Directory'de nasıl depolandığını
Her güvenlik bağlamı nesnesi (örneğin, kullanıcı ve güvenlik grupları için) Active Directory'de, kendisiyle ilişkili bir güvenlik tanımlayıcısı (SID) özniteliği vardır. SID, "SıD Components" başvurusunu bu makalenin "Başvurusu" bölümünde açıklandığı gibi birçok bileşen vardır. Bu bileşenleri SıD'SI etki alanı göreli tanımlayıcı (RID) ve etki alanındaki nesneye RID özel ikisidir.
Bir kullanıcının birincil grubu varsayılan olarak, kullanıcı nesnesinin
PrimaryGroupID özniteliği (kullanıcının etki alanındaki grup RID) olarak depolanır. Bir kullanıcının birincil grubu, yalnızca kullanıcı aynı etki alanında varolan bir grup olabilir ve bu grubun üyesi olan kullanıcı grubu vardır. Ayrıca, bu
Grup nesnesi Active Directory'de, bu grup etki alanındaki RID saklayan
PrimaryGroupToken, adlı bir özniteliğine sahip.
Windows NT ve Basit Dizin Erişim Protokolü (LDAP) sağlayıcıları, kullanıcının üyesi olduğu bir grubun RID ilgili olarak için
PrimaryGroupID öznitelik değerini ayarlayarak, bir kullanıcının birincil grubunu değiştirmek, programcılar izin ver. Kullanıcı grubunun bir üyesi değilse, kullanıcının
PrimaryGroupID Grup RID ilgili olarak için ayarlanamaz.
ADSI Windows NT sağlayıcı kullandığında birincil grubu, kullanıcının
IADsUser::Groups koleksiyonunda bir girdi olarak dahil edilir.
DeğilIADsUser::Groups derlemedeki bir girdi olarak dahil, veya olduğu birincil grubu LDAP sağlayıcısında değil grubun
MemberOf özniteliği dizine kullanıcı nesnesinin ayırt edici ad (DN) parçası. Grubun RID
PrimaryGroupID, bir kullanıcının birincil grubu LDAP kullanıcı nesnesinde başvurulan tek yerdir.
Hiçbir sağlayıcı için ilgili kullanıcı nesneleri doğrudan bir kullanıcının birincil grubu adını belirlemek için bir mekanizma tanımlar. Sorunu daha karmaşık her sağlayıcı tarafından sağlanan her grup nesnesinin öznitelikleri, farklı bir şekilde desteklediğini gerçeğini tarafından yapılır:
- Windows NT tarafından sağlanan grup nesnesi PrimaryGroupToken özniteliği desteklemiyor ya da Windows NT sağlayıcı yerel ADSI kodunu kullanarak grubun RID almak için başka bir şekilde desteklemiyor.
- Hesaplanmış bir özniteliğin LDAP Sağlayıcı grup nesnesinin PrimaryGroupToken özniteliğidir. Bu özniteliği dizine grup nesnesi yok. Istemciye bir <a0>IADs::GetInfoEx</a0> yöntem çağrısı tarafından istenen öznitelik aslında oluşturulur. Active Directory'de oluşturulmuş öznitelikler temel alan LDAP aramaları yapmak mümkün değildir. Bu nedenle, bir grubu birincil grup belirlemek istediğiniz kullanıcı nesnesinin PrimaryGroupID özniteliği ile eşleşen PrimaryGroupToken özniteliğinde LDAP Sağlayıcı kullanarak arama yapamazsınız. Bu, ayrıca, birincil grup belirlemenize yardımcı olması için bir dış COM nesnesinde bağımlı olmayan ADSI çözüm saf dışı kuralları.
Yol, bir kullanıcının birincil grubu belirlemek için
Bir kullanıcının birincil grubu adını belirlemek için üç bilinen yöntemleri şunlardır:
- Bir SID grup nesnesi Active Directory'de kullanıcı SıD'SINI ve grubun RID PrimaryGroupID özniteliği <a0>kullanıcı</a0> nesnesinde saklanan etki alanı RID bileşeninden bağlama dizesi oluşturma.
Microsoft KB makalesi (Bu makalenin "Başvurusu" bölümünde bulunan) Q297951 anlatılan yöntem budur. SID bağlama dizesi oluşturmak için <a0></a0>, Programcı ikili güvenlik tanımlayıcısı bir etki alanı nesnesinin SDDL şekliyle dönüştürmek ADsSID nesnesi kullanan gerekir, bu yöntem önemli bir sorun var. ADsSID nesnesi, kopyalanmasını olmalı ve kodu başarıyla çalıştırılabilmesi için önce istemci üzerinde kayıtlı ADsSecurity.dll dosyasıyla barındırılıyor. - Bir etki alanındaki tüm grupları bulmak ve kendi PrimaryGroupToken özniteliği dönmek için bir LDAP sorgusu kullanın.
Bu yöntem yalnızca bir LDAP çözümüdür. Ancak, bu arama, her grup etki alanında da bu kullanıcı; üyesi değildir ve bu kayıt kümesi geçiş gibi PrimaryGroupToken özniteliği, istemci üzerinde oluşturulur, bu aramayı oldukça yavaş olduğundan verdiği için komut dosyası kullanan çözüm çok etkili değildir. Bu yöntem özellikle zaman, çok sayıda etki alanındaki grupları alabilir. LDAP diyalekt ADO sorguları oluşturmak örnekler abound ve bu nedenle, bu makaledeki dahil edilmez. - Karma bir çözüm oluşturmak için her sağlayıcı özelliklerinden yararlanın.
Bu çözüm, kullanıcının birincil grubu belirlemek için farklı sağlayıcıların özelliklerinden yararlanır. Bunu yapmak için şu adımları izleyin:- Kullanıcı nesnesi için Windows NT sağlayıcı ile bağlama.
Windows NT kullanıcı nesnesi, kullanıcının birincil grubunu içerecek şekilde garanti grubu sağlar. Ayrıca, kullanıcı nesnesinin PrimaryGroupID hemen kullanılmak üzere bu algoritma için geçici bir konuma depolanır. - IADsUser::Groups toplamasını.
- Bu koleksiyon her grubu ADsPath'den SamAccountName özelliği ayıklamak ve sonra da bu koleksiyonunda PrimaryGroupToken ve DistinguishedName öznitelik değerleri döndüren listelenen SamAccountName özelliği tüm grupları bulmak için bir LDAP diyalekt sorgu dizesi oluşturun.
- ADO ADSI ara çalıştırın ve sonra her grubun PrimaryGroupToken daha önce önbelleğe alınmış olan PrimaryGroupID öznitelik değerinin karşılaştırma kayıt kümesi döngü.
- Bir eşleştirme bulursanız, durdurma ve bu kullanıcı için birincil grup olarak bu grubun ayırt edici adı görüntüler.
- Bir eşleşme bulamazsanız, arama sonucu ile döngü devam edin.
Bu yöntemin avantajları hemen belirgin. Kullanılan tüm nesneleri için ADSI yerel ve ek bileşenleri gerektirir. Ayrıca, numaralandırma, yalnızca sahibin meşru olarak birincil grubu olabilir gruplarını içerir.
Ancak, aşağıdaki dezavantajı unutmayın: IADsUser::Groups tahsilat numaralandırılan olduğunda döndürülen bir ıads arabirimi grubu üyesine nesnedir. Herhangi bir nedenle numaralandırma gerçekleştiren kullanıcının belirli bir nesneyi açmak için gerekli izinlere sahip değil, numaralandırma olduğunu belirten bir hata olmadan durdurur. Aşağıdaki kod, önceki algoritması uygulamak gösterir:
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
Daha fazla bilgi için, Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:
297951
(http://support.microsoft.com/kb/297951/
)
Bir kullanıcının birincil grubu bulmak için PrimaryGroupID özniteliği nasıl kullanılır