を使用してWindowsサービス内からプロセスを実行しています
ProcessStartInfo processStartInfo = new ....
Process.Start(processStartInfo);
問題は、ローカル システム アカウントでサービスを実行すると問題なく実行されるのに、プログラムのウィンドウが表示されないことです。ユーザー資格情報をサービス プロパティに入力しようとしましたが、[デスクトップとの対話をサービスに許可する] チェックボックスが無効になります。
サービスから呼び出してアプリを実行する必要があり、アプリのウィンドウを表示する必要があります。
お願い助けて。
アップデート。ユーザー名、パスワード、ドメインを取得する Process.Start の過負荷バージョンを使用すると、プログラムがデスクトップにプルされます。しかし、今では 1 つの資格情報でアプリを起動しますが、別のユーザーのデスクトップでそれを示しています。どうして?
UPD2: アイデアがあります。Sysinternals Suite の psexec.exe を使用できます。しかし、問題は、「管理者として」静かに開始する必要があることです。そして、私は方法がわかりません。つまり、既に管理者権限を持っている場合でも、手動で「管理者として実行」と言って、UAC を確認してから準備が整う場合があります。UACを使わずに何かを静かに実行する方法がわかりません....
UPD3: 親愛なる主よ。私はそのことを持っている !ついに。
Ok。当初、問題は実際にセッション 0 の分離にありました。そのため、サービスから開始できる中間アプリを構築する必要がありました。次に、そのアプリが RPC を介してアプリケーションを開始し、デスクトップに表示することを想定しています。中間層アプリを構築する代わりに、psexec ツールを使用することにしました (とにかく、RPC を介して、必要なとおりに動作します)。そして、そのツールを LOCAL SYSTEM アカウントで使用しようとすると、何らかの理由で機能しませんでした。そして、私は気づきました-その理由は、MSがすべてのpstoolに入れているEULAポップアップダイアログであり、ボタンをクリックしてダイアログをローカルシステムアカウントで確認することは不可能でした. したがって、解決策は、レジストリ HKU.DEFAULT\Software\Sysinternals\PsExec に DWORD 値 EulaAccepted = 1 でキーを作成することです。
万歳、今それは動作します! しかし!次に、現在ログインしているユーザーの画面にプログラムを表示する必要があります。そのためには、セッション ID が必要です。
問題は、現在ログインしているユーザーのセッション ID を取得する方法です。まだ誰もログインしていない場合はどうなりますか? それはどのようなセッション ID でしょうか?
UPD4: それだけです! 私はそれを手に入れました!
[DllImport("Kernel32.dll", EntryPoint = "WTSGetActiveConsoleSessionId")] public static extern int WTSGetActiveConsoleSessionId();
君たちありがとう!