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 говорит
"Если вы используете этот метод во время олицетворения, вы можете получить следующую ошибку: " Ключ недопустим для использования в указанном состоянии."Эту ошибку можно предотвратить, загрузив профиль пользователя, которого вы хотите выдать, перед вызовом метода".
2 ответа
Вот что происходит: для работы DPAPI ему необходим ключевой материал пользователя, который частично получен из учетных данных пользователя. Эти данные хранятся в профиле пользователя. Вот почему процесс не запускается, так как пользователь должен загрузить профиль пользователя.
Вы должны вызвать UnloadUserProfile(), используя данные, возвращаемые LoadUserProfile()
вот что вам нужно сделать:
LogonUser ()
Олицетворять ()
LoadUserProfile()
Шифрование ()
UnloadUserProfile()
RevertImpersonation () (Отменить () в.NET)
Вы должны проверять ошибки, используя GetLastError(), на каждом этапе.
Обратите внимание, что для всех этих вещей в основном требуется, чтобы процесс был учетной записью администратора. Вам нужны права на резервное копирование и восстановление, чтобы загрузить профиль пользователя. Если при вызове LoadUserProfile вы получаете привилегию не удерживается ошибка, то вам необходимо:
а) убедитесь, что учетная запись приложения имеет резервное копирование и восстановление привилегий
б) привилегии включены, по умолчанию они не включены.
Вы можете активировать привилегии с помощью AdjustTokenPrivileges () http://msdn.microsoft.com/en-us/library/aa375202(VS.85).aspx
Сам не пробовал, но вы можете попробовать использовать неуправляемый вызов API LoadUserProfile. Для получения дополнительной информации, проверьте здесь.
Есть несколько связанных с этим вопросов.