Массовая перезагрузка компьютеров в локальной сети
Что такое хороший способ перезагрузить список компьютеров Windows в домене Windows? Предполагая, что контроллер домена Windows не имеет службы для этого, пожалуйста, сделайте рекомендации для сценария.
Мои предпочтительные языки сценариев от наиболее до наименее желательных: PHP, javascript, Bash, Python (очень мало знаю), VB (знаю, но не нравится)
@JM - нет, если в BIOS установлено «Возобновить предыдущее состояние питания».Если GPO не ваша вещь, и вы хотите использовать второй вариант Марка Хендерсона ( shutdown /m пакетный режим), вы можете упростить свою работу, выполняя пакетное отключение, поэтому он будет выполнять их параллельно, а не последовательно. Это требует PowerShell со стороны административной станции, но это очень изящно .
Этот фрагмент порождает столько фоновых заданий, которые выполняются параллельно, сколько машин в $ ComputerList. Это может сделать отключение All The Things намного быстрее.
Это интересное решение - если у вас много компьютеров для перезагрузки, я очень рекомендую это решение, так как оно будет запускать команды выключения параллельно. Мне любопытно, почему вы используете команду shutdown, а не командлет Restart-Computer. @CharlesBurge На это ответили 5 лет назад, и PS3 не получил широкого распространения. Также это демонстрирует технику запуска команд в других системах. В 2017 году мы просто делали все это в PowerShell и не беспокоились о командах. Времена меняются.Это можно сделать с помощью параметров групповой политики, создав новую запланированную задачу, которая будет выполняться каждую ночь в определенное время. Команда для этой задачи должна быть shutdown /r /t 0 . Затем вы можете связать этот объект групповой политики с подразделениями или подразделениями, в которых есть ваши компьютеры.
Возможно, вы захотите использовать опцию «Запускать эту программу с произвольным интервалом», установленную где-то между 10-15 минутами. Если каждый компьютер включается одновременно, это может быть вредно для ваших выключателей, если вы не будете осторожны. Вы также можете выбрать вариант запуска задачи только в том случае, если компьютер простаивал в течение x часов, если кто-то тянет всю ночь. Вы не хотите убивать труд на целую ночь, перезагружая кого-то, кто пытается сделать крайний срок.
Я не знаком с настройкой запланированных задач с помощью объекта групповой политики, поэтому мне интересно: если машина будет перемещена из одного подразделения в другое без заданной задачи, исчезнет ли заданная задача или она останется после первого применения?Создайте запланированное задание с помощью объекта групповой политики, который запускается shutdown /r /f /t 0 или shutdown /g /f /t 0 на каждой машине, которую вы хотите перезагрузить. (проверьте shutdown /? для более подробной информации.
Создайте пакет, который запускается shutdown /m [computer name] /r /f /t 0 с центрального компьютера (возможно, контроллера домена?). Зациклите его для каждого компьютера, который вы хотите перезагрузить (измените [computer name] ). Это означает, что компьютер не будет перезагружен, если он по какой-либо причине недоступен, и его необходимо запускать с учетной записи, имеющей права на перезагрузку компьютеров.
Вы должны быть в состоянии написать командный файл, который просматривает список компьютеров, извлеченных из активного каталога, и запускает команду, однако у меня нет времени, чтобы написать один сегодня (и я не хочу тестировать его, даже если Я действительно написал это, иначе я был бы готов для перезагрузки любого компьютера в середине дня).
Перезагрузка компьютера, это базовая процедура в операционной системе, и для большинства людей достаточно графического варианта, но бывают ситуации, что у вас может быть с помощью групповой политики убрана кнопка перезагрузки, или же вам нужно перезагрузить сразу пачку серверов, в таких ситуациях вас выручит PowerShell.
Открываем окно PowerShell в режиме администратора и знакомимся с командлетом Restart-Computer.Первое, что я вам советую сделать, это ознакомиться со справкой командлета, для этого введите:
Для того, чтобы была выполнена локальная перезагрузка компьютера, вам достаточно ввести данный командлет:
Как видим компьютер уходит в перезагрузку.
Так же можно использовать команду с добавлением ключа -ComputerName
Тут так же будет выполнена перезагрузка компьютера, хочу отметить, что localhost означает локальный компьютер, но вам никто не мешает тут ввести и имя локального компьютера.
Удаленная перезагрузка компьютера
Как я и говорил ранее PowerShell, это прекрасный инструмент по удаленному управлению компьютерами, серверами и службами. Предположим, что у меня есть RDS ферма состоящая из 10 серверов с Windows Server 2019. Мне необходимо произвести обслуживание четырех серверов, для этого я перевожу их в режим стока (Drain Mode) чтобы отсечь новые подключения, и рассылаю уведомление сотрудникам, через msg, чтобы сотрудники перелогинились. После я начинаю обслуживать данные системы, когда я заканчиваю, то мне необходимо их перезагрузить. Для этого мы воспользуемся вот такой конструкцией:
Restart-Computer -ComputerName w10-cl02, w10-cl03 (w10-cl02, w10-cl03 имена удаленных компьютеров или серверов)После выполнения команды компьютер уходит в перезагрузку, если этого не произошло, то вы с большой вероятностью получите ошибку:
Restart-Computer -ComputerName w10-cl02, w10-cl03 -ForceКак видим команда успешно отработала и была произведена перезагрузка компьютера.
Если вы хотите перезагрузить удаленный компьютер от имени определенного пользователя, то данный командлет вам это позволит сделать. Для этого введите:
Restart-Computer -ComputerName w10-cl02, w10-cl03 -Credential root\sem (Где root, это наименование домена, а sem, это логин пользователя)В результате у вас появится окно для ввода пароля пользователя, указываем его и нажимаем "Ok". Кстати если на удаленном компьютере, который требуется перезагрузить, будет активная сессия пользователя в интерактивном режиме, то вам так же выскочит ошибка, что "компьютер используется другими пользователями" и вам нужно будет добавлять ключик -Force:
Restart-Computer -ComputerName w10-cl02, w10-cl03 -Credential root\sem -ForceВ логах Windows на тех компьютерах, в журнале система, вы сможете обнаружить событие с кодом ID 1074(/kak-uznat-kto-perezagruzil-server-windows/), в котором вы увидите, кто перезагрузил систему:
Процесс C:\Windows\system32\wbem\wmiprvse.exe (W10-CL02) инициировал действие "Перезапустить" для компьютера W10-CL02 от имени пользователя ROOT\sem по причине: Причина на перечисленаКод причины: 0x80070015 Тип выключения: Перезапустить
Предположим, что у вас есть список компьютеров, которые требуется удаленно перезагрузить. В такой ситуации сам Бог велел использовать PowerShell. Структура файла выглядит очень просто, обычный текстовый документ, формата txt. На каждой строке по одному имени компьютера, без запятых. Я положил его в корень диска C:\.
Для того, чтобы прочитать данный файл есть командлет Get-Content и конструкция команды принимает вот такой вид:
В итоге удаленная перезагрузка компьютера через PowerShell успешно отработала и все системы из файла обслужены.
Перезагрузка компьютера с задержкой по времени
Еще очень частая ситуация, это перезапуск компьютера, но через определенное время, предположим, через 60 секунд, чтобы какие-то другие вещи успели отработать, очень часто применяется в сценариях и скриптах. Для выполнения это задачи есть командлет Start-Sleep. Пишем команду:
Start-Sleep -Seconds 60; Restart-Computer -ComputerName w10-cl03 -ForceВ ключе -Seconds вы задаете время в секундах.
так же у вас есть возможность определить механизм, который используется для аутентификации учетных данных пользователя. Этот параметр был введен в Windows PowerShell 3.0. Называется этот ключ -WsmanAuthentication. На выбор у вас будет пять вариантов: Basic, CredSSP, Default, Digest, Kerberos и Negotiate.
В моем примере я буду использовать проверку подлинности Kerberos, напоминаю, что для этого у вас на удаленных компьютерах должна быть настроена служба WinRM и политика, определяющая с каких ip-адресов вы можете производить подключение к ней. В итоге команда принимает такой вид:
Restart-Computer -ComputerName w10-cl02, w10-cl03 -Force -WsmanAuthentication KerberosПосле ее выполнения удаленные компьютеры уходят в перезагрузку.
Скрипт PowerShell для перезагрузки по расписанию
Предположим, что вам нужно перезагрузить компьютер по расписанию, это можно сделать и групповыми политиками, а так же и через задачу по расписанию, актуально для компьютеров не в домене. Вы в задаче подкладывает ваш скрипт PowerShell, чтобы выполнять его в нужное время, но с уведомлением человека. Ниже текст скрипта.
$wshell.Popup("Данный компьютер будет перезагружен",10,"Сохраните свои данные",0x0)
$wshell.Popup("Перезагрузка будет через 30 секунд",2,"Не забудьте сохранить данные",0x0)
Restart-Computer -ComputerName w10-cl01
Еще бонусом перезагрузка локального компьютера может быть выполнена и с помощью WMI. Для этого в оболочке PowerShell введите;
Системному администратору неизбежно потребуется перезапустить сервер или систему. Вместо того, чтобы проходить через пользовательский интерфейс, PowerShell предоставляет несколько методов для удаленной перезагрузки компьютера.
В этой статье мы исследуем различные способы использования PowerShell для перезагрузки удаленного компьютера в сети, и какими дополнительными инструментами богат PowerShell для задачи перезагрузки системы. Каждый метод по своей сути не лучше и не хуже другого, т.к. каждый метод будет использоваться в зависимости от вашей среды.
Возможно, вы знакомы с командлетом Restart-Computer, но знаете ли вы, что есть еще много других способов?
Содержание
- Что нам понадобиться
- Перезагрузка удаленного компьютера с помощью Restart-Computer
- Перезагрузка удаленного компьютера с помощью Invoke-CimMethod
- Использование shutdown.exe для удаленной перезагрузки компьютера
- Перезагрузка компьютера удаленно с помощью PSExec.exe
- Параллельный перезапуск нескольких систем
- Вывод
Что нам понадобиться
Перезагрузка удаленного компьютера с помощью командлета Restart-Computer
Как вы можете видеть в приведенном ниже примере, это, как правило, наиболее простой метод и подходящее решение для большинства сценариев PowerShell.
Перезагрузка удаленного компьютера помощью Invoke-CimMethod
Не предназначен специально для удаленной перезагрузки системы.
Invoke-CimMethod работает с использованием метода WIM для перезагрузки удаленной системы.
Не такой гибкий, как Restart-Computer командлет, но вы можете удаленно перезагрузить систему с помощью собственной команды PowerShell.
Использование shutdown.exe для удаленной перезагрузки компьютера
Удаленная перезагрузка компьютера с помощью PSExec.exe
Параллельный перезапуск нескольких систем
Большинству системных администраторов в тот или иной момент потребуется перезапустить несколько систем. Есть несколько способов сделать это с помощью определенных команд.
Параллельный перезапуск нескольких компьютеров легко выполняется с помощью PowerShell 7 и команды Restart-Computer .
Вывод
Использование PowerShell для перезагрузки компьютеров в сети является важным и полезным умением системного администратора Windows. Поскольку PowerShell обладает уникальной способностью запускать сторонние команды из скриптов и функций, вы сможете использовать PowerShell для «склеивания» различных методов вместе в зависимости от ваших потребностей!
Каждый пользователь компьютера сталкивался хотя бы раз в своей жизни с такой ситуацией: ты ушёл к себе на работу, почти доехал до неё и вдруг вспомнил,- что забыл взять со своего личного компьютера какую-то очень важную вещь.
Ехать обратно — опоздаешь на работу. А ведь ситуация может развиваться и гораздо более драматично: допустим, человек поехал куда-то далеко за рубеж, в отпуск, и там ему приходит важный звонок, по результатам которого ему необходимо передать своему визави,- определённые документы. А документы остались дома! А дом находится за границей!
Или вот ещё такая беда: ваш персональный компьютер является мощной графической станцией, на которой установлено множество тяжёлых программ для работы с графикой, программными продуктами. А вы перемещаетесь по городу, имея в руках всего лишь «тонкий» клиент, в виде ноутбука…
Из этого описания становится понятно, что «тонкий» клиент не обладает соответствующей производительностью, для запуска множества высокопрофессиональных программ и проектов. Да и если даже он у вас достаточно мощный, — это в принципе неудобно, каждый раз синхронизировать проекты с «тонким» клиентом. Как быть в описанных выше ситуациях — мы и поговорим в этой статье.
На самом деле, указанная проблема очень легко решается: установкой на ваш персональный компьютер системы удалённого включения/выключения и перезагрузки. Этот подход позволит всегда иметь под рукой всю мощь вашей домашней машины и все необходимые документы, и проекты, хранящиеся на ней.
До начала описания своей разработки, хочу сказать, что конечно, она не является единственно возможным способом для удалённого включения выключенного компьютера. Например, хорошо известна технология Wake-on-LAN. Суть этой технологии заключается в том, что она позволяет включить выключенный компьютер, отправкой специального пакета на его MAC-адрес.
Сетевой адаптер компьютера, поддерживающего Wake-on-LAN, находится в этот момент в режиме пониженного потребления и анализирует все пакеты на него. Если одним из поступающих пакетов окажется так называемый magic packet, сетевой адаптер выдаст сигнал на включение питания компьютера.
Согласно wiki: Magic packet — это специальная последовательность байтов, которую для нормального прохождения по локальным сетям можно вставить в пакеты транспортного уровня, не требующие установки соединения (например, протокол UDP или устаревший IPX). Обычно для Wake-on-LAN пакеты протоколов верхнего уровня рассылают широковещательно, так как в случае динамического присвоения адресов неизвестно, какой IP-адрес соответствует какому MAC-адресу. Однако, для корректного прохождения через маршрутизатор, запрещающий широковещательные пакеты, можно послать пакет по какому-то определённому адресу.
Из минусов данной технологии стоит отметить, что она:
- должна поддерживаться аппаратно (например, мой компьютер её не поддерживает, насколько мне известно); некоторые пользователи, наблюдаются проблемы с восстановлением работы, если пропадало напряжение в сети или компьютер вынимали из розетки;
- является небезопасной, хотя бы даже из-за этого.
В любом случае, я подумал, что создание девайса, о котором пойдёт дальше речь, будет интересной затеей, так как:
- это более безопасно, чем Wake-on-LAN;
- можно установить даже на устройства, не поддерживающие Wake-on-LAN;
- прошивка устройства снабжена средствами восстановления связи, после пропадания питания/перезагрузки;
- позволяет принудительно перезагрузить «зависший» компьютер — удалённо;
- в принципе интересно, так как позволяет реализовать новый девайс на esp32, в рамках растущего «интернета вещей».
▍ Итак, приступим.
Некоторое время назад, решение указанной проблемы было достаточно затруднённым: необходимо было обладать достаточно высоким уровнем профессионализма и наличием глубоких знаний в области электроники, чтобы собрать требуемое для решения этой задачи устройство.
С появлением платформы Arduino, данная задача существенно облегчилась, однако, она продолжала оставаться достаточно неудобной в своей реализации, ввиду наличия клубка проводов, соединяющих требуемые компоненты, либо, ввиду необходимости покупки соответствующих wi-fi шилдов.
В текущее же время, этот вопрос ещё более облегчился, из-за появления платы espressif esp32. Для тех, кто не знает, это двухъядерный модуль, содержащий множество необходимых для любого самодельщика свойств. В рамках же данного проекта, нас будет интересовать наличие встроенного wi-fi модуля.
Использование этой платы позволит нам легко и просто построить требуемое устройство, не загромождая всё проводами и за достаточно малую цену. Рискну предположить, что суммарная стоимость компонентов нашего решения не превысит 350-400 руб.
Для того, чтобы создать устройство, нам понадобится всего лишь четыре резистора, два мосфет- транзистора и плата esp32.
- 2 резистора на 10 кОм, мощностью на 1 ватт или меньше;
- 2 резистора на 100 Ом, мощностью на 1 ватт или меньше;
- 2 мосфет-транзистора с логическим уровнем IRLZ44NPBF;
- 1 модуль микроконтроллера esp32
По набору компонентов, искушённый читатель сразу понял, что мы будем делать: с помощью esp32 мы будем управлять ключами на основе мосфет-транзисторов.
При использовании мосфет-транзистора нужно иметь в виду один нюанс: транзистор должен открыться полностью, если этого не произойдёт, то он в работе будет сильно греться и будет фактически, работать в роли резистора.
В данном конкретном случае, это, конечно, не так важно, так как мы будем коммутировать достаточно малые токи кнопки включения/выключения и reset-a.
Кстати, весьма рекомендую к прочтению хорошую статью про подбор мосфетов.
Конечно, можно не напрягаться и взять релейные модули для ардуино:
Но это не наш путь и вот почему: а) щелчки реле; б) наклёп контактов; в) высокое энергопотребление релейным модулем.
Оно нам надо? Нет, оно нам не надо :-)
Так как мы хотим сделать «всё красиво» — мы будем использовать специальные мосфеты с логическим уровнем.
В рамках данного проекта, я выбрал мосфет-транзистор IRLZ44NPBF. У него порог срабатывания от 2 Вольт. То, что надо.
Как собрать ключ на мосфете — можно почитать тут.
По поводу конкретных силовых исполнительных устройств более-менее всё понятно. Однако нам ведь нужно ещё и каким-то образом «рулить» esp32 внешнего интернета!
То есть, задача в общем виде представляется следующей: некий интерфейс из внешнего интернета, зная IP адрес esp32, может отдавать ей команды.
Однако, подключение к устройству, находящемуся в сети за роутером, может стать неудобством, ввиду, как минимум, смены IP адреса у управляемого устройства, после каждой перезагрузки.
Да, вы скажете, что IP на самом деле не меняется, он может поменяться, только если кто-нибудь из домашних тоже подключится к сети, в тот момент, пока esp32 перезагружается, и ей придётся взять другой свободный IP.
Как бы там ни было, но все эти частности не важны, так как данный вопрос можно решить намного проще, чем выяснять какой текущий IP у платы и каким образом его сообщить во внешний интернет: для этого мы будем использовать протокол mqtt. Для тех, кто не сталкивался, вкратце можно сказать, что протокол предназначен для интернета вещей, «умного» дома и не только.
Использование протокола позволяет с лёгкостью обойти проблему прохода за роутер (тут следует сделать оговорку, что мы делаем допущение, что большая часть пользователей интернета, которая выходит в сеть, используя персональные компьютеры, имеют дома wi-fi точку доступа в виде роутера).
❒ В нашем случае, использование протокола будет выглядеть следующим образом:
Значение отправляемых цифр:
0 — «выключить компьютер»;
1 — «включить компьютер»;
2 — «перезагрузить компьютер»;
Как работать с клиентом: при запуске указанного выше mqtt-клиента — мы видим вот это окно. Ничего в нём не меняем, жмём кнопочку «Connect»:
Вводим топик и жмём «Subscribe»:
Топик, на который мы подписались — появился справа, наверху:
То есть, для работы всей системы нужны:
- компьютер с установленной в него сборкой на базе esp32;
- точка доступа wifi (домашний роутер);
- MQTT-брокер;
- публичный MQTT-клиент (который мы запускаем на смартфоне).
И работает оно так (текст оттуда же):
Модифицируем её для нашего случая:
Прошивка проекта написана в Arduino IDE и доступна на моём гитхабе.
Пробежимся по основным моментам.
Вы можете использовать любой другой — это вопрос исключительно предпочтений. Я выбрал этот и он у меня заработал. А так как я обычно иду по пути наименьшего сопротивления (в рамках парадигмы «и так сойдёт!» ), то искать что-то иное не было смысла. Ибо любая минута поиска — воровала у меня время, которое я мог бы с пользой провести, лёжа на диване, с думами о вечном :-))).
Для начала мы в блоке изначальной инициализации переменных указываем порт для подключения к mqtt брокеру, при необходимости — имя пользователя и его пароль(или имя и пароль оставляем пустыми, если брокер публичный — как в нашем случае):
Далее мы указываем два топика, — один из которых для публикации статуса компьютера в данный момент (то есть компьютер включён/выключен, или перезагружается):
Для подключения мосфет-транзисторов, я использовал пины, под номерами 19 и 21. Вы можете использовать, в принципе, любые допустимые пины, хорошее описание которых содержится по следующему адресу.
Из ещё одного интересного момента можно рассмотреть следующие три переменные:
В них мы задаем время в миллисекундах, в течение которого наше устройство будет держать нажатой соответствующую кнопку. Данные переменные вам нужно определить самостоятельно, опытным путём(если мои значения не будут работать)- для вашего конкретного компьютера, так как, вероятно, они могут отличаться в вашем конкретном случае. В прошивке значения переменных указаны для моего случая.
Ещё одним любопытным моментом, который некоторые могут не знать, является то, что встроенный в esp32 светодиод привязан к пину, под номером 2. Я решил, что «инженерия инженерией, но и красотень тоже должна быть». Поэтому наша esp-шка будет мигать встроенным светодиодом:
Теперь, что касается питания нашей сборки на esp32: единственный более-менее комфортный способ это осуществить,- запитать нашу сборку от дежурного питания компьютера. Так как наша сборка потребляет совсем немного, её подключение к дежурному питанию не должно вызвать проблемы с невозможностью включения компьютера из-за просадки напряжения.
А далее, когда компьютер включён — можно подключиться к нему, с помощью предварительно настроенных программ удалённого администрирования, удалённого рабочего стола и т.д. и т.п.
Ну, вот на этом кажется и всё. Ещё раз только остановлюсь на том факте, что вся эта идея со сборкой системы для удалённого управления компьютером была продиктована не только, и не столько потребностью в доступе к файлам (потому что, как альтернативу, можно купить в таком случае NAS), а скорее даже необходимостью иметь возможность доступа к своему пулу рабочих программ, которые установлены только на домашнем компьютере.
Читайте также: