繁体   English   中英

读取注册表项时.Net中的模拟崩溃(LinkLabel SecurityException)

[英]Impersonation in .Net crashes when reading registry keys (LinkLabel SecurityException)

我的应用需要模拟一个服务帐户,我通过本地调用LogonUser 但是,.Net库中的随机组件似乎尝试访问帐户无权访问的注册表项,从而导致抛出SecurityException

具体来说,当我加载LinkLabel ,它崩溃试图确定IE中的默认超链接颜色:

System.Security.SecurityException: Requested registry access is not allowed.
      at System.ThrowHelper.ThrowSecurityException(ExceptionResource resource)
      at Microsoft.Win32.RegistryKey.OpenSubKey(String name, Boolean writable)
      at Microsoft.Win32.RegistryKey.OpenSubKey(String name)
      at System.Windows.Forms.LinkUtilities.GetIEColor(String name)
      at System.Windows.Forms.LinkUtilities.get_IELinkColor()
      at System.Windows.Forms.LinkLabel.get_LinkColor()
      at System.Windows.Forms.LinkLabel.OnPaint(PaintEventArgs e)
      at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs)
      at System.Windows.Forms.Control.WmPaint(Message& m)
      at System.Windows.Forms.Control.WndProc(Message& m)
      at System.Windows.Forms.Label.WndProc(Message& m)
      at System.Windows.Forms.LinkLabel.WndProc(Message& msg)
      at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
      at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
      at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
The Zone of the assembly that failed was:  MyComputer

不,设置默认颜色没有帮助。


我发现这个线程有完全相同的问题,但我担心我不明白解决方案:

使用LoadUserProfile加载的注册表配置单元存储在HKU下,HKCU仍然是交互式登录用户的配置单元(由winlogon.exe加载)。

因此,如果您需要访问新加载的配置单元,则需要:
- 将Regkey设置为Registry.Users
- 使用您模拟的用户帐户的字符串SID打开子项。

有谁知道这方面的任何变通办法?

问题是你冒充的时间过长而且你的代码(间接通过.NET框架)在模仿时访问的资源比你预期的要多。 此异常似乎是由您的模拟代码在GUI(STA)线程上运行引起的。

您可以:

  1. 冒充更短的时间 - 只要您需要这样调用模仿,然后尽快撤消。 即使一个声明后来你必须重新冒充。 这是典型的模仿模式。
  2. 将模拟代码移动到工作(MTA)线程,您应该避免此特定症状。 现在您遇到了如何与模拟代码进行通信的问题,但这并不可怕。
  3. 如果你真的希望整个过程作为系统帐户运行(或许是最不重要的事情),我所知道的唯一支持的解决方案是让HKEY_CURRENT_USER成为系统帐户可以访问的东西。 这是通过调用LoadUserProfile然后调用CreateProcessAsUser完成的; 但这是一个全新的架构,您可以通过旋转新流程来处理模拟。

你想做什么?

为什么需要冒充服务帐户? 这似乎不是一个好主意。 我建议你找到一种不同的方法来解决任何促使你这样做的问题。

如果用户需要访问某些资源,则授予对该组用户的访问权限。

或者创建一个COM服务器服务来执行脏工作,并将其配置为作为服务帐户运行,但为您的用户提供启动权限。

真的你不能这样做。 在Windows安全中,你正在像一艘战舰一样大的洞。

在我看来,问题是服务帐户无权访问HKEY_CURRENT_USER。 您可以通过向HKEY_CURRENT_USER配置单元添加ACE来授予对服务帐户的读取权限,从而解决问题。

顺便说一下,如果情况更糟,这也是非常不安全的。 使用Tony Lee的第一选项,如果你可以让它工作。

在编写代码之前,先在Regedit中尝试一下。

对于这个特定的问题,我刚刚创建了一个标签(而不是一个linklabel),将其设置为蓝色并加下划线,并将Cursor设置为Cursors.Hand 然后它的行为就像一个linklabel,除了链接颜色不会因用户的主题而改变(哦)。

然后我有权保存文件的其他问题; 请参阅@ Tony对上述解决方案的回答。

暂无
暂无

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

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