DEV Community

HOUSE4IT A/S
HOUSE4IT A/S

Posted on

Når en Windows-tjeneste stopper: Fejlsøgning med PowerShell

En medarbejder forsøger at udskrive en faktura, men printeren reagerer ikke.

Computeren fungerer. Internetforbindelsen er aktiv, og alle andre programmer ser ud til at køre normalt.

Alligevel kan medarbejderen ikke udskrive.

En mulig forklaring er, at en Windows-tjeneste ikke fungerer som forventet.

Windows bruger tjenester til en række opgaver i baggrunden. Nogle understøtter udskrivning, mens andre håndterer opdateringer, netværksfunktioner og forskellige programmer.

Men hvordan undersøger man en tjeneste, der pludselig stopper?

I denne vejledning bruger vi PowerShell til at kontrollere tjenesters status, undersøge hændelsesloggen og oprette en diagnostisk rapport.

Vi fokuserer på at indsamle oplysninger, før der bliver foretaget ændringer.

Forudsætninger: Windows 10, Windows 11 eller et relevant Windows Server-miljø med Windows PowerShell 5.1 eller nyere kompatible kommandoer.

Eksemplerne er beregnet til administratorer og tekniske supportmedarbejdere. Kommandoerne ændrer ikke tjenester eller systemindstillinger.

1. Hvad er en Windows-tjeneste?

En Windows-tjeneste er et program eller en systemkomponent, som typisk kører i baggrunden.

Den kan være aktiv, selvom ingen medarbejder har åbnet et almindeligt programvindue.

Et eksempel er Print Spooler.

Denne tjeneste håndterer udskriftsopgaver i Windows.

Hvis den ikke fungerer som forventet, kan medarbejderen opleve problemer med at udskrive dokumenter.

Men ikke alle Windows-tjenester skal køre hele tiden.

Nogle bliver startet efter behov. Andre er deaktiveret som en del af computerens godkendte konfiguration.

Derfor bør en stoppet tjeneste ikke automatisk betragtes som en fejl.

Det første spørgsmål er:

Skal denne tjeneste faktisk være aktiv på denne computer?

Svaret afhænger af systemet og den opgave, tjenesten understøtter.

2. Se status på Windows-tjenester med Get-Service

Åbn PowerShell på en Windows-computer, som du har tilladelse til at undersøge.

Kør følgende kommando:

Get-Service |
    Select-Object Name, DisplayName, Status |
    Sort-Object DisplayName
Enter fullscreen mode Exit fullscreen mode

Kommandoen viser de tilgængelige tjenester samt deres navne og aktuelle status.

Du vil typisk se værdier som Running og Stopped.

Resultatet kan være omfattende, fordi Windows indeholder mange tjenester.

Derfor er det ofte mere praktisk at undersøge én bestemt tjeneste.

Lad os bruge Print Spooler som eksempel:

Get-Service -Name "Spooler" |
    Format-List Name, DisplayName, Status, StartType
Enter fullscreen mode Exit fullscreen mode

Her får vi oplysninger om udskrivningstjenesten og dens konfigurerede starttype.

En tjeneste kan eksempelvis have starttypen Automatic, Manual eller Disabled.

Det er dog vigtigt at forstå forskellen mellem starttype og aktuel status.

En tjeneste med automatisk start kan være stoppet på grund af en fejl.

En tjeneste med manuel start kan være stoppet, fordi der ikke er behov for den.

PowerShell-resultatet giver os altså et udgangspunkt, men ikke nødvendigvis årsagen til problemet.

3. Find tjenester, der er stoppet

Hvis du vil se alle tjenester med status Stopped, kan du bruge:

Get-Service |
    Where-Object {
        $_.Status -eq "Stopped"
    } |
    Select-Object Name, DisplayName, StartType
Enter fullscreen mode Exit fullscreen mode

Resultatet kan indeholde mange tjenester.

Det er helt normalt.

Nogle Windows-tjenester er designet til kun at køre, når der er behov for dem.

Derfor bør du ikke forsøge at starte alle stoppede tjenester.

