Tworzenie usługi systemu Windows przy użyciu BackgroundService

Deweloperzy programu .NET Framework prawdopodobnie znają aplikacje usługi systemu Windows. Przed .NET Core i .NET 5 lub nowszym deweloperzy, którzy polegali na programie .NET Framework, mogą tworzyć usługi systemu Windows do wykonywania zadań w tle lub wykonywania długotrwałych procesów. Ta funkcja jest nadal dostępna i można tworzyć usługi robocze, które działają jako usługa systemu Windows.

Z tego samouczka dowiesz się, jak wykonywać następujące czynności:

  • Opublikuj aplikację procesu roboczego platformy .NET jako pojedynczy plik wykonywalny.
  • Utwórz usługę systemu Windows.
  • Utwórz aplikację BackgroundService jako usługę systemu Windows.
  • Uruchom i zatrzymaj usługę systemu Windows.
  • Wyświetlanie dzienników zdarzeń.
  • Usuń usługę systemu Windows.

Napiwek

Cały przykładowy kod źródłowy "Pracownicy na platformie .NET" jest dostępny w przeglądarce Samples Browser do pobrania. Aby uzyskać więcej informacji, zobacz Przeglądanie przykładów kodu: Procesy robocze na platformie .NET.

Ważne

Zainstalowanie zestawu .NET SDK powoduje również zainstalowanie Microsoft.NET.Sdk.Worker szablonu i procesu roboczego. Innymi słowy, po zainstalowaniu zestawu SDK platformy .NET można utworzyć nowy proces roboczy przy użyciu polecenia dotnet new worker . Jeśli używasz programu Visual Studio, szablon jest ukryty do momentu zainstalowania opcjonalnego obciążenia ASP.NET i tworzenia aplikacji internetowych.

Wymagania wstępne

Tworzenie nowego projektu

Aby utworzyć nowy projekt usługi roboczej za pomocą programu Visual Studio, wybierz pozycję Plik>nowy>projekt....W oknie dialogowym Tworzenie nowego projektu wyszukaj frazę "Usługa procesu roboczego" i wybierz szablon Usługa procesu roboczego. Jeśli wolisz użyć interfejsu wiersza polecenia platformy .NET, otwórz swój ulubiony terminal w katalogu roboczym. dotnet new Uruchom polecenie i zastąp element <Project.Name> odpowiednią nazwą projektu.

dotnet new worker --name <Project.Name>

Aby uzyskać więcej informacji na temat polecenia nowego projektu usługi roboczej interfejsu wiersza polecenia platformy .NET, zobacz dotnet new worker (dotnet new worker).

Napiwek

Jeśli używasz programu Visual Studio Code, możesz uruchomić polecenia interfejsu wiersza polecenia platformy .NET z poziomu zintegrowanego terminalu. Aby uzyskać więcej informacji, zobacz Visual Studio Code: Zintegrowany terminal.

Instalowanie pakietu NuGet

Aby współdziałać z natywnymi usługami systemu Windows z implementacji platformy .NET IHostedService , należy zainstalować Microsoft.Extensions.Hosting.WindowsServices pakiet NuGet.

Aby zainstalować to z poziomu programu Visual Studio, użyj okna dialogowego Zarządzanie pakietami NuGet... Wyszukaj ciąg "Microsoft.Extensions.Hosting.WindowsServices" i zainstaluj go. Jeśli wolisz użyć interfejsu wiersza polecenia platformy .NET, uruchom dotnet add package polecenie:

dotnet add package Microsoft.Extensions.Hosting.WindowsServices

Aby uzyskać więcej informacji na temat polecenia dodawania pakietu interfejsu wiersza polecenia platformy .NET, zobacz dotnet add package (Dotnet add package).

Po pomyślnym dodaniu pakietów plik projektu powinien teraz zawierać następujące odwołania do pakietu:

<ItemGroup>
  <PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
  <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="8.0.0" />
</ItemGroup>

Aktualizowanie pliku projektu

Ten projekt roboczy korzysta z typów odwołań dopuszczanych do wartości null języka C#. Aby włączyć je dla całego projektu, zaktualizuj odpowiednio plik projektu:

<Project Sdk="Microsoft.NET.Sdk.Worker">

  <PropertyGroup>
    <TargetFramework>net8.0-windows</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>true</ImplicitUsings>
    <RootNamespace>App.WindowsService</RootNamespace>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
    <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="8.0.0" />
  </ItemGroup>
