2

以下代码不起作用:

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 说

“如果您在模拟期间使用此方法,您可能会收到以下错误:“密钥在指定状态下无效。”可以通过在调用该方法之前加载您要模拟的用户的配置文件来防止此错误。

4

2 回答 2

1

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

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

这是你需要做的:

LogonUser()
Impersonate()
LoadUserProfile()
Encrypt()
UnloadUserProfile()
RevertImpersonation()(.NET 中的 Undo())

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

请注意,对于您而言,所有这些东西基本上都需要该过程是管理员帐户。您需要备份和恢复权限才能加载用户的配置文件。如果在调用 LoadUserProfile 时出现 privilege notheld 错误,那么您需要:

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

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

于 2010-04-08T16:05:24.027 回答
0

我自己没有尝试过,但您可以尝试使用LoadUserProfile非托管 API 调用。如需更多信息,请查看此处

有一些相关的 SO 问题

于 2010-03-23T19:32:50.923 回答