Перезагрузите все компьютеры в домене с помощью PowerShell
В этой статье я показываю, как принудительно перезапустить все компьютеры в домене с помощью команды Restart-Computer.
Подготовка
Список всех имён компьютеров по организационным единицам
Сначала мне нужен список всех компьютеров домена. В упорядоченной среде все компьютеры домена хранятся в отдельном организационном подразделении. Если это так, то список всех компьютеров можно получить там.
(Get-ADComputer -Filter * -SearchBase "OU=Workstations,DC=pagr,DC=inet").Name | Out-File c:\Temp\computers.txt
Имена компьютеров хранятся в файле. Вы также можете использовать переменную.
Список всех имен компьютеров по атрибуту
Как уже упоминалось, аккуратные окружения редки. Компьютеры домена могут быть где-то рядом, там царит путаница (горячая подсказка: контейнерные компьютеры). Затем вы можете искать их, используя атрибут операционной системы, чтобы поймать их всех. Все клиентские компьютеры, но без серверов.
(Get-ADComputer -Filter 'operatingsystem -notlike "*server*"').Name | Out-File C:\Temp\computers.txt
Межсетевой экран: Входящие WMI
Правило входного брандмауэра WMI должно быть включено на всех компьютерах домена. Это можно сделать вручную или с помощью групповый политик.
Перезапуск в действии
Я рекомендую всем читателям остановиться и спросить себя: «Вы действительно хотите перезагрузить все эти компьютеры?» 😉 Тщательно контролируйте список компьютеров. Теперь все компьютеры перезагружены. Открытые файлы не сохранены, и пользователь вышел из системы. Это может быть неприятно, если вы поймаете «неправильный».
Restart-Computer -ComputerName (Get-Content C:\Temp\computers.txt) -Force -ErrorAction SilentlyContinue -ErrorVariable NoRestart
Параметр -Force заставляет перезагрузку даже при вошедших пользователях. Параметр -ErrorAction не отображает никаких ошибок (компьютеры в базе данных могут быть офлайн). Параметр -ErrorVariable хранит ошибки в переменной NoRestart.
Ошибки
После завершения вы можете видеть, что мой компьютер client01 недоступен. Эта информация хранится в переменной NoRestart.
Список компьютеров, которые не перезагрузились, будет сохранен по имени компьютера. Для проверки выполните следующую команду, чтобы получить все компьютеры с пометкой «Не перезагружен» по имени компьютера и сохранить их в файл.
$NoRestart.targetobject | Out-File C:\Temp\NoRestart.txt
Заключение
Этот подход не является заменой для корпоративного решения, такого как SCCM. Но для тех, кто не может использовать корпоративное решение, эта статья может быть полезна для перезагрузки всех компьютеров с помощью однострочной команды в PowerShell.
Чтобыforce gpupdate на всех компьютерах домена, смотрите мою статью: PowerShell: Принудительно выполнить gpupdate на всех компьютерах домена.
Для документирования вашей среды смотрите: PowerShell: Документирование вашей среды с помощью команды systeminfo на всех доменных компьютерах


