VB.Net winforms アプリがネットワーク経由で WMV ファイルを再生する必要がある場合があります。アプリを実行しているユーザーに、ネットワーク共有への直接アクセスを許可することはできません。偽装によって、ファイルが存在することがわかります (偽装がなければ、File.Exists はネットワーク共有上のファイルに対して false を返します)。次に、ファイルを Windows Media Player コントロールにロードしようとすると、コントロールが黒のままになります。Windows Media Player コントロールがメモリに読み込まれると、.Net マネージ スレッドとは別のアンマネージ スレッドで実行されると推測しました。そのセキュリティ トークンをマネージド スレッドからアンマネージド スレッドに渡す方法はありますか? 私は何かを完全に見逃していますか?
4 に答える
SetThreadPrincipal
メソッドオフを使用してみましたAppDomain
か?
例:
IPrinicipal userPrincipal = new MyCustomPrincipal();
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.SetThreadPrincipal(userPrincipal);
あなたの質問で、WMVは管理されていない状態で実行されているように見えるので、その前提が正しければ、これは実際には機能しないはずです(私の2番目の回答を参照)。
WMVプレーヤーがAppDomainの外部で実行されていると仮定すると、ネットワーク経由でファイルにアクセスするためにWPF/Silverlightメディアプレーヤーをホストしようとします。
WMP がプロセス トークンから継承する独自のスレッドを開始する可能性が非常に高く、これは ::CreateThread() のデフォルトの動作です。外部からスレッド トークンを変更することは不可能であり、コントロールがトークンをパラメーターとして受け入れない限り、できることはあまりないと確信しています。
それを別のプロセスに入れて、 ::CreateProcessAsUser() を使用してそのプロセスを作成するか、ローカルのどこかにファイルをバッファリングする以外に答えがあるかどうかはわかりません。
使ってみたらしい
[DllImport("advapi32.dll", SetLastError=true)]
public static extern int LogonUser(string pszUsername, string pszDomain, string pszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
ネットワーク共有にログインします。
私の経験では、スレッドは気にしません。
少しでも役立つと思われる場合は、使用例をお見せします。ここで言及するのはちょっと遠いです。