【发布时间】:2011-02-06 04:23:17
【问题描述】:
如何在不同用户的安全上下文中启动线程?当一个进程正常启动一个线程时,安全上下文也会被传递,但是如何在不同的安全上下文中以不同用户的主体启动线程呢?
【问题讨论】:
-
Related post - 如何在运行应用程序时冒充AD账户运行一段代码?
标签: c#
如何在不同用户的安全上下文中启动线程?当一个进程正常启动一个线程时,安全上下文也会被传递,但是如何在不同的安全上下文中以不同用户的主体启动线程呢?
【问题讨论】:
标签: c#
我相信你可以在线程启动后将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);
【讨论】:
ExecutionContext 流?使用模拟时(就像我在这里所做的那样),ExecutionContext 的 SecurityContext 会更新(使用反射器检查,这发生在 MS 实现的内部 UpdateThreadWI 方法中)。
Start方法的yourPrincipal对象?
Unable to load DLL 'iphlpapi.dll': Exception from HRESULT: 0x80070542。
我已经成功使用了like this 的技术进行模仿。
“模仿”一词在 编程上下文是指一个 下执行代码的技术 另一个用户上下文,而不是用户 最初启动了一个应用程序, 即用户上下文是暂时的 期间更改过一次或多次 应用程序的执行。
这样做的原因是 执行当前用户的任务 应用程序的上下文不是 允许做。当然可以 授予用户执行 申请更多特权,但 通常这是一个坏主意(由于 安全约束)或不可能 (例如,如果您没有完整的 对机器的管理访问权限 这样做)。
【讨论】: