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()
给我1168
或ERROR_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