Когда обновлялась групповая политика
- Постановка задачи
- Изучаем журналы системы
- Как выяснить время обновления GPO через командную строку
- Как выяснить время обновления GPO через RSOP
- Как выяснить время обновления GPO через PowerShell
- Как выяснить время обновления GPO через реестр Windows
- Как узнать на списке серверов время обновления групповой политики
- Узнаем время обновления GPO через gptime
- Удаленное определение времени применения GPO
Добрый день! Уважаемые читатели и гости одного из крупнейших IT блогов рунета Pyatilistnik.org. В прошлый раз мы с вами разобрали, где скачать библиотеку vcruntime140.dll, отсутствие которой у нас вызывало ошибку установки и запуска некоторых игр. В сегодняшней статье я хочу с вами поделиться уже административным опытом и мы разберем, как определить время последнего обновления групповых политик на компьютере, иногда такая задача у вас может появиться.
Постановка задачи
Предположим, что вы сделали новую групповую политику и к какому-то пользовательскому компьютеру она не применилась, перед тем, как искать причину обработки GPO, вам нужно вычислить дату последнего обновления. В статье нам нужно изучить методы и инструменты, которые позволят это сделать.
Методы определения времени применения групповых политик
- Утилита Gpresult
- PowerShell
- Утилита GP Time
- Rsop
- Реестр Windows
Изучаем журналы системы
Наверняка всем известным методом будет исследование логов Windows. Для этого в просмотре событий разверните журнал "Система" и найдите там события с кодом:
ID 1503: Параметры групповой политики для этого пользователя обработаны успешно. Были обнаружены и применены новые параметры из 5 объектов групповой политики.
ID 1502: Параметры групповой политики для этого компьютера обработаны успешно. Были обнаружены и применены новые параметры из 30 объектов групповой политики.
Понимая этот принцип получения информации в логах системы, можно сделать запрос к нужному журналу:
# Определяем фильтр для журнала
$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
Как выяснить время обновления GPO через командную строку
Самый просто способ, это использование всем известной утилиты командной строки под названием Gpresult. Открываем cmd и вводим команду:
gpresult /R
На моем тестовом сервере с Windows Server 2019 я получил, что политика для компьютера применилась в 11:13:20, а вот политика изменяющая конфигурацию пользователя в 11:55:47, это интересно, что все в разное время.
При необходимости gpresult может вывести информацию, только по пользователю или компьютеру, для этого есть ключ /scope:
gpresult /scope:user /R
или более детально отфильтровать через findstr
gpresult /scope:user /R | findstr "Последнее применение групповой политики"
Как выяснить время обновления GPO через RSOP
RSoP (Resultant Set of Policy) - это отчет обо всех параметрах групповой политики в Active Directory, который показывает, как эти параметры могут влиять на сеть или как существующие объекты групповой политики (GPO) влияют на различные комбинации пользователей и компьютеров, когда локальная политика безопасности прилетели.
Чтобы запустить RSOP вы можете воспользоваться множеством методов, я бы выделил через командную строку или через окно выполнить. В командной строке просто введите:
rsop
В результате у вас будет произведен сбор сводных данных
То же самое через окно "Выполнить" в котором нужно вписать rsop.msc.
В результате вы получите отчет результирующей политики, тут вы увидите так же два раздела. Один для компьютера, второй для пользователя. Щелкните правым кликом по нужному разделу и выберите из контекстного меню пункт "Свойства".
В окне свойств перейдите на вкладку "Сведения об ошибке" и найдите пункт "Инфраструктура групповой политики", в области сведений вы увидите время обновления групповой политики.
Как выяснить время обновления 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 : CommandNotFoundExceptionGet-GPOReport : Имя "Get-GPOReport" не распознано как имя командлета, функции, файла сценария или выполняемой программы. Проверьте правильность написания имени,
а также наличие и правильность пути, после чего повторите попытку.
строка:1 знак:1
+ Get-GPOReport
+ ~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (Get-GPOReport:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Чтобы иметь возможность использовать эти командлеты, установите пакет 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-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.
В результате вы получите отчет в виде html файла, который легко открывается через браузер. В самом верху отчета вы увидите сводку по времени последнего обновления политики для пользователя и компьютера.
Так же Get-GPResultantSetOfPolicy может получать данные и с удаленного компьютера, для этого нужно добавить ключ -Computer, в итоге команда примет вот такой вид:
Get-GPResultantSetOfPolicy -Computer dc01 -ReportType HTML -Path "c:\report.html"
Как видим отчет получен и данные в нем есть, единственное в моем тесте показалось время обновления только для компьютера, но вам никто не мешает явно задать ключ -user перед -Computer.
Как выяснить время обновления 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
Как вы можете обратить, эти данные для вас не особо читаемы, так как имеют шестнадцатиричное значение, но вы можете воспользоваться моим скриптом, который легко, это поправить.
Вы можете воспользоваться готовым скриптом по определению времени обработки политик, слева ссылка на его скачивание, а ниже его тест:
$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.
Как узнать на списке серверов время обновления групповой политики
Тут от вас нужны права на выполнение запроса на удаленном сервере и сам список серверов, где каждое имя идет с новой строки и без пробелов. Пример скрипта:
# Чтение списка серверов из файла
$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 через gptime
gptime.exe - это удобная небольшая утилита предназначена для быстрого и краткого отчета о том, когда в последний раз компьютер и пользовательская групповая политика запускались в локальной или удаленной системе. Если в систему вошли более одного пользователя, инструмент сообщит о времени обработки GP для всех найденных пользователей.
Этот инструмент предоставляет время запуска и остановки для последнего цикла обработки, а также общее истекшее время, что может быть полезно. Вам необходим Для работы требуется .Net Framework 2.0, установленный на компьютере, на котором вы запускаете эту утилиту.
Скачать gptime.exe вы можете у меня
В командной строке перейдите в каталог с gptime.exe и запустите ее. В моем примере видно, когда были обновлены политики для компьютера, а так же для всех пользователей, чьи профили были обнаружены на компьютере.
Удаленное определение времени применения GPO
Я вам уже неоднократно рассказывал про утилиты Марка Руссиновича PSTools, а конкретнее PsExec. Утилита при наличии административных прав на целевом компьютере может запускать командную строку или оболочку PowerShell из которой уже легко делать, то что нужно. Открываем командную строку, переходим в папку с утилитой PsExec. Подключаться я буду с контроллера домена dc01 к удаленному серверу SVT2019S01. Для начала через команды hostname и whoami я виду исходные данные и, что cmd запущенна именно на исходном сервере.
Далее пишите:
PsExec64.exe \\svt2019s01.root.pyatilistnik.org -u root\Администратор
\\svt2019s01.root.pyatilistnik.org это имя моего сервера
Вас попросит ввести пароль, если кстати не указывать ключ -u, то вам не нужно будет вводить логин и пароль, а будут использоваться текущие данные из под кого запущена командная строка. В итоге я успешно подключился и вижу, что hostname уже SVT2019S01. Далее все просто вы используете утилиту gpresult /R.
Еще получить данные с удаленного компьютера, вы можете через командлет PowerShell Enter-PSSession. Для этого введите команду:
Enter-PSSession -ComputerName svt2019s01
далее подключившись к серверу вы все так же выполняете gpresult /R.
На этом мои методы закончились, я допускаю, что существует еще огромное количество утилит, но мне достаточно и этих. С вами был Иван Семин, автор и создатель IT портала Pyatilistnik.org.