3

ユーザーが特定のADグループのメンバーであるかどうかを判断するコードを強化しようとしています。これは基本的に、グループのメンバーが外国のセキュリティプリンシパルとして保存されているために別の(信頼できる)ドメインからのものである場合を除いて機能します。

テストするグループとチェックするアカウントの両方に有効なDirectoryEntryオブジェクトがある場合、アカウントがそのグループに含まれていることを確認できるDirectorySearcherFilter文字列が必要です。外国のセキュリティプリンシパルです。

(問題を示すVB.NETコードサンプル)

Dim ContainerGroup as DirectoryEntry = ... Code to get Group
Dim UserToCheckFor as DirectoryEntry = ... Code to get User

DSearcher = New DirectorySearcher(ContainerGroup, "(WHATCANIPUTINHERE)", New String() {"member;Range=0-5000"}, SearchScope.Base)
DSearcher.AttributeScopeQuery = "member"

'If an object is found, the account was in the group
Return (DSearcher.FindOne() IsNot Nothing)  
4

1 に答える 1

1

わかった。それを見つけた。これがトリックです。

ユーザーが特定の AD グループのメンバーであるかどうかを判断するコードを強化しようとしています。グループのメンバーがたまたま別の (信頼された) ドメインからのものである場合を除いて、基本的に機能します。

(VB.NET コード サンプル)

Dim ContainerGroup as DirectoryEntry = ... Code to get Group
Dim UserToCheckFor as DirectoryEntry = ... Code to get User

DSearcher = New DirectorySearcher
Dim DSearcher As New DirectorySearcher(ContainerGroup, getLDAPQueryStringUsingSID(containedGroup), New String() {"member;Range=0-5000"}, SearchScope.Base)

Return (DSearcher.FindOne() IsNot Nothing) 


** Helper Methods **

Private Function getLDAPQueryStringUsingSID(ByVal DEObject As DirectoryEntry) As String            
  Return "(objectSid=" + getSDDLSidForDirectoryEntry(DEObject) + ")"
End Function

Private Function getSDDLSidForDirectoryEntry(ByVal DEObject As DirectoryEntry) As String
      Dim bytes As Byte() = CType(DEObject.Properties("objectSid").Value, Byte())
      Dim sid As New System.Security.Principal.SecurityIdentifier(bytes, 0)
      Return sid.ToString
End Function
于 2008-12-16T23:18:24.903 に答える