[英]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)线程上运行引起的。
您可以:
你想做什么?
为什么需要冒充服务帐户? 这似乎不是一个好主意。 我建议你找到一种不同的方法来解决任何促使你这样做的问题。
如果用户需要访问某些资源,则授予对该组用户的访问权限。
或者创建一个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.