Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Stopping & Restarting Services Remotely Using Set-Service

I've got a list of 10-15 services that I routinely need to restart on 6 servers. I have a script that calls a list of services, then calls a list of the servers, and then stops all the services:

$Services = Get-Content -Path "C:\Powershell\Services.txt"
$Machines = Get-Content -Path "C:\Powershell\Machines.txt"
Get-Service -Name $Services -ComputerName $Machines | Set-Service -Status Stopped

I then have another separate script to start them up again:

$Services = Get-Content -Path "C:\Powershell\Services.txt"
$Machines = Get-Content -Path "C:\Powershell\Machines.txt"
Get-Service -Name $Services -ComputerName $Machines | Set-Service -Status Running

I've checked around and can't seem to find a way of putting this into a single script. As I understand, Set-Service only has the ability to Stop, Start & Pause services, not restart them at the same time.

Any ideas? I might be missing something completely obvious.

like image 893
PJC83 Avatar asked Jul 31 '15 15:07

PJC83


People also ask

What is mean by stopping?

1a : to cease activity or operation his heart stopped the motor stopped. b : to come to an end especially suddenly : close, finish The talking stopped when she entered the room. 2a : to cease to move on : halt. b : pause, hesitate. 3a : to break one's journey : stay.

Is stopping correct word?

verb (used without object), stopped or (Archaic) stopt; stop·ping. to come to a stand, as in a course or journey; halt. to cease moving, proceeding, speaking, acting, operating, etc.; to pause; desist. to cease; come to an end.


2 Answers

To restart services simply use Restart-Service:

$Services = Get-Content -Path "C:\Powershell\Services.txt"
$Machines = Get-Content -Path "C:\Powershell\Machines.txt"
Get-Service -Name $Services -ComputerName $Machines | Restart-Service

Since according to the comments PowerShell v6 has removed support for remote access from the *-Service cmdlets you need to resort to Invoke-Command for remote execution when running v6 or newer, like this:

Invoke-Command -Computer $Machines -ScriptBlock {
    Get-Service -Name $using:Services -ErrorAction SilentlyContinue |
        Restart-Service
}

or like this:

Invoke-Command -Computer $Machines -ScriptBlock {
    Restart-Service $using:Services -ErrorAction SilentlyContinue
}

Another option would be WMI:

$fltr = ($Services | ForEach-Object { 'Name="{0}"' -f $_ }) -join ' or '
Get-WmiObject Win32_Service -Computer $Machines -Filter $fltr | ForEach-Object {
    $_.StopService()
    $_.StartService()
}
like image 107
Ansgar Wiechers Avatar answered Sep 18 '22 14:09

Ansgar Wiechers


I am with Ansgar, this should work

$Services = Get-Content -Path "C:\Powershell\Services.txt"
$Machines = Get-Content -Path "C:\Powershell\Machines.txt"
foreach ($service in $services){
    foreach ($computer in $Machines){
    Invoke-Command -ComputerName $computer -ScriptBlock{
    Restart-Service -DisplayName $service}
    }
}

it is a little messy but should give you a starting point

Sorry I forgot to take time to explain what is going on, so you import each of your txt docs and then it will process for each service and each computer and restart the services.

like image 39
Luke Avatar answered Sep 17 '22 14:09

Luke