# Список привилегированных групп, которые обычно анализирует 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