2011-07-12 6 views
40

私が作成しているアプリケーションに問題があります。私は私のC#アプリケーションを介してWindowsサービスを開始しようとしています。スタートボタンをクリックすると、すべてが通り抜けているように見えますが、サーバーにログインしても、サービスが実行中であることは表示されません。しかし、2回目に実行すると、サービスのインスタンスがすでに実行されているという例外が表示されます。再度サーバーにログインすると、サービスが停止したように見えます。誰もこれを見たことがありますか?C#プログラムによるWindowsサービスの開始

ここに私のコードです。

try 
{ 
    while (reader.Read()) 
    { 
     int timeoutMilliseconds = 1000; 
     string serviceName = reader["ServiceName"].ToString(); 
     string permission = reader["Permission"].ToString(); 

     if (permission == "E") 
     { 
      lblServStartSuccess.Visible = true; 

      ServiceController service = new ServiceController(serviceName); 
      TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds); 

      service.Start(); 
      service.WaitForStatus(ServiceControllerStatus.Running, timeout); 
     } 
     else 
     { 
      lblServErrorStart.Visible = true; 
     } 
    } 
} 
catch (Exception ex) 
{ 
    Response.Write(ex.ToString()); 
} 

編集:ここで私は、一つのサービスで受信した例外は次のとおりです。

のSystem.InvalidOperationException:サービス論理ディスクマネージャ管理サービスがコンピュータ上で見つかりませんでした「」。 ---> System.ComponentModel.Win32Exception:指定されたサービスがインストールされたサービスとして存在しません---内部例外スタックトレースの末尾---

サービスが存在することがわかります。どのサーバーを見るべきかを伝えるために、サービスの前に何かを追加する必要がありますか?

+1

サービスは開始状態で停​​止していませんか?私はサービスコントロールパネルがそれを表示することについて華麗ではなかったことを覚えています(少なくともいくつかのWindowsバージョン前) – Rup

+0

"サーバーにログインするとき"とはどういう意味ですか - 別のマシンでSCMを使用しようとしていますか? – BrokenGlass

+0

はいリモートサーバーからWebサービスを実行しています。管理者権限を持つアカウントを使用しています。私はそれが固まっているかわからない。タイムアウトが短すぎてタイムアウトになることはありますか? – Matt

答えて

31

サービスが実行される場所以外のマシンで表示されたコードが実行されている場合(あなたのコメントからは分かりません)、そのマシン名をServiceControllerコンストラクタ。あなたが正常にサービスを開始することは可能ですが、あなたが思っているマシンでは可能ではありませんか?それはあなたが描いている症状に合っているでしょう。ここで

ServiceController service = new ServiceController(serviceName, serverName); 

http://msdn.microsoft.com/en-us/library/aa331793%28v=VS.71%29.aspx

+0

私は、リモートサーバー名を取るコンストラクタの使用方法を表示するように編集しました。 – hatchet

+0

これを行うには他の特権が必要であるというエラーが表示されるので、あなたは正しいと思います。 – Matt

+0

偽装されたユーザーとしてソースサーバーにログインすると、ターゲットサーバーのサービスマネージャをプルアップし、リモートからサービスを開始および停止できます。私はちょうどWebアプリケーションからそれを行うことはできません。 – Matt

0

サービスを試してみてください。 timeoutやwaitforstatusを使わずにイベントをフックして何が起きているのかを確認します。

+0

すべてが機能しているように見えます。それは単にサービスが実行中であると表示しません。 – Matt

14

私は、同じサーバー上で実行されている他のサービスを開始、停止を担当するウィンドウサービスを持っているコードです。

ServiceController controller = new ServiceController(serviceName); 
if (controller.Status==ServiceControllerStatus.Running) 
    controller.Stop(); 

if (controller.Status==ServiceControllerStatus.Stopped) 
    controller.Start(); 
2
public static void StartService(string serviceName, int timeoutMilliseconds) 
    { 
     ServiceController service = new ServiceController(serviceName); 
     try 
     { 
      int millisec1 = 0; 
      TimeSpan timeout; 

      // count the rest of the timeout 
      int millisec2 = Environment.TickCount; 
      timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds - (millisec1)); 
      service.Start(); 
      service.WaitForStatus(ServiceControllerStatus.Running, timeout); 

     } 
     catch (Exception e) 
     { 
      Trace.WriteLine(e.Message); 
     } 
    } 
    public static void StopService(string serviceName, int timeoutMilliseconds) 
    { 
     ServiceController service = new ServiceController(serviceName); 
     try 
     { 
      int millisec1 = 0; 
      TimeSpan timeout; 
      if (service.Status == ServiceControllerStatus.Running) 
      { 
       millisec1 = Environment.TickCount; 
       timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds); 
       service.Stop(); 
       service.WaitForStatus(ServiceControllerStatus.Stopped, timeout); 
      } 


     } 
     catch (Exception e) 
     { 
      Trace.WriteLine(e.Message); 
     } 
    } 
    public static void RestartService(string serviceName, int timeoutMilliseconds) 
    { 
     ServiceController service = new ServiceController(serviceName); 
     try 
     { 
      int millisec1 = 0; 
      TimeSpan timeout; 
      if (service.Status == ServiceControllerStatus.Running) 
      { 
       millisec1 = Environment.TickCount; 
       timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds); 
       service.Stop(); 
       service.WaitForStatus(ServiceControllerStatus.Stopped, timeout); 
      } 
      // count the rest of the timeout 
      int millisec2 = Environment.TickCount; 
      timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds - (millisec2 - millisec1)); 
      service.Start(); 
      service.WaitForStatus(ServiceControllerStatus.Running, timeout); 

     } 
     catch (Exception e) 
     { 
      Trace.WriteLine(e.Message); 
     } 
    } 

いけないreferance System.ServiceProcessを使用したとしてServiceProcessを追加するのを忘れ。

+0

これは質問のコードに何かを追加しますか? – Rup

3

これは古いスレッドですが、Googleは私をここに連れてきました。サービスが正常に開始された後でも、私のサービスは依然として停止したまま返答します。 あなたが

service.Refresh(); 

を追加する場合は、前のクエリから実際の現在の状態の代わりに、保存された状態を照会します。なぜこのように動作するのか分かりませんが、それはあります。

P .:私は1分の時間を追加し、まだサービスがリフレッシュせずに応答を停止しました。

関連する問題