5

まず第一に、私はいかなる種類のデスクトップとも対話しようとはしていません。

私がやろうとしているのは、関心の分離です。ローカルシステムアカウント(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

何か案は?

4

1 に答える 1

4

私はついにこれを見つけました:Process.Start()を使用して、Windowsサービス内から別のユーザーとしてプロセスを開始すると、問題が解決します。確かに、回答で提供されているコードにはかなりの磨きが必要ですが、それで私の問題は解決したようです。

于 2012-05-29T20:03:24.693 に答える