gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:16:31 24 4
gpt4 key购买 nike

我的应用程序需要模拟一个服务帐户,这是我通过对 LogonUser 的 native 调用来完成的。但是,似乎 .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

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


我找到了 this thread有完全相同的问题,但恐怕我不明白解决方案:

Registry hives loaded with LoadUserProfile are stored under HKU, HKCU remains the interactive logon user's hive (loaded by winlogon.exe).

So if you need to get at the newly loaded hive you need to:
- set Regkey to Registry.Users
- Open the subkey using the string SID of the user account you are impersonating.

有人知道这方面的任何解决方法吗?

最佳答案

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

您可以:

  1. 模拟较短的时间 - 仅在您需要时调用模拟,然后尽快撤消。即使一个声明之后你必须重新模拟。这是典型的模拟模式。
  2. 将模拟代码移至工作 (MTA) 线程,您应该可以避免这种特殊症状。现在您遇到了如何与模拟代码通信的问题,但这并不可怕。
  3. 如果您真的希望整个进程都以系统帐户的身份运行(可能是最低权限之类的事情),我所知道的唯一受支持的解决方案是让 HKEY_CURRENT_USER 成为系统帐户可以访问的内容。这是通过调用 LoadUserProfile 然后调用 CreateProcessAsUser 来完成的;但这是一个全新的架构,您可以启动一个新流程来处理模拟。

关于c# - .Net 中的模拟在读取注册表项时崩溃(LinkLabel SecurityException),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5239533/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com