4

.net アプリケーションを使用して Windows サービスをリモートで制御する必要があります。例: 異なるサービスに 10 の Windows サービスがあります。今、私はこれらのサービスをリモートで開始および停止するためのアプリケーション(Windowsサービスでもあると思います)を作成し、コマンドラインからそれらをインストールまたはアンインストールしたいと考えています。

まず、これらのサービス名を収集します。次に、ループまたは if/else を使用します。その前に、すべてのサービスがインストールされていることを確認したいと思います。サービス マネージャーにアクセスしてサービスをインストールするのではなく、コードに実装したい。どこかからヒントを得たのですが、まだ正確にはわかりません。

ServiceInstaller.InstallService("\"" + _applicationPath + "\\" + _applicationName + ".exe\" -service", _applicationName, _applicationName, autoInstall, autoRun);
internal static bool InstallService(string svcPath, string svcName, string svcDispName, bool autoStart, bool startNow)
    {
        #region Constants declaration.
        int SC_MANAGER_CREATE_SERVICE = 0x0002;
        int SERVICE_WIN32_OWN_PROCESS = 0x00000010;
        int SERVICE_DEMAND_START = 0x00000003;
        int SERVICE_ERROR_NORMAL = 0x00000001;
        int STANDARD_RIGHTS_REQUIRED = 0xF0000;
        int SERVICE_QUERY_CONFIG = 0x0001;
        int SERVICE_CHANGE_CONFIG = 0x0002;
        int SERVICE_QUERY_STATUS = 0x0004;
        int SERVICE_ENUMERATE_DEPENDENTS = 0x0008;
        int SERVICE_START = 0x0010;
        int SERVICE_STOP = 0x0020;
        int SERVICE_PAUSE_CONTINUE = 0x0040;
        int SERVICE_INTERROGATE = 0x0080;
        int SERVICE_USER_DEFINED_CONTROL = 0x0100;
        int SERVICE_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED |
        SERVICE_QUERY_CONFIG |
        SERVICE_CHANGE_CONFIG |
        SERVICE_QUERY_STATUS |
        SERVICE_ENUMERATE_DEPENDENTS |
        SERVICE_START |
        SERVICE_STOP |
        SERVICE_PAUSE_CONTINUE |
        SERVICE_INTERROGATE |
        SERVICE_USER_DEFINED_CONTROL);
        int SERVICE_AUTO_START = 0x00000002;
        #endregion Constants declaration.

        try
        {
            int dwStartType = SERVICE_AUTO_START;
            if (autoStart == false) dwStartType = SERVICE_DEMAND_START;

            IntPtr sc_handle = OpenSCManager(null, null, SC_MANAGER_CREATE_SERVICE);
            if (sc_handle.ToInt32() != 0)
            {
                IntPtr sv_handle = CreateService(sc_handle, svcName, svcDispName, SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, dwStartType, SERVICE_ERROR_NORMAL, svcPath, null, 0, null, null, null);
                if (sv_handle.ToInt32() == 0)
                {
                    CloseServiceHandle(sc_handle);
                    return false;
                }
                else

私の質問:

1) サービスの受け取り方法は?

2) サービスの開始/停止方法は?

3)サービスコードをインストールしますが、手がかりはありません。

4

3 に答える 3

0

たぶんnet、シェルからコマンドを使用する方法ですか?サービスのリスト、開始、停止などを行うことができます。使用すると少し「汚い」と感じるかもしれませんが、まあ、うまくいくでしょう。

Windows のリモート マシンでサービスを再起動するにはどうすればよいですか?

はい、単純な WEB サービス アプリの下にラップすることをお勧めします。

また読む:リモートコンピューターでサービスを再起動する最も簡単な方法

于 2013-09-30T12:54:32.097 に答える
0

ServiceController クラスはどうですか?

http://msdn.microsoft.com/library/system.serviceprocess.servicecontroller.aspx

サービスがインストールされていない場合、ServiceController.Status は InvalidOperationException をスローします

ServiceController.GetServices() は、サービスのリストを取得します。リモート コンピューターでも動作しますが、コードには適切なアクセス許可が必要です (なりすまし、おそらく?)

これもあります: http://www.codeproject.com/Articles/4242/Command-Line-Windows-Services-Manager

Windows では、InstallUtil.exe を使用してサービスをインストール/アンインストールできます。ただし、正しいバージョンを使用する必要があります。.NET のバージョンとシステム (x64、x32) によっては、複数ある場合があります。自分のマシン (リモート マシンについてはわかりません) の正しいパスは次のとおりです。

 string path = Path.Combine(System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory(), "InstallUtil.exe");

PsExecまたは WMIを使用して別のマシンでプロセスを実行できます

編集:

自分のマシンにサービスをインストールするための .bat スクリプト (x64 バージョンの installutil は x64 バージョンのサービスをインストールします):

@ECHO OFF

REM The following directory is for .NET 2.0
set DOTNETFX2=%SystemRoot%\Microsoft.NET\Framework64\v2.0.50727
set PATH=%PATH%;%DOTNETFX2%

echo Installing WindowsService...
echo ---------------------------------------------------
InstallUtil /i "service path goes here"
echo ---------------------------------------------------
echo Done.
于 2013-09-30T12:54:46.593 に答える