【问题标题】:CredWrite returns Win32 error code 2 (ERROR_INVALID_FUNCTION) "Incorrect function."CredWrite 返回 Win32 错误代码 2 (ERROR_INVALID_FUNCTION)“函数不正确”。
【发布时间】:2010-02-25 21:16:08
【问题描述】:

我正在尝试调用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

【问题讨论】:

  • 会投票关闭“不再相关”,因为发布的代码显然没有任何问题,但该选项不再可用。而是选择“过于本地化”,因为只有 Ian 知道真正发生了什么。
  • 是的,我不被允许删除它;尽管原因列表显示没有一个原因是正确的,但我粗略地瞥了一眼。另一方面,功能完善的代码可能对其他希望使用 CredWrite 的人有用,尤其是来自 Delphi 的人。

标签: delphi winapi credui


【解决方案1】:

没关系,我想通了。

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

我只是愚蠢。

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

【讨论】:

    【解决方案2】:

    不应该这样

     Credentials.Type_ := CRED_TYPE_GENERIC;
    

    改为这个?

     Credentials.Type := CRED_TYPE_GENERIC;
    

    【讨论】:

    • 没有。 :-) Type 是 Delphi 中的保留字,因此导入类型库会将 Type 转换为 Type_ 而不是在内部重新映射。不过眼光不错。 ;-)
    • @Ken White:好的,这是有道理的。谢谢你的解释。
    【解决方案3】:

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

    希望这会有所帮助, 此致, 汤姆。

    【讨论】:

    • 它不适用于智能卡。我正在存储通用凭据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-11
    • 1970-01-01
    • 2020-07-01
    • 2014-07-31
    • 2019-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多