0

我正在尝试调用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 的示例代码?

笔记

  • 我试过调用 Ansi 版本(CredWriteA),结果相同
  • 我试过使用CRED_PERSIST_SESSIONand CRED_PERSIST_LOCAL_MACHINE,除了CRED_PERSIST_ENTERPRISE
4

3 回答 3

1

没关系,我想通了。

这不是 API 调用或我的参数的错。

我只是愚蠢。

我想生气,不用说我做了什么:(

于 2010-02-25T23:25:25.020 回答
0

这不应该

 Credentials.Type_ := CRED_TYPE_GENERIC;

改为这个?

 Credentials.Type := CRED_TYPE_GENERIC;
于 2010-02-25T21:22:05.180 回答
0

我很好奇,这是给智能卡的吧?并且您正在将密码存储到智能卡中,也许附件/驱动程序没有加载以使 credwrite 工作?也许,使用 Windows 使用的标准定义的智能卡硬件/软件将激活 CredWrite 函数,我的猜测是 CredWrite 正在尝试与某些东西进行通信(也许是对智能卡硬件中标准函数的通用 API 调用?)......只是我的想法...

希望这会有所帮助,最好的问候,汤姆。

于 2010-02-25T21:28:19.330 回答