69

最近、Windows サービスとして実行されるいくつかのアプリケーションを継承しましたが、両方で GUI (システム トレイのコンテキスト メニューからアクセス可能) を提供するのに問題があります。

Windows サービスの GUI が必要な理由は、停止/再起動に頼らずに Windows サービスの動作を再構成できるようにするためです。

私のコードはデバッグモードで正常に動作し、コンテキストメニューが表示され、すべてが正しく動作するなど.

名前付きアカウント (つまり、ローカル システム アカウントではない) を使用して「installutil」経由でサービスをインストールすると、サービスは正常に動作しますが、システム トレイにアイコンが表示されません (これは正常な動作です。 「デスクトップと対話する」オプションがあります)。

ただし、ここに問題があります-「LocalSystemAccount」オプションを選択し、「デスクトップと対話する」オプションをチェックすると、明らかな理由もなくサービスの起動にAGESがかかり、取得し続けます

ローカル コンピュータで ... サービスを開始できませんでした。

エラー 1053: サービスは開始または制御要求にタイムリーに応答しませんでした。

ちなみに、Windows サービスのタイムアウトをデフォルトの 30 秒から 2 分にレジストリ ハック ( http://support.microsoft.com/kb/824344を参照、セクション 3 で TimeoutPeriod を検索) で増やしましたが、サービスはまだ起動します。タイムアウトします。

私の最初の質問は、サービスが非 LocalSystemAccount でログインする場合よりも「ローカル システム アカウント」のログインに時間がかかり、Windows サービスのタイムアウトが発生するのはなぜですか? 起動時にこのような異なる動作を引き起こすこれら2つの違いは何ですか?

第二に、一歩下がって、私が達成しようとしているのは、構成用のGUIを提供するWindowsサービスだけです-非ローカルシステムアカウント(名前付きのユーザー/ pwdを使用)を使用して実行できれば幸いです。サービスをデスクトップと対話させることができれば (つまり、システム トレイからコンテキスト メニューを利用できるようにする)。これは可能ですか?

上記の質問へのポインタをいただければ幸いです。

4

34 に答える 34

76

何日もこのメッセージと戦った後、友人はリリース ビルドを使用しなければならないと言いました。Debug ビルドを InstallUtil すると、このメッセージが表示されます。リリース ビルドが正常に開始されます。

于 2011-09-30T14:12:40.300 に答える
31

サービスをユーザーのデスクトップと直接対話させようとする道を進み続けると、負けてしまいます。最良の状況下(つまり、「Vista以前」)でも、これは非常に注意が必要です。

Windowsは、それぞれが独自のデスクトップを持つ複数のウィンドウステーションを内部的に管理します。特定のアカウントで実行されているサービスに割り当てられているウィンドウステーションは、ログオンしているインタラクティブユーザーのウィンドウステーションとはまったく異なります。クロスウィンドウステーションへのアクセスは、セキュリティ上のリスクがあるため、常に嫌​​われてきましたが、以前のWindowsバージョンではいくつかの例外が許可されていましたが、Vista以降のオペレーティングシステムではほとんど排除されています。

サービスが起動時にハングしている可能性が最も高い理由は、存在しないデスクトップと対話しようとしている(または、Explorerがシステムユーザーセッション内で実行されていると想定しているが、そうではない)か、非表示のデスクトップからの入力を待機しているためです。 。

これらの問題に対する唯一の信頼できる修正は、サービスからすべてのUIコードを削除し、インタラクティブユーザーセッション内で実行される別の実行可能ファイルに移動することです(たとえば、実行可能ファイルはグローバルスタートアップグループを使用して開始できます)。

UIコードとサービス間の通信は、任意のRPCメカニズムを使用して実装できます。名前付きパイプは、この目的に特に適しています。通信のニーズが最小限である場合は、アプリケーション定義のサービスコントロールマネージャーコマンドを使用することもうまくいく可能性があります。

UIとサービスコードをこのように分離するには、ある程度の努力が必要です。ただし、これが確実に機能する唯一の方法であり、将来的には役立つでしょう。

補遺、2010年4月:この質問は依然として非常に人気があるため、デスクトップとの対話などの面白いことを試みない.NETサービスを含む、「サービスが応答しませんでした...」エラーを引き起こす別の一般的なシナリオを修正する方法を次に示します。ただし、Authenticode署名付きアセンブリを使用してください。.exe.configファイルに次の要素を追加して、パブリッシャーの証拠を作成するために、ロード時にAuthenticode署名の検証を無効にします。

<configuration>
    <runtime>
        <generatePublisherEvidence enabled="false"/>
    </runtime>
</configuration>

パブリッシャーの証拠は、ほとんど使用されていないコードアクセスセキュリティ(CAS)機能です。サービスが実際にPublisherMembershipConditionに依存しているというまれなイベントでのみ、問題が発生します。他のすべての場合、ランタイムが高価な証明書チェック(失効リストのルックアップを含む)を実行する必要がなくなるため、永続的または断続的なスタートアップの失敗がなくなります。

于 2008-10-01T16:36:05.550 に答える
22

サービスを実行しているボックスにフレームワークがないため、この問題に直面しました。ボックスには .NET 4.0 があり、サービスは .NET 4.5 の上に書かれていました。

ボックスに次のダウンロードをインストールして再起動すると、サービスが正常に起動しました: http://www.microsoft.com/en-us/download/details.aspx?id=30653

于 2013-09-20T20:39:28.517 に答える
14

サービスの起動をデバッグするには、OnStart()サービスのメソッドの先頭に次を追加します。

 while(!System.Diagnostics.Debugger.IsAttached) Thread.Sleep(100);

これにより、[デバッグ] -> [プロセスにアタッチ...] を使用して Visual Studio デバッガーを手動でアタッチするまで、サービスが停止します。

注:一般に、ユーザーがサービスとやり取りする必要がある場合は、GUI コンポーネントを、ユーザーがログインしたときに実行される別の Windows アプリケーションに分割することをお勧めします。次に、名前付きパイプやその他の形式の IPC などを使用します。 GUI アプリとサービス間の通信を確立します。実際、これがWindows Vista で可能な唯一の方法です。

于 2008-10-01T17:00:36.647 に答える
6

OnStart メソッド内のサービス クラスでは、大規模な操作を行わないでください。OS は、サービスを実行するのに短い時間を期待し、スレッド スタートを使用してメソッドを実行します。

protected override void OnStart(string[] args)
{
    Thread t = new Thead(new ThreadStart(MethodName)); // e.g.
    t.Start();
}
于 2011-03-17T11:08:55.357 に答える
5

ここでは盲目的に撮影していますが、サービスの起動に長い遅延が直接的または間接的にネットワーク機能のタイムアウトによって引き起こされることがよくあります。これは、多くの場合、アカウント SID を検索するときにドメイン コントローラーに接続しようとしたときに発生します。GetMachineAccountSid()その関数は RPC サブシステムによって呼び出されるためです。

このような状況でのデバッグ方法の例については、Mark Russinovich のブログのThe Case of the Process Startup Delaysを参照してください。

于 2008-10-01T16:14:38.130 に答える
4

サービスで以下のようなデバッグ コードを使用している場合、問題が発生する可能性があります。

#if(!DEBUG)
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new EmailService()
};
ServiceBase.Run(ServicesToRun);
#else
//direct call function what you need to run
#endif

