Олицетворение пользователя домена в WPF - UnauthorizedAccess - PullRequest
2 голосов
/ 11 мая 2009

Я пытаюсь олицетворять учетную запись пользователя домена в приложении WPF, чтобы приложение могло выполнять запись в папку в сети. Пользователь домена имеет достаточные права для записи в это местоположение. Я использую некоторый код, найденный в net для выполнения олицетворения.

По сути, он вызывает собственный метод LogonUser, который возвращает токен безопасности, затем создает новый идентификатор WindowsIdentity, передавая токен и, наконец, вызывая метод windowsIdentity.Impersonate (). Я не получаю никаких исключений при выполнении вышеуказанной логики.

Вызов WindowsIdentity.GetCurrent () -> возвращает олицетворенную личность.

Запись в путь UNC -> исключение UnauthorizedAccess.

Итак, я проверяю объект Thread.CurrentPrincipal перед тем, как пытаться записать файл, он имеет GenericPrincipal, а не WindowsPrincipal с имитируемым WindowsIdentity.

Таким образом, при запуске приложения я установил для AppDomain.CurrentAppDomain.SetPrincipalPolicy значение PrincipalPolicy.Impersonate.

Я перезапускаю свое приложение ...

Перед моим призывом к олицетворению я могу видеть свои собственные учетные данные в Thread.CurrentPrincipal, те, которые я использую для входа на мою машину разработки и которая выполняет мою программу WPF.

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

Однако в Thread.GetCurrentPrincipal я все еще вижу свои собственные учетные данные, и если я смотрю на свойство AuthenticationType, возникает исключение UnauthorizedException (которое видно только в отладчике, оно не выбрасывается в приложении !!). Я позволил запустить код.

Опять-таки, UnauthorizedAccess при попытке записать мой файл в папку UNC.

Последнее, что я попытался, - это создать новый WindowsPrincipal с WindowsIdentity.GetCurrent () и я явно установил его на Thread.Current, но результат тот же.

UnauthorizedAccess при записи в местоположение UNC.

У меня нет идей:)

1 Ответ

0 голосов
/ 12 мая 2009

принадлежит ли машина с сетевым ресурсом находится в домене? Вы пытались получить доступ к общему сетевому ресурсу, используя эту учетную запись домена? Например, используя «Run As ...».

В функции LogonUser попробуйте использовать флаг LOGON32_LOGON_NETWORK при входе в систему. Также, чтобы увидеть, действительно ли имитировалось, попытайтесь включить аудит событий входа / выхода из политики безопасности ( info link )

...