将托管线程上的模拟令牌传递给非托管线程
我遇到一个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媒体播放器以通过网络访问文件。