我有一个案例,一个winforms应用程序需要播放网络上的VB.Net文件。无法向运行应用程序的用户授予对网络共享的直接访问权限。通过模拟,我可以看到文件是否存在(在没有模拟的情况下,File.Exists会为网络共享上的文件返回false )。然后,当我尝试将该文件加载到Windows Media Player控件中时,该控件仍然是黑色的。我推断,当Windows Media Player控件加载到内存中时,它在与.Net托管线程不同的非托管线程上运行。有没有办法将该安全令牌从托管线程传递到非托管线程?我是不是完全漏掉了什么?
发布于 2009-10-28 04:28:45
您是否尝试过在AppDomain上使用SetThreadPrincipal方法
示例:
IPrinicipal userPrincipal = new MyCustomPrincipal();
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.SetThreadPrincipal(userPrincipal);
你在你的问题中提到,WMV似乎是非托管运行的,所以如果这个前提是正确的,那么它真的不应该工作(参见我的第二个答案)。
发布于 2008-09-15 16:51:08
我猜你试着用
[DllImport("advapi32.dll", SetLastError=true)]
public static extern int LogonUser(string pszUsername, string pszDomain, string pszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken); 登录网络共享。
根据我的经验,它并不关心线程。
如果你觉得有用的话,我可以给你看一个用法例子。在这里提到它的可能性有点小。
发布于 2009-10-20 18:02:14
WMP很有可能启动它自己的线程,这些线程继承自你的进程令牌,这是::CreateThread()的默认行为。我很确定从外部改变线程令牌是不可能的,除非控件接受令牌作为参数,否则你不能做很多事情。
除了将其放入另一个进程并使用::CreateProcessAsUser()和您拥有的令牌创建该进程,或者将文件缓冲到本地某个地方之外,我不确定是否有其他解决方案。
https://stackoverflow.com/questions/63379
复制相似问题