Я видел несколько вопросов, похожих на мой, но ни один из них не подходил. Проблема, с которой я столкнулся:
Мне нужно получить членство в группе пользователя с:
- Группа в домене B
- Пользователь в домене A.
- Услуга в домене Б.
- От Форреста к Форресту двустороннее доверие.
Пользователь подключается к службе, и служба получает объект WindowsIdentity с идентификатором безопасности, именем и т. Д.
Чтобы получить членство в группе, я использую объект UserPrincipal. Для этого вам понадобится объект PrincipalContext. Конструктору объекта PrincipalContext требуется полное доменное имя домена (например, A.some.domain.com). Объект WindowsIdentity содержит имя домена NetBios в имени пользователя (например, A \ User), но я не вижу способа получить имя DNS.
Вот пример кода с DNS-именем HARD CODED, который работает, но мне нужно удалить жестко закодированную часть.
- WindowsIdentity wi (передается в метод) -
PrincipalContext context = new PrincipalContext(ContextType.Domain, "A.some.domain.com");
UserPrincipal userPrincipal = UserPrincipal.FindByIdentity(context, IdentityType.Sid, wi.User.ToString());
У меня есть другое решение, которое использует олицетворение, используя System.DirectoryServices.ActiveDirectory.Domain.GetCurrentDomain (). Name, но это неприемлемо, потому что олицетворение может быть недоступно. Мне нужно решение, которое будет работать с TokenImpersonationLevel.Identification
Я потратил несколько дней на поиск в MSDN и Google (включая Stack Overflow), но безрезультатно.