2010-03-23 4 views
1

Следующий код не работает:ProtectedData.Unprotect() после того, как Impersonate()

IntPtr token = Win32Dll.LogonUser(“user1”, “mydomain”, “password1”); 
WindowsIdentity id = new WindowsIdentity(token); 
WindowsImpersonationContext ic = id.Impersonate(); 
byte[] unprotectedBytes = ProtectedData.Unprotect(passwordBytes, null, DataProtectionScope.CurrentUser); 
password = Encoding.Unicode.GetString(unprotectedBytes); 
ic.Undo(); 

Пароль не расшифрован.

MSDN говорит

"If you use this method during impersonation, you may receive the following error: "Key not valid for use in specified state." This error can be prevented by loading the profile of the user you want to impersonate, before calling the method."

ответ

0

Не пробовал это сам, но вы можете попробовать использовать неуправляемый вызов API LoadUserProfile. Для получения дополнительной информации, проверьте here.

Есть related SO questions.

+0

Спасибо вам за ответ. Но я попытался вызвать LoadUserProfile() после "... id.Impersonate();" и код по-прежнему не работает. Также я не знаю, что делать с результатом функции LoadUserProfile() (его токен IntPtr). Я просто вызываю LoadUserProfile()? Должен ли я что-то делать с токеном? – Andrey

+0

Боюсь, я не знаю, что делать с результатом LoadUserProfile. Я пытался воспроизвести вашу проблему, но я никогда не получаю исключение, которое вы описываете. Я тестировал как локальные, так и учетные записи домена, но ProtectedData.Protect всегда преуспевает. Удачи, мне было бы интересно услышать, нашли ли вы решение ... –

+0

@ rwwilden: Снять защиту, а не защищать. –

0

Вот что происходит: для работы DPAPI он нуждается в материале пользователя, который частично получен из учетных данных пользователя. Эти данные сохраняются с профилем пользователя. Вот почему процесс не работает, так как пользователь должен загружать профиль пользователя.

Вы должны вызвать UnloadUserProfile(), используя данные, возвращенные из LoadUserProfile()

вот что вам нужно сделать:

LogonUser()
Impersonate()
LoadUserProfile()
Encrypt ()
UnloadUserProfile()
RevertImpersonation() (Отмена() в .NET)

Вы должны проверить ошибки, используя GetLastError(), на каждом шагу.

Обратите внимание, что для вас всем этим в основном требуется, чтобы процесс был учетной записью администратора. Для загрузки профиля пользователя необходимы права на резервное копирование и восстановление. Если при вызове LoadUserProfile вы получаете привилегию не дотянул ошибку, то вам необходимо:

а) убедитесь, что учетная запись приложения имеет резервное копирование и восстановление privs
б) privs включена, по умолчанию они не являются.

Вы можете быть включен privs с помощью AdjustTokenPrivileges() http://msdn.microsoft.com/en-us/library/aa375202(VS.85).aspx

Смежные вопросы