@Kadet77Rus

Как проверить наличие службы и если её нет — запустить батник?

Приветствую. Есть некий exe-шник, который я хотел бы запускать на всех компах в домене при включении. В данный момент я смог это реализовать только как логон-скрипт через GPO таким образом: первый батник лежит в авторане и запускает vbs, который, в свою очередь уже создает свой скрытый шелл и там запускает exe-шник с аргументами. Чтобы было понятно - вот скрипт:

Set WshShell = CreateObject("WScript.Shell")
WshShell.Run "cmd.exe /c %path_to_folder%\start.bat", 0, false

Вручную при помощи nssm служба создается и запускается. Автоматизация этого процесса мне видится примерно таким образом -
1) Через GPO распространить нужные файлы
2) Запихнуть в авторан скрипт, проверяющий наличие службы, и, в случае её отсутствия, запускающий nssm с параметрами установки. Вопрос - как это сделать? В PowerShelle и VBS не силен, к сожалению
  • Вопрос задан
  • 3646 просмотров
Пригласить эксперта
Ответы на вопрос 3
@res2001
Developer, ex-admin
Из cmd проверить состояние службы можно с помощью sc и проанализировать ее вывод.
Либо можно с помощью tasklist вывести список запущенных процессов и найти нужный, если его нет, то и служба не работает.
Запустить любой процесс в качестве службы можно с помощью srvany и instrvs. Эти утилиты входят в состав Microsoft’s Windows Server 2003 Resource Kit. Вполне работали на Вин7, дальше не в курсе.
Ответ написан
Комментировать
проще завершить службу и потом запустить чем мониторить
Ответ написан
Комментировать
@NRinat
Вариант 1
Примерно можно использовать такую функцию.
Function ServiceExists([string] $ServiceName) {
    [bool] $Return = $False
    if ( Get-WmiObject -Class Win32_Service -Filter "Name='$ServiceName'" ) {
        $Return = $True
    }
    Return $Return
}

Потом проверка и запуск команды
if (!ServiceExists ServiceName)
{
    run some command
}


Вариант 2
if (!Get-Service "ServiceName" -ErrorAction SilentlyContinue)
{
    run some command
}

Вариант 3
Я бы наверно сделал лучше wmi filter для GPO и его бы прикрутил к политике, такие ощущения, что надежнее будет.
Get-WmiObject -Class Win32_Service -Filter "Name='$ServiceName'"

P.S!
Примеры не проверял, используйте их на свой страх и риск )))
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы