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

本地 SQL 和 Windows 身份验证的不同模拟

如何在 Qt 中模拟适用于 Linux 和 Windows 的所有鼠标和键盘事件?

Cisco模拟器GNS3在Windows 7上Console Telnet localhost 主机不了怎么办?

Python实现windows下模拟按键和鼠标点击的方法

windows api模拟键盘鼠标