我有一个案例,VB.Net winforms应用程序需要从网络上播放WMV文件。无法直接访问运行应用程序的用户访问网络共享。通过模拟,我可以看到文件存在(没有模拟,File.Exists为网络共享上的文件返回false)。当我尝试将文件加载到Windows Media Player控件时,控件只保持黑色。我推断当Windows Media Player控件加载到内存中时,它运行在一个单独的非托管线程上,而不是.Net托管线程。有没有办法将该安全令牌从托管线程传递到非托管线程?我完全错过了什么吗?
答案 0 :(得分:1)
您是否尝试过使用AppDomain
关闭IPrinicipal userPrincipal = new MyCustomPrincipal();
方法?
示例:
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.SetThreadPrincipal(userPrincipal);
{{1}}
你在问题中提到,WMV似乎运行不受管理,所以如果这个前提是正确的,那么这真的不行(参见我的第二个回答)。
答案 1 :(得分:0)
我想您尝试使用
[DllImport("advapi32.dll", SetLastError=true)]
public static extern int LogonUser(string pszUsername, string pszDomain, string pszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
登录网络共享。
根据我的经验,它并不关心线程。
如果您认为它可能有用,我可以向您展示一个用法示例。在这里提一下它的远景。
答案 2 :(得分:0)
WMP很可能正在启动它自己的继承自您的进程令牌的线程,这是:: CreateThread()的默认行为。我很确定不可能从外部更改线程令牌,除非控件接受令牌作为参数,否则你可以做很多事情。
我不确定除了将它放入另一个进程并使用:: CreateProcessAsUser()创建该进程以及您拥有的令牌或将文件缓冲到本地某处之外,我不确定答案。
答案 3 :(得分:0)
假设WMV播放器在AppDomain之外运行,我会尝试托管WPF / Silverlight媒体播放器以通过网络访问该文件。