Как я могу определить, содержит ли группа AD заданный DirectoryEntry из другого (доверенного) домена?

Я пытаюсь улучшить свой код, который определяет, является ли пользователь членом данной группы AD. По сути, это работает, за исключением случаев, когда член группы находится из другого (доверенного) домена, потому что он хранится как foreignsecurityprincipal.

Учитывая, что у меня есть действительный объект DirectoryEntry как для группы, которую я хочу протестировать, так и для учетной записи, которую я хочу проверить, мне нужна строка фильтра DirectorySearcher, которая позволит мне подтвердить, что учетная запись находится в этой группе, даже если учетная запись является принципом внешней безопасности.

(Пример кода 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)  

person JohnFx    schedule 16.12.2008    source источник


Ответы (1)


Хорошо. Нашел. Вот уловка.

Я пытаюсь улучшить свой код, который определяет, является ли пользователь членом данной группы AD. По сути, это работает, за исключением случаев, когда член группы находится из другого (доверенного) домена, потому что он хранится как foreignsecurityprincipal.

(Пример кода 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
person JohnFx    schedule 16.12.2008