Пятница, вечер. Приветствую всех, кто добрался сюда этим вечером!
В сложной доменной структуре с делегированием и прочими плюшками рано или поздно (чаще, конечно, рано) встречаешься с ограничением доступа к функциям разблокировки пользователя. Это вполне нормальная, даже ожидаемая ситуация. Вот только помочь незадачливому хозяину заблокированной учётной записи мы никак [увы] не сможем.
Говорят, админ — ненастоящий!
Неизвестный боярин
Ну, и раз уж так сложилась ситуация, попробуем метод подорожника: не можем разлочить аккаунт, озвучим хотя бы время снятия блокировки. В подобных ситуациях всегда можно попинать командлет Get-ADDefaultDomainPasswordPolicy (тык) и добиться от него LockoutDuration.
Для автоматизации процесса запихнём всё это в ps1-скрипт и прикрутим модуль ActiveDirectoryObjectPicker.
Полный текст скрипта:
# Заголовок консоли #
[System.Console]::Title = "Проверка блокировки пользователя"
# Поиск модуля ActiveDirectoryObjectPicker #
if (Get-InstalledModule ActiveDirectoryObjectPicker -ErrorAction SilentlyContinue)
{
Write-Host "Импорт модуля ActiveDirectoryObjectPicker..." -ForegroundColor Yellow
Import-Module -Name ActiveDirectoryObjectPicker
}
else
{
Write-Host "Установка модуля ActiveDirectoryObjectPicker..." -ForegroundColor Yellow
Install-Module -Name ActiveDirectoryObjectPicker -Scope CurrentUser
Import-Module -Name ActiveDirectoryObjectPicker
}
# Получение данных пользователя #
Write-Host "Ожидание данных пользователя..."
$upn = Show-ActiveDirectoryObjectPicker -AllowedLocations EnterpriseDomain -DefaultObjectTypes Users -DefaultLocations EnterpriseDomain
# Проверка, был ли выбран пользователь #
if (-not $upn)
{
Write-Host "Окно выбора пользователя было закрыто. Завершение скрипта." -ForegroundColor Red
exit
}
$username = ($upn.Upn -Split '@')[0]
# Чистим консоль #
Clear-Host
# Цикл while со Start-Sleep #
while ($true)
{
# Получаем данные о пользователе #
$user = Get-ADUser -Identity $username -Properties LockedOut, LockoutTime | Select-Object Name, LockedOut, LockoutTime
# Получаем текущую дату/время #
$currentTime = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
# Если пользователь заблокирован #
if ($user.LockedOut -eq $true) {
# Получаем дату и время блокировки учетной записи пользователя
$lockoutDateTime = [System.DateTime]::FromFileTime($user.LockoutTime)
# Извлекаем продолжительность политики разблокировки из настроек доменной политики паролей
$unlockPolicyDuration = (Get-ADDefaultDomainPasswordPolicy).LockoutDuration.TotalMinutes
# Рассчитываем время разблокировки
$unlockTime = $lockoutDateTime.AddMinutes($unlockPolicyDuration)
Write-Host -ForegroundColor Red "$currentTime - $($user.Name) - Заблокирован. Предполагаемое время разблокировки: $($unlockTime.ToString("yyyy-MM-dd HH:mm:ss"))"
}
else
{ Write-Host -ForegroundColor Green "$currentTime - $($user.Name) - Разблокирован" }
# Ждем 10 секунд до повторения цикла #
Start-Sleep -Seconds 10
}
В идеальных условиях в консоль на условии while($true) будет вываливаться сообщение о блокировке учётной записи. Здесь цикл нужен исключительно для наглядности.
Гифка взята отсюда.
