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은 원격 컴퓨터의 서비스 관리도 지원합니다.