</Project>

Poprzednie zmiany pliku projektu dodają <Nullable>enable<Nullable> węzeł. Aby uzyskać więcej informacji, zobacz Ustawianie kontekstu dopuszczalnego do wartości null.

Tworzenie usługi

Dodaj nową klasę do projektu o nazwie JokeService.cs i zastąp jego zawartość następującym kodem w języku C#:

namespace App.WindowsService;

public sealed class JokeService
{
    public string GetJoke()
    {
        Joke joke = _jokes.ElementAt(
            Random.Shared.Next(_jokes.Count));

        return $"{joke.Setup}{Environment.NewLine}{joke.Punchline}";
    }

    // Programming jokes borrowed from:
    // https://github.com/eklavyadev/karljoke/blob/main/source/jokes.json
    private readonly HashSet<Joke> _jokes = new()
    {
        new Joke("What's the best thing about a Boolean?", "Even if you're wrong, you're only off by a bit."),
        new Joke("What's the object-oriented way to become wealthy?", "Inheritance"),
        new Joke("Why did the programmer quit their job?", "Because they didn't get arrays."),
        new Joke("Why do programmers always mix up Halloween and Christmas?", "Because Oct 31 == Dec 25"),
        new Joke("How many programmers does it take to change a lightbulb?", "None that's a hardware problem"),
        new Joke("If you put a million monkeys at a million keyboards, one of them will eventually write a Java program", "the rest of them will write Perl"),
        new Joke("['hip', 'hip']", "(hip hip array)"),
        new Joke("To understand what recursion is...", "You must first understand what recursion is"),
        new Joke("There are 10 types of people in this world...", "Those who understand binary and those who don't"),
        new Joke("Which song would an exception sing?", "Can't catch me - Avicii"),
        new Joke("Why do Java programmers wear glasses?", "Because they don't C#"),
        new Joke("How do you check if a webpage is HTML5?", "Try it out on Internet Explorer"),
        new Joke("A user interface is like a joke.", "If you have to explain it then it is not that good."),
        new Joke("I was gonna tell you a joke about UDP...", "...but you might not get it."),
        new Joke("The punchline often arrives before the set-up.", "Do you know the problem with UDP jokes?"),
        new Joke("Why do C# and Java developers keep breaking their keyboards?", "Because they use a strongly typed language."),
        new Joke("Knock-knock.", "A race condition. Who is there?"),
        new Joke("What's the best part about TCP jokes?", "I get to keep telling them until you get them."),
        new Joke("A programmer puts two glasses on their bedside table before going to sleep.", "A full one, in case they gets thirsty, and an empty one, in case they don’t."),
        new Joke("There are 10 kinds of people in this world.", "Those who understand binary, those who don't, and those who weren't expecting a base 3 joke."),
        new Joke("What did the router say to the doctor?", "It hurts when IP."),
        new Joke("An IPv6 packet is walking out of the house.", "He goes nowhere."),
        new Joke("3 SQL statements walk into a NoSQL bar. Soon, they walk out", "They couldn't find a table.")
    };
}

readonly record struct Joke(string Setup, string Punchline);

Powyższy kod źródłowy usługi żartów uwidacznia pojedynczą funkcjonalność , metodę GetJoke . Jest to string metoda zwracana, która reprezentuje losowy żart programistyjny. Pole o _jokes zakresie klasy służy do przechowywania listy żartów. Losowy żart jest wybierany z listy i zwracany.

Ponowne zapisywanie Worker klasy

Zastąp istniejący Worker z szablonu następującym kodem języka C# i zmień nazwę pliku na WindowsBackgroundService.cs:

namespace App.WindowsService;

public sealed class WindowsBackgroundService(
    JokeService jokeService,
    ILogger<WindowsBackgroundService> logger) : BackgroundService
{
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        try
        {
            while (!stoppingToken.IsCancellationRequested)
            {
                string joke = jokeService.GetJoke();
                logger.LogWarning("{Joke}", joke);

                await Task.Delay(TimeSpan.FromMinutes(1), stoppingToken);
            }
        }
        catch (OperationCanceledException)
        {
            // When the stopping token is canceled, for example, a call made from services.msc,
            // we shouldn't exit with a non-zero exit code. In other words, this is expected...
        }
        catch (Exception ex)
        {
            logger.LogError(ex, "{Message}", ex.Message);

            // Terminates this process and returns an exit code to the operating system.
            // This is required to avoid the 'BackgroundServiceExceptionBehavior', which
            // performs one of two scenarios:
            // 1. When set to "Ignore": will do nothing at all, errors cause zombie services.
            // 2. When set to "StopHost": will cleanly stop the host, and log errors.
            //
            // In order for the Windows Service Management system to leverage configured
            // recovery options, we need to terminate the process with a non-zero exit code.
            Environment.Exit(1);
        }
    }
}

