ProtectedData.Unprotect () после Impersonate () - PullRequest
1 голос
/ 23 марта 2010

Следующий код не работает:

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 говорит

"Если вы используете этот метод во время подражания, вы можете получить следующая ошибка: «Ключ недействителен для использования в указанном состоянии.» это ошибку можно предотвратить, загрузив профиль пользователя, которого вы хотите олицетворять перед вызовом метода. "

Ответы [ 2 ]

0 голосов
/ 08 апреля 2010

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

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

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

LogonUser ()
Олицетворение ()
LoadUserProfile ()
Шифрование () * * +1010 UnloadUserProfile ()
RevertImpersonation () (Отменить () в .NET)

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

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

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

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

0 голосов
/ 23 марта 2010

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

Есть несколько связанных с этим вопросов .

...