非UI线程在模拟用户下运行时,是否自动模拟UI线程?

4
我已经搜索了几个小时,但迄今为止没有找到任何解决方案 - 所以想发帖求助。
我有一个用vb.net编写的WPF应用程序,在DotNet 4.0上运行,启动工作线程执行特定的功能,如哈希文件和其他处理器/时间密集型例程。
一些启动的线程需要模拟不同的用户,以便访问网络资源,而登录用户通常无法直接访问这些资源(他们可以通过应用程序控制访问网络资源,但不能通过Windows资源管理器等方式访问)。为此,工作线程会模拟预先确定的具有访问权限的用户帐户,然后允许应用程序访问网络资源。
在以模拟的用户帐户运行的工作线程正在工作时,它偶尔需要更新位于用户目录中的本地sql 3.5紧凑型数据库。该数据库仅适用于登录用户 - 而不是模拟的用户。
为了允许此更新,从模拟的工作线程中,我可以访问UI Dispatcher对象(在创建线程时传递),并调用子例程来更新SQL紧凑型数据库。
这里有一个有趣的问题,我无法解释,但请继续阅读,因为可能有人能够解释这个问题。
当应用程序从工作线程调用UI Dispatcher时,它会返回到登录用户的凭据,以在UI线程中更新sql数据库 - 然后当UIThread.dispatcher.invoke调用返回到工作线程时,它会回到模拟的工作线程帐户。
今天-我不知道为什么-当我调用UI dispatcher线程来更新SQL Compact数据库时,线程上下文保留在模拟的用户身份下 - 而不是UI线程上的登录用户。就像模拟的用户现在强制适用于所有线程 - 包括UI线程一样。
我试图理解的是什么是正确的结果 - UIThread.Dispatcher.Invoke是否应该在UI线程(未模拟)的用户上下文中执行调用的任何代码,还是由于从工作线程启动了调用,所以模拟用户上下文对UI线程上的调用回调产生影响?
我感到困惑,因为昨天 - 当我在UIThread.Dispatcher.Invoked例程中设置断点时,我可以看到线程正在以登录用户的帐户下执行,并且对SQL紧凑型数据库的更新有效。然而,今天同样的代码正在以模拟的帐户下执行,并且在尝试更新数据库时出现访问被拒绝的异常。
我在启动工作线程之前检查了UI线程的ManagedThreadId,并确认在执行UIThread.Dispatcher.Invoke时,ManagedThreadId返回到UI线程的ManagedThreadId - 然后当调用结束并且执行返回到工作线程时,ManagedThreadId返回到正确的工作线程ManagedThreadId。这次没有改变的是该线程的用户。它似乎现在一直保持在模拟的用户上,除非我明确结束线程的模拟。

请问有人能够解释一下这个问题吗?并建议我是否在错误的方向上努力,应该尝试其他方法。我真正想了解的是为什么它之前一直可以工作,现在却不能工作了 - 没有任何代码更改。

抱歉发了这么长的帖子。

谢谢。

Rod.

1个回答

3
您可能需要查看线程的执行上下文。

http://msdn.microsoft.com/en-us/library/system.threading.executioncontext.aspx

在System.Threading命名空间中,有一个ExecutionContext类,可以让您控制线程的执行上下文如何从一个线程流动到另一个线程。
如果启动线程的执行上下文没有流向辅助线程,则辅助线程将使用其上次关联的任何执行上下文。因此,辅助线程实际上不应该执行依赖于执行上下文状态(如用户的Windows标识)的任何代码。
另外,我最近在一个ASP.NET应用程序中进行了一些模拟操作,并且LogonUser win32 api在我想要模拟身份、如何模拟(例如,网络、互动、服务等)以及在单个线程中快速还原时提供了一些非常精细的控制。

http://msdn.microsoft.com/en-us/library/ff647404.aspx#paght000023_impersonatingusinglogonuser


1
太棒了!您真是个天才。在调用分派线程之前抑制流程纠正了问题,并使其按预期运行。非常感谢。 - Roddles
太棒了!很高兴能帮到你...干杯。 - Jason
我正在使用LogonUser API调用进行模拟。它的效果很好 - 只是今天出现了这个问题,即分派UI线程在模拟线程下执行,这破坏了应用程序的几乎所有方面。显式抑制流程纠正了这个问题,现在它又可以工作了 - 感谢您的帮助。 - Roddles
啊...谢谢你提供的信息...通过StackOverflow社区学习真是太好了。我以前从未在智能客户端应用程序中进行过模拟,所以很有兴趣看到你使用LogonUser API来实现它。 - Jason
1
实际上,我找到了一个网站,它有一个比我之前使用的模拟实现要好得多的方法,而且还解决了在模拟线程上运行组件对象时出现的问题。链接是[link]http://www.vbdotnetheaven.com/uploadfile/scottlysle/7407/ - Roddles
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接