2

インストーラーを使用して Windows サービスをインストールし、ServiceControllerを使用して開始しました。

public static int StartService(string serviceName, int timeoutMilliseconds)
{
    ServiceController service = new ServiceController(serviceName);
    try
    {
        TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);

        service.Start();
        service.WaitForStatus(ServiceControllerStatus.Running, timeout);

        service.Close();

        return 0;
     }
     catch
     {
        return 1;
     }
}

サービスは問題なく開始されているように見えますが、サービスがリモート コンピュータに対して WMI 呼び出しを実行しようとすると、例外がスローされます。

The RPC server is unavailable. (Exception from HRESULT: 0x800706BA)

サービスが実行されているマシンから、サービスが接続しようとしている同じマシンに WBEMTest で接続しようとしましたが、正常に動作します。

また、Services.msc から手動でサービスを開始すると、完全に機能します。ServiceController には何が欠けていますか?

4

2 に答える 2

1

私はそれを理解しました。

サービスの .config ファイルを構成するとき、[UserName] や [Password] などのプレースホルダーを使用して、インストーラーでユーザーが指定した実際の値を置き換えます。

これらの値が交換される前にサービスが開始され、サービスはユーザー名とパスワードを [UserName] と [Password] として接続しようとしました。

「アクセスが拒否されました」というエラーが表示されると思ったので、最初はこの可能性を考えていませんでしたが、何らかの理由でユーザー名に [ または ] が含まれていると、接続で「RPC サーバーが利用できません」が返されます。

于 2011-11-09T08:40:49.620 に答える
0

電話をかける前に、必要なサービス (RPC) がまだ開始されていないことに賭けます。

つまり、サービスを開始する必要があるか、少なくとも処理を開始する必要があるのは、それを行う手段がある場合 (RPC サービスが開始されたとき) だけです。RPC の開始前に行われた RPC に依存する呼び出しは、失敗します。

私の知る限り、依存関係情報はレジストリに保存されます。ソリューションにレジストリ スクリプトを展開し、インストール時に実行できます。

したがって、たとえば、次の場所に値を作成する必要があります。

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\<Service>

あなた自身が依存しているサービスのレジストリキー名を保存します。

于 2011-11-08T12:54:52.220 に答える