まず第一に、私はいかなる種類のデスクトップとも対話しようとはしていません。
私がやろうとしているのは、関心の分離です。ローカルシステムアカウント(LSA)で実行されるサービスがあります。別のアカウントでプロセスを実行する必要がある場合があります。
私はSystem.Diagnostics.Process
これに使用しています。これは私がこれまでに試したことです:
- サービスアプリを通常のデスクトップアプリとして実行し、同じアカウントで子プロセスを起動します:動作します
- サービスアプリを通常のデスクトップアプリとして実行し、別のアカウントで子プロセスを起動します:動作します
- サービスをサービスアプリとして(LSAとして)実行し、同じアカウント(LSA)で子プロセスを起動する:動作します
- サービスをサービスアプリとして(LSAとして)実行し、別のアカウントで子プロセスを起動する:機能しない
私にとってうまくいかない場合は、「アクセスが拒否されました」というWin32Exceptionがスローされます。問題のユーザーアカウントにサービスとしてログオンする権利を付与しましたが、違いはありません。
楽しみのために、私はこれらのシナリオも試しました:
- 自分の開発者アカウント(Developerと呼びましょう)でサービスを実行し、特権の低いアカウント(ServiceAccountと呼びます)で子プロセスを開始しようとすると、process.Start()はスローされず、trueを返しますがSysInternalのProcessExplorerでプロセスが開始されているのを確認したことがなく、
Process.Exited
すぐに起動されます。 - ServiceAccountでサービスを実行し、同じアカウント(ServiceAccount)で子プロセスを開始すると、期待どおりに機能します。
これは私が使用しているコードです:
var pi = new ProcessStartInfo {
CreateNoWindow = true,
WindowStyle = ProcessWindowStyle.Hidden,
UseShellExecute = false,
ErrorDialog = false,
RedirectStandardError = false,
RedirectStandardInput = false,
RedirectStandardOutput = false,
FileName = @"C:\Path\To\SomeApplication.exe",
Arguments = @"Some arguments",
UserName = "SomeUserName",
Domain = "SomeDomain",
Password = SecureStringUtils.Convert("SomePassword")
};
var process = new Process();
process.StartInfo = pi;
process.Start(); // Throws when run as a service
何か案は?