Impersonate()之后的ProtectedData.Unprotect()

时间:2010-03-23 18:23:26

标签: c# .net security cryptography system.security

以下代码不起作用:

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 :(得分:0)

我自己没试过,但您可以尝试使用LoadUserProfile非托管API调用。有关详情,请查看here

有一些related SO questions

答案 1 :(得分:0)

以下是正在发生的事情:要使DPAPI正常工作,它需要用户的密钥材料,该密钥材料部分来自用户的登录凭据。此数据与用户的配置文件一起存储。这就是为什么一个没有运行的进程必须加载用户的配置文件的原因。

您必须使用从LoadUserProfile()返回的数据调用UnloadUserProfile()

这是你需要做的:

LogonUser的()
冒充()
LoadUserProfile()
加密()
UnloadUserProfile()
RevertImpersonation()(.NET中的Undo())

必须检查错误,使用GetLastError(),每一步。

请注意,对于您所有这些东西,基本上要求该过程是一个管理员帐户。您需要备份和还原权限才能加载用户的配置文件。如果在调用LoadUserProfile时获得权限未保留错误,则需要:

a)确保应用程序帐户具有备份和恢复权限 b)启用了priv,默认情况下不启用。

您可以使用AdjustTokenPrivileges()http://msdn.microsoft.com/en-us/library/aa375202(VS.85).aspx

启用权限