4

我的应用程序需要模拟一个服务帐户,我通过对LogonUser. 但是,.Net 库中的随机组件似乎会尝试访问该帐户无权访问的注册表项,从而导致 aSecurityException被抛出。

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

System.Security.SecurityException:不允许请求的注册表访问。
      在 System.ThrowHelper.ThrowSecurityException(ExceptionResource 资源)
      在 Microsoft.Win32.RegistryKey.OpenSubKey(字符串名称,布尔可写)
      在 Microsoft.Win32.RegistryKey.OpenSubKey(字符串名称)
      在 System.Windows.Forms.LinkUtilities.GetIEColor(字符串名称)
      在 System.Windows.Forms.LinkUtilities.get_IELinkColor()
      在 System.Windows.Forms.LinkLabel.get_LinkColor()
      在 System.Windows.Forms.LinkLabel.OnPaint(PaintEventArgs e)
      在 System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e,Int16 层,布尔 disposeEventArgs)
      在 System.Windows.Forms.Control.WmPaint(消息和 m)
      在 System.Windows.Forms.Control.WndProc(消息和 m)
      在 System.Windows.Forms.Label.WndProc(消息和 m)
      在 System.Windows.Forms.LinkLabel.WndProc(消息和消息)
      在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(消息& m)
      在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(消息和 m)
      在 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd,Int32 msg,IntPtr wparam,IntPtr lparam)
失败的程序集区域是:MyComputer

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


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

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

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

有谁知道任何解决方法?

4

4 回答 4

3

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

你可以:

  1. 模拟较短的时间 - 只要您需要尽快调用模拟然后撤消。即使稍后发表一个声明,您也必须重新模仿。这是典型的模仿模式。
  2. 将模拟代码移至工作 (MTA) 线程,您应该避免这种特殊症状。现在您遇到了如何与模拟代码进行通信的问题,但这并不可怕。
  3. 如果您真的希望整个过程作为系统帐户运行(也许是最低权限的事情),我所知道的唯一受支持的解决方案是让 HKEY_CURRENT_USER 成为系统帐户可以访问的东西。这是通过调用 LoadUserProfile 然后调用 CreateProcessAsUser 来完成的;但这是一个全新的架构,您可以旋转一个新流程来处理模拟。
于 2011-03-08T23:53:54.933 回答
0

你想做什么?

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

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

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

真的,你不应该这样做。你在 Windows 安全中炸了一个像战舰一样大的洞。

于 2011-03-09T07:31:40.883 回答
0

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

顺便说一句,如果有更糟的情况,这也是非常不安全的。如果你能让它发挥作用,请使用 Tony Lee 的 1 号选项。

在您费心编写代码之前先在 Regedit 中尝试一下。

于 2011-03-09T21:44:31.553 回答
0

对于这个特定问题,我只是创建了一个标签(而不是链接标签),将其设为蓝色并加下划线,并将其设置CursorCursors.Hand. 然后它的行为与链接标签完全一样,除了链接颜色不会因用户主题而改变(哦,好吧)。

然后我在保存文件的权限方面遇到了其他问题;请参阅我对上面@Tony 答案的评论以获取解决方案。

于 2011-07-14T03:59:30.967 回答