En mere nyttig undersøgelse er at sammenligne den faktiske status med virksomhedens forventede konfiguration.

Hvis et vigtigt program kræver en bestemt tjeneste, bør du kontrollere, om tjenesten eksisterer og har den forventede status.

Det kan også være relevant at undersøge, om programleverandøren har dokumenteret særlige krav.

En stoppet tjeneste er et muligt spor.

Det er ikke automatisk dokumentation for fejl.

4. Undersøg tjenestens konfiguration med CIM

Nogle gange har vi brug for flere oplysninger end dem, Get-Service viser.

Her kan PowerShell bruge Windows' CIM-information.

Prøv følgende:

Get-CimInstance -ClassName Win32_Service `
    -Filter "Name = 'Spooler'" |
    Select-Object Name,
                  DisplayName,
                  State,
                  StartMode,
                  PathName
Enter fullscreen mode Exit fullscreen mode

Kommandoen viser blandt andet tjenestens tilstand, startkonfiguration og stien til dens programfil.

PathName kan være relevant, hvis du undersøger en tjeneste, der tilhører et bestemt program.

Hvis stien peger på en fil, der ikke længere findes, kan det være et forhold, som skal undersøges nærmere.

Men ændr ikke filstier eller startindstillinger uden at forstå konsekvenserne.

I et administreret IT-miljø kan tjenester være konfigureret gennem centrale politikker eller af en softwareleverandør.

Det er derfor vigtigt at kende tjenestens formål, før der foretages ændringer.

5. Windows Event Log kan fortælle mere

Nu kommer vi til den mest interessante del.

Hvis en tjeneste stopper uventet, kan Windows have registreret oplysninger om hændelsen.

De kan ofte findes i systemets hændelseslog.

PowerShell indeholder kommandoen Get-WinEvent, som kan bruges til at undersøge Windows Event Logs.

Lad os først se nogle af de seneste hændelser fra systemloggen:

Get-WinEvent -LogName "System" -MaxEvents 20 |
    Select-Object TimeCreated,
                  Id,
                  ProviderName,
                  LevelDisplayName,
                  Message
Enter fullscreen mode Exit fullscreen mode

Resultatet kan indeholde oplysninger fra forskellige Windows-komponenter.

Hver hændelse har blandt andet et tidspunkt, en hændelsesidentifikation og en kilde.

Det er relevant at kende tidspunktet for den oplevede fejl.

Hvis medarbejderen eksempelvis fortæller, at printeren stoppede med at fungere klokken 09.20, kan du undersøge loghændelser omkring dette tidspunkt.

Det betyder ikke, at alle hændelser fra samme tidspunkt er relateret til problemet.

Men tidsmæssig sammenhæng kan være et nyttigt udgangspunkt.

6. Find fejl fra Service Control Manager

Windows bruger Service Control Manager til at administrere tjenester.

Denne komponent kan registrere hændelser, når en tjeneste eksempelvis ikke kan starte eller afsluttes uventet.

Nogle relevante hændelses-id'er er:

  • 7000: En tjeneste kunne ikke startes.
  • 7009: Et timeoutproblem opstod under forsøg på at starte eller forbinde til en tjeneste.
  • 7031: En tjeneste blev afsluttet uventet.

Disse hændelser skal altid vurderes ud fra deres konkrete meddelelser og systemets konfiguration.

Du kan undersøge relevante hændelser fra de seneste syv dage med:

$startTime = (Get-Date).AddDays(-7)

Get-WinEvent -FilterHashtable @{
    LogName      = "System"
    ProviderName = "Service Control Manager"
    Id           = 7000, 7009, 7031
    StartTime    = $startTime
} |
    Select-Object TimeCreated,
                  Id,
                  Message
Enter fullscreen mode Exit fullscreen mode

Kommandoen bruger FilterHashtable til at begrænse søgningen.

Det er ofte mere effektivt end at hente hele hændelsesloggen og filtrere alle resultater bagefter.

Hvis Windows ikke finder matchende hændelser, kan Get-WinEvent give en fejlmeddelelse om manglende resultater.

Det betyder ikke nødvendigvis, at tjenesten aldrig har haft problemer.

Ældre hændelser kan være uden for den valgte periode eller ikke længere findes i loggen.

Adgang til bestemte logs kan desuden kræve passende rettigheder.

7. Se efter et mønster i hændelserne

Forestil dig, at en bestemt tjeneste er stoppet flere gange i løbet af en uge.

Du finder forskellige hændelser i systemloggen.

Nogle er registreret kort før medarbejderne oplevede problemer.

Andre er opstået på tidspunkter, hvor ingen har meldt fejl.

Hvordan bruger man oplysningerne?

Begynd med at undersøge tidspunktet og hændelsens tekst.

Kontrollér, hvilken tjeneste meddelelsen omtaler.

Undersøg derefter, om hændelsen passer til det problem, medarbejderen har beskrevet.

Hvis den samme tjeneste bliver afsluttet uventet gentagne gange, kan det være relevant at undersøge tilhørende programlogfiler, softwareversioner eller leverandørens dokumentation.

Men en hændelse er ikke altid forklaringen på en bestemt brugerfejl.

Tidsmæssig sammenhæng er ikke det samme som en dokumenteret årsag.

Derfor bør logoplysninger bruges til at opbygge og teste en teknisk forklaring frem for at drage en hurtig konklusion.

8. Opret en PowerShell-rapport over tjenester og hændelser

Hvis du arbejder med IT-support, kan det være nyttigt at samle oplysningerne i en rapport.

Vi opretter et script, som:

  1. Registrerer tjenester og deres aktuelle status.
  2. Søger efter relevante Service Control Manager-hændelser.
  3. Gemmer resultaterne i CSV-filer.
  4. Registrerer en fejlmeddelelse, hvis hændelsesloggen ikke kan læses.

Scriptet genstarter ikke tjenester og ændrer ikke systemindstillinger.

Gem følgende kode som:

Get-ServiceDiagnostics.ps1

param(
    [ValidateRange(1, 30)]
    [int]$DaysBack = 7,

    [string]$OutputFolder = (
        [Environment]::GetFolderPath("MyDocuments")
    )
)

$timestamp = Get-Date -Format "yyyyMMdd-HHmmss"

if (-not (Test-Path -LiteralPath $OutputFolder -PathType Container)) {
    throw "Outputmappen findes ikke: $OutputFolder"
}

$servicesFile = Join-Path $OutputFolder (
    "services-$timestamp.csv"
)

$eventsFile = Join-Path $OutputFolder (
    "service-events-$timestamp.csv"
)

# Hent status på Windows-tjenester
$services = Get-CimInstance -ClassName Win32_Service |
    Select-Object Name,
                  DisplayName,
                  State,
                  StartMode

$services |
    Export-Csv -LiteralPath $servicesFile `
        -NoTypeInformation -Encoding UTF8

