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()方法。
您可以通过设置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