Как перезапустить Win32_Service вместе со всеми его зависимостями - PullRequest
1 голос
/ 05 марта 2019

Если я использую

$service.stopservice()

метод я получаю сообщение об ошибке из-за зависимостей. Что мне нужно сделать, это перезапустить службу и все ее зависимости.

Аналогично тому, как при использовании графического интерфейса и выборе службы верхней линии и нажатии перезапуска, сначала я получу предупреждение, затем список других служб, которые тоже будут перезапущены, который затем проходит остановку каждой зависимости до перезапуска верхней один, а затем перезапустить зависимости.

Мне нужно сделать это в powershell

Try {
    Write-host "Connecting to remote computer"
    $service = Get-WmiObject -Class Win32_Service -ComputerName $ip -Credential $cred -Filter "Name='$servname'"
    if ($service.Status -eq 'Running'){$ServiceStarted = $true}

    if($ServiceStarted -eq $true) {


    $StopResponse = $service.stopservice()  
    $StopReturnCode = Switch ($StopResponse.ReturnValue) {
    0{ "The request was accepted" }
    5{ "The service is already stopped" }
    10{ "The service failed to stop - run the script again" }
    default{ "Something unexpected happened" }
}
}
     Write-Host $StopReturnCode
} catch {
Write-Host "script noped out bro" :fore RED
}

Вышеуказанное работает (хотя и медленно) для одной услуги.

Я пытался использовать -Force, но это не работает, и -Force -Confirm выдает ошибку.

1 Ответ

0 голосов
/ 06 марта 2019

Есть несколько соображений по поводу этого варианта использования.

Вы можете получить зависимости несколькими способами ... и запускать по мере необходимости, прежде чем пытаться перезапустить тот, который вам нужен.

# Review Dependent Services
Get-Service -Name Winmgmt -DependentServices

или

Использование Windows PowerShell для отображения зависимостей службы

Get-Service -CN $env:COMPUTERNAME | 
    Where-Object { $_.status -eq ‘running’} | 
    ForEach-Object { 
    write-host -ForegroundColor 9 "Service name $($_.name)" 
    if ($_.DependentServices) 
    {
        write-host -ForegroundColor 3 "tServices that depend on $($_.name)"
        foreach ($s in $_.DependentServices) 
        { "tt" + $s.name } 
    } #end if DependentServices 
    if ($_.RequiredServices) 
    {
        Write-host -ForegroundColor 10 "tServices required by $($_.name)"
        foreach ($r in $_.RequiredServices) 
        { "tt" + $r.name } 
    } #end if DependentServices 
} #end foreach-object

Для решения этих проблем могут использоваться разные подходы, здесь обсуждается тема.

Как перезапустить службы с зависимостями с помощью сценариев PowerShell (128574)

# For services with just a few dependencies, running 
Restart-Service winmgmt -Force -PassThru

Может быть достаточно, поскольку все текущие работающие зависимости перезапускаются.

Однако это небезопасный способ перезапуска, так как некоторые службы могли быть ранее остановлены.

Для производственных машин рекомендуется следующий подход (в примере используется служба WMI):

cls
Write-Host "Restarting Service with Dependencies`r`n" -f Green

# 1. Get wmi dependencies
$wmidependents = (get-service winmgmt).dependentservices  

if desired to get only the running dependent services, pipe | where {$_.status -eq "running"}


# 2. Get all necessary information about dependent services
$wmidependentservices = Get-WmiObject Win32_Service | 
Select-object name,state,startmode | 
Where-Object {$wmidependents.name -contains $_.name}

# 3. Stop wmi dependencies
Write-Host "`r`nStopping Services`r`n-----------------`r`n" -f Yellow


ForEach ($service in $wmidependentservices)
{
Write-Host "`r`nAnalyzing $($service.name)" -f Yellow

    if($service.startmode -eq "auto" -or $service.status -eq "Running")
    {
        Write-Host "Stopping $($service.name)"
        stop-service $service.name
        #you can add more logic in the block
    } 
    else
    {
        "$($service.name) is $($service.state) with the startmode: $($service.startmode)"
    }
}

#equivalent to stop-service $wmidependents.name

# 4. Stop the WMI service
Stop-Service winmgmt -force
Write-Host "`r`nStarting Services`r`n -----------------`r`n" -f Yellow

# 5. start dependencies

ForEach ($service in $wmidependentservices)
{
    Write-Host "`r`nAnalyzing $($service.name)" -f Yellow

    if($service.startmode -eq "auto")
    {
        "Starting $($service.name)"
        start-service $service.name
        #you can add more logic in the block
    } 
    else
    {
        "$($service.name) is $($service.state) with the startmode: $($service.startmode)"
    }
}

#equivalent to start-service $wmidependents.name

# 6. start WMI
Start-Service winmgmt

Обратите внимание, что как с автоматическим, так и с автоматическим запуском типы отображаются WMI как "авто".

...