PowerShell · 17.07.2026

Скажите, когда можно

Пятница, вечер. Приветствую всех, кто добрался сюда этим вечером!

В сложной доменной структуре с делегированием и прочими плюшками рано или поздно (чаще, конечно, рано) встречаешься с ограничением доступа к функциям разблокировки пользователя. Это вполне нормальная, даже ожидаемая ситуация. Вот только помочь незадачливому хозяину заблокированной учётной записи мы никак [увы] не сможем.

Кадр из фильма Иван Васильевич меняет профессию

Говорят, админ — ненастоящий!

Неизвестный боярин

Ну, и раз уж так сложилась ситуация, попробуем метод подорожника: не можем разлочить аккаунт, озвучим хотя бы время снятия блокировки. В подобных ситуациях всегда можно попинать командлет 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) будет вываливаться сообщение о блокировке учётной записи. Здесь цикл нужен исключительно для наглядности.

Гифка взята отсюда.