これを修正するには、Windows サービスのビルド中に #if 条件を削除します。このままでは機能しないためです。

以下のように代わりにデバッグモードの引数を使用してください。

if (args != null && args.Length > 0)
{
_isDebug = args[0].ToLower().Contains("debug");
}
于 2014-11-24T10:38:36.190 に答える
4

私の場合、問題は のバージョンが見つからないことでした.net framework

私が利用したサービス

<startup>
  <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>

しかし.net Framework、サーバーのバージョンは 4 だったので、4.5 を 4 に変更することで問題は解決しました。

<startup>
  <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
</startup>
于 2015-07-11T04:39:34.680 に答える
3

リリース DLL をコピーするか、デバッグ モードではなくリリース モードから DLL を取得し、インストール フォルダに貼り付けます。動作するはずです。

于 2011-02-22T13:56:48.683 に答える
3

私が書いていたサービスで同様の問題が発生していました。それは正常に機能し、ある日、開始エラーでタイムアウトが発生し始めました。何が起こっているかに応じて、リリースとデバッグの一方および/または両方で発生しました。System.Diagnostics から EventLogger をインスタンス化しましたが、表示されていたエラーは、Logger が書き込む前に発生していたに違いありません...

EventLog を検索する場所がわからない場合は、VS でサーバー エクスプローラーの下のマシンに移動できます。私は自分のサービス以外の EventLog を調べ始めました。Application - .NETRuntime の下に、起動時のエラーに関連するエラー ログが見つかりました。基本的に、サービスのコンストラクターにいくつかの例外がありました (そのうちの 1 つは、EventLog インスタンスのセットアップで例外であることが判明しました。これにより、サービス EventLog にログが表示されない理由が説明されました)。以前のビルドでは、他のエラーがあったようです (これにより、EventLog セットアップでエラーにつながる変更を行う必要がありました)。

