如何在不同的安全上下文中启动线程?

如何在不同用户的安全上下文中启动一个线程? 当进程正常启动一个线程时,安全上下文也会被传递但是如何在不同安全上下文中使用不同用户的主体启动一个线程?

我相信你可以在线程启动后将CurrentPrincipal设置为线程代码的第一个操作,然后才开始执行应该与其他主体一起运行的代码。

这应该处理任何基于.NET角色的检查。 如果您还需要模拟操作系统,则可以模拟WindowsIdentity

代码(可能有效也可能无效 – 未对其进行测试):

 public void Run(object principalObj) { if (principalObj == null) { throw new ArgumentNullException("principalObj"); } IPrincipal principal = (IPrincipal)principalObj; Thread.CurrentPrincipal = principal; WindowsIdentity identity = principal.Identity as WindowsIdentity; WindowsImpersonationContext impersonationContext = null; if (identity != null) { impersonationContext = identity.Impersonate(); } try { // your code here } finally { if (impersonationContext != null) { impersonationContext.Undo(); } } } ... Thread thread = new Thread(Run); thread.Start(yourPrincipal); 

我已经使用这样的技术来成功模仿。

编程上下文中的术语“模仿”指的是在最初启动应用程序的用户之下在另一用户上下文下执行代码的技术,即,在应用程序的执行期间临时改变用户上下文一次或多次。

执行此操作的原因是执行不允许应用程序的当前用户上下文执行的任务。 当然,您可以授予用户执行应用程序更多权限,但通常这是一个坏主意(由于安全性限制)或不可能(例如,如果您没有对计算机的完全管理访问权限)。