我正在尝试拨打CredWrite,但它正在返回ERROR_INVALID_FUNCTION。我可以致电CredRead从密码存储区取出凭据,我可以使用CredUIPromptForCredentials存储新凭据。
但我无法弄清楚如何让CredWrite工作。
我正在使用的代码是:
var
Target, Username, Password: WideString;
begin
Target := 'StackOverflowSomething';
Username := 'IanBoyd';
Password := 'password69';
ZeroMemory(@Credentials, SizeOf(Credentials));
Credentials.TargetName := PWideChar(Target);
Credentials.Type_ := CRED_TYPE_GENERIC;
Credentials.UserName := PWideChar(Username);
Credentials.Persist := CRED_PERSIST_ENTERPRISE;
Credentials.CredentialBlob := PByte(Password);
Credentials.CredentialBlobSize := 2*(Length(Password));
Credentials.UserName := PWideChar(Username);
if not CredWriteW(@Credentials, 0) then
RaiseLastWin32Error;
GetLastError返回1(ERROR_INVALID_FUNCTION
)
这个功能不正确吗?它甚至没有返回ERROR_INVALID_PARAMETER
,它返回“不正确的功能”。什么是不正确的?
是否有任何调用CredWrite的示例代码?
备注
CRED_PERSIST_SESSION
和CRED_PERSIST_LOCAL_MACHINE
,以及CRED_PERSIST_ENTERPRISE
答案 0 :(得分:1)
没关系,我想通了。
这不是API调用或我的参数的错误。
我只是愚蠢。
我想生气,不必说出我做了什么:(
答案 1 :(得分:0)
不应该这个
Credentials.Type_ := CRED_TYPE_GENERIC;
是这样吗?
Credentials.Type := CRED_TYPE_GENERIC;
答案 2 :(得分:0)
我很好奇,这是智能卡,对吧?并且您将引脚号存储到智能卡中,可能没有加载附件/驱动程序以使信用写入工作?也许,使用Windows使用的标准定义的智能卡硬件/软件将激活CredWrite功能,我的猜测是CredWrite正在尝试与某些东西进行通信(可能是对智能卡硬件中的标准功能的通用API调用?)...我的想法......
希望这有帮助, 最好的祝福, 汤姆。