Como posso determinar se um grupo de anúncios contém um determinado DirectoryEntry de outro domínio (confiável)?
-
21-08-2019 - |
Pergunta
Eu estou tentando reforçar o meu código que determina se um usuário é um membro de um determinado grupo de anúncios. Ele funciona essencialmente exceto quando o membro do grupo passa a ser de outro domínio (confiável), porque ele é armazenado como um foreignsecurityprincipal.
Uma vez que eu tenho um objeto DirectoryEntry válida tanto para o Grupo Quero teste, ea Conta Quero verificar para, eu preciso de uma seqüência DirectorySearcher filtro que irá permitir-me para confirmar que a conta é nesse grupo, mesmo Se a conta for uma foreignsecurityprincipal.
(código VB.NET Amostra demonstrando a questão)
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)
Solução
Ok. Encontrei. Aqui está o truque.
Eu estou tentando reforçar o meu código que determina se um usuário é um membro de um determinado grupo de anúncios. Ele funciona essencialmente exceto quando o membro do grupo passa a ser de outro domínio (confiável), porque ele é armazenado como um foreignsecurityprincipal.
(código VB.NET Amostra)
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