Передача токена олицетворения в управляемом потоке в неуправляемый поток - PullRequest
2 голосов
/ 15 сентября 2008

У меня есть случай, когда приложению winforms VB.Net необходимо воспроизводить файлы WMV по всей сети. Пользователь, запустивший приложение, не может получить прямой доступ к общему сетевому ресурсу. Через олицетворение я вижу, что файлы существуют (без олицетворения File.Exists возвращает false для файлов на сетевом ресурсе). Когда я пытаюсь загрузить файл в элемент управления проигрывателя Windows Media, элемент управления остается черным. Я пришел к выводу, что когда элемент управления проигрывателя Windows Media загружается в память, он работает в отдельном неуправляемом потоке, а не в управляемом потоке .Net. Есть ли способ передать этот токен безопасности из управляемого потока в неуправляемый поток? Я что-то упустил полностью?

Ответы [ 4 ]

1 голос
/ 27 октября 2009

Вы пробовали использовать SetThreadPrincipal метод выключения AppDomain?

Пример:

IPrinicipal userPrincipal = new MyCustomPrincipal();

AppDomain currentDomain = AppDomain.CurrentDomain;

currentDomain.SetThreadPrincipal(userPrincipal);

Вы упомянули в своем вопросе, что WMV, кажется, работает неуправляемо, поэтому, если это предположение верно, это действительно не должно работать (см. Мой второй ответ).

0 голосов
/ 27 октября 2009

Если предположить, что проигрыватель WMV работает за пределами вашего домена приложений, я бы попытался разместить медиаплеер WPF / Silverlight для доступа к файлу по сети.

0 голосов
/ 20 октября 2009

Существует очень хороший шанс, что WMP запускает свои собственные потоки, которые наследуются от вашего токена процесса, это поведение по умолчанию :: CreateThread (). Я почти уверен, что невозможно изменить токен потока извне, и если элемент управления не принимает токен в качестве параметра, вы не можете многое сделать.

Я не уверен, что есть ответ за пределами помещения его в другой процесс и создания этого процесса с помощью :: CreateProcessAsUser () с имеющимся у вас токеном или буферизации файла где-то локально.

0 голосов
/ 15 сентября 2008

Полагаю, вы пытались использовать

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

для входа в сетевой ресурс.

По моему опыту это не волнует темы.

Я могу показать вам пример использования, если вы считаете, что он может быть вообще полезен. В некотором роде, чтобы упомянуть об этом здесь.

...