CryptUpdateProtectedState 函数 (dpapi.h)

在用户的安全标识符 (SID) 更改后,CryptUpdateProtectedState 函数会迁移当前用户的主密钥。 此函数可用于在用户从一个域移动到另一个域后保留加密数据。

语法

DPAPI_IMP BOOL CryptUpdateProtectedState(
  [in]  PSID    pOldSid,
  [in]  LPCWSTR pwszOldPassword,
  [in]  DWORD   dwFlags,
  [out] DWORD   *pdwSuccessCount,
  [out] DWORD   *pdwFailureCount
);

参数

[in] pOldSid

包含用户以前的 SID 的 SID 结构的地址。 此 SID 用于查找旧的主密钥。 如果此参数为 NULL,则迁移当前用户 SID 的主密钥。

此参数或 pwszOldPassword 参数可以为 NULL,但不能同时为 NULL

[in] pwszOldPassword

指向在 SID 更改之前包含用户密码的以 null 结尾的 Unicode 字符串的指针。 此密码用于解密旧主密钥。 如果此参数为 NULL,则将使用当前用户的密码。

此参数或 pOldSid 参数可以为 NULL,但不能同时为 NULL

[in] dwFlags

未使用。 必须为零。

[out] pdwSuccessCount

接收成功迁移的主密钥数的 DWORD 变量的地址。

[out] pdwFailureCount

接收无法解密的主密钥数的 DWORD 变量的地址。

如果一个或多个主密钥无法解密,则不一定是错误。 某些用户可能拥有停滞的主密钥,并且长时间无法解密。 发生这种情况的一种方式是,本地用户的密码已管理重置。

返回值

如果函数成功,则返回值为 TRUE

如果函数失败,则返回值为 FALSE。 有关扩展的错误信息,请调用 GetLastError。 一些可能的错误代码包括以下内容。

返回代码 说明
ERROR_INVALID_PARAMETER
其中一个参数包含无效的值。
ERROR_OUTOFMEMORY
内存分配失败。
ERROR_ENCRYPTION_FAILED
无法加密旧密码。

注解

此函数使用以前的密码解密旧主密钥目录中的所有用户主密钥,并将其存储在用户的当前主密钥目录中,并使用用户的当前密码进行加密。

必须从密钥迁移到的用户帐户调用此函数。

如果此函数能够成功迁移旧主密钥,则会自动删除旧主密钥。 无法解密的主密钥不会被删除。

要求

要求
最低受支持的客户端 Windows Vista [仅限桌面应用]
最低受支持的服务器 Windows Server 2008 [仅限桌面应用]
目标平台 Windows
标头 dpapi.h
Library Crypt32.lib
DLL Crypt32.dll