我写了一些示例代码,当我从正常用户帐户的上下文中的Windows命令提示符调用时,使用CredEnumerate()转储所有用户保存的凭证。但是,我真的希望能够从SYSTEM用户上下文中完成此操作,因此我已经从SYSTEM cmd提示符测试了我的程序。为什么Win32 API函数CredEnumerate()返回ERROR_NOT_FOUND如果我模拟?
当我跑我的程序作为SYSTEM,我跑的LogonUser像这样:
bLoggedOn = LogonUser(userName.c_str(), domain.c_str(), password.c_str(), LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &userToken_);
然后我在令牌运行ImpersonateLoggedOnUser()给我的本地用户的安全上下文。在此之后我做的:
bOk = CredEnumerate(NULL, 0, &count, &pCredentials);
而且我预计这以同样的方式返回凭据,如果我不从系统中消失了,人格化。任何人都可以发现我错过的任何东西,真正把自己置于用户的环境中吗?
这些凭据是否存储在注册表中?也许你需要在调用CredEnumerate之前加载用户的注册表配置单元。您可以使用Process Monitor来查看是否发生了这种情况。 – Luke 2010-09-09 21:24:29
嗯,这是一个很好的想法,我没有考虑过它。但是我实际上也遇到了同样的问题,即使我正在模拟的用户实际登录时,我使用psexec踢了一个系统propt。据推测,在这种情况下,用户的注册表配置单元将被加载。 – Benj 2010-09-10 09:06:48
凭证管理API的文档似乎表明这些凭证与登录会话相关联。也许LogonUser导致一个新的登录会话,所以凭证不存在那里。您可以通过使用现有令牌调用ImpersonateLoggedOnUser()来测试此功能,而不是通过LogonUser()获取一个令牌。 – Luke 2010-09-10 11:37:40