CredUnPackAuthenticationBufferA 函数 (wincred.h)
CredUnPackAuthenticationBuffer 函数将调用 credUIPromptForWindowsCredentials 函数返回的身份验证缓冲区转换为字符串用户名和密码。
语法
CREDUIAPI BOOL CredUnPackAuthenticationBufferA(
[in] DWORD dwFlags,
[in] PVOID pAuthBuffer,
[in] DWORD cbAuthBuffer,
[out] LPSTR pszUserName,
[in, out] DWORD *pcchlMaxUserName,
[out] LPSTR pszDomainName,
[in, out] DWORD *pcchMaxDomainName,
[out] LPSTR pszPassword,
[in, out] DWORD *pcchMaxPassword
);
参数
[in] dwFlags
将此参数的值设置为 CRED_PACK_PROTECTED_CREDENTIALS 指定函数尝试解密身份验证缓冲区中的凭据。 如果无法解密凭据,该函数将返回 FALSE,对 GetLastError 函数的调用将返回值 ERROR_NOT_CAPABLE。
解密的完成方式取决于身份验证缓冲区的格式。
如果身份验证缓冲区是 SEC_WINNT_AUTH_IDENTITY_EX2 结构,则函数可以使用 SEC_WINNT_AUTH_IDENTITY_ENCRYPT_SAME_LOGON 选项使用 SspiEncryptAuthIdentityEx 来解密缓冲区。
如果身份验证缓冲区是封送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] pcchlMaxUserName
指向 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 [仅限桌面应用] |
目标平台 | 窗户 |
标头 | wincred.h |
库 | Credui.lib |
DLL | Credui.dll |