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

时间:2010-04-09 14:18:34

标签: c# multithreading principal security-context

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

2 个答案:

答案 0 :(得分:5)

我相信你可以在线程启动后将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);

答案 1 :(得分:1)

我已经使用技术like this进行模拟,并取得了成功。

  

“冒充”一词   编程上下文是指a   执行代码的技术   另一个用户上下文而不是用户   最初开始申请,   即用户上下文是暂时的   在期间改变了一次或多次   执行申请。

     

这样做的原因是   执行当前用户的任务   应用程序的上下文不是   允许这样做。你当然可以   授予用户执行   申请更多特权,但是   通常这是一个坏主意(由于   安全约束)或不可能   (例如,如果你没有满员   对计算机的管理访问权限   这样做。)