Computer >> 컴퓨터 >  >> 시스템 >> Windows Server

PowerShell로 Windows 서비스 관리하기: 조회부터 생성·삭제까지 완벽 가이드

Windows 서비스는 services.msc 스냅인이나 sc.exe 같은 명령줄 도구뿐만 아니라 PowerShell로도 손쉽게 관리할 수 있습니다. 이 글에서는 PowerShell을 활용해 Windows 서비스를 조회, 시작, 중지, 생성, 삭제하는 다양한 시나리오를 단계별로 살펴봅니다.

Windows 서비스 관리에 사용되는 PowerShell cmdlet

Windows 서비스의 상태를 확인하고 관리하기 위한 기본 서비스 cmdlet은 총 8가지입니다. 전체 목록을 확인하려면 아래 명령어를 실행하세요.

Get-Help *-Service

  • Get-Service — 로컬 또는 원격 컴퓨터의 서비스를 실행/중지 상태와 함께 조회합니다.
  • New-Service – 새 서비스를 생성합니다. 레지스트리와 서비스 데이터베이스에 새 항목을 만듭니다.
  • Restart-Service – 서비스를 재시작합니다. Windows 서비스 컨트롤러를 통해 재시작 메시지를 전달합니다.
  • Resume-Service – 일시 중지된 서비스를 재개합니다. Windows 서비스 관리자에게 재개 메시지를 전송합니다.
  • Set-Service — 로컬 또는 원격 서비스의 상태, 설명, 표시 이름, 시작 유형 등 설정을 변경합니다. 서비스 시작·중지·일시 중지에도 사용할 수 있습니다.
  • Start-Service – 서비스를 시작합니다.
  • Stop-Service – 서비스를 중지합니다(서비스 관리자에게 중지 메시지를 전송).
  • Suspend-Service – 서비스를 일시 중지합니다. 일시 중지된 서비스는 실행 중 상태이지만, Resume-Service 등으로 재개할 때까지 어떤 작업도 수행하지 않습니다.

특정 cmdlet의 자세한 설명과 사용 예제는 Get-Help로 확인할 수 있습니다.

Get-Help Start-Service

Get-Service로 Windows 서비스 상태 확인하기

Get-Service cmdlet을 사용하면 로컬 또는 원격 컴퓨터의 서비스 목록과 상태(Running/Stopped)를 확인할 수 있습니다. -Name 매개변수로 이름 기준 검색이 가능하며, 와일드카드 문자 *도 사용할 수 있습니다.

정확한 서비스 이름을 모르는 경우 -DisplayName 매개변수로 표시 이름 기준으로 찾을 수 있으며, 값 목록과 와일드카드 조합도 지원합니다.

원격 컴퓨터의 서비스 상태를 조회하려면 -ComputerName 매개변수를 사용합니다. 쉼표로 구분하여 여러 대의 컴퓨터를 한 번에 조회할 수도 있습니다. 예를 들어 아래 명령은 ny-prnt1과 ny-prnt2 원격 컴퓨터의 Spooler 서비스 상태를 가져옵니다.

Get-Service spooler –ComputerName ny-prnt1,ny-prnt2

Status Name DisplayName
------ ---- -----------
Running spooler Print Spooler
Stopped spooler Print Spooler

서비스의 모든 속성을 표시하려면 Select-Object cmdlet을 사용합니다.

Get-Service spooler | Select-Object *

Select-Object로 특정 속성만 추출할 수도 있습니다. 예를 들어 Spooler 서비스의 이름, 상태, 사용 가능 옵션을 확인하려면 다음과 같이 실행합니다.

Get-Service Spooler | Select DisplayName,Status,ServiceName,Can*

Get-Service에는 서비스 종속성을 확인할 수 있는 두 가지 매개변수가 있습니다.

  • -DependentServices: 해당 서비스에 의존하는 서비스를 표시합니다.
  • -RequiredServices: 해당 서비스가 의존하는 서비스를 표시합니다.

Spooler 서비스를 시작하는 데 필요한 서비스를 표시하는 명령입니다.

Get-Service –Name Spooler -RequiredServices

Spooler에 의존하는 서비스를 표시하는 명령입니다.

Get-Service –Name Spooler -DependentServices

특정 상태나 조건을 만족하는 서비스를 찾으려면 Where-Object cmdlet을 활용합니다. 예를 들어 현재 실행 중인 서비스 목록은 다음과 같이 조회합니다.

Get-Service | Where-Object {$_.status -eq 'running'}

시작 유형이 '수동(Manual)'인 서비스를 표시하려면 아래 명령을 실행합니다.

Get-Service | Where-Object {$_.starttype -eq 'Manual'}

현재 컴퓨터에 특정 Windows 서비스가 존재하는지 확인하는 PowerShell 스크립트입니다.

if (Get-Service "ServiceTest" -ErrorAction SilentlyContinue)
{
Write-host "ServiceTest exists"
}

PowerShell로 서비스 중지, 시작, 재시작하기

서비스를 중지하려면 Stop-Service cmdlet을 사용합니다. Spooler 서비스를 중지하려면 다음 명령을 실행합니다.

Stop-Service -Name spooler

Stop-Service는 실행 후 별도의 출력을 표시하지 않습니다. 결과를 확인하려면 -PassThru 매개변수를 사용하세요.

모든 서비스가 중지될 수 있는 것은 아닙니다. 종속 서비스가 있는 경우 다음과 같은 오류가 발생합니다.

Cannot stop service because it has dependent services. It can only be stopped if force flag set.

서비스를 강제로 중지하려면 -Force 매개변수를 사용합니다. 이때 모든 종속 서비스도 함께 중지된다는 점에 유의해야 합니다.

Stop-Service samss –Force -Passthru

