Экспорт членства в группе 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
.