Я начал с этого кода, чтобы найти все группы, в которые входит пользователь:
Using user As UserPrincipal = UserPrincipal.FindByIdentity(domainContext, name)
Dim groupList As AccountManagement.PrincipalSearchResult(Of Principal) = user.GetGroups
For Each group As GroupPrincipal In groupList
myUserGroupList.GroupList.Add(group.Name)
Next
End Using
Return myUserGroupList
Я обнаружил, что это не возвращает группы из других доменов, поэтому я добавил следующее:
If domain.ToUpper = "Domain1" Then
Dim myDomainList As DomainConfiguration.DomainCollection = GetDomains()
For Each DomainItem As DomainConfigElement In myDomainList
If DomainItem.DomainName.ToUpper <> "Domain1" Then
Try
myUserGroupList.GroupList.Add(DomainItem.DomainName.ToUpper)
Using OtherDomainContext As New PrincipalContext(ContextType.Domain, DomainItem.DomainName, DomainItem.UserName, DomainItem.Password)
myUserGroupList.GroupList.Add("Using: " & DomainItem.DomainName.ToString)
Try
Dim NewGroupList As AccountManagement.PrincipalSearchResult(Of Principal) = user.GetGroups(OtherDomainContext)
myUserGroupList.GroupList.Add(NewGroupList.ToString)
If NewGroupList IsNot Nothing Then
For Each newgroup As UserPrincipal In NewGroupList
myUserGroupList.GroupList.Add(newgroup.Name)
Next
Else
myUserGroupList.GroupList.Add("No Groups for: " & DomainItem.DomainName.ToString)
End If
Catch ex As Exception
myUserGroupList.GroupList.Add("Other Context Ex: " & ex.ToString)
End Try
End Using
Catch ex As Exception
myUserGroupList.GroupList.Add("unable to add: " & DomainItem.DomainName.ToString)
End Try
End If
Next
End If
Что странного в этом то, что для каждого домена, кроме текущего, я получаю 1 запись для myUserGroupList с текстом «PrincipalSearchResult`1". Я чувствую, что это должно сработать, но я пинаю его уже довольно давно, и Microsoft заявляет, что это поведение By Design . Я постараюсь почти все, но я надеялся избежать advapi32.dll. Спасибо всем, кто ответит.