CredRead()无法跨登录会话工作

时间:2014-03-20 09:15:49

标签: c# security credentials credential-manager

我按照this answer使用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()给我1168ERROR_NOT_FOUND

为什么会这样?凭据管理API是仅适用于当前会话,还是我做错了什么?

修改this question下面的评论说:

  

凭据管理API的文档似乎表明这些凭据与登录会话相关联。也许LogonUser会导致新的登录会话,因此凭证不存在。

但是,我还没有发现任何证据表明凭据管理是特定于会话的。我认为如果是这样的话会毫无用处。

编辑2 :仅为记录,如果您需要获取错误编号,指出CredRead()失败的原因,请检查this article中的ReadCred()方法。

1 个答案:

答案 0 :(得分:2)

您可以通过设置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