W poprzednim kodzie JokeService element jest wstrzykiwany wraz z elementem ILogger. Oba są udostępniane klasie jako private readonly pola. W metodzie ExecuteAsync usługa żartów żąda żartu i pisze go do rejestratora. W takim przypadku rejestrator jest implementowany przez dziennik zdarzeń systemu Windows — Microsoft.Extensions.Logging.EventLog.EventLogLogger. Dzienniki są zapisywane i dostępne do wyświetlania w Podgląd zdarzeń.

Uwaga

Domyślnie ważność dziennika zdarzeń to Warning. Można to skonfigurować, ale w celach WindowsBackgroundService demonstracyjnych dzienniki z LogWarning metodą rozszerzenia. Aby w szczególności nadać EventLog poziomowi, dodaj wpis w obszarze appsettings.{ Environment}.json lub podaj EventLogSettings.Filter wartość.

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    },
    "EventLog": {
      "SourceName": "The Joke Service",
      "LogName": "Application",
      "LogLevel": {
        "Microsoft": "Information",
        "Microsoft.Hosting.Lifetime": "Information"
      }
    }
  }
}

Aby uzyskać więcej informacji na temat konfigurowania poziomów dzienników, zobacz Logging providers in .NET: Configure Windows EventLog (Dostawcy rejestrowania na platformie .NET: Konfigurowanie dziennika zdarzeń systemu Windows).

Ponowne zapisywanie Program klasy

Zastąp zawartość pliku Template Program.cs następującym kodem języka C#:

using App.WindowsService;
using Microsoft.Extensions.Logging.Configuration;
using Microsoft.Extensions.Logging.EventLog;

HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);
builder.Services.AddWindowsService(options =>
{
    options.ServiceName = ".NET Joke Service";
});

LoggerProviderOptions.RegisterProviderOptions<
    EventLogSettings, EventLogLoggerProvider>(builder.Services);

builder.Services.AddSingleton<JokeService>();
builder.Services.AddHostedService<WindowsBackgroundService>();

IHost host = builder.Build();
host.Run();

Metoda AddWindowsService rozszerzenia konfiguruje aplikację tak, aby działała jako usługa systemu Windows. Nazwa usługi jest ustawiona na ".NET Joke Service". Hostowana usługa jest zarejestrowana do wstrzykiwania zależności.

Aby uzyskać więcej informacji na temat rejestrowania usług, zobacz Wstrzykiwanie zależności na platformie .NET.

Opublikuj aplikację

Aby utworzyć aplikację .NET Worker Service jako usługę systemu Windows, zaleca się opublikowanie aplikacji jako pojedynczego pliku wykonywalnego. Jest mniej podatny na błędy, aby mieć samodzielny plik wykonywalny, ponieważ nie ma żadnych plików zależnych leżących wokół systemu plików. Można jednak wybrać inną modalność publikowania, która jest całkowicie akceptowalna, o ile tworzysz plik *.exe , którego celem może być Menedżer kontroli usług systemu Windows.

Ważne

Alternatywną metodą publikowania jest skompilowanie biblioteki *.dll (zamiast pliku *.exe), a podczas instalowania opublikowanej aplikacji przy użyciu Menedżera kontroli usług systemu Windows delegujesz do interfejsu wiersza polecenia platformy .NET i przekazujesz bibliotekę DLL. Aby uzyskać więcej informacji, zobacz .NET CLI: dotnet command (Interfejs wiersza polecenia platformy .NET: dotnet).

