問題タブ [servicecontroller]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
windows-services - アンインストール時にWindowsサービスを自動的に停止する
私のサービスがインストールされると、インストール後にサービスを開始するハンドラーがあります。
アンインストールする前にサービスを停止したいので、InitializeComponent()にハンドラーを追加しました。
そして関数を追加しました:
ただし、アンインストールする前にサービスが停止することはありません。ServiceController.Stop()関数を不適切に使用していますか?
c# - WCF サービスをリモートで停止および開始するようにセキュリティを設定するにはどうすればよいですか?
これは長い投稿なので、ここに私の質問の要点を前もって示します。C# で ServiceController クラスを使用して別のコンピューターのサービスを制御したいのですが、サービス ホスト コンピューターでアカウントを偽装する必要があるようです。 .NET がセキュリティを管理する方法に準拠するため。それ、どうやったら出来るの?
詳細:
サーバーでホストされているいくつかの WCF サービスと、それらに依存するクライアント アプリがあります。(すべて .NET 4.0 C# で記述されています。) どのサービスが動作しているかを示すダッシュボードがクライアントにあり、いずれかのサービスがダウンした場合、ユーザーがそれらをリモートで再起動できるようにしたいと考えています。いくつかの調査の結果、ServiceController は私たちが望んでいることを実行できるようです。私はそれをいじり始めました、そしてこれは私がこれまでに書いたものです:
明らかに、これは実際にはサービスを再起動しません。ServiceController.Start()
andを使用してそれを行う方法がわかると思いますが、これだけのコードが実行されると、が呼び出されると.Stop().
例外がスローされます。GetServices()
これについて調査したところ、次のスレッドが見つかりました:
ServiceController を使用して Windows サービスをリモートで制御する方法は?
http://social.msdn.microsoft.com/Forums/en-US/clr/thread/18c34a5c-8637-4e85-b9ee-d9052bb12a34/
Windows 7 の ServiceController アクセス許可
servicecontroller アクセス許可
http://social.msdn.microsoft.com /フォーラム/en/wcf/スレッド/c35e75c4-de7d-409d-bc82-4533e4982264
私が彼らから集めたのは、ServiceController がサービスとやり取りするとき、サービスと対話するための適切な権限が必要だということです。私が見つけた記事では、サーバー上で適切な権限を持つユーザー アカウントになりすますことを提案していました。
残念ながら、私は .NET がセキュリティ上の問題をどのように管理するかについてまったくの初心者なので、どうすればよいかわかりません。ここに私の質問があります:
1. サーバー上のアカウントを偽装することは、この問題に対する適切なアプローチですか? 私が読んだスレッドの 1 人は、セキュリティの脆弱性が多すぎると考えていました。
2. アカウントを偽装するにはどうすればよいですか? 良いコード例の記事はどこかにありますか?
3. サーバーとクライアント コンピューターを構成せずにユーザーを偽装する方法はありますか? クライアントの環境にシステムをセットアップしましたが、インストールにあいまいな手順を追加したくありません。
編集: AvkashChauhan の回答によると、WCF サービスは Windows サービスとしてホストされています。
.net - AssemblyInstallerを使用してインストールした後にサービスが見つかりません
コンテクスト
Windows200864ビット。
インストーラーとして機能する.NETサービスをインストールしています。
バックグラウンド
私はこのコード(クレジット:Marc Gravell)を使用してサービスをインストールしています:
問題
すべて正常に動作し、例外はありませんが、その直後に、次のコードを実行して、インストールしたばかりのサービスを開始しようとしています。
そして、私は例外を受け取ります:
理由がわかりません。理由は次のとおりです。
ServiceInstaller
サービスの名前は、 (ServiceName
プロパティ内の)とまったく同じです。- コードは、ローカルシステムアカウントで実行される別のサービス内で実行され ます。
wix - 'wix 管理者によるアンインストール前にバッチを実行
私の WiX XML ファイルは、OLOLO_SERVICE という名前の Windows サービスを含むアプリをインストールします (たとえば)。アプリのインストール/再インストール時にこのサービスを停止したい。
ExeCommand='sc stop OLOLO_SERVICE' で CustomAction を使用します。
<InstallExecuteSequence> タグ内はアクションです
しかし、これは機能しません。アンインストーラーは、「アンインストールを続行するには、実行可能ファイルの追跡を停止する必要があります」というウィンドウを表示します (ロシア語の Windows 7 ではロシア語で書かれているため、100% 正しくない可能性があります)。
考えられる理由としては、
- スクリプトは管理者権限が取得される前に実行されます (管理者権限が必要なため、サービスの停止は失敗します)
- スクリプトは検証後に実行されます (インストールされた実行可能ファイルをチェックするときに検証が失敗します)
助けてください。バッチ「sc stop OLOLO_SERVICE」を使用してサービスを停止したいのですが。
PS。質問を単純化することにしました。WiX で実行中のアプリケーションをチェックする前に、管理者権限で「sc stop OLOLO_SERVICE」を実行するようにします。
c# - 複数のスレッドが停止できない Windows サービスを停止する方法
複数のスレッドを作成する C# で記述された Windows サービスがあり、一部のスレッドにはレガシー コードがあり、OnStop() が完了する前にこれらすべてのスレッドが停止するのを待つのに十分な時間/レガシー コードへのアクセスがありません。繰り返しになりますが、レガシーコードがあるため、すべてのスレッドへの参照がありません。ここで、サービスを動的に更新したいと考えています。そこで、Job サービスとは別の Updater サービスを開始します。アップデータ サービスはジョブ サービスを停止し、ジョブ サービス exe およびその他の dll をダウンロードし、これらを古いサービス exe および dll に置き換え、最後にジョブ サービスを再起動します。起動すると、Job サービスは Updater サービスを停止します。
アップデータ サービスが ServiceController.Stop() を使用してジョブ サービスを停止し、さらに ServiceController.WaitForStatus(ServiceControllerStatus.Stopped) を呼び出すと、ジョブ サービスは停止しますが、ジョブ サービスから生成された一部のレガシー スレッドはその時点で停止しない場合があります。その結果、ジョブ サービス exe を更新できません。
私は本当にまだ良い解決策を見つけていません。最善の解決策は、WaitHandles (AutoResetEvent/ManualResetEvent) を使用してすべてのスレッドが終了するのを待つことでしたが、これは発生していません。または、すべてのスレッドが強制的に中止された可能性もありますが、これも重要なようです。別の望ましくない解決策は、サービス プロセスで実行されているすべてのスレッドを見つけて、すべてのスレッドを終了/中止することです。これは単純ではなく、望ましい解決策でもありません。OnStop() で Environment.Exit を使用することを望んでいましたが、Windows でプロセスが予期せず終了した (エラー 1067) という悪い警告メッセージが表示されることがわかりましたが、これはまったく解決できませんでした。
今、レガシーコードに触れずに、この瞬間に短時間で何をすべきか混乱しています。どんな助けもかなりのものです。
c# - ServiceController またはその他を使用して、アンマネージド カーネル ドライバー サービスをプログラムで作成する
C で記述されたカーネル ドライバーと C# で記述されたアプリケーションで構成された C/C# 混合プロジェクトがあります。現在、カーネル ドライバー サービスを作成して実行するために、ネイティブ API の OpenSCManager と CreateService を相互運用サービスと共に使用しています。コードのスニペットは次のとおりです。
しかし、(可能であれば) C で記述されたドライバーのみを使用し、システム API/ネイティブなどに依存して、これを完全に管理したいと考えています。
ServiceController を使用して、既にインストールされている Windows サービスを管理 ( start/stop/etc ) する方法は知っていますが、それ (または他のクラス) を使用してカーネル ドライバーのサービスを作成する方法についてはわかりません。
ご協力いただきありがとうございます。
.net - ServiceController.ExecuteCommand: データを取り戻す方法
.NET では、このクラスを使用して、メソッドServiceController
を使用してサービスにカスタム コマンドを送信できます。ExecuteCommand
サービスのステータスを照会できるようにしたいと考えています (「開始/停止」の種類ではなく、ステータスのカスタム概念)。ExecuteCommand
似たようなものを使用してサービスを呼び出し、ステータスを示す戻り値を取得するのは簡単だと思っていました。これを可能にするものはありServiceController
ますか?
そうでないと仮定すると、ある種の外部プロセス間通信技術を使用する必要があると思います (たとえば、サービスはそのステータスをデータベースまたはメッセージ キューに書き込みます)。シンプルにするために何をお勧めしますか?
c# - ServiceController クラス (C#) に代わるものを知っていますか
問題は、サービスを開始しようとすると、時間がかかりすぎる場合に、開始が遅い/開始されないサービスを「キャンセル」する方法がないことです。
「ts」を 300 秒のように長すぎるように設定し、120 秒待った後、操作をキャンセルすることにしたとします。サービス コントローラーのステータスが変化するのを待つか、タイムアウトが発生するのを待ちたくありません。 、 どうやってやるの?
c# - WindowsサービスのOnStart内で資格情報を変更するsc.exe構成
データベースからサービスのクレデンシャルを取得したい(より動的に)
サービスで.Start()を呼び出す前に、sc.exeを使用してOnStart内の資格情報を変更しています。
sc.exeの変更は機能しますが、再起動するまで有効にならないことに気付きました。
つまり、実行しているユーザーとしてのSYSTEMであることに気付きました。もう一度再起動すると、ドメインアカウントが表示されます。
実際に実行する前にOnStart内でそれを実行できるようにする資格情報を変更する他の方法はありますか?
ありがとう、デビッド
c# - .NET3.5でServiceControllerを使用してサービスを停止することはできません
.NET 3.5で作業していますが、ServiceControllerを使用して一部のサービスを停止する際に問題が発生します。インターネット全体を検索しましたが、問題の解決策が見つかりませんでした;)
これが私がそれをする方法です:
サービスが停止するまで待っています。次に、ライブラリを置き換えます(更新します)。そして、例外がスローされます。
UnauthorizedAccessException例外の詳細:System.UnauthorizedAccessException:パス「blablabla」へのアクセスが拒否されました。
アプリケーションを管理者として実行しているので、このパスにアクセスできると確信しています。
このコードが実行されると興味深いのは、このサービスが現在のサービスのリスト(タスクマネージャー内)から消えることです。したがって、実際には停止しますが、一部のスレッドは引き続きそれを使用する必要があるため、サービスのファイルを移動できません。自分でファイルを移動しようとしても(Serviceディレクトリに移動し、マウスを使ってファイルを移動しようとすると)できません。しかし、サービスを手動で停止すると(タスクマネージャーと「タスクの終了」)、そのファイルでやりたいことが何でもできます。では、C#コード(ServiceControllerを使用)から停止することと、タスクマネージャーを使用して停止することの違いは何ですか?
重要かどうかはわかりませんが、このアプリケーション(およびこのサービス)をWindowsServer2008のVirtualBoxで実行しています。(私はそれを他のマシンで実行する必要があり、それから私のコンピューターで実行する必要がありました)。
この問題をどのように解決できますか?;)
助けてくれてありがとう。
ピート、よろしくお願いします。