Discussion:
Создание объекта WindowsIdentity
(слишком старое сообщение для ответа)
Sergey Lydin
2005-09-19 11:29:32 UTC
Permalink
Привет, All!

Помогите, пожалуйста, решить следующую проблему.

Hеобходимо определить, принадлежит ли заданный пользователь в домене
определенной группе.
Известно имя пользователя (например, foo) и название домена (например, quux). В
домене quux создана группа bar, на принадлежность которой и следует проверить
пользователя foo. В качестве контроллера домена используется Windows Server
2003.

Делаю следующим образом: на машине (ОС WinXp Professional + SP2), включенной в
домен quux, пытаюсь выполнить следующий код:

WindowsIdentity wi = new WindowsIdentity ("***@quux");

c тем, чтобы далее создать объект WindowsPrincipal wp и с помощью

wp.IsInRole (@"quux\bar");

проверить принадлежность группе bar.

Однако при создании WindowsIdentity генерируется исключение:

Unhandled Exception: System.ArgumentException: Unable to log on.
at System.Security.Principal.WindowsIdentity._S4ULogon(String
sUserPrincipalName)
at System.Security.Principal.WindowsIdentity..ctor(String
sUserPrincipalName)

С чем бы это могло быть связано? Может, кто нибудь знает другой способ
проверить принадлежность пользователя домена группе домена.

Удачи!
Andrzej Novosiolov
2005-09-20 08:44:51 UTC
Permalink
Post by Sergey Lydin
Hеобходимо определить, принадлежит ли заданный пользователь в домене
определенной группе.
Известно имя пользователя (например, foo) и название домена (например, quux). В
домене quux создана группа bar, на принадлежность которой и следует проверить
пользователя foo. В качестве контроллера домена используется Windows Server
2003.
Решение предложить не могу - всё, что мы делали, предназначалось только для
текущего залогиненного узера, максимум - для логина с известным паролем,
который можно было имперсонировать. У меня сложилось впечатление, что
WindowsPrincipal/WindowsIdentity вообще не задумывались для чего-то иного,
кроме работы с текущим юзером.

Может быть, вот это обсуждение чем-нибудь тебе поможет:
http://groups.google.com/group/microsoft.public.adsi.general/browse_thread/thread/7dcc6a35236f45d1/d6276a625bc5676d
--
ICQ 8481158, http://www.livejournal.com/users/andrzejn/
Sergey Lydin
2005-09-20 09:07:22 UTC
Permalink
Привет, Andrzej!
Post by Sergey Lydin
Hеобходимо определить, принадлежит ли заданный пользователь в домене
определенной группе.
Известно имя пользователя (например, foo) и название домена (например,
quux). В домене quux создана группа bar, на принадлежность которой и
следует проверить пользователя foo. В качестве контроллера домена
используется Windows Server 2003.
AN> Решение предложить не могу - всё, что мы делали, предназначалось только
AN> для текущего залогиненного узера,

С текущим залогиненным юзером все понятно, для него не надо создавать объект
WindowsIdentity, достаточно получить текущий принципал.

AN> максимум - для логина с известным
AN> паролем, который можно было имперсонировать.
Если б знать пароль :( Тогда можно было бы вообще вызвать LogonUser и из
полученного маркера выдернуть информацию о группах. Проблема как раз в том, что
пароль я не знаю.
AN> У меня сложилось впечатление,
AN> что WindowsPrincipal/WindowsIdentity вообще не задумывались для чего-то
AN> иного, кроме работы с текущим юзером.

Вообще в MSDN пишут, что в .Net Framework 1.1 поддерживается конструктор
WindowsIdentity, в котором можно задавать UPN типа ***@DOMAINNAME на
платформе Windows Server 2003. Для этого используется расширение Kerberos
Service-for-User-to-Self, с помощью которого контроллеру домена предоставляется
только юзерпринципал без пароля, КД типа аутентифицирует (на самом деле,
понятно, ни хрена он без пароля не аутентифицирует) этого юзера и возвращает
для него маркер, из которого можно все узнать о группах юзера. Так ведь, блин,
не работает!

AN> Может быть, вот это обсуждение чем-нибудь тебе поможет:
AN> http://groups.google.com/group/microsoft.public.adsi.general/browse_thread
AN> /thr ead/7dcc6a35236f45d1/d6276a625bc5676d

Большое спасибо за ссылку, но там описан метод, который мне известен. Мне
хочется знать, почему он не работает ("Unable to log on"). В любом случае я
очень благодарен за помощь.

Удачи!
Alexander Rozenbaum
2005-09-20 17:58:18 UTC
Permalink
Post by Sergey Lydin
Известно имя пользователя (например, foo) и название домена
(например, quux). В домене quux создана группа bar, на
принадлежность которой и следует проверить пользователя foo. В
качестве контроллера домена используется Windows Server 2003.
Мы в таких случаях не мудрствуя лукаво спрашиваем ActiveDirectory на предмет
"членом каких групп является юзверь такой-то". Там список всех групп (с учётом
и опосредованного членства) в одном из атрибутов юзера есть.
Hо способ вобщемто не быстрый...

Всего тебе самого самого... ну чего бы тебе хотелось? Ах не надо??!!??
Sergey Lydin
2005-09-21 13:25:44 UTC
Permalink
Привет, Alexander!
└─> [20 сентября 2005] <───> Alexander Rozenbaum ────> Sergey Lydin
Post by Sergey Lydin
Известно имя пользователя (например, foo) и название домена
(например, quux). В домене quux создана группа bar, на
принадлежность которой и следует проверить пользователя foo. В
качестве контроллера домена используется Windows Server 2003.
AR> Мы в таких случаях не мудрствуя лукаво спрашиваем ActiveDirectory на
AR> предмет "членом каких групп является юзверь такой-то". Там список всех
AR> групп (с учётом и опосредованного членства) в одном из атрибутов юзера
AR> есть. Hо способ вобщемто не быстрый...

Ты имеешь в виду, что вы используете функциональность ADSI? Мы теперь тоже к
этому пришли. Скорость выполнения не особо для нас критична. Буду получать
необходимую информацию посредством System.DirectoryServices namespace.
WindowsIdentity не работал, потому что, оказывается, для его использования
необходимо наличие Windows Server 2003 и в качестве контроллера домена, и на
машине, инициирующей запрос, что нас не устраивает

Удачи!

Loading...