我按照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()
给我1168
或ERROR_NOT_FOUND
。
为什么会这样?凭据管理API是仅适用于当前会话,还是我做错了什么?
修改:this question下面的评论说:
凭据管理API的文档似乎表明这些凭据与登录会话相关联。也许LogonUser会导致新的登录会话,因此凭证不存在。
但是,我还没有发现任何证据表明凭据管理是特定于会话的。我认为如果是这样的话会毫无用处。
编辑2 :仅为记录,如果您需要获取错误编号,指出CredRead()失败的原因,请检查this article中的ReadCred()方法。
答案 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