将托管线程上的模拟令牌传递给非托管线程

时间:2020-03-05 18:53:35  来源:igfitidea点击:

我遇到一个VB.Net Winforms应用程序需要从整个网络播放WMV文件的情况。无法授予运行该应用程序的用户直接访问网络共享的权限。通过模拟,我可以看到文件存在(没有模拟,File.Exists对网络共享上的文件返回false)。然后,当我尝试将文件加载到Windows Media Player控件中时,该控件只是保持黑色。我推断出,当Windows Media Player控件加载到内存中时,它在与.Net托管线程不同的单独非托管线程上运行。有什么方法可以将安全令牌从托管线程传递到非托管线程?我完全错过了什么吗?

解决方案

回答

我想你尝试使用

[DllImport("advapi32.dll", SetLastError=true)]
public static extern int LogonUser(string pszUsername, string pszDomain, string pszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);

登录网络共享。

以我的经验,它并不关心线程。

如果我们认为它完全有用,那么我可以向我们展示一个用法示例。很想在这里提一下。

回答

WMP非常有可能启动它自己的线程,这些线程从进程令牌继承,这是:: CreateThread()的默认行为。我非常确定不可能从外部更改线程令牌,除非控件接受令牌作为参数,否则我们将无能为力。

我不确定将其放入另一个进程并使用:: CreateProcessAsUser()和我们拥有的令牌来创建该进程,或者将文件缓冲到本地某个地方之外是否还有答案。

回答

我们是否尝试过在AppDomain之外使用SetThreadPrincipal方法?

例子:

IPrinicipal userPrincipal = new MyCustomPrincipal();

AppDomain currentDomain = AppDomain.CurrentDomain;

currentDomain.SetThreadPrincipal(userPrincipal);

我们在问题中提到,WMV似乎是不受管理的,因此,前提是正确的,那么这实际上是行不通的(请参阅我的第二个答案)。

回答

假设WMV播放器在AppDomain外部运行,我将尝试托管WPF / Silverlight媒体播放器以通过网络访问文件。