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

групповая политикаДобрый день! Уважаемые читатели и гости одного из крупнейших IT блогов рунета Pyatilistnik.org. В прошлый раз мы с вами разобрали, где скачать библиотеку vcruntime140.dll, отсутствие которой у нас вызывало ошибку установки и запуска некоторых игр. В сегодняшней статье я хочу с вами поделиться уже административным опытом и мы разберем, как определить время последнего обновления групповых политик на компьютере, иногда такая задача у вас может появиться.

Постановка задачи

Предположим, что вы сделали новую групповую политику и к какому-то пользовательскому компьютеру она не применилась, перед тем, как искать причину обработки GPO, вам нужно вычислить дату последнего обновления. В статье нам нужно изучить методы и инструменты, которые позволят это сделать.

Методы определения времени применения групповых политик

  • Утилита Gpresult
  • PowerShell
  • Утилита GP Time
  • Rsop
  • Реестр Windows

Изучаем журналы системы

Наверняка всем известным методом будет исследование логов Windows. Для этого в просмотре событий разверните журнал "Система" и найдите там события с кодом:

ID 1503: Параметры групповой политики для этого пользователя обработаны успешно. Были обнаружены и применены новые параметры из 5 объектов групповой политики.

ID 1503

ID 1502: Параметры групповой политики для этого компьютера обработаны успешно. Были обнаружены и применены новые параметры из 30 объектов групповой политики.

ID 1502

Понимая этот принцип получения информации в логах системы, можно сделать запрос к нужному журналу:

# Определяем фильтр для журнала
$logName = 'System'
$source = 'Microsoft-Windows-GroupPolicy'
$eventIds = 1502, 1503

# Получаем события из журнала с заданными фильтрами
$events = Get-WinEvent -LogName $logName | Where-Object {
$_.ProviderName -eq $source -and ($_.Id -in $eventIds)
}

# Выводим ID события и время его появления
$events | Select-Object Id, TimeCreated

Получение ID 1502 и ID 1503

Как выяснить время обновления GPO через командную строку

Самый просто способ, это использование всем известной утилиты командной строки под названием Gpresult. Открываем cmd и вводим команду:

gpresult /R

На моем тестовом сервере с Windows Server 2019 я получил, что политика для компьютера применилась в 11:13:20, а вот политика изменяющая конфигурацию пользователя в 11:55:47, это интересно, что все в разное время.

gpresult /R

При необходимости gpresult может вывести информацию, только по пользователю или компьютеру, для этого есть ключ /scope:

gpresult /scope:user /R

Как выяснить время обновления GPO через командную строку

или более детально отфильтровать через findstr

gpresult /scope:user /R | findstr "Последнее применение групповой политики"

gpresult /scope:user /R | findstr "Последнее применение групповой политики"

Как выяснить время обновления GPO через RSOP

RSoP (Resultant Set of Policy) - это отчет обо всех параметрах групповой политики в Active Directory, который показывает, как эти параметры могут влиять на сеть или как существующие объекты групповой политики (GPO) влияют на различные комбинации пользователей и компьютеров, когда локальная политика безопасности прилетели.

Чтобы запустить RSOP вы можете воспользоваться множеством методов, я бы выделил через командную строку или через окно выполнить. В командной строке просто введите:

rsop

В результате у вас будет произведен сбор сводных данных

Как выяснить время обновления GPO через RSOP

То же самое через окно "Выполнить" в котором нужно вписать rsop.msc.

rsop.msc

В результате вы получите отчет результирующей политики, тут вы увидите так же два раздела. Один для компьютера, второй для пользователя. Щелкните правым кликом по нужному разделу и выберите из контекстного меню пункт "Свойства".

время обновления gpo

В окне свойств перейдите на вкладку "Сведения об ошибке" и найдите пункт "Инфраструктура групповой политики", в области сведений вы увидите время обновления групповой политики.

Инфраструктура групповой политики

Как выяснить время обновления GPO через PowerShell

Естественно у Microsoft есть отдельные командлеты, который позволяет вычислить время применения GPO, называется они Get-GPResultantSetOfPolicy и Get-GPOReport. Чтобы ими воспользоваться на клиентской системе, такой как Windows 10, вам необходимо установить RSAT пакет и импортировать модуль GroupPolicy. в противном случае вы будите получать ошибку:

