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

我按照这个答案使用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是仅适用于当前会话,还是我做错了什么?

编辑 : 此问题下面的评论说:

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

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

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

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