sc.exe create ".NET Joke Service" binpath="C:\Path\To\dotnet.exe C:\Path\To\App.WindowsService.dll"
<Project Sdk="Microsoft.NET.Sdk.Worker">

  <PropertyGroup>
    <TargetFramework>net8.0-windows</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>true</ImplicitUsings>
    <RootNamespace>App.WindowsService</RootNamespace>
    <OutputType>exe</OutputType>
    <PublishSingleFile Condition="'$(Configuration)' == 'Release'">true</PublishSingleFile>
    <RuntimeIdentifier>win-x64</RuntimeIdentifier>
    <PlatformTarget>x64</PlatformTarget>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
    <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="8.0.0" />
  </ItemGroup>
</Project>

Powyższe wyróżnione wiersze pliku projektu definiują następujące zachowania:

  • <OutputType>exe</OutputType>: tworzy aplikację konsolową.
  • <PublishSingleFile Condition="'$(Configuration)' == 'Release'">true</PublishSingleFile>: włącza publikowanie pojedynczego pliku.
  • <RuntimeIdentifier>win-x64</RuntimeIdentifier>: określa identyfikator RID elementu win-x64.
  • <PlatformTarget>x64</PlatformTarget>: Określ docelowy procesor platformy 64-bitowej.

Aby opublikować aplikację z poziomu programu Visual Studio, możesz utworzyć profil publikowania, który jest utrwalany. Profil publikowania jest oparty na formacie XML i ma rozszerzenie pliku pubxml . Program Visual Studio używa tego profilu do niejawnego publikowania aplikacji, natomiast jeśli używasz interfejsu wiersza polecenia platformy .NET — musisz jawnie określić profil publikowania, który ma być używany.

Kliknij prawym przyciskiem myszy projekt w Eksplorator rozwiązań, a następnie wybierz pozycję Publikuj.... Następnie wybierz pozycję Dodaj profil publikowania, aby utworzyć profil. W oknie dialogowym Publikowanie wybierz pozycję Folder jako element docelowy.

The Visual Studio Publish dialog

Pozostaw domyślną lokalizację, a następnie wybierz pozycję Zakończ. Po utworzeniu profilu wybierz pozycję Pokaż wszystkie ustawienia i sprawdź ustawienia profilu.

The Visual Studio Profile settings

Upewnij się, że określono następujące ustawienia:

  • Tryb wdrażania: samodzielny
  • Tworzenie pojedynczego pliku: zaznaczone
  • Włącz kompilację ReadyToRun: zaznaczone
  • Przycinanie nieużywanych zestawów (w wersji zapoznawczej): niezaznaczone

Na koniec wybierz pozycję Publikuj. Aplikacja jest kompilowana, a wynikowy plik exe jest publikowany w katalogu /publish output.

Alternatywnie możesz użyć interfejsu wiersza polecenia platformy .NET do opublikowania aplikacji:

dotnet publish --output "C:\custom\publish\directory"

W celu uzyskania więcej informacji, zobacz następujący temat: dotnet publish.

Ważne

W przypadku platformy .NET 6, jeśli spróbujesz debugować aplikację przy <PublishSingleFile>true</PublishSingleFile> użyciu ustawienia, nie będzie można debugować aplikacji. Aby uzyskać więcej informacji, zobacz Nie można dołączyć do coreCLR podczas debugowania aplikacji .NET 6 "PublishSingleFile".

Tworzenie usługi systemu Windows

Jeśli nie znasz programu PowerShell i wolisz utworzyć instalatora dla usługi, zobacz Tworzenie instalatora usługi systemu Windows. W przeciwnym razie, aby utworzyć usługę systemu Windows, użyj natywnego menedżera kontroli usług systemu Windows (sc.exe) create polecenia. Uruchom program PowerShell jako administrator.

sc.exe create ".NET Joke Service" binpath="C:\Path\To\App.WindowsService.exe"

Napiwek

Jeśli musisz zmienić katalog główny zawartości konfiguracji hosta, możesz przekazać go jako argument wiersza polecenia podczas określania elementu binpath:

sc.exe create "Svc Name" binpath="C:\Path\To\App.exe --contentRoot C:\Other\Path"

Zostanie wyświetlony komunikat wyjściowy:

[SC] CreateService SUCCESS

Aby uzyskać więcej informacji, zobacz sc.exe create.

Konfigurowanie usługi systemu Windows

Po utworzeniu usługi można ją opcjonalnie skonfigurować. Jeśli używasz domyślnych ustawień usługi, przejdź do sekcji Weryfikowanie funkcji usługi.

