CredUnPackAuthenticationBufferW 函数 (wincred.h)
CredUnPackAuthenticationBuffer 函数将调用 CredUIPromptForWindowsCredentials 函数返回的身份验证缓冲区转换为字符串用户名和密码。
语法
CREDUIAPI BOOL CredUnPackAuthenticationBufferW(
[in] DWORD dwFlags,
[in] PVOID pAuthBuffer,
[in] DWORD cbAuthBuffer,
[out] LPWSTR pszUserName,
[in, out] DWORD *pcchMaxUserName,
[out] LPWSTR pszDomainName,
[in, out] DWORD *pcchMaxDomainName,
[out] LPWSTR pszPassword,
[in, out] DWORD *pcchMaxPassword
);
参数
[in] dwFlags
将此参数的值设置为 CRED_PACK_PROTECTED_CREDENTIALS 指定函数尝试解密身份验证缓冲区中的凭据。 如果无法解密凭据,则函数返回 FALSE,对 GetLastError 函数的调用将 返回ERROR_NOT_CAPABLE值。
解密方式取决于身份验证缓冲区的格式。
如果身份验证缓冲区是 SEC_WINNT_AUTH_IDENTITY_EX2 结构,则函数可以使用 SspiEncryptAuthIdentityEx 和 SEC_WINNT_AUTH_IDENTITY_ENCRYPT_SAME_LOGON 选项来解密缓冲区。
如果身份验证缓冲区是封送KERB_*_LOGON结构之一,则函数先解密密码,然后再在 pszPassword 缓冲区中返回密码。
[in] pAuthBuffer
指向要转换的身份验证缓冲区的指针。
此缓冲区通常是 CredUIPromptForWindowsCredentials 或 CredPackAuthenticationBuffer 函数的 输出。 这必须是以下类型之一:
- 标识凭据 的SEC_WINNT_AUTH_IDENTITY_EX2 结构。 函数不接受其他 SEC_WINNT_AUTH_IDENTITY 结构。
- 密码凭据 的KERB_INTERACTIVE_LOGON 或 KERB_INTERACTIVE_UNLOCK_LOGON 结构。
- 智能卡证书凭据的KERB_CERTIFICATE_LOGON或KERB_CERTIFICATE_UNLOCK_LOGON结构。
- 泛型凭据的GENERIC_CRED。
[in] cbAuthBuffer
pAuthBuffer 缓冲区的大小(以字节为单位)。
[out] pszUserName
指向接收用户名的以 null 结尾的字符串的指针。
此字符串可以是封送凭据。 请参阅“备注”。
[in, out] pcchMaxUserName
指向 DWORD 值的指针,该值指定 pszUserName 缓冲区的大小(以字符为单位)。 在输出中,如果缓冲区大小不足,则指定 pszUserName 缓冲区的所需大小(以字符为单位)。 大小包括终止 null 字符。
[out] pszDomainName
指向以 null 结尾的字符串的指针,该字符串接收用户的域的名称。
[in, out] pcchMaxDomainName
指向 DWORD 值的指针,该值指定 pszDomainName 缓冲区的大小(以字符为单位)。 在输出中,如果缓冲区大小不足,则指定 pszDomainName 缓冲区的所需大小(以字符为单位)。 大小包括终止 null 字符。 如果没有域名,则所需的大小可以为零。
[out] pszPassword
指向接收密码的以 null 结尾的字符串的指针。
[in, out] pcchMaxPassword
指向 DWORD 值的指针,该值指定 pszPassword 缓冲区的大小(以字符为单位)。 在输出中,如果缓冲区大小不足,则指定 pszPassword 缓冲区的所需大小(以字符为单位)。 大小包括终止 null 字符。
此字符串可以是封送凭据。 请参阅“备注”。
返回值
如果函数成功,则为 TRUE;否则为 FALSE。
对于扩展的错误信息,请调用 GetLastError 函数。 下表显示了 GetLastError 函数的通用值。
返回代码/值 | 说明 |
---|---|
|
CRED_PACK_PROTECTED_CREDENTIALS作为 dwFlags 参数的值传递,但此函数无法解密凭据,因为用于保护密码的安全上下文不同于调用方的安全上下文。 |
|
其中一个输出缓冲区 pszUserName、 pszDomainName 或 pszPassword 大小不足。 |
|
身份验证缓冲区不是受支持的类型。 |
注解
从 Windows 8 和 Windows Server 2012 开始,身份验证缓冲区可以是 SEC_WINNT_AUTH_IDENTITY_EX2 结构,可以选择使用 SspiEncryptAuthIdentityEx 函数和 SEC_WINNT_AUTH_IDENTITY_ENCRYPT_SAME_LOGON 选项对其进行加密。 此凭据格式由标识提供者的凭据提供程序使用 CredUIPromptForWindowsCredentials 或 SspiPromptForCredentials 函数返回。 也可以使用 CredPackAuthenticationBuffer 函数构造此结构。 如果身份验证缓冲区 pAuthBuffer 表示非密码凭据(如 KERB_CERTIFICATE_LOGON 或 SEC_WINNT_AUTH_IDENTITY_EX2),则函数必须将凭据封送为字符串,以用户名、域名和密码字符串的形式返回。 封送处理是使用特定过程完成的。 当 dwFlags 包含CRED_PACK_PROTECTED_CREDENTIALS标志时,调用方必须在加密凭据的同一登录会话中运行。
注意
wincred.h 标头将 CredUnPackAuthenticationBuffer 定义为别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将非特定编码别名的使用与非非特定编码的代码混合使用可能会导致不匹配,从而导致编译或运行时错误。 有关详细信息,请参阅 函数原型的约定。
要求
最低受支持的客户端 | Windows Vista [仅限桌面应用] |
最低受支持的服务器 | Windows Server 2008 [仅限桌面应用] |
目标平台 | Windows |
标头 | wincred.h |
Library | Credui.lib |
DLL | Credui.dll |