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

C# CredRead()无法跨登录会话工作,c#,security,credentials,credential-manager,C#,Security,Credentials,Credential Manager,我正在按照使用凭据管理器API。引用相关代码段: public static Credential ReadCredential(string applicationName) { IntPtr nCredPtr; bool read = CredRead(applicationName, CredentialType.Generic, 0, out nCredPtr); if (read) { using (CriticalCredentialH

我正在按照使用凭据管理器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帐户然后再次登录时,creaward()返回false并
封送。GetLastWin32Error()
给我
1168
,或者
找不到错误

为什么会有这种行为?凭证管理API是否仅适用于当前会话,还是我做错了什么

编辑:下面的一条评论说:

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

然而,我还没有发现任何证据表明凭证管理是特定于会话的。我想如果是这样的话,那就没什么用了


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

您可以通过设置
Persist
属性来配置凭证的持久化方式

来自MSDN()

CRED_PERSIST_SESSION
CRED_PERSIST_LOCAL_MACHINE
CRED_PERSIST_ENTERPRISE