Как проверить, является ли тип запуска службы Windows автоматическим или с автоматической задержкой, с помощью Powershell 5 в Windows Server 2012

Во время обслуживания, прежде чем я остановлю службу Windows, мне нужно установить для нее тип запуска «Вручную». Позже мне нужно переключить его обратно на исходный тип запуска. Поэтому мне нужно знать тип запуска, прежде чем я остановлю службу.

Я знаю, что в Windows 10 есть свойство под названием «DelayedAutoStart», но, похоже, оно недоступно в Windows Server 2012. Как я могу получить тип запуска службы в Powershell?

Я использую Powershell 5.1 на Windows Server 2012.


person Jim    schedule 09.12.2019    source источник


Ответы (1)


Вот хороший пост с несколькими подходами к обработке свойства DelayedAutoStart объекта Служба Windows.

Для вашей версии PowerShell лучше всего использовать sc.exe.

Запрос типа запуска службы

Вы можете запросить тип запуска служб, используя sc.exe, но информация возвращается в виде текста, а не объектов PowerShell, поэтому вам придется выполнить некоторые манипуляции с текстом. Я набросал быстрый однострочный код, который может получить тип запуска для службы с заданным именем.

sc.exe qc "SERVICE_NAME" | Select-String "START_TYPE" | ForEach-Object { ($_ -replace '\s+', ' ').trim().Split(" ") | Select-Object -Last 1 }

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

foreach($Service in (Get-Service)) {
    Write-Host "$($Service.ServiceName)"
    sc.exe qc "$($Service.ServiceName)" | Select-String "START_TYPE" | ForEach-Object { ($_ -replace '\s+', ' ').trim().Split(" ") | Select-Object -Last 1 } 
}

Настройка типа запуска службы

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

sc.exe config NameOfTheService start= delayed-auto

или обернуть sc.exe в PowerShell...

$myArgs = 'config "{0}" start=delayed-auto' -f 'TheServiceName'
Start-Process -FilePath sc.exe -ArgumentList $myArgs

Начиная с PowerShell 6.0, они добавили поддержку AutomaticDelayedStart, однако, поскольку вы используете PowerShell 5.1, это неприменимо (но может быть для других читателей).

Set-Service -Name "Testservice" –StartupType "AutomaticDelayedStart"
person Zam    schedule 09.12.2019
comment
Большое спасибо за ответ. Можно ли использовать подстановочный знак в sc.exe для запроса? или можно передать имя службы в sc.exe, например, использовать get-service для получения списка служб, а затем передать его в sc.exe? - person Jim; 10.12.2019
comment
Привет, Джим! Да, я думаю, что лучший подход — использовать командлет Get-Service, а затем циклически перебирать службы, которые он возвращает. Get-Service возвращает объект со свойством ServiceName, имя которого совпадает с именем, которое необходимо использовать при выполнении запросов с помощью sc.exe. Я обновлю свой ответ примером, который получает тип запуска каждой службы. Оттуда вы можете применить фильтр к командлету Get-Service, чтобы сузить его, если вам нужно. - person Zam; 10.12.2019