Write-Host "Tjenesteoversigt gemt: $servicesFile"

# Søg efter udvalgte tjenestehændelser
$startTime = (Get-Date).AddDays(-$DaysBack)

try {
    $events = @(
        Get-WinEvent -FilterHashtable @{
            LogName      = "System"
            ProviderName = "Service Control Manager"
            Id           = 7000, 7009, 7031
            StartTime    = $startTime
        } -ErrorAction Stop |
        Select-Object TimeCreated,
                      Id,
                      ProviderName,
                      Message
    )

    if ($events.Count -gt 0) {
        $events |
            Export-Csv -LiteralPath $eventsFile `
                -NoTypeInformation -Encoding UTF8

        Write-Host "Haendelser gemt: $eventsFile"
        Write-Host "Antal haendelser: $($events.Count)"
    }
}
catch {
    Write-Warning (
        "Haendelser kunne ikke hentes, " +
        "eller der blev ikke fundet match: " +
        $_.Exception.Message
    )
}
Enter fullscreen mode Exit fullscreen mode

Hvad gør scriptet?

Først opretter vi et tidsstempel, som indgår i rapporternes filnavne.

Det gør det lettere at skelne rapporter fra forskellige undersøgelser.

Derefter kontrollerer scriptet, om den valgte outputmappe findes.

Hvis mappen ikke findes, stopper scriptet med en fejl i stedet for at forsøge at gemme filerne et ukendt sted.

Herefter henter Get-CimInstance oplysninger om Windows-tjenester.

Vi registrerer navn, visningsnavn, status og starttype.

Disse oplysninger bliver eksporteret til CSV.

Til sidst søger scriptet efter de udvalgte Service Control Manager-hændelser.

Hvis søgningen lykkes, bliver resultaterne gemt i en separat CSV-fil.

Hvis søgningen fejler eller ikke finder matchende hændelser, viser scriptet en advarsel.

Advarslen skelner ikke automatisk mellem manglende match og adgangsproblemer. Derfor bør den konkrete fejltekst gennemgås.

Scriptet er beregnet til lokal fejlsøgning og er ikke et komplet overvågningssystem.

9. Sådan kører du scriptet

Åbn PowerShell i den mappe, hvor scriptet er gemt.

Kør:

.\Get-ServiceDiagnostics.ps1 -DaysBack 7
Enter fullscreen mode Exit fullscreen mode

Du kan også vælge en bestemt eksisterende outputmappe:

.\Get-ServiceDiagnostics.ps1 `
    -DaysBack 14 `
    -OutputFolder "C:\Temp"
Enter fullscreen mode Exit fullscreen mode

I det sidste eksempel skal C:\Temp eksistere på forhånd.

Scriptet forsøger ikke at oprette mappen.

Kør kun scriptet, hvis virksomhedens regler tillader det, og brug en konto med de nødvendige rettigheder.

Du bør ikke ændre virksomhedens PowerShell-politikker blot for at gennemføre en diagnostisk test.

Hvis scriptet ikke kan læse bestemte oplysninger, bør du undersøge tilladelserne og den konkrete fejlmeddelelse.

10. Hvad kan CSV-rapporten bruges til?

Den første CSV-fil indeholder oplysninger om systemets tjenester på undersøgelsestidspunktet.

Den anden indeholder de udvalgte hændelser fra systemloggen.

Filerne kan åbnes i et regneark eller behandles med andre godkendte værktøjer.

Det kan eksempelvis være nyttigt at sammenligne undersøgelser fra to forskellige dage.

Hvis en tjeneste tidligere kørte, men nu er stoppet, er ændringen værd at undersøge.

Det beviser dog ikke, at tjenesten er årsagen til et bestemt problem.

En tjeneste kan have ændret status som en del af helt normal drift.

Hændelserne bør derfor sammenholdes med de faktiske brugerproblemer og systemets forventede konfiguration.

Beskyt rapporterne

En serviceoversigt kan indeholde oplysninger om installerede programmer og interne systemkomponenter.

Hændelsesloggens meddelelser kan også indeholde tekniske oplysninger, som virksomheden ikke ønsker at offentliggøre.

Derfor bør rapporterne behandles som interne driftsoplysninger.

Undgå at uploade dem til offentlige tjenester uden godkendelse.

Hvis rapporterne deles med en supportleverandør, bør det ske gennem virksomhedens godkendte kanaler.

11. Hvorfor bør man ikke bare genstarte tjenesten?

Når en tjeneste stopper, kan det være fristende straks at genstarte den.

I nogle tilfælde kan en genstart være en relevant del af den godkendte fejlretning.

Men det er ikke altid den rigtige første handling.

Hvis tjenesten stopper på grund af en underliggende fejl, kan problemet vende tilbage.

En genstart kan også påvirke andre programmer eller medarbejdere, som er afhængige af tjenesten.

Derfor bør administratoren først undersøge, hvad tjenesten bruges til, og hvilke systemer der kan blive påvirket.

I et produktionsmiljø kan der være behov for at planlægge ændringen eller kontakte den ansvarlige leverandør.

Kommandoerne i denne vejledning er bevidst begrænset til undersøgelse og dokumentation.

Det hjælper med at bevare den oprindelige situation, mens problemet bliver analyseret.

12. IT Service Kolding – Teknisk service begynder med overblik

Når virksomheder undersøger IT Service Kolding, kan behovet handle om almindelig support, stabil IT-drift eller hjælp til tekniske problemer i virksomhedens systemer.

HOUSE4IT A/S har adresse på Kokholm 1A, 6000 Kolding og arbejder med IT-support, IT-drift, netværk, Microsoft 365, cloudløsninger og IT-sikkerhed til erhverv.

Virksomheder kan læse mere om HOUSE4IT A/S og deres IT-løsninger til virksomheder og undersøge, hvilke serviceområder der passer til deres behov.

PowerShell kan være et nyttigt værktøj i supportarbejdet, men det bør indgå i en større proces.

Det er vigtigt at kende systemets funktion, dokumentere relevante fund og forstå konsekvenserne, før der foretages ændringer.

En rapport med stoppede tjenester kan give et overblik.

Men det er den efterfølgende tekniske vurdering, der afgør, hvilke oplysninger der kræver handling.

13. Brug en fast fejlsøgningsproces

Forestil dig, at et program stopper med at fungere flere gange i løbet af en uge.

I stedet for at begynde forfra hver gang kan supportmedarbejderen følge en enkel proces.

Først: Beskriv problemet.

Hvilket program er påvirket, og hvornår opstår fejlen?

Dernæst: Kontroller de relevante tjenester.

Find ud af, om de eksisterer og har den forventede status.

Derefter: Undersøg hændelsesloggen.

Se efter relevante fejl og tidsmæssige sammenhænge.

Til sidst: Dokumentér resultatet.

Beskriv, hvad undersøgelsen viste, og hvilke yderligere kontroller der eventuelt er nødvendige.

Hvis problemet kræver ændringer, bør de udføres efter virksomhedens godkendte procedurer.

En sådan fremgangsmåde gør det lettere at overdrage sagen til en anden tekniker, hvis det bliver nødvendigt.

Det kan også hjælpe med at undgå, at de samme undersøgelser bliver gentaget uden at bringe sagen videre.

14. Hvad fortæller en hændelseslog ikke?

Windows Event Log kan indeholde nyttige tekniske oplysninger.

Men den giver ikke nødvendigvis en komplet forklaring på alle fejl.

En tjeneste kan stoppe, uden at de udvalgte hændelses-id'er bliver registreret.

Et problem kan også skyldes selve applikationen, netværket, en afhængig komponent eller en ekstern tjeneste.

Derfor bør en undersøgelse ikke begrænses til Service Control Manager.

Det kan være nødvendigt at undersøge programmets egne logfiler eller andre relevante Windows-hændelser.

Det er også vigtigt at være opmærksom på loggenes opbevaringsperiode.

Hvis ældre hændelser er blevet overskrevet, kan de ikke nødvendigvis findes i den aktuelle systemlog.

En diagnostisk rapport giver derfor et billede af de oplysninger, der var tilgængelige under undersøgelsen.

Ikke en fuldstændig historik over alle problemer, computeren tidligere har oplevet.

Afslutning: Find årsagen, før du ændrer systemet

Når et vigtigt program ikke fungerer, er det naturligt at ønske en hurtig løsning.

Men det kan betale sig at undersøge situationen systematisk.

Get-Service viser tjenesters aktuelle status.

Get-CimInstance kan give flere oplysninger om deres konfiguration.

Og Get-WinEvent kan hjælpe med at undersøge, om Windows har registreret relevante hændelser.

Sammen giver værktøjerne et bedre udgangspunkt for fejlsøgning.

De erstatter ikke teknisk erfaring eller viden om virksomhedens programmer.

Men de kan hjælpe med at stille mere præcise spørgsmål.

En stoppet tjeneste er ikke altid et problem.

En loghændelse er ikke altid forklaringen.

Og en genstart er ikke altid den bedste løsning.

God IT-service handler ikke kun om at få et program til at virke igen. Det handler også om at forstå, hvorfor det holdt op med at fungere, så næste beslutning bygger på viden frem for gæt.

Top comments (0)