【问题标题】:How do I start a thread in a different security context?如何在不同的安全上下文中启动线程?
【发布时间】:2011-02-06 04:23:17
【问题描述】:

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

【问题讨论】:

  • Related post - 如何在运行应用程序时冒充AD账户运行一段代码?

标签: c#


【解决方案1】:

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

【讨论】:

  • 一个代码 sn-p 会很好。我认为 ExecutionContext 流也应该被抑制。
  • 为什么要抑制ExecutionContext 流?使用模拟时(就像我在这里所做的那样),ExecutionContextSecurityContext 会更新(使用反射器检查,这发生在 MS 实现的内部 UpdateThreadWI 方法中)。
  • 如何创建已传递给Start方法的yourPrincipal对象?
  • 对我来说,在模拟生效后尝试运行代码时会引发错误 - Unable to load DLL 'iphlpapi.dll': Exception from HRESULT: 0x80070542
【解决方案2】:

我已经成功使用了like this 的技术进行模仿。

“模仿”一词在 编程上下文是指一个 下执行代码的技术 另一个用户上下文,而不是用户 最初启动了一个应用程序, 即用户上下文是暂时的 期间更改过一次或多次 应用程序的执行。

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

【讨论】:

    猜你喜欢
    • 2012-08-11
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 2011-03-23
    • 2014-11-15
    • 2020-09-10
    相关资源
    最近更新 更多