2008-09-15 8 views
2

Ich habe einen Fall, in dem eine VB.Net Winforms-App WMV-Dateien über das Netzwerk wiedergeben muss. Der Benutzer, der die App ausführt, kann keinen direkten Zugriff auf die Netzwerkfreigabe erhalten. Durch den Identitätswechsel kann ich erkennen, dass die Dateien vorhanden sind (ohne Identitätswechsel gibt File.Exists für die Dateien auf der Netzwerkfreigabe false zurück). Wenn ich dann versuche, die Datei in ein Windows Media Player-Steuerelement zu laden, bleibt das Steuerelement nur schwarz. Ich habe abgeleitet, dass, wenn das Windows Media Player-Steuerelement in Arbeitsspeicher geladen wird, es in einem separaten nicht verwalteten Thread als dem verwalteten Thread ".Net" ausgeführt wird. Gibt es eine Möglichkeit, dieses Sicherheitstoken vom verwalteten Thread an den nicht verwalteten Thread zu übergeben? Fehle ich etwas komplett?Übergeben von Identitätswechsel-Token für einen verwalteten Thread an einen nicht verwalteten Thread

Antwort

0

Ich nehme an, Sie versucht, mit

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

in der Netzwerkfreigabe zu protokollieren.

Nach meiner Erfahrung ist es egal, Threads.

Ich kann Ihnen ein Anwendungsbeispiel zeigen, wenn Sie denken, dass es überhaupt nützlich sein kann. Irgendwie ein langer Schuss, um es hier zu erwähnen.

0

Es ist sehr wahrscheinlich, dass WMP eigene Threads startet, die von Ihrem Prozesstoken erben. Dies ist das Standardverhalten von :: CreateThread(). Ich bin mir ziemlich sicher, dass es nicht möglich ist, ein Threads-Token von außen zu ändern, und wenn das Steuerelement kein Token als Parameter akzeptiert, können Sie nicht viel tun.

Ich bin nicht sicher, es gibt eine Antwort außerhalb des Einfügens in einen anderen Prozess und Erstellen dieses Prozesses mit :: CreateProcessAsUser() mit dem Token, das Sie haben, oder die Datei an einen lokalen Ort abpuffern.

1

Haben Sie versucht, SetThreadPrincipal Methode aus AppDomain zu verwenden?

Beispiel:

IPrinicipal userPrincipal = new MyCustomPrincipal();

AppDomain currentDomain = AppDomain.CurrentDomain;

currentDomain.SetThreadPrincipal(userPrincipal);

Sie in Ihrer Frage erwähnt, dass WMV unmanaged zu laufen scheint, so dass, wenn Prämisse richtig ist, sollte dies wirklich nicht Arbeit (siehe meine zweite Antwort).

0

Angenommen, der WMV-Player läuft außerhalb Ihrer AppDomain, würde ich versuchen, den WPF/Silverlight Media Player für den Zugriff auf die Datei über das Netzwerk zu hosten.