以下代码不起作用:
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说“如果您在假冒期间使用此方法,您可能会收到 跟随错误:“密钥无法在指定状态下使用。”这个 加载您想要的用户的配置文件可以防止错误 在调用方法之前模仿。“
答案 0 :(得分:0)
我自己没试过,但您可以尝试使用LoadUserProfile非托管API调用。有关详情,请查看here。
答案 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
启用权限