4

この回答に従って、Credential Manager API を使用しています。関連するコード スニペットの引用:

public static Credential ReadCredential(string applicationName)
{
    IntPtr nCredPtr;
    bool read = CredRead(applicationName, CredentialType.Generic, 0, out nCredPtr);
    if (read)
    {
        using (CriticalCredentialHandle critCred = new CriticalCredentialHandle(nCredPtr))
        {
            CREDENTIAL cred = critCred.GetCredential();
            return ReadCredential(cred);
        }
    }

    return null;
}

Windows アカウントをログオフしてから再度ログインすると、CredRead() が false を返しMarshal.GetLastWin32Error()1168またはERROR_NOT_FOUND.

なぜこの振る舞いをするのですか?Credential Management API は現在のセッションでのみ機能しますか? それとも何か間違っていますか?

編集:この質問の下のコメントには次のように書かれています:

資格情報管理 API のドキュメントは、これらの資格情報がログオン セッションに関連付けられていることを示しているようです。おそらく、LogonUser によって新しいログオン セッションが発生するため、資格情報はそこに存在しません。

ただし、資格情報管理がセッション固有であるという証拠はまだ見つかっていません。だとしたらかなりもったいないと思います。

編集 2 : 記録のために、CredRead() が失敗した理由を示すエラー番号を取得する必要がある場合は、この記事の ReadCred() メソッドを確認してください。

4

1 に答える 1

3

Persistプロパティを設定することで、資格情報の永続化方法を構成できます。

MSDN から ( http://msdn.microsoft.com/en-us/library/windows/desktop/aa374788(v=vs.85).aspx )

CRED_PERSIST_SESSION
CRED_PERSIST_LOCAL_MACHINE
CRED_PERSIST_ENTERPRISE
于 2014-03-20T09:36:47.590 に答える