簡単に言えば、タイムアウトの理由はさまざまな例外/エラーが原因である可能性がありますが、Runtime EventLogs を使用すると、何が起こっているのかを理解するのに役立ちます (特に、あるビルドが機能し、別のビルドが機能しない場合)。

お役に立てれば!

于 2013-08-16T18:16:44.440 に答える
2

私はこの問題を抱えていました、そしてそれは私を2日間狂わせました…あなたの問題が私のものと似ているなら:

Windowsサービスに「ユーザー設定」の設定があるので、サービスを停止および開始しなくても、サービスは自己保守を行うことができます。問題は「ユーザー設定」にあり、これらの設定の構成ファイルは、service-exeファイルバージョンでWindowsサービスを実行しているユーザーのユーザープロファイルの下のフォルダーに保存されます。

このフォルダは何らかの理由で破損しています。フォルダを削除すると、サービスは通常どおり正常に機能し始めます…</ p>

于 2011-03-04T21:45:11.223 に答える
2

私はこの問題を抱えていました。修正するのに約1日かかりました。私にとっての問題は、コードが「メインコンテンツ」をスキップし、数行を効果的に実行してから終了したことでした。そして、これが私にエラーを引き起こしました。これは、Windows サービスをインストールする C# コンソール アプリケーションであり、ServiceController ( sc.Run() ) で実行しようとするとすぐに、このエラーが発生します。

メイン コンテンツに移動するようにコードを修正すると、目的のコードが実行されます。

ServiceBase.Run(new ServiceHost());

その後、表示されなくなりました。

多くの人がすでに言っているように、エラーは何でもあり得、人々が提供する解決策はそれを解決するかもしれないし、しないかもしれない. 彼らがそれを解決しない場合 (Debug ではなく Release、config に generatePublisherEvidence=false を追加するなど)、問題は自分のコードにある可能性があります。

sc.Run() を使用せずにコードを実行してみてください (つまり、sc.Run() が実行するコードを実行します)。

于 2014-05-01T22:13:40.530 に答える
2

この問題は通常、アセンブリに欠落している参照があり、実行時にバインディングが失敗する場合に発生します。

に入れデバッグThread.Sleep(1000)main()ます。実行の次の行にブレークポイントを置きます。

次に、プロセスを開始し、プロセスの開始中にデバッガーをプロセスにアタッチします。ブレークポイントに到達したら f5 を押します。アセンブリまたは参照がないという例外がスローされます。

これでこのエラーが解決されることを願っています。

于 2014-07-28T03:07:25.037 に答える
2

サービスのデバッグ ビルドをインストールし、デバッガーをサービスにアタッチして、何が起こっているかを確認します。

于 2008-10-01T16:13:51.907 に答える
2

一度exeファイルを実行してみてください。同じ問題が発生しましたが、exeファイルをダブルクリックして直接実行すると、.Netフレームワークのバージョンに関するメッセージが表示されました。これは、ターゲットマシンにインストールされていないフレームワークでサービスプロジェクトをリリースしたためです。

于 2016-09-04T18:35:22.320 に答える
2

ここで mdb のコメントをエコーし​​たいと思います。この道を行かないでください。あなたのサービスはUIを持つべきではありません...「ユーザーの操作なし」は、サービスの定義機能のようなものです。

サービスを構成する必要がある場合は、サービスが起動時に読み取るのと同じ構成を編集する別のアプリケーションを作成します。ただし、それを独自のツールにします。サービスを開始したい場合は、サービスを開始します。構成する場合は、構成ツールを実行します。

さて、サービスのリアルタイム監視が必要な場合、それは少しトリッキーです (そして確かに私がサービスで望んでいたことです)。ここで、プロセス間通信を使用しなければならないことやその他の頭痛の種について話しています。

最悪なことに、ユーザーとの対話が必要な場合、サービスがユーザーと対話しないため、ここで実際の切断が発生します。

あなたの場合、私は一歩下がって、なぜこれがサービスである必要があるのか​​と尋ねます。また、なぜユーザーの操作が必要なのですか?