아래 명령은 bits, spooler 서비스가 '실행 중(Running)' 상태일 때만 중지합니다.

get-service bits,spooler | where {$_.status -eq 'running'} | stop-service –passthru

간혹 서비스가 'Stopping' 상태에서 멈추는 경우가 있는데, 이럴 때는 프로세스를 강제 종료해야 할 수 있습니다.

Start-Service cmdlet은 중지된 서비스를 시작합니다.

Start-Service -Name spooler -PassThru

종속 서비스가 중지되어 있으면 해당 서비스는 시작되지 않습니다. 다음 한 줄 명령으로 종속 서비스를 찾아 함께 시작할 수 있습니다.

get-service samss | Foreach { start-service $_.name -passthru; start-service $_.DependentServices -passthru}

Suspend-Service cmdlet은 일시 중지를 지원하는 서비스를 일시 중지합니다. 서비스가 일시 중지를 지원하는지 확인하려면 Get-Service의 CanPauseAndContinue 속성을 확인하세요.

Get-Service samss | Format-List name, canpauseandcontinue

일시 중지 가능한 모든 서비스 목록을 표시하려면 다음 명령을 실행합니다.

Get-Service | Where-Object {$_.canpauseandcontinue -eq "True"}

SQLBrowser 서비스를 일시 중지해 보겠습니다.

Suspend-Service -Name SQLBrowser

일시 중지된 서비스를 재개하려면 Resume-Service cmdlet을 사용합니다.

Resume-Service -Name SQLBrowser

모든 일시 중지된 서비스를 한 번에 재개하는 명령입니다.

get-service | where-object {$_.Status -eq "Paused"} | resume-service

Restart-Service cmdlet으로 서비스를 재시작할 수 있습니다.

Restart-Service -Name spooler

컴퓨터에서 중지된 모든 네트워크 관련 서비스를 시작하는 명령입니다.

get-service net* | where-object {$_.Status -eq "Stopped"} | restart-service

이 cmdlet들에는 -ComputerName 매개변수가 없지만, Invoke-Command cmdlet이나 파이프라인을 사용하면 원격 컴퓨터에서 실행할 수 있습니다.

예를 들어 원격 컴퓨터 ny-prnt1의 인쇄 스풀러를 재시작하려면 다음 명령을 실행합니다.

Get-Service Spooler -ComputerName ny-prnt1 | Start-Service

기본적으로 관리자만 Windows 서비스를 시작/중지할 수 있지만, 특정 서비스에 대해 비관리자 사용자에게 시작/중지/재시작 권한을 부여할 수도 있습니다.

Set-Service로 서비스 설정 변경하기

Set-Service cmdlet을 사용하면 로컬 또는 원격 컴퓨터의 서비스 매개변수와 설정을 변경할 수 있습니다. 서비스 상태 역시 하나의 속성이므로, 이 cmdlet으로 서비스를 시작, 중지, 일시 중지할 수도 있습니다. -StartupType 매개변수를 사용하면 서비스의 시작 유형을 변경할 수 있습니다.

Spooler 서비스의 시작 유형을 자동(Automatic)으로 변경해 보겠습니다.

Set-Service spooler –startuptype automatic –passthru

수동(Manual)으로 변경하려면 다음과 같이 실행합니다.

Set-Service spooler –startuptype manual –passthru

PowerShell로 Windows 서비스 생성 및 삭제하기

New-Service는 Windows에서 새 서비스를 만드는 cmdlet입니다. 새 서비스의 이름과 실행 파일 경로를 지정합니다(PowerShell 스크립트를 Windows 서비스로 실행하는 것도 가능합니다).

TestSvc라는 이름의 새 서비스를 생성해 보겠습니다.

new-service -name TestSvc -binaryPathName "C:\WINDOWS\System32\svchost.exe -k netsvcs"

Get-WmiObject cmdlet으로 서비스의 시작 유형과 설명 정보를 확인할 수 있습니다.

get-wmiobject win32_service -filter "name='testservice'"

새로 만든 서비스의 설정을 변경하는 명령입니다.

Set-Service -Name TestSvc -Description 'My Service' -StartupType Manual

서비스를 삭제하려면 다음 명령을 실행합니다.

(Get-WmiObject win32_service -Filter ″name=′TestSvc′″).delete()

Windows 서비스 실행 계정 변경하기

PowerShell을 사용하면 서비스를 시작하는 데 사용되는 사용자 계정도 변경할 수 있습니다. 먼저 TestSvc 서비스의 계정 이름을 확인합니다.

get-wmiobject win32_service -filter "name='TestSvc'" | Select name,startname

Windows 서비스의 사용자 이름과 암호를 변경하려면 다음 명령을 실행합니다.

$svc = get-wmiobject win32_service -filter "name='TestSvc'"
$svc.GetMethodParameters("change")

Change() 메서드의 매개변수 목록이 표시됩니다. StartName과 StartPassword 매개변수의 위치를 확인하면 각각 20번째와 21번째에 위치합니다.

$svc | Invoke-WmiMethod -Name Change –ArgumentList @($null,$null,$null,$null,$null,$null,$null,$null,$null,$null,$null,$null,$null,$null,$null,$null,$null,$null,$null,"Administrator","!123Pa$$w0rd")

또는 gMSA(그룹 관리 서비스 계정) 계정 이름을 입력할 수도 있습니다(이 경우 암호는 지정하지 않습니다).

이처럼 PowerShell을 활용하면 Windows 서비스를 매우 편리하게 관리할 수 있습니다. 서비스를 생성, 중지, 시작, 재개하고 속성을 변경할 수 있으며, 대부분의 cmdlet은 원격 컴퓨터의 서비스 관리도 지원합니다.