我的应用程序需要模拟一个服务帐户,这是通过本机调用来完成的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
不,设置默认颜色没有帮助。
I found 这个线程 http://www.dotnetmonster.com/Uwe/Forum.aspx/dotnet-general/8052/Impersonation-and-LinkLabels-result-in-SecurityException遇到完全相同的问题,但恐怕我不明白解决方案:
注册表配置单元已加载LoadUserProfile
存储在 HKU 下,HKCU 仍然是交互式登录用户的配置单元(由 winlogon.exe 加载)。
因此,如果您需要获取新加载的配置单元,您需要:
- 放Regkey
to Registry.Users
- 使用您正在模拟的用户帐户的字符串 SID 打开子项。
有谁知道这有什么解决方法吗?
问题是您模拟的时间太长,并且您的代码(间接通过 .NET 框架)在模拟时访问的资源比您预期的要多。此异常似乎是由于您的模拟代码在 GUI (STA) 线程上运行而引起的。
You can:
- 模拟时间较短 - 只要您需要调用模拟,然后尽快撤消即可。即使后来发表了一项声明,您也必须重新冒充。这是典型的模仿模式。
- 将模拟代码移至工作线程 (MTA),您应该避免这种特定症状。现在您遇到了如何与模拟代码进行通信的问题,但这并不可怕。
- 如果您确实希望整个过程作为系统帐户运行(可能是最低权限之类的事情),我所知道的唯一支持的解决方案是让 HKEY_CURRENT_USER 成为系统帐户可以访问的东西。这是通过调用 LoadUserProfile 然后调用 CreateProcessAsUser 来完成的;但这是一个全新的架构,可以让您启动一个新的流程来处理模拟。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)