2010-02-25 65 views
0

我正在嘗試撥打CredWrite,但它正在返回ERROR_INVALID_FUNCTION。我可以撥打CredRead從密碼存儲中提取憑證,並且我可以使用CredUIPromptForCredentials存儲新的憑據。CredWrite返回Win32錯誤代碼2(ERROR_INVALID_FUNCTION)「函數不正確。」

但我不知道如何讓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
+0

會投票關閉爲「不再有意義」,因爲顯然有什麼不對發佈的代碼,但該選項不可可以選擇「過於本地化」,因爲只有伊恩知道發生了什麼 – 2010-02-26 03:58:51

+1

是的,我不允許刪除它;而我的粗略瀏覽,雖然原因列表顯示沒有任何原因是正確的。 ,也許完美的功能代碼可以有用的其他人尋找使用CredWrite,特別是從Delphi。 – 2010-02-27 02:51:31

回答

1

沒關係,我想通了。

而這不是API調用或我的參數的錯誤。

我只是愚蠢的。

,我要生氣了,不必說什麼我做:(

0

不該't

Credentials.Type_ := CRED_TYPE_GENERIC; 

是這個嗎?

Credentials.Type := CRED_TYPE_GENERIC; 
+2

編號:-)類型是在Delphi中的保留字,因此導入類型庫轉換類型爲Type_,而事情是內部重新映射。好的眼睛,但。 ;-) – 2010-02-25 21:42:59

+0

@Ken White:好的,這很有道理。感謝您的解釋。 – 2010-02-25 22:02:41

+0

^他說什麼。 :P – 2010-02-25 23:12:27

0

我很好奇,這是智能卡,對不對?並且您將pin no存儲到智能卡,也許附件/驅動程序未被加載以使credwrite正常工作?也許,使用由windows使用的標準定義的智能卡硬件/軟件將激活CredWrite函數,我的猜測是CredWrite試圖與某些東西(可能是智能卡硬件中的標準功能的通用API調用)進行通信?我的想法...

希望這會有所幫助, 最好的問候, 湯姆。

+0

這不適用於智能卡。我正在存儲通用憑據。 – 2010-02-25 23:12:05