Usługi systemu Windows zapewniają opcje konfiguracji odzyskiwania. Możesz wykonać zapytanie dotyczące bieżącej konfiguracji przy użyciu sc.exe qfailure "<Service Name>" polecenia (gdzie <Service Name> to nazwa usługi), aby odczytać bieżące wartości konfiguracji odzyskiwania:

sc qfailure ".NET Joke Service"
[SC] QueryServiceConfig2 SUCCESS

SERVICE_NAME: .NET Joke Service
        RESET_PERIOD (in seconds)    : 0
        REBOOT_MESSAGE               :
        COMMAND_LINE                 :

Polecenie zwróci konfigurację odzyskiwania, czyli wartości domyślne — ponieważ jeszcze nie zostały skonfigurowane.

The Windows Service recovery configuration properties dialog.

Aby skonfigurować odzyskiwanie, użyj wartości sc.exe failure "<Service Name>" where <Service Name> to nazwa usługi:

sc.exe failure ".NET Joke Service" reset=0 actions=restart/60000/restart/60000/run/1000
[SC] ChangeServiceConfig2 SUCCESS

Napiwek

Aby skonfigurować opcje odzyskiwania, sesja terminalu musi działać jako Administracja istrator.

Po pomyślnym skonfigurowaniu można wykonać zapytanie dotyczące wartości po raz kolejny przy użyciu sc.exe qfailure "<Service Name>" polecenia :

sc qfailure ".NET Joke Service"
[SC] QueryServiceConfig2 SUCCESS

SERVICE_NAME: .NET Joke Service
        RESET_PERIOD (in seconds)    : 0
        REBOOT_MESSAGE               :
        COMMAND_LINE                 :
        FAILURE_ACTIONS              : RESTART -- Delay = 60000 milliseconds.
                                       RESTART -- Delay = 60000 milliseconds.
                                       RUN PROCESS -- Delay = 1000 milliseconds.

Zostaną wyświetlone skonfigurowane wartości ponownego uruchomienia.

The Windows Service recovery configuration properties dialog with restart enabled.

Opcje odzyskiwania usługi i wystąpienia platformy .NET BackgroundService

W przypadku platformy .NET 6 nowe zachowania obsługi wyjątków hostingu zostały dodane do platformy .NET. Wyliczenie BackgroundServiceExceptionBehavior zostało dodane do Microsoft.Extensions.Hosting przestrzeni nazw i służy do określania zachowania usługi po wystąpieniu wyjątku. W poniższej tabeli wymieniono dostępne opcje:

Opcja Opis
Ignore Ignoruj wyjątki zgłoszone w pliku BackgroundService.
StopHost Zostanie IHost zatrzymany, gdy zostanie zgłoszony nieobsługiwany wyjątek.

Domyślne zachowanie przed platformą .NET 6 to Ignore, co spowodowało procesy zombie (uruchomiony proces, który nic nie zrobił). W przypadku platformy .NET 6 domyślne zachowanie to StopHost, co powoduje zatrzymanie hosta po wystąpieniu wyjątku. Ale zatrzymuje się czysto, co oznacza, że system zarządzania usługami systemu Windows nie uruchomi ponownie usługi. Aby poprawnie zezwolić na ponowne uruchomienie usługi, można wywołać Environment.Exit kod zakończenia bez zera. Rozważ następujący wyróżniony catch blok:

namespace App.WindowsService;

public sealed class WindowsBackgroundService(
    JokeService jokeService,
    ILogger<WindowsBackgroundService> logger) : BackgroundService
{
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        try
        {
            while (!stoppingToken.IsCancellationRequested)
            {
                string joke = jokeService.GetJoke();
                logger.LogWarning("{Joke}", joke);

                await Task.Delay(TimeSpan.FromMinutes(1), stoppingToken);
            }
        }
        catch (OperationCanceledException)
        {
            // When the stopping token is canceled, for example, a call made from services.msc,
            // we shouldn't exit with a non-zero exit code. In other words, this is expected...
        }
        catch (Exception ex)
        {
            logger.LogError(ex, "{Message}", ex.Message);

            // Terminates this process and returns an exit code to the operating system.
            // This is required to avoid the 'BackgroundServiceExceptionBehavior', which
            // performs one of two scenarios:
            // 1. When set to "Ignore": will do nothing at all, errors cause zombie services.
            // 2. When set to "StopHost": will cleanly stop the host, and log errors.
            //
            // In order for the Windows Service Management system to leverage configured
            // recovery options, we need to terminate the process with a non-zero exit code.
            Environment.Exit(1);
        }
    }
}

