2015-09-20 67 views
1

我正在使用WindowsIdentity.Impersonate以便從遠程註冊表讀取。但是,正在讀取註冊表的實際代碼位於Task代表中,因此它可能運行在不同的線程上。我的問題是在UI線程中冒充是否合法並在線程池中執行提升的作業?Windows模擬和TPL

UPDATE:

// get userHandle from LogonUser(...)  
Task task = Task.Run(() => 
{ 
    using (impersonationContext = WindowsIdentity.Impersonate(userHandle)) 
    { 
     // Do stuff here 
     if (impersonationContext != null) 
     { 
      impersonationContext.Undo(); 
     } 
    } 
} 
+0

你是什麼意思*合法*? –

+0

我的意思是即使它在我的第一次嘗試中有效,在某些情況下它也不會失敗。嘗試瞭解模擬是否應用於當前線程或所有線程/進程。 – Pablo

回答

2

由於您使用TPL,這些都可以從.NET框架4.0。 WindowsIdentity應自動流動,除非您明確禁止流量。

在.NET Framework版本1.0和1.1中,WindowsIdentity不會跨任何用戶定義的異步點。在.NET Framework 2.0版中,有一個ExecutionContext對象,其中包含有關當前正在執行的線程的信息,並在應用程序域內的異步點上傳輸它。 WindowsIdentity也作爲流經異步點的信息的一部分流動,這意味着如果模擬上下文退出,它也會流動。 Source