2

ログインしている各ユーザーに対して特定のアプリケーションが実行されているかどうかを確認する「SYSTEM」アカウントで実行されている Windows サービスがあります。アプリケーションが実行されていない場合、サービスは (対応するユーザー名で) アプリケーションを開始します。
CreateProcessAsUser() を使用して目標を達成しようとしています。サービスは対応するユーザー名でアプリケーションを起動しますが、GUI は描画されません。(はい、「デスクトップとの対話をサービスに許可する」チェックボックスが有効になっていることを確認しています)。

システム: XP SP3、言語: C#

興味深いかもしれないいくつかのコードを次に示します。

PROCESS_INFORMATION processInfo = new PROCESS_INFORMATION();  
startInfo.cb = Marshal.SizeOf(startInfo);  
startInfo.lpDesktop = "winsta0\\default";  
bResult = Win32.CreateProcessAsUser(hToken, null, strCommand, IntPtr.Zero, IntPtr.Zero, false, 0, IntPtr.Zero, null, ref startInfo, out processInfo);  

私の知る限り、設定 startInfo.lpDesktop = "winsta0\default"; 対応するユーザーのデスクトップを使用する必要がありました。
ここに記載されていることとは反対に: http://support.microsoft.com/kb/165194、lpDesktop を null に設定するか、まったく設定しないで試してみましたが、どちらも同じ結果になりました: プロセスは期待される名前で開始されましたユーザーと私は、ウィンドウのタイトル バーの一部を見ることができました。「見えない」ウィンドウは、マウス クリック イベントをインターセプトし、期待どおりに処理します。それ自体を描画しません。

そのような問題に精通していて、私が間違っていることを知っている人はいますか?

4

1 に答える 1

1

MSDN には、ウィンドウ ステーションとデスクトップ オブジェクトに明示的なアクセス許可を設定する別のユーザーとしてプロセスを作成する方法のサンプルがあります。

CreateProcessAsUser() ウィンドウステーションとデスクトップ

P/Invoke を使用してコードを C# に移植するか、C++/CLI アセンブリを使用することができます。

ただし、あなたのシナリオはサポートされておらず、Vista (および Windows 7) のセッション 0 分離では壊れる可能性があることに注意してください(右側のホワイトペーパーをダウンロードしてください)。

于 2010-04-06T11:01:30.847 に答える