Install-WindowsFeature : Имя "Install-WindowsFeature" не распознано как имя командлета, функции, файла сценария или выполняемой программы. Проверьте правильность
написания имени, а также наличие и правильность пути, после чего повторите попытку.
строка:1 знак:1
+ Install-WindowsFeature –Name GPMC
+ ~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (Install-WindowsFeature:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

Get-GPOReport : Имя "Get-GPOReport" не распознано как имя командлета, функции, файла сценария или выполняемой программы. Проверьте правильность написания имени,
а также наличие и правильность пути, после чего повторите попытку.
строка:1 знак:1
+ Get-GPOReport
+ ~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (Get-GPOReport:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

Install-WindowsFeature" не распознано как имя командлета

Чтобы иметь возможность использовать эти командлеты, установите пакет RSAT, в операционных системах Windows Server, это не нужно. Далее установите модуль GroupPolicy, через команду:

Install-WindowsFeature –Name GPMC

После его установки введите команду для просмотра доступных модулей:

Get-Command -Module GroupPolicy

В итоге я вижу:

  • Get-GPPermissions
  • Set-GPPermissions
  • Backup-GPO
  • Copy-GPO
  • Get-GPInheritance
  • Get-GPO
  • Get-GPOReport
  • Get-GPPermission
  • Get-GPPrefRegistryValue
  • Get-GPRegistryValue
  • Get-GPResultantSetOfPolicy
  • Get-GPStarterGPO
  • Import-GPO
  • Invoke-GPUpdate
  • New-GPLink
  • New-GPO
  • New-GPStarterGPO
  • Remove-GPLink
  • Remove-GPO
  • Remove-GPPrefRegistryValue
  • Remove-GPRegistryValue
  • Rename-GPO
  • Restore-GPO
  • Set-GPInheritance
  • Set-GPLink
  • Set-GPPermission
  • Set-GPPrefRegistryValue
  • Set-GPRegistryValue

Get-Command -Module GroupPolicy

Чтобы вычислить время последнего обновления групповых политик через командлет Get-GPResultantSetOfPolicy, выполните команду:

Get-GPResultantSetOfPolicy -ReportType HTML -Path "c:\report.html"

Где -ReportType, это вид конечного файла, может быть и xml, -Path, это путь до конечного файла, подробнее можно почитать на https://docs.microsoft.com/en-us/powershell/module/grouppolicy/get-gpresultantsetofpolicy?view=win10-ps.

Get-GPResultantSetOfPolicy -ReportType HTML

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

Как выяснить время обновления GPO через PowerShell

Так же Get-GPResultantSetOfPolicy может получать данные и с удаленного компьютера, для этого нужно добавить ключ -Computer, в итоге команда примет вот такой вид:

Get-GPResultantSetOfPolicy -Computer dc01 -ReportType HTML -Path "c:\report.html"

Get-GPResultantSetOfPolicy для удаленного компьютера

Как видим отчет получен и данные в нем есть, единственное в моем тесте показалось время обновления только для компьютера, но вам никто не мешает явно задать ключ -user перед -Computer.

время обновления gpo

Как выяснить время обновления GPO через реестр Windows

Логично предположить, что gpresult, rsopm powershell получают все значения из реестра Windows и я вам покажу, где располагаются данные ветки. Для начала давайте посмотрим для компьютера. Для этого откройте реестр Windows и перейдите в раздел:

HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\Windows\CurrentVersion\ Group Policy\State\Machine\Extension-List\ {00000000-0000-0000-0000-000000000000}

тут вы обнаружите 6 ключей:

  • EndTimeHi
  • EndTimeLo
  • LoggingStatus
  • StartTimeHi
  • StartTimeLo
  • Status

Как выяснить время обновления GPO через реестр Windows

Как вы можете обратить, эти данные для вас не особо читаемы, так как имеют шестнадцатиричное значение, но вы можете воспользоваться моим скриптом, который легко, это поправить.

Вы можете воспользоваться готовым скриптом по определению времени обработки политик, слева ссылка на его скачивание, а ниже его тест:

$RegPath='HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine\Extension-List\{00000000-0000-0000-0000-000000000000}'
$LowTime=Get-ItemProperty -path $RegPath -name "EndTimeLo"
$HighTime=Get-ItemProperty -path $RegPath -name "EndTimeHi"
$CompTime=([long]$HighTime.EndTimeHi -shl 32) + [long] $LowTime.EndTimeLo
[DateTime]::FromFileTime($CompTime)

На выходе я вижу 19 ноября 2019 г. 17:25:51.

Как выяснить время обновления GPO через реестр Windows

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

Тут от вас нужны права на выполнение запроса на удаленном сервере и сам список серверов, где каждое имя идет с новой строки и без пробелов. Пример скрипта:

# Чтение списка серверов из файла
$servers = Get-Content -Path "C:\Temp\RDS\servers.txt"

# Проход по каждому серверу
foreach ($server in $servers) {
try {
# Использование Invoke-Command для выполнения кода на удаленном сервере
$result = Invoke-Command -ComputerName $server -ScriptBlock {
# Определение пути к реестру
$RegPath = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine\Extension-List\{00000000-0000-0000-0000-000000000000}"

# Получение значений из реестра
$LowTime = Get-ItemProperty -Path $RegPath -Name "EndTimeLo"
$HighTime = Get-ItemProperty -Path $RegPath -Name "EndTimeHi"

# Вычисление времени
$CompTime = ([long]$HighTime.EndTimeHi -shl 32) + [long]$LowTime.EndTimeLo
return [DateTime]::FromFileTime($CompTime)
}

# Вывод имени сервера и полученной даты
Write-Output "$server $result"
} catch {
# Обработка ошибок
Write-Output "Ошибка при доступе к серверу $server $_"
}
}

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

Массовая проверка обновление GPO

Узнаем время обновления GPO через gptime

gptime.exe - это удобная небольшая утилита предназначена для быстрого и краткого отчета о том, когда в последний раз компьютер и пользовательская групповая политика запускались в локальной или удаленной системе. Если в систему вошли более одного пользователя, инструмент сообщит о времени обработки GP для всех найденных пользователей.

Этот инструмент предоставляет время запуска и остановки для последнего цикла обработки, а также общее истекшее время, что может быть полезно. Вам необходим Для работы требуется .Net Framework 2.0, установленный на компьютере, на котором вы запускаете эту утилиту.

Скачать gptime.exe вы можете у меня

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

Узнаем время обновления GPO через gptime

Удаленное определение времени применения GPO

Я вам уже неоднократно рассказывал про утилиты Марка Руссиновича PSTools, а конкретнее PsExec. Утилита при наличии административных прав на целевом компьютере может запускать командную строку или оболочку PowerShell из которой уже легко делать, то что нужно. Открываем командную строку, переходим в папку с утилитой PsExec. Подключаться я буду с контроллера домена dc01 к удаленному серверу SVT2019S01. Для начала через команды hostname и whoami я виду исходные данные и, что cmd запущенна именно на исходном сервере.

Удаленное определение времени применения GPO

Далее пишите:

PsExec64.exe \\svt2019s01.root.pyatilistnik.org -u root\Администратор

\\svt2019s01.root.pyatilistnik.org это имя моего сервера

время обновления gpo через PsExec64.exe

Вас попросит ввести пароль, если кстати не указывать ключ -u, то вам не нужно будет вводить логин и пароль, а будут использоваться текущие данные из под кого запущена командная строка. В итоге я успешно подключился и вижу, что hostname уже SVT2019S01. Далее все просто вы используете утилиту gpresult /R.

время обновления gpo через PsExec

Еще получить данные с удаленного компьютера, вы можете через командлет PowerShell Enter-PSSession. Для этого введите команду:

Enter-PSSession -ComputerName svt2019s01

далее подключившись к серверу вы все так же выполняете gpresult /R.

время обновления gpo через Enter-PSSession

На этом мои методы закончились, я допускаю, что существует еще огромное количество утилит, но мне достаточно и этих. С вами был Иван Семин, автор и создатель IT портала Pyatilistnik.org.

Оцените статью
Настройка серверов windows и linux
Добавить комментарий