【发布时间】:2010-09-09 16:08:47
【问题描述】:
我编写了一些示例代码,当我在普通用户帐户的上下文中从 Windows 命令提示符调用时,使用 CredEnumerate() 转储所有用户保存的凭据。但是,我真的希望能够从 SYSTEM 用户上下文中执行此操作,因此我已经从 SYSTEM cmd 提示符测试了我的程序。
当我以 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 来查看是否发生了这种情况。
-
嗯,这是个好主意,但我没有考虑过。但是,即使我在模拟的用户实际登录时使用 psexec 启动系统属性,我实际上也遇到了同样的问题。大概在那种情况下,用户的注册表配置单元已经加载。
-
凭证管理 API 的文档似乎表明这些凭证与登录会话相关联。也许 LogonUser 会导致新的登录会话,因此那里不存在凭据。您可以通过使用现有令牌调用 ImpersonateLoggedOnUser() 来测试这一点,而不是通过 LogonUser() 获取一个。
标签: c++ c authentication winapi