Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Скрипт на отключение служб (http://forum.oszone.net/showthread.php?t=340860)

Welcome_to_the_jungl 10-06-2019 07:19 2875024

Скрипт на отключение служб
 
Добрый день, уважаемые системные администраторы.
Стоит задача, автоматизировать процесс.
Отключение определенной службы, проверка (завершила ли работу служба или нет, если нет то "алярм")
И после перезагрузка.
Загвоздка в том, как организоваться проверку отключилась ли служба или нет.
Буду рад любым идеями.
Спасибо.

Welcome_to_the_jungl 10-06-2019 08:42 2875030

Как застопить службу я разобрался.
Самое интересно как организовать проверку остановлена ли служба?

mwz 10-06-2019 09:40 2875035

Цитата:

Цитата Welcome_to_the_jungl
как организовать проверку остановлена ли служба? »

Запустите в окне cmd команду
sc /?
и после вывода основной справки нажмите Y чтобы увидеть дополнительную справку для команды с параметром query, т.е. для
sc query

greg zakharov 10-06-2019 09:43 2875036

По типу остановки службы можно условно разделить на две группы: напрямую и через реестр. В первом случае служба может быть остановлена с помощью командлета Stop-Service, во-втором - путем поиска одноименного со службой ключа реестра в разделе HKLM\SYSTEM\CurrentControlSet\Services, однако стоит учитывать, что изменения в таком случае вступят в силу только после перезагрузки системы, а потому проверка на "отключенность" должна производиться также через реестр. В противном случае достаточно воспользоваться командлетом Get-Service:
Код:

.({Write-Warning 'служба по-пержнему выполняется'},{Restart-Computer})[(Get-Service имя_сервиса).Status -eq 1]
В данном примере осуществляется проверка на запущенность службы, если она остановлена, компьютер будет перезагружен, если выполняется - выводится предупреждение.

Elven 10-06-2019 10:02 2875037

Код:

sc query "spooler" | findstr /i state | findstr /i STOPPED && (
@echo "остановлена") || (
@echo " находиться в каком-то другом состоянии"
)


Welcome_to_the_jungl 11-06-2019 09:30 2875160

Спасибо за ответы.

greg zakharov,


Цитата:

.({Write-Warning 'служба по-пержнему выполняется'},{Restart-Computer})[(Get-Service имя_сервиса).Status -eq 1]
Спасибо большое, это код из повер шела?
Что означает -eq 1?

Спасибо.

Elven 11-06-2019 10:14 2875164

Цитата:

Цитата Welcome_to_the_jungl
Что означает -eq 1 »

"-eq" это оператор сравнения, ну а "1" это то значение с которым сравнивается.

Busla 11-06-2019 11:34 2875179

Цитата:

Цитата Welcome_to_the_jungl
Спасибо большое, это код из повер шела? »

да, это пример, как не надо писать на PowerShell - имитация тернарного оператора
Код:

операнд1 -eq операнд2
сравнивает операнды и возвращает bool
bool неявно преобразуется в int
по этому индексу берётся блок кода из массива
оператор контекста точка его исполняет

greg zakharov 11-06-2019 12:18 2875190

Цитата:

Цитата Busla
это пример, как не надо писать на PowerShell

Аргументируйте, иначе подобные высказывания можно расценить лишь как пустой треп. Почему? Во-первых, -eq 1 - неспроста; есть ряд ситуаций, когда свойство Status может быть равным нулю, да и просто полагаться на "встроенное" приведение к булеву типу неразумно. Во-вторых, что касается синтаксиса: будь то if или switch, - в любом из этих случаев приходится иметь дело со скриптблоками; разница с приведенным выше примером лишь в том, что создается массив анонимных скриптблоков, ну может чуть более расходуется при этом памяти. Однако, по сути это - латеральная лямбда с возможностью отложенного исполнения, и если кто-то начинает гнать, дескать, так делать не нужно или нечто в этом роде, значит он ни черта не смыслит в PowerShell.

YuS_2 11-06-2019 13:02 2875197

Цитата:

Цитата greg zakharov
Во-первых, -eq 1 - неспроста; »

Это "ж-ж-ж" - неспроста! :)
Цитата:

Цитата greg zakharov
просто полагаться на "встроенное" приведение к булеву типу неразумно. »

А у статусов, если не ошибаюсь и нет булева типа...
Цитата:

Цитата greg zakharov
Однако, по сути это - латеральная лямбда с возможностью отложенного исполнения, и если кто-то начинает гнать »

Григорий, не матерись! :)
Можно ведь просто сказать, что у статусов сервисов существует конкретное [int32] значение свойства, которое можно подсмотреть по:
Код:

(gsv).status.value__
и тип такого значения вполне можно получить тоже, выделив один из элементов ...

greg zakharov 11-06-2019 15:18 2875219

YuS_2, имелось в виду, что pwsh исповедует приведение к булеву типу в стиле JavaScript, однако при этом статус может быть нулевыми или просто пустым значением (даже если в действительности это не так).
К слову, Busla уже не первый раз берется утверждать вещи нелепые и далёкие от истины.

