vb.net - 在模拟用户下运行的非 UI 线程是否会自动模拟 UI 线程?

标签 vb.net multithreading impersonation dispatcher

我现在已经搜索了几个小时,到目前为止还没有找到这个 - 所以我想我会发布。

我有一个用 vb.net 编写的 WPF 应用程序,它运行在 DotNet 4.0 上,它启动工作线程来执行特定功能,例如散列文件和其他处理器/时间密集型例程。

一些启动的线程需要模拟不同的用户才能访问登录用户通常无法直接访问的网络资源(它们可以通过应用程序控制访问网络资源,但不能通过例如 windows 资源管理器) .为此,工作线程模拟一个预先确定的用户帐户,该帐户具有访问权限,然后允许应用程序访问网络资源。

虽然这个在模拟用户帐户下运行的工作线程正在工作 - 它偶尔需要更新位于用户目录中的本地 sql 3.5 紧凑型数据库。该数据库只能由登录用户访问 - 而不是模拟用户。

为了允许此更新,我可以从模拟的工作线程访问 UI Dispatcher 对象(在创建线程时通过它),我在其中调用子例程来更新 SQL 紧凑型数据库。

这是一个有趣的问题,我无法解释,但请继续阅读,因为有人可能会解释这一点。

当应用程序从工作线程调用 UI Dispatcher 时,它会退回到登录的用户凭据以更新 UI 线程中的 sql 数据库 - 然后当 UIthread.dispatcher.invoke 调用返回到工作线程时 - 它会是回到模拟的工作线程帐户。

今天 - 我没有理由 - 当我调用 UI 调度程序线程来更新 SQL Compact 数据库时,线程上下文保留在模拟用户处 - 而不是 UI 线程上的登录用户。就像模拟用户现在被强加给所有线程 - 包括 UI 线程。

我想了解的是什么是正确的结果 - UIThread.Dispatcher.Invoke 是否应该执行在 UI 线程的用户上下文(未模拟)下调用的任何代码,或者模拟用户上下文是否对调用调用生效回到 UI 线程,因为它是从工作线程启动的?

我很困惑,因为昨天 - 当我在 UIThread.Dispatcher.Invoked 例程中有一个断点时,我可以看到该线程正在登录的用户帐户下执行,并且对 SQL 紧凑型数据库的更新工作正常。然而,今天,同样的代码正在模拟帐户下执行,我在尝试更新数据库时遇到拒绝访问异常。

我在启动工作线程之前检查了 UI 线程的 ManagedThreadId,并且能够确认在执行 UIThread.Dispatcher.Invoke 时 ManagedThreadId 返回到 UI 线程的 ManagedThreadId - 然后当调用结束并且执行返回到工作线程时线程 ManagedThreadId 返回到正确的 worker ManagedThreadId。这次没有改变的是那个线程的用户。除非我明确结束线程的模拟,否则它现在似乎一直保留在模拟用户身上。

有人可以对此有所了解吗 - 并建议我是否对这一切都做错了,应该尝试以另一种方式做到这一点。我真正想了解的是为什么它一直在工作 - 为什么现在没有 - 而且没有 - 昨天和今天之间没有对此代码进行任何代码更改。

抱歉,帖子太长了

干杯

杆。

最佳答案

您可能想查看线程的执行上下文。
http://msdn.microsoft.com/en-us/library/system.threading.executioncontext.aspx
从 CLR 通过 C#, 3d ed pg 721:

In the System.Threading namespace, there is an ExecutionContext class that allows you to control how a thread's execution context flows from one thread to another.

...

If the initiating thread's execution context does not flow to a helper thread, the helper thread will use whatever execution context it last associated with it. Therefore, the helper thread really shouldn't execute any code that relies on the execution context state (such as a user's Windows identity).


此外,我最近不得不在 ASP.NET 应用程序中进行一些模拟,当我想模拟时,LogonUser win32 api 提供了一些非常精细的控制,我想如何模拟(即,网络、交互、服务等),然后在单个线程中快速恢复。
http://msdn.microsoft.com/en-us/library/ff647404.aspx#paght000023_impersonatingusinglogonuser

关于vb.net - 在模拟用户下运行的非 UI 线程是否会自动模拟 UI 线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6352877/

相关文章:

vb.net - 如何使用通配符搜索删除sqlite数据库中的表?

java - Java中的多线程服务器

asp.net - 在 ASP.Core 中找不到 WindowsImpersonationContext 和 Impersonate()

c# - ASP.NET Core Identity 模拟特定用户

vb.net - 在 vb.net 中将图像格式从 .bmp 转换为其他图像格式

vb.net - 是否有用于在 VB.NET 中进行开发的 BDD/TDD 工具?

C# - 如何读取和写入二进制文件?

multithreading - 如何在GDB中调试多线程代码?

java - 异步方法调用完成后,Spring 命令行应用程序挂起

asp.net - 使用 ASP.NET 和 TFS api 的直通(模拟)身份验证