CredWrite返回Win32错误代码2(ERROR_INVALID_FUNCTION)“功能不正确”。

时间:2010-02-25 21:16:08

标签: delphi winapi credui

我正在尝试拨打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_SESSIONCRED_PERSIST_LOCAL_MACHINE,以及CRED_PERSIST_ENTERPRISE

3 个答案:

答案 0 :(得分:1)

没关系,我想通了。

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

我只是愚蠢。

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

答案 1 :(得分:0)

不应该这个

 Credentials.Type_ := CRED_TYPE_GENERIC;

是这样吗?

 Credentials.Type := CRED_TYPE_GENERIC;

答案 2 :(得分:0)

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

希望这有帮助, 最好的祝福, 汤姆。