Weryfikowanie funkcjonalności usługi

Aby wyświetlić aplikację utworzoną jako usługa systemu Windows, otwórz pozycję Usługi. Wybierz klawisz systemu Windows (lub Ctrl + Esc) i wyszukaj w obszarze "Usługi". W aplikacji Usługi powinna być widoczna możliwość znalezienia usługi według jej nazwy.

Ważne

Domyślnie regularni użytkownicy (niebędący administratorami) nie mogą zarządzać usługami systemu Windows. Aby sprawdzić, czy ta aplikacja działa zgodnie z oczekiwaniami, musisz użyć konta Administracja.

The Services user interface.

Aby sprawdzić, czy usługa działa zgodnie z oczekiwaniami, musisz:

  • Uruchamianie usługi
  • Wyświetlanie dzienników
  • Zatrzymywanie usługi

Ważne

Aby debugować aplikację, upewnij się, że nie próbujesz debugować pliku wykonywalnego, który jest aktywnie uruchomiony w procesie usług systemu Windows.

Unable to start program.

Uruchamianie usługi systemu Windows

Aby uruchomić usługę systemu Windows, użyj sc.exe start polecenia :

sc.exe start ".NET Joke Service"

Zostaną wyświetlone dane wyjściowe podobne do następujących:

SERVICE_NAME: .NET Joke Service
    TYPE               : 10  WIN32_OWN_PROCESS
    STATE              : 2  START_PENDING
                            (NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
    WIN32_EXIT_CODE    : 0  (0x0)
    SERVICE_EXIT_CODE  : 0  (0x0)
    CHECKPOINT         : 0x0
    WAIT_HINT          : 0x7d0
    PID                : 37636
    FLAGS

Stan usługi zostanie przeniesiony z pozycji START_PENDINGUruchomione.

Wyświetlanie dzienników

Aby wyświetlić dzienniki, otwórz Podgląd zdarzeń. Wybierz klawisz systemu Windows (lub Ctrl + Esc) i wyszukaj ciąg "Event Viewer". Wybierz węzeł Podgląd zdarzeń (local)>Windows Logs Application (Aplikacja dzienników>systemu Windows). Powinien zostać wyświetlony wpis na poziomie ostrzeżenia ze źródłem pasującym do przestrzeni nazw aplikacji. Kliknij dwukrotnie wpis lub kliknij prawym przyciskiem myszy i wybierz pozycję Właściwości zdarzenia, aby wyświetlić szczegóły.

The Event Properties dialog, with details logged from the service

Po obejrzeniu dzienników w dzienniku zdarzeń należy zatrzymać usługę. Jest przeznaczony do rejestrowania losowego żartu raz na minutę. Jest to zamierzone zachowanie, ale nie jest praktyczne w przypadku usług produkcyjnych.

Zatrzymywanie usługi systemu Windows

Aby zatrzymać usługę systemu Windows, użyj sc.exe stop polecenia :

sc.exe stop ".NET Joke Service"

Zostaną wyświetlone dane wyjściowe podobne do następujących:

SERVICE_NAME: .NET Joke Service
    TYPE               : 10  WIN32_OWN_PROCESS
    STATE              : 3  STOP_PENDING
                            (STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN)
    WIN32_EXIT_CODE    : 0  (0x0)
    SERVICE_EXIT_CODE  : 0  (0x0)
    CHECKPOINT         : 0x0
    WAIT_HINT          : 0x0

Stan usługi zmieni się z STOP_PENDING na Zatrzymano.

Usuwanie usługi systemu Windows

Aby usunąć usługę systemu Windows, użyj natywnego polecenia usuń Menedżera kontroli usług systemu Windows (sc.exe). Uruchom program PowerShell jako administrator.

Ważne

Jeśli usługa nie znajduje się w stanie Zatrzymano , nie zostanie natychmiast usunięta. Przed wydaniem polecenia delete upewnij się, że usługa została zatrzymana.

sc.exe delete ".NET Joke Service"

Zostanie wyświetlony komunikat wyjściowy:

[SC] DeleteService SUCCESS

Aby uzyskać więcej informacji, zobacz sc.exe delete.

Zobacz też

Następne