CredRead()不能跨登录会话工作

本文关键字:登录 会话 工作 不能 CredRead | 更新日期: 2023-09-27 17:51:00

根据这个答案,我正在使用凭据管理器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()方法。

CredRead()不能跨登录会话工作

您可以通过设置Persist属性

来配置凭证的持久化方式

From 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