Загрузка данных


# Список привилегированных групп, которые обычно анализирует PingCastle (можно расширить)
$privilegedGroups = @(
    "Domain Admins",
    "Enterprise Admins",
    "Schema Admins",
    "Administrators",
    "Account Operators",
    "Server Operators",
    "Backup Operators",
    "Print Operators",
    "DnsAdmins",
    "Group Policy Creator Owners",
    "Enterprise Key Admins",
    "Key Admins"
)

# Получаем DN группы Protected Users
$protectedUsersGroup = Get-ADGroup -Identity "Protected Users" -Properties Member
$protectedUsersDNs = $protectedUsersGroup.Member

# Функция для рекурсивного получения всех членов группы
function Get-NestedGroupMembers {
    param(
        [Parameter(Mandatory=$true)]
        [string]$GroupIdentity
    )
    $members = Get-ADGroupMember -Identity $GroupIdentity -Recursive -ErrorAction SilentlyContinue |
               Where-Object { $_.objectClass -eq "user" -or $_.objectClass -eq "msDS-GroupManagedServiceAccount" } |
               Select-Object -ExpandProperty DistinguishedName
    return $members
}

# Собираем DN всех учетных записей, которые PingCastle может считать администраторами
$allAdminDNs = New-Object System.Collections.Generic.HashSet[string]

# 1. Добавляем членов привилегированных групп (рекурсивно)
foreach ($group in $privilegedGroups) {
    $groupMembers = Get-NestedGroupMembers -GroupIdentity $group
    foreach ($member in $groupMembers) {
        [void]$allAdminDNs.Add($member)
    }
}

# 2. Добавляем пользователей с adminCount=1 (на случай, если они не в группах, но PingCastle их считает)
$adminCountUsers = Get-ADUser -LDAPFilter "(adminCount=1)" -Properties DistinguishedName |
                   Select-Object -ExpandProperty DistinguishedName
foreach ($userDN in $adminCountUsers) {
    [void]$allAdminDNs.Add($userDN)
}

# 3. Исключаем тех, кто уже входит в Protected Users
$adminsNotInProtected = $allAdminDNs | Where-Object { $protectedUsersDNs -notcontains $_ }

# Выводим результат
Write-Host "Всего учетных записей, считающихся привилегированными (по логике PingCastle): $($allAdminDNs.Count)" -ForegroundColor Cyan
Write-Host "Из них НЕ входят в Protected Users: $($adminsNotInProtected.Count)" -ForegroundColor Yellow
Write-Host "`nСписок учетных записей, которых не хватает в Protected Users:" -ForegroundColor Green

$adminsNotInProtected | ForEach-Object {
    $user = Get-ADObject -Identity $_ -Properties sAMAccountName, objectClass
    [PSCustomObject]@{
        Name = $user.sAMAccountName
        Type = $user.objectClass
        DN   = $user.DistinguishedName
    }
} | Format-Table -AutoSize