Вопрос или проблема
Я недавно обнаружил функцию “adminSDHolder” в Active Directory. Мне нужен простой способ идентифицировать всех пользователей, на которых она повлияет, а именно скрипт для выгрузки учётных записей пользователей.
Вы можете использовать этот скрипт PowerShell для возврата пользователей, у которых adminCount больше 0, что означает, что они затронуты функцией adminSDHolder. Вам необходимо, чтобы модуль AD для PowerShell был установлен, который поставляется с RSAT.
import-module activedirectory
get-aduser -Filter {admincount -gt 0} -Properties adminCount -ResultSetSize $null
([adsisearcher]"(AdminCount=1)").findall()
Это вариант отличного решения от MDMarra.
Import-Module ActiveDirectory
Get-ADUser -LDAPFilter "(admincount>0)" -Properties adminCount
Этот вариант использует -LDAPFilter вместо -Filter. Некоторые предпочитают использовать синтаксис LDAP фильтра, так как он переносим между многими различными типами приложений.
Обратите внимание, что Filter и LDAPFilter имеют схожие характеристики производительности, так как фильтр выполняется на стороне сервера. При запросе больших каталогов всегда старайтесь фильтровать напрямую, как в этом примере, а не использовать Where-Object
, который заставит загрузить все объекты перед фильтрацией. Это описано подробно в статье на TechNet Filter vs. Where-Object.
Дело не только в значении AdminCount > 0, но и в том, защищена ли учётная запись. Этот скрипт получает оба типа информации:
$AdminUsers=Get-ADUser -Filter "*" -Properties "admincount"
$Results=@()
for ($i=0; $i -lt $AdminUsers.Count; $i++) {
$OU=[System.DirectoryServices.DirectoryEntry]::new("LDAP://"+$AdminUsers[$i].DistinguishedName)
$SEC=$OU.PSBase.ObjectSecurity
if ($SEC.AreAccessRulesProtected -or ($AdminUsers[$i].AdminCount -ne $null)) {
$Results+=[PSCustomObject]@{Name=$AdminUsers[$i].Name;SAM=$AdminUsers[$i].SAMAccountName;AdminCount=$AdminUsers[$i].AdminCount;Protected=$SEC.AreAccessRulesProtected}
}
}
$Results | Sort-Object -Property Protected,Name; $Result=@($Results)
## Имя скрипта = Set-IheritablePermissionOnAllUsers.ps1
##
## устанавливает флажок "Разрешить наследуемые разрешения от родителя
## для распространения на этот объект"
# Содержит DN пользователей
#
#$users = Get-Content C:\C:\Navdeep_DoNotDelete\variables\users.txt
Get-ADgroup -LDAPFilter “(admincount=1)” | select name
$users = Get-ADuser -LDAPFilter “(admincount=1)”
##Get-QADUser -SizeLimit 0 | Select-Object Name,@{n=’IncludeInheritablePermissions’;e={!$_.DirectoryEntry.PSBase.ObjectSecurity.AreAccessRulesProtected}} | Where {!$_.IncludeInheritablePermissions}
ForEach($user in $users)
{
# Привязка пользователей к DS
$ou = [ADSI]("LDAP://" + $user)
$sec = $ou.psbase.objectSecurity
if ($sec.get_AreAccessRulesProtected())
{
$isProtected = $false ## разрешает наследование
$preserveInheritance = $true ## сохраняет наследуемые правила
$sec.SetAccessRuleProtection($isProtected, $preserveInheritance)
$ou.psbase.commitchanges()
Write-Host "$user теперь наследует разрешения";
}
else
{
Write-Host "$User наследуемое разрешение уже установлено"
}
}
Ответ или решение
Работа с функцией adminSDHolder в Active Directory (AD) может быть ключевым аспектом для понимания защищенных объектов в AD и управления их безопасностью. Пользователи с adminCount > 0 указывают на учетные записи, которые подпадают под защиту и наследуют особые списки управления доступом (ACL) от объекта adminSDHolder. Это важная деталь для администраторов, которые должны быть уверены в безопасности своей сетевой инфраструктуры.
Теория
adminSDHolder — это специальный объект в AD, который используется для защиты административных учетных записей от случайного изменения делегированием управления. Каждый час планировщик задач обновляет владельцев и права доступа на административные учетные записи, делая их аналогичными объекту adminSDHolder. Когда учетная запись подлежит защите, объект данной учетной записи получает атрибут adminCount со значением больше нуля, что может влиять на возможность наследования прав другими объектами безопасности в иерархии AD.
Пример
Для поиска пользователей, которые подпадают под эту защиту, можно использовать PowerShell с модулем Active Directory, который входит в состав Remote Server Administration Tools (RSAT). Правильное использование средств PowerShell позволяет эффективно управлять учетными записями. Оператор -LDAPFilter
можно использовать для поиска с контролем со стороны сервера, что делает фильтрацию более быстрой и производительной в больших директориях.
Пример простейшего скрипта для получения всех учетных записей с adminCount > 0:
Import-Module ActiveDirectory
Get-ADUser -LDAPFilter "(admincount>0)" -Properties adminCount | Select-Object Name, SAMAccountName, adminCount
Этот скрипт позволяет быстро идентифицировать пользователей, чьи учетные записи защищены администратором.
Применение
Когда идентификация защищенных учетных записей завершается, администратор может предпринять действия для оптимизации безопасности и управления данными учетными записями. Полезно понимать, что adminCount > 0 определяется не только прямым изменением, но и другими факторами, такими как административный доступ и правила безопасности, применяемые к учетной записи.
Расширенный скрипт может предоставлять больше информации о том, защищена ли учетная запись от наследования правил безопасности. Это можно сделать, проверив, является ли правило защиты доступа унаследованным:
$AdminUsers = Get-ADUser -Filter "*" -Properties "admincount"
$Results = @()
foreach ($User in $AdminUsers) {
$OU = [System.DirectoryServices.DirectoryEntry]::new("LDAP://" + $User.DistinguishedName)
$SEC = $OU.PSBase.ObjectSecurity
if ($SEC.AreAccessRulesProtected -or $User.AdminCount -ne $null) {
$Results += [PSCustomObject]@{
Name = $User.Name
SAM = $User.SamAccountName
AdminCount = $User.AdminCount
Protected = $SEC.AreAccessRulesProtected
}
}
}
$Results | Sort-Object -Property Protected, Name
Этот сценарий позволяет более глубоко анализировать защищенные учетные записи, включая и тех, у кого унаследованные права защищены.
В случае, если наследование прав необходимо восстановить, можно воспользоваться следующим фрагментом для изменения свойств безопасности:
foreach ($User in $AdminUsers) {
$ou = [ADSI]("LDAP://" + $User.DistinguishedName)
$sec = $ou.psbase.objectSecurity
if ($sec.AreAccessRulesProtected) {
$sec.SetAccessRuleProtection($false, $true)
$ou.psbase.CommitChanges()
Write-Host "$($User.Name) is now inheriting permissions"
} else {
Write-Host "$($User.Name) already inherits permissions"
}
}
Этот скрипт помогает администратору гарантировать, что объекты в AD могут наследовать права доступа из родительской иерархии, при этом защищая их от ненадежного изменения.
Заключение
Использование скриптов PowerShell для управления административными учетными записями в AD является важным инструментом для обеспечения безопасности и надежности в управлении сетевой инфраструктурой. Знание и понимание таких механизмов как adminSDHolder и adminCount— ключевые аспекты для эффективного и безопасного управления Active Directory.