我正在尝试从 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();
}
Run Code Online (Sandbox Code Playgroud)
我的期望是 sValue 将来自用户/通行帐户(因为我正在模仿它),但奇怪的是它仍然是来自我的服务正在运行的 LocalSystem 帐户的 sValue ...
关于我做错了什么的任何线索吗?任何帮助将非常感激。谢谢,
我知道这是一个旧线程,但我最近遇到了同样的问题(尽管来自 C++ Windows 服务),并认为我应该分享我的发现,因为许多论坛都提出了同样的问题,但没有人留下满意的答案。
基本上,我找到了两种方法来解决这个问题,尽管这更多地是针对 C 应用程序而不是 .NET 的答案(我还没有使用 pinvoke 进行测试,但它可能有效)。
解决方案 1:不使用 RegOpenKey,而是使用RegOpenCurrentUser()获取密钥句柄。显然,RegOpenKey 无法获取模拟用户密钥的原因是 HKEY_CURRENT_USER缓存在正在运行的线程中。
解决方案 2: RegDisablePredefinedCache()。这将禁用上面提到的缓存,并允许对 HKEY_CURRENT_USER 的后续调用是实际模拟的用户。这是我采用的解决方案。
希望这可以帮助。
| 归档时间: |
|
| 查看次数: |
4591 次 |
| 最近记录: |