我正在按照这个答案使用 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()方法。