Windows 模拟和 TPL
Posted
技术标签:
【中文标题】Windows 模拟和 TPL【英文标题】:Windows Impersonation and TPL 【发布时间】:2015-09-20 07:22:49 【问题描述】:我使用WindowsIdentity.Impersonate
来读取远程注册表。但是,读取位于Task
中的注册表的实际代码委托,因此它可能在不同的线程上运行。我的问题是在 UI 线程中模拟并在线程池中完成提升的工作是否合法?
更新:
// get userHandle from LogonUser(...)
Task task = Task.Run(() =>
using (impersonationContext = WindowsIdentity.Impersonate(userHandle))
// Do stuff here
if (impersonationContext != null)
impersonationContext.Undo();
【问题讨论】:
你说的合法是什么意思? 我的意思是即使它在我第一次尝试时有效,在某些情况下它也不会失败。试图了解模拟是应用于当前线程还是应用于所有线程/进程。 【参考方案1】:由于您使用的是 .NET Framework 4.0 中提供的 TPL。 WindowsIdentity
应该自动流动,除非你明确禁止流动。
在 .NET Framework 1.0 和 1.1 版中,
WindowsIdentity
不会流经任何用户定义的异步点。在 .NET Framework 2.0 版中,有一个ExecutionContext
对象,其中包含有关当前正在执行的线程的信息,并在应用程序域内的异步点之间流动。WindowsIdentity
也作为跨异步点的信息的一部分流动,这意味着如果模拟上下文退出,它也会流动。 Source
【讨论】:
以上是关于Windows 模拟和 TPL的主要内容,如果未能解决你的问题,请参考以下文章
IIS 7.5、ASP.NET、模拟和访问 C:\Windows\Temp
如何在 Qt 中模拟适用于 Linux 和 Windows 的所有鼠标和键盘事件?