繁体   English   中英

模拟获取用户 HKEY_CURRENT_USER 不起作用?

[英]Impersonation to get user HKEY_CURRENT_USER does not work?

我正在尝试从 LocalSystem 服务模拟管理员帐户,以便从管理员 HKEY CURRENT USER 注册表中获取数据 - 为了模拟我正在使用在 Uwe Keim 编写的以下站点上找到的 codeproject 代码: Impersonator

我的源代码如下:

using (new Impersonator("user", ".", "pass"))
{
    RegistryKey rk = Registry.CurrentUser.OpenSubKey("Software\\CompanyName");
    string sValue = rk.GetValue("Value", "").ToString();
    rk2.Close();
}

我的期望是 sValue 将来自用户/密码帐户(因为我正在模拟它)但奇怪的是它仍然是来自我的服务正在运行的 LocalSystem 帐户的 sValue ...

关于我做错了什么的任何线索? 任何帮助将非常感激。 谢谢,

我知道这是一个旧线程,但我最近遇到了同样的问题(尽管来自 C++ Windows 服务)并认为我会分享我的发现,因为许多论坛都提出了同样的问题,但没有一个给出令人满意的答案。

基本上,我找到了两种方法来解决这个问题,尽管这更多是针对 C 应用程序而不是 .NET 的答案(我还没有用 pinvoke 测试过,但它可能有效)。

解决方案 1:不使用 RegOpenKey,而是使用RegOpenCurrentUser()获取密钥句柄。 显然,RegOpenKey 没有得到模拟用户的密钥的原因是因为 HKEY_CURRENT_USER 被缓存在正在运行的线程中。

解决方案 2: RegDisablePredefinedCache() 会禁用上面提到的缓存,并允许对 HKEY_CURRENT_USER 的后续调用是实际模拟用户。 这是我采用的解决方案。

希望这可以帮助。

我读到的关于这个主题的所有内容似乎都表明模拟应该让您访问模拟帐户的 HKEY_CurrentUser。 但是,这可能是 .NET Registry 实现中的一个怪癖。

这只是一种预感,而且未经测试,但您是否考虑过使用 Registry.Users 而不是 Registry.CurrentUser?

您需要找到管理员帐户的 SID ,但您应该能够使用 Regedit 推断出这一点

默认情况下,HKEY_CURRENT_USER 句柄在进程范围内缓存。 因此,当您模拟用户然后访问当前用户配置单元时,您将访问启动该过程的用户的配置单元,而不是被模拟的用户。 这适用于所有 Win32 进程,而不仅仅是 .Net。 如果您希望禁用此缓存,以便所有当前用户来电转到下HKEY_USERS正确的用户配置单元,则必须调用RegDisablePredefinedCache通过的PInvoke

请注意,如果被模拟的用户尚未加载其配置文件,则任何 CurrentUser 请求都将转发给 .DEFAULT 用户。 因此,您可能还需要调用 LoadUserProfile。

禁用句柄缓存也会导致所有 CurrentUser 请求的速度稍微减慢。

我猜你会发现你不走运。 做不到。

如果应用程序能够模拟管理员帐户并将值写入 Windows 中的注册表,则会出现一个巨大的安全漏洞。 我的猜测是Registry.CurrentUser属性将始终引用运行您的应用程序的用户...无论您是否尝试模拟。

编辑

原来我没有阅读您使用的 Impersonator 代码的实现细节。 您的问题可能完全不同。

在运行模拟代码之前,您的代码是否引用了Registry静态类? 如果是这样,那就是问题所在。 如果您查看 Reflector 中的Registry.CurrentUser属性,您会看到它是由Registry对象的静态构造函数设置的。 静态构造函数在第一次引用静态对象时被调用。

在您的情况下,如果您正在引用Registry对象(无论它是否涉及CurrentUser ),则会调用静态构造函数,它将CurrentUser设置为您的原始用户......而不是模拟帐户。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM