Обновил скрипт и пост до актуального состояния
Иногда случается такая история: вот вроде бы выстрадал объект групповой политики (например, вот так), применил к подразделению, обновил. Сделал всё, как надо. Но нет же — обязательно найдётся пара тройка машин, которые продолжают множить время своего аптайма, а пользователи по-прежнему будут сталкиваться со какими-либо сложностями.
Внимание! Скрипт, представленный ниже перезагрузит целую кучу компьютеров в домене! Будьте предельно внимательны и перед запуском скрипта убедитесь в правильности своих действий! Автор сайта снимает с себя всякую ответственность за всякое такое и т.д. и т.п.
Крайне не рекомендую задействовать для подобного метода обновления политик «глухую» автоматизацию. Лучше следить за процессом в реальном времени.
## Заголовок консоли ##
[System.Console]::Title = "Обновление GPO и перезапуск хостов в домене"
## Импорт модуля ActiveDirectory ##
Import-Module ActiveDirectory
## Получение перечня хостов из подразделения в домене ##
# Name -notlike "*ASU*" - исключает из запроса ПК с именами, в которых встречается конструкция ASU #
# Name -like "*TESTGP*" - включает в запрос ПК с именами, в которых встречается конструкция TESTGP #
$hosts = Get-ADComputer -Filter {Name -notlike "*ASU*" -and Name -like "*TESTGP*"} -SearchBase "OU=Компьютеры,OU=Организация,DC=org,DC=domain,DC=ru" | select -ExpandProperty Name
## Цикл перезапуска хостов ##
foreach ($hostname in $hosts)
{
# Блок переменных #
$offline = "$hostname - недоступен"
$err = "$hostname - ошибка перезапуска"
# Сохранить отчёт об ошибках на рабочем столе текущего пользователя #
$path = [Environment]::GetFolderPath("Desktop") + "\errorlist.txt"
if (Test-Connection -ComputerName $hostname -Quiet -Count 1)
{
try {
Write-Host "$hostname - запущено обновление..." -ForegroundColor Green
Set-Service -ComputerName $hostname -Name WinRM -Status Running -PassThru | Out-Null
Invoke-Command -ComputerName $hostname -ScriptBlock { gpupdate /force /boot } | Out-Null
# Опционально: форсировать перезагрузку ПК #
# Restart-Computer -ComputerName $hostname -Force -ErrorAction Ignore
}
catch {
$err >> $path
Write-Host "$err" -ForegroundColor Red
}
}
else
{
# Вывод недоступных компьютеров в текстовый файл
$offline >> $path
Write-Host "$hostname - недоступен!" -ForegroundColor Red
}
}
Read-Host "Работа скрипта завершена..."
Кстати, советую повнимательнее отнестись к формированию запроса Get-ADComputer.