PowerShell · 21.11.2022

Ребутнул компьютер в ночь…

Обновил скрипт и пост до актуального состояния

Иногда случается такая история: вот вроде бы выстрадал объект групповой политики (например, вот так), применил к подразделению, обновил. Сделал всё, как надо. Но нет же — обязательно найдётся пара тройка машин, которые продолжают множить время своего аптайма, а пользователи по-прежнему будут сталкиваться со какими-либо сложностями.

Внимание! Скрипт, представленный ниже перезагрузит целую кучу компьютеров в домене! Будьте предельно внимательны и перед запуском скрипта убедитесь в правильности своих действий! Автор сайта снимает с себя всякую ответственность за всякое такое и т.д. и т.п.

Крайне не рекомендую задействовать для подобного метода обновления политик «глухую» автоматизацию. Лучше следить за процессом в реальном времени.

## Заголовок консоли ##
[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.