これら 2 つの要件はかなり相容れないものであり、警告が発せられるはずです。

于 2008-10-01T18:17:50.453 に答える
1

「Hosts」ファイルに127.0.0.1crl.microsoft.comを追加すると、問題が解決しました。

于 2013-01-15T13:32:11.683 に答える
0

ローカルシステムアカウントとローカルサービスの両方が機能しませんでした。次に、ネットワークサービスに設定すると、これは正常に機能しました。

于 2009-07-20T13:33:17.883 に答える
0
  1. リリース モードでプロジェクトをビルドします。
  2. すべてのリリース フォルダー ファイルをソース パスにコピーします。
  3. 管理アクセスでコマンド プロンプト ウィンドウを使用して Window サービスを実行します。
  4. ソース パスからファイルを削除しないでください。

少なくともこれは私にとってはうまくいきます。

于 2016-08-25T08:19:21.620 に答える
0

データベース テーブルにログを記録するように Log4Net を構成しました。テーブルが非常に大きくなったため、サービスがメッセージをログに記録しようとしてタイムアウトになりました。

于 2016-06-15T17:48:35.713 に答える
0

テストに Windows フォームを使用している場合は、スタートアップ オブジェクトが Windows フォームではなくサービスであることを確認してください。

于 2016-04-04T15:10:53.620 に答える
0

私の場合、本物のエラーが原因でこの問題が発生しました。サービス コンストラクターが呼び出される前に、メンバー変数の静的コンストラクターの 1 つが失敗していました。

    private static OracleCommand cmd;

    static SchedTasks()
    {
        try
        {
            cmd = new OracleCommand("select * from change_notification");
        }
        catch (Exception e)
        {
            Log(e.Message); 
            // "The provider is not compatible with the version of Oracle client"
        }
    }

try-catch ブロックを追加することで、Oracle のバージョンが間違っているために例外が発生していることがわかりました。正しいデータベースをインストールすると、問題が解決しました。

于 2011-02-21T02:52:17.393 に答える
0

私の問題は、サービス プログラムがサードパーティの dll を見つけられなかったことです。DLLへのパスをシステムPATHに追加すると、これが解決しました。

于 2022-02-02T11:52:46.537 に答える
0

私も同様の問題に直面し、アセンブリの読み込みに問題があることがわかりました。サービスを開始しようとすると、すぐにこのエラーが発生しました。

問題をすばやくデバッグするには、ProcDump http://technet.microsoft.com/en-us/sysinternals/dd996900を使用して、コマンド プロンプトから実行可能なサービスを実行してみてください。正確なエラーについての十分なヒントを提供する必要があります。

http://bytes.com/topic/net/answers/637227-1053-error-trying-start-my-net-windows-serviceはかなり役に立ちました。

于 2012-09-28T07:20:12.260 に答える
0

私もこの問題を抱えていました。ログオン アカウントをローカル システム アカウントに変更することで機能するようになりました。私のプロジェクトでは、ローカル サービス アカウントとして実行するようにセットアップしました。そのため、インストールしたとき、デフォルトで Local Service を使用していました。私は .net 2.0 と VS 2005 を使用しています。したがって、.net 1.1 SP1 をインストールしても効果はありませんでした。

于 2009-03-03T20:10:31.473 に答える
0

私たちの場合、イベント ビューアーを参照し、マシン構成が適切な形式の XML ではないことを示すエラーを取得したため、調査したところ、削除した要素の 1 つに二重 << 角かっこを誰かが配置していることがわかり、これで問題が解決しました。

于 2022-01-18T12:23:09.357 に答える
0

私の場合、ADのユーザーアカウントの許可でした。正しく設定すると、完璧に機能します。

于 2018-08-02T12:14:42.603 に答える
0

これは私にとってはうまくいきました。基本的に、ログオン ユーザーが正しいユーザーに設定されていることを確認します。ただし、アカウント インフラストラクチャの設定方法によって異なります。私の例では、AD アカウントのユーザー資格情報を使用しています。

起動メニューの検索ボックスで「サービス」を検索します - サービスで必要なサービスを見つけます - 右クリックして [ログオン] タブを選択します - [このアカウント] を選択し、必要なコンテンツ/資格情報を入力します - OK して、通常どおりサービスを開始します

ここに画像の説明を入力

于 2016-03-23T10:26:53.797 に答える