YuS_2 11-06-2019 15:45 2875228

Цитата:

Цитата greg zakharov
имелось в виду, что pwsh исповедует приведение к булеву типу »

это да, для powershell нет разницы, булево для него: $false -eq 0, а всё, что не ноль, то $true ... и да, приводит он это всё автоматом, специально обозначать не требуется.

Busla 11-06-2019 16:39 2875235

Цитата:

Цитата greg zakharov
если кто-то начинает гнать, дескать, так делать не нужно или нечто в этом роде, значит он ни черта не смыслит в PowerShell »

всё ровно наоборот: то, что вы наваяли понимает от силы человек пять на форуме
это дешёвые понты: накорябать такое решение, которое топикстартер заведомо не поймёт

Цитата:

Цитата YuS_2
у статусов сервисов существует конкретное [int32] значение свойства, которое можно подсмотреть по: »

конкретные int - это magic numbers, статусы служб - это enum с читаемыми названиями. Это "ж-ж-ж" - неспроста! А чтобы люди понимали, что происходит в коде без внешних подсказок.

Цитата:

Цитата greg zakharov
Busla уже не первый раз берется утверждать вещи нелепые и далёкие от истины »

отличный ход - ведь моя просьба конкретизировать будет призывом к офтопику, и "личными разборками", которые модераторы поудаляют

YuS_2 11-06-2019 22:11 2875294

Цитата:

Цитата Busla
конкретные int - это magic numbers »

Если уж на то пошло, то это никакие не magic numbers, а вполне себе конкретное перечисление констант:
SERVICE_STOPPED - 0x00000001
SERVICE_START_PENDING - 0x00000002
SERVICE_STOP_PENDING - 0x00000003
SERVICE_RUNNING - 0x00000004
SERVICE_CONTINUE_PENDING - 0x00000005
SERVICE_PAUSE_PENDING - 0x00000006
SERVICE_PAUSED - 0x00000007
где:
Цитата:

An enumeration is a set of named constants whose underlying type is any integral type. If no underlying type is explicitly declared, Int32 is used. Enum is the base class for all enumerations in the .NET Framework.
то бишь, используемые в powershell со вполне себе [int32] значениями:
Код:

(gsv).status|gm
- это к моей ссылке, опубликованной выше:
Цитата:

TypeName: System.ServiceProcess.ServiceControllerStatus
и для пущей убедительности:
Код:

gsv|? status -eq 4
В любом случае, это никакая не:
Цитата:

Цитата Busla
имитация тернарного оператора »

а вполне себе, верное использование предоставленного инструмента.

ЗЫ А вообще, я за то, чтобы при появлении такого утверждения:
Цитата:

Цитата Busla
это пример, как не надо писать на PowerShell »

за ним сразу же следовал бы пример того, как надо писать... и речь, конечно же, не только о powershell.
Цитата:

Цитата Busla
моя просьба конкретизировать будет призывом к офтопику, и "личными разборками", которые модераторы поудаляют »

Если аргументация не будет выглядеть кратенькими и голыми аксиомами, а будет включать в себя конкретные доказательства, причем безо всякого перехода на личности, то и модераторам незачем будет удалять поучительные дискуссии, даже если она немного свалится в оффтоп. Имхо.

greg zakharov 11-06-2019 22:39 2875301

Busla, если латеральная лямбда "дешёвые понты", которые по-вашему могут разуметь лишь горстка избранных форума (к слову, не названных), что же тогда в вашем представлении обобщенные делегаты? Видимо в них вовсе нет нужды, ибо "дешёвые понты". Или рефлексия. Тоже "понты".
О, сослаться на модераторов ещё какой "хороший ход"! Цепляться за форум, точнее за сомнительно заработанную репутацию - вот истинная причина вашего словоблудия. Если не влом, поищите на форуме свои каки, в которых вы утверждаете полную чушь, в то время как прочие дают адекватные ответы.

Serguei Kouzmine 15-06-2019 07:42 2875601

@greg zakharov простите вы не смотрели если в агрументе несуществеющий сервис то ответ неправильный

HTML код:

$service_name = 'zzz'; .({Write-Warning ('service {0} running' -f $service_name)},{Write-Warning ('service{0} stopped' -f $service_name)})[(Get-Service $service_name ).Status -eq 1]

Get-Service : Cannot find any service with service name 'zzz'.At line:1 char:149+ ... e {0} stopped' -f $service_name)})[(Ge....

WARNING: service zzz running


greg zakharov 15-06-2019 13:39 2875649

Serguei Kouzmine, все верно. Речи же не было о несуществующем сервисе, так? В противном случае, при Get-Service обращенным в $null и (-ErrorAction 0), породить исключение индекса. Если нужен пример:
Код:

$service = 'foo'
.({if(!$$){throw};'возможно запущен'},{'остановлен'})[($$=gsv $service -ea 0).Status -eq 1]



Время: 08:15.

Время: 08:15.
© OSzone.net 2001-