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.

为什么会有这种行为?凭据管理 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 回答