2014. 9. 19. 16:50

로컬 컴퓨터의 서비스를 중지하는 방법은 Stop-Service -Name servicename -Force이다.
Stop-Service는 -Force 매개변수가 있기 때문에 [의존하고 있는 서비스]가 있더라도 해당 서비스를 강제로 중지할 수 있다.
하지만 Stop-Service의 아쉬운 점은 RPC로 원격 컴퓨터를 제어하는 -Computername이라는 매개변수가 없다는 것이다.
그래서 원격 컴퓨터의 서비스(예를 들면 spooler 서비스)를 중지하는 방법은 다음의 방법을 사용해야 한다.
1) Set-Service: 이것을 사용하기 위해서는 관리자 권한으로 Powershell 콘솔 프로그램을 실행하여야 한다.
Set-Service -Name Spooler  -ComputerName 원격컴퓨터이름 -Status “Stopped”
이것의 약점은 -Force 매개변수가 없어서 의존하고 있는 서비스는 종료할 수 없다는 것이다.

2) Invoke-Command (강추): 원격 접속을 허용한 경우, 즉, Enable-PSRemoting -Force을 한 원격 컴퓨터
Invoke-Command -ComputerName 원격컴퓨터이름 { Stop-Service -Name Spooler -Force }
이것은 원하는 모든 것을 할 수 있어서 제일 추천되는 방법이다.
Invoke-Command의 내용은 로컬에서 구문이 제대로 되어 있는지 분석한 후 원격 컴퓨터에 접속하여 원격 컴퓨터에서 명령어를 실행하는 것이다. 그렇기 때문에 {     }의 내용이 원격에서 실행되기 때문에 Stop-Service가 원격에서 이루어지는 것이다.

다음은 원격 컴퓨터의 오디오 서비스를 중지하는 데모이다.
a) Help Get-Service
이렇게 하면 -DependentServices와 -RequiredServices라는 매개변수가 있음을 알 수 있다.
b) Get-Service -Computername Server1 -Name audiosrv -RequiredServices
이것을 결과를 보면 AudioEndpointBuilder, MMCSS, RpcSs 서비스가 나타난다. 즉, audiosrv가 시작되려면 이러한 서비스들이 모두 Start가 되어 있어야 한다는 것이다. 다른 말로 말하면autiosrv는 mmcss에 의존하고 있으며, 의존하고 있는 서비스를 가지고 있는 mmcss 서비스를 중지하려면 먼저 audiosrv 서비스를 중지해야 한다는 것이다. 그래서 우리가 원격에 있는 컴퓨터의 mmcss 서비스를 중지하려면 반드시 -Force 매개 변수를 사용해야 하는 것이다. 그런데 Set-Service는 -Force 옵션이 없고, Stop-Service는  -Computername 매개변수가 없다. 그래서 이를 해결하기 위해서는 가장 좋은 것이 Invoke-Command 명령어이다.

다시 거꾸로 설명하면.. Get-Service -Name mmcss -DependentServices를 실행하면 Windows Audio (audiosrv) 서비스가 의존하고 있다는 것을 알 수 있다. 그래서 원격 컴퓨터의 Multimedia Class Scheduler(mmcSS) 서비스를 중지하려면 Invoke-Command가 최적의 방안이다.
하지만 해당 서비스를 의존하고 있는 서비스가 없다면 (예를 들면, spooler, w32time, dns, dhcp..) 그냥 Set-Service -Force를 사용하거나 Invoke-Command를 사용하면 된다.

c) Stop-Service -Computername server1 (이것은 아예 안된다. 즉, stop-Service는 -computername 매개변수가 없다.)

d) Set-Service -ComputerName server1 -Name mmcss   -Status “Stopped”
이렇게 하면 종속 서비스를 포함하고 있기 때문에 중지할 수 없다고 나온다.

e) Set-Service -ComputerName server1 -Name audiosrv   -Status “Stopped”
이것도 안된다. audiosrv가 다른 서비스에 종속되기 때문이라고 안된다. 

f) Invoke-Command -Computername Server1 {Stop-Service -Name mmcss  -Force}
Invoke-Command -Computername Server1 {Stop-Service -Name audiosrv  -Force}
이렇게 하면 종속 서비스를 가지고 있는 서비스(mmcss)와 종속된 서비스인 audiosrv 모두 중지할 수 있다.

** 참고로 만약에 로컬 컴퓨터에 실행 중인 서비스인 경우에는 종속된 서비스인 audiosrv는 stop-service -name audio로 중지할 수 있지만,
종속된 서비스를 가지고 있는 mmcss는 stop-service -name mmcss로 중지할 수 없다. 그래서 반드시 -force 매개변수를 사용하여 중지해야 한다.
마지막으로, 꼭 알아야 할 것은 종속된 서비스를 가지고 있는 서비스를 죽이면 자동적으로 종속된 서비스들을 자연적으로 동시에 중지된다는 사실이다. 그러므로 mmcss와 같은 서비스를 중지하면 여기에 의존하고 있는 서비스인 audiosrv 서비스가 동시지 중지된다는 사실을 꼭 염두에 두어야 한다.


출처 : http://cloudsns.wordpress.com/category/microsoft/powershell/page/10/

Posted by pegasuss