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