2

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

4

4 回答 4

1

您是否尝试过使用SetThreadPrincipal方法 off AppDomain

例子:

IPrinicipal userPrincipal = new MyCustomPrincipal();

AppDomain currentDomain = AppDomain.CurrentDomain;

currentDomain.SetThreadPrincipal(userPrincipal);

你在你的问题中提到,WMV 似乎运行不受管理,所以如果这个前提是正确的,这真的不应该工作(见我的第二个答案)。

于 2009-10-27T20:28:44.800 回答
0

我想你尝试使用

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

登录网络共享。

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

如果您认为它可能有用,我可以向您展示一个用法示例。在这里提到它有点长镜头。

于 2008-09-15T16:51:07.977 回答
0

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

我不确定除了将其放入另一个进程并使用 ::CreateProcessAsUser() 与您拥有的令牌创建该进程或将文件缓冲到本地某处之外是否有答案。

于 2009-10-20T18:02:13.953 回答
0

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

于 2009-10-27T20:30:03.830 回答