Экспорт членства в группе AD для списка пользователей из CSV Powershell

Я пытаюсь получить CSV-вывод всех пользователей в группе «Пользователи VPN», которые также находятся в группе «Пользователи домена». Я бы хотел, чтобы было указано их имя, а затем членство в группе. Каждый участник должен быть только в группе VPN. Я хочу определить, кто входит в обе группы.

Для этого я сначала экспортировал список пользователей в группе VPN в CSV, который отлично работает. Вторая часть кода предназначена для просмотра списка пользователей в CSV из этой группы AD и экспорта вывода в виде CSV, содержащего пользователей и их членство в группах, что у меня не работает. Для каждого пользователя в CSV возвращается ошибка: Get-ADUser: не удается найти объект с идентификатором: '"User001_vpn"'.....

Я не уверен, что то, что я собираюсь делать, - лучший способ выполнить поставленную задачу или кто-нибудь из вас может помочь мне заставить ее работать? Похоже, Get-ADUser не находит пользователей из CSV.

      #Retrieves list of users that are in the VPN Users group and exports them into a CSV
(Get-ADGroupMember "VPN Users" -Recursive | Get-ADUser -Properties * |
Select-Object SamAccountName |
ConvertTo-Csv -NoTypeInformation) |
Select-Object -Skip 1 |
Set-Content -Path "C:\Documents\VPN Users Report\VPNUsers.csv”


Get-Content “C:\Documents\VPN Users Report\VPNUsers.csv” | Get-ADUser | ForEach{
    $user = $_
    $groups = Get-ADPrincipalGroupMembership $user
    $groups | %{ New-Object PSObject -Property @{ User = $user.SamAccountName; Group = $_.SamAccountName } }
} | Export-Csv "C:\VPN Users Report\Results\Output.csv"

2 ответа

Решение

Я считаю, что проблема в кавычках, поскольку вы используете ConvertTo-Csv при получении пользователей будут цитироваться SamAccountNames всех пользователей.

После этого вы читаете этот CSV-файл, используя Get-Content, нет Import-Csv, поэтому кавычки не будут удалены, и у вас будут такие имена пользователей, как "User001_vpn" вместо User001_vpn

Вам совсем не обязательно использовать это промежуточное резюме, и, если подумать, вы можете не указывать Get-ADUser тоже, если вы не хотите, чтобы у этих пользователей были другие свойства, кроме того, что уже было возвращено (например, отличное имя, имя, объектный класс, objectGUID, SamAccountName, SID)

Пытаться

      # Retrieves list of users that are in the VPN Users group
(Get-ADGroupMember "VPN Users" -Recursive | Where-Object { $_.objectClass -eq 'user' }).SamAccountName | ForEach-Object {
    foreach ($group in (Get-ADPrincipalGroupMembership -Identity $_)) {
        [PsCustomObject]@{
            User  = $_
            Group = $group.SamAccountName
        }
    }
} | Export-Csv "C:\VPN Users Report\Results\Output.csv" -NoTypeInformation

я добавил Where-Object { $_.objectClass -eq 'user' }, поскольку Get-ADGroupMember командлет может возвращать пользователей, группы и / или объекты компьютеров

Я предлагаю альтернативу полезному ответу Тео, позволяющую LDAP обрабатывать фильтрацию пользователей.

Результатом этого запроса будут те пользователи, которые являются членами и членами:

      $groupX = (Get-ADGroup 'VPN Users').DistinguishedName
$groupY = (Get-ADGroup 'Domain Users').DistinguishedName

Get-ADUser -LDAPFilter "(&(memberOf=$groupX)(memberOf=$groupY))"

Если вы искали косвенных членов одной из групп или обеих групп , то есть возможных членов вложенных групп в этих группах, вы могли бы использовать memberOf:1.2.840.113556.1.4.1941:. Пример:

      Get-ADUser -LDAPFilter "(&(memberOf:1.2.840.113556.1.4.1941:=$groupX)(memberOf=$groupY))"

Приведет всех членов (рекурсивных) из GroupXкоторые также являются прямыми членами GroupY.

Другие вопросы по тегам