Некоторые группы в моем объявлении не находятся данным скриптом.

Вопрос или проблема

Импорт-Модуль ActiveDirectory

$groups = Get-ADGroup -Filter {(Name -like “F_*” -or Name -like “G_*” -or Name -like “CAX_*”)} -Properties Name, GroupCategory | Sort-Object -Property Name

$emptyGroups = @()

foreach ($group in $groups) {
# Проверяет, является ли группа типом “Безопасность”
if ($group.GroupCategory -eq ‘Security’) {
try {
$user = Get-ADGroupMember -Identity $group.Name -ErrorAction Stop

if ($user.Count -eq 0) {
$emptyGroups += $group.Name
}
}
catch {
Write-Host “Предупреждение: Группа ‘$($group.Name)’ не найдена или недоступна.”
}
}
else {
Write-Host “Информация: Группа ‘$($group.Name)’ не является группой безопасности и будет пропущена.”
}
}

Write-Host “Пустые группы:”
$emptyGroups | ForEach-Object { Write-Host $_ }

У меня есть этот код, который ищет группы в моем AD. Похоже, он работает хорошо, но некоторые группы не находятся, и я не знаю причины, потому что они явно существуют в моем AD. Можете помочь мне?

У меня есть эти ошибки:

Предупреждение: Группа 'CAX_BOCAL_265_ORVR_G_L' не найдена или недоступна.
Предупреждение: Группа 'CAX_GM_GEM_JCCC1_G_E' не найдена или недоступна.
Предупреждение: Группа 'CAX_GM_GEM_JCCC1_G_L' не найдена или недоступна.

Ошибка:

Невозможно найти объект с идентификатором: 'CAX_BOCAL_265_ORVR_G_L' в: 'DC=myLDAP,DC=com'.

Скорее всего, проблема в том, что Get-ADGroupMember не может найти тех групп, у которых есть участник, который был удалён, однако нет необходимости использовать его вообще. Вы можете получить их, используя фильтр AD напрямую:

$getADGroupSplat = @{
    LDAPFilter="(&(|(name=F_*)(name=G_*)(name=CAX_*))(groupType:1.2.840.113556.1.4.803:=2147483648)(!member=*))"
    Properties="Member"
}
# Получить все группы безопасности, имеющие имя, начинающееся с F_ или G_ или CAX_, которые не имеют членов
$emptyGroups = Get-ADGroup @getADGroupSplat

Ответ или решение

Конечно! Давайте внимательно посмотрим на проблемы, с которыми вы столкнулись при использовании вашего скрипта для получения информации о группах в Active Directory (AD). Судя по приведенному коду и возникшим ошибкам, основная проблема заключается в том, что некоторые группы не обнаруживаются, даже если они существуют в вашей AD. Рассмотрим возможные причины и лучшие практики для решения данной ситуации.

Анализ текущего кода

Ваш скрипт активно использует командлет Get-ADGroup, чтобы получить группы по определенному фильтру, а затем применяет Get-ADGroupMember, чтобы установить, какие из этих групп пусты (не имеют участников). Однако, возникает несколько проблем:

  1. Проблемы с доступом: Ошибка Warning: Group 'CAX_BOCAL_265_ORVR_G_L' could not be found or accessed может сигнализировать о том, что у пользователя, под которым выполняется скрипт, недостаточно прав для доступа к некоторым группам или что эти группы были удалены, но кэш AD еще на них ссылается.

  2. Группы без участников: Если группа не содержит участников, вызов Get-ADGroupMember вернет ошибку, так как в случае отсутствия участников может возникнуть исключение.

Решение проблемы

Чтобы избежать повторяющихся ошибок и сделать ваш код более эффективным, можно обойтись без вызова Get-ADGroupMember для проверки на пустоту групп, расширив вашу выборку данных непосредственно на этапе фильтрации.

Вот улучшенный вариант вашего скрипта:

Import-Module ActiveDirectory

$filter = "(&(|(name=F_*)(name=G_*)(name=CAX_*))(groupType:1.2.840.113556.1.4.803:=2147483648)(!member=*))"
$emptyGroups = Get-ADGroup -LDAPFilter $filter -Properties Name

Write-Host "Группы без участников:"
$emptyGroups | ForEach-Object { Write-Host $_.Name }

Объяснение изменений:

  1. Используйте LDAP-фильтр: Мы заменили фильтрацию через PowerShell на LDAP-фильтр, который позволяет более эффективно получать группы, соответствующие критериям.

    • Фильтр ищет группы, начинающиеся с F, G или CAX_, которые являются "Security" группами и не имеют участников.
  2. Избежание ошибок: Этот метод исключает возможность ошибок, вызванных недоступными группами или отсутствующими участниками, поскольку мы ограничиваем выборку только теми группами, которые уже проверены.

  3. Простота и читаемость: Избегание лишних циклов и вызовов делает скрипт гораздо более понятным и упрощает его поддержку.

Заключение

При использовании Active Directory PowerShell важно обращать внимание на права доступа, структуру групп и правильность используемых командлетов. Версия вашего скрипта была переработана для повышения производительности и исключения возможных ошибок доступа. Надеюсь, это поможет вам решить обозначенные проблемы. Если у вас есть какие-либо дополнительные вопросы, не стесняйтесь спрашивать!

Оцените материал
Добавить комментарий

Капча загружается...