【发布时间】:2015-12-29 10:34:35
【问题描述】:
在我的 C# 应用程序中,我使用Impersonation 来扩展用户的访问权限。为方便起见,我只是添加了一个public static Impersonation 对象,该对象在App启动时初始化。
Impersonation 的代码来自this answer on stackoverflow。
到目前为止,在应用程序中执行任何代码都可以正常工作:
someCodeThatNeedsImpersonation(); // Fine
somethingElse();
我现在想将代码移动到BackgroundWorker:
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += (s, a) =>
{
someCodeThatNeedsImpersonation(); // fails to "see" impersonation
}
bw.RunWorkerCompleted += (s, a) =>
{
somethingElse();
}
bw.RunWorkerAsync();
这失败了,因为显然在主线程中初始化的Impersonation 句柄没有在BackgroundWorker 中使用。
当然,快速解决方法是
bw.DoWork += (s, a) =>
{
using ( new Impersonation(...) )
{
someCodeThatNeedsImpersonation(); // works, because of bw's own impersonation
}
}
但我更喜欢在每个 BackgroundWorker 中都不需要新的模拟句柄的解决方案(因为我肯定会忘记一个)。有没有办法共享主线程的static Impersonation对象?
【问题讨论】:
-
这个是关于ASP.NET的,但是原因和解决方法都是一样的:blogs.msdn.com/b/tom/archive/2008/04/22/…
-
@Dennis 感谢您的链接。第一个链接 (blogs.msdn.com/b/tom/archive/2008/04/22/…) 的方法 2 完美运行。您想将此作为答案发布吗?
-
好吧,我的答案没有投资,所以,请随意发布答案。此外,它所说的问题是广泛讨论的基础——因为这是桌面应用程序(我假设它是使用
BackgroundWorker),这是一个大问题,为什么你需要这么多地方来模拟。所以,你接受的解决方案对我来说看起来不太好,因为,IMO,它隐藏了真正的设计问题。
标签: c# windows backgroundworker impersonation