2

ServiceProcessInstaller.NET Windows サービスをインストールする があります。

次のいずれかの場合、インストール プロセスは完全に機能します。

  • サービスを SYSTEM ( serviceProcessInstaller1.Account = ServiceAccount.LocalSystem) として実行するように設定します。
  • およびプロパティserviceProcessInstaller1.Account = ServiceAccount.Userを指定するか、インストール プロセスでプロンプトが表示されるようにして、サービスを通常のユーザー ( ) として実行するように設定します。UsernamePassword

ただし、サービスを仮想ユーザーa la として実行したいと思いますNT Service\ServiceName。一部の SQL Server サービスを見ると、デフォルトで独自の仮想ユーザー アカウントとしてログオンすることがわかります。http://technet.microsoft.com/en-us/library/dd548356.aspxには、限定的ではありますが、さらに多くの情報があります。


を設定しようとしserviceProcessInstaller1.Username = @"NT Service\ServiceName"ましたが、パスワードとして何を指定しても、インストーラーは次のエラーをスローします (対話型ダイアログを表示するためString.Emptyに、ユーザー名、自分のパスワード、nullさらにはランダムなジャンクを表示しようとしました):

アカウント名とセキュリティ ID の間のマッピングは行われませんでした

ただし、サービスを通常どおりにインストールすると (例: SYSTEM として実行)、スナップインからサービスのプロパティに移動services.mscし、ログオン ページでユーザーをNT Service\ServiceNameに変更すると、問題なく動作します。

私もChangeServiceConfig2関数を調べましたが、何も変更できないようです。


NT Service\ServiceName内のコードからログオン ユーザーを仮想ユーザーに設定するにはどうすればよいServiceProcessInstallerですか?

4

2 に答える 2

3

ServiceProcessInstallerオブジェクトで直接行うことはできません。ただし、サービスのインストール後に、WMI の Change メソッドServiceInstaller.Committedを使用してユーザー名を設定できます。ユーザー名を次のように指定し、パスワードは null のままにします。wmiParams[6]

void serviceInstaller1_Committed(object sender, InstallEventArgs e)
{
    using (ManagementObject service = new ManagementObject(new ManagementPath("Win32_Service.Name='ServiceName'")))
    {
        object[] wmiParams = new object[11];
        wmiParams[6] = @"NT Service\ServiceName";
        service.InvokeMethod("Change", wmiParams);
    }
}

最後に、サービスの exe ファイルと構成ファイルに対する読み取り/実行権限をユーザーに付与することを忘れないでください。そうしないと、アクセス拒否エラーが発生します。

于 2013-02-01T16:04:42.150 に答える