PowerShell - пользователи AD из основной группы плюс одна из двух дополнительных групп
Сценарий здесь:
https://gallery.technet.microsoft.com/scriptcenter/Powershell-Get-users-who-b0420fe1
будет возвращать результаты для пользователей, которые существуют в основной группе, а также в любой из двух дополнительных групп (спасибо OP zperryz за код). Ниже приведена моя версия этого сценария.
Я хотел бы добавить условия для отключенных пользователей и пользователей, которые находятся в определенной OU "hold". В другом сценарии я смог сделать это так (очевидно, фрагмент, а не весь сценарий):
| where {$_.Enabled -ne $False} `
| where {$_.DistinguishedName -notlike "*HOLD OU*"} `
Я просто не уверен, где "внедрить" их в сценарий ниже. (В будущем изменение будет возвращать больше информации, например DisplayName, Enabled & DistinguishedName, а не только вход в систему.)
Если у кого-то есть совет, я буду очень признателен! Вот сценарий, как он стоит сегодня:
$ADgroup1 = "VPN Front Door"
$ADgroup2 = "VPN Full Access"
$ADgroup3 = "VPN Restricted Access"
get-adgroupmember $ADgroup1 `
| ForEach-Object {if(((GET-ADUSER –Identity $_.SamAccountName –Properties MemberOf `
| Select-Object MemberOf).MemberOf -replace '^CN=([^,]+).+$','$1') -eq "$ADgroup2" -or "$ADgroup3"){$_.SamAccountName `
| Out-File -append -filepath C:\Users\3Jake\Desktop\VPN_Users.txt}}
Спасибо!
ЗАКЛЮЧИТЕЛЬНАЯ ВЕРСИЯ, все с комментариями:
Как есть, он предназначен для запуска в консоли, но его должно быть легко обновить, чтобы выложить файл при необходимости.
# Define Variables
$ADgroup1 = "VPN Front Door"
$ADgroup2 = "VPN Full Access"
$ADgroup3 = "VPN Restricted Access"
$vpnGroups = $ADgroup2, $ADgroup3
# Collect users in $ADgroup1
# Also pass user properties forward
$UsersFound = (
Get-ADGroupMember $ADgroup1 |
Get-ADUser -Properties MemberOf, Name, SamAccountName, Company |
# Ignore disabled users & those in the "On HOLD" OU
Where {
$_.Enabled -ne $False -and
$_.DistinguishedName -notlike '*HOLD OU*'
} |
# Compare users in $ADgroup1 to the ones in $ADgroup2 and $ADgroup3
select Name, SamAccountName, Company,
@{n='Groups';e={$_.MemberOf | Get-ADGroup | select -Expand Name}} |
Where { $groups = @($_.Groups); $vpnGroups | Where { $groups -contains $_ } }
)
# Display count
Write-Host "Total = " $UsersFound.Count
# Prompt to show user info
$YN = Read-Host "Show Users? (Y/N)"
if ($YN -eq 'Y')
{
$UsersFound |
select Name, SamAccountName, Company |
Sort-Object name, company |
Out-GridView
}
else {exit}
1 ответ
Во-первых, вы должны распутать эту запутанную if
заявление. Что-то вроде этого было бы гораздо более читабельным (и гораздо более удобным):
$vpnGroups = $ADgroup2, $ADgroup3
Get-ADGroupMember $ADgroup1 | ForEach-Object {
Get-ADUser -Identity $_.SamAccountName -Properties MemberOf |
select SamAccountName,
@{n='Groups';e={$_.MemberOf | Get-ADGroup | select -Expand Name}} |
? { $groups = @($_.Groups); $vpnGroups | ? { $groups -contains $_ } } |
select -Expand SamAccountName |
Out-File -Append -Filepath 'C:\Users\3Jake\Desktop\VPN_Users.txt'
}
Вам даже не нужно ForEach-Object
петля, потому что Get-ADUser
можно читать прямо из конвейера:
$vpnGroups = $ADgroup2, $ADgroup3
Get-ADGroupMember $ADgroup1 |
Get-ADUser -Properties MemberOf |
select SamAccountName,
@{n='Groups';e={$_.MemberOf | Get-ADGroup | select -Expand Name}} |
? { $groups = @($_.Groups); $vpnGroups | ? { $groups -contains $_ } } |
select -Expand SamAccountName |
Out-File -Filepath 'C:\Users\3Jake\Desktop\VPN_Users.txt'
При этом вы можете просто вставить свой дополнительный фильтр (ы) после Get-ADUser
:
Get-ADGroupMember $ADgroup1 |
Get-ADUser -Properties MemberOf |
? {
$_.Enabled -ne $False -and
$_.DistinguishedName -notlike '*HOLD OU*'
} |
select SamAccountName,
@{n='Groups';e={$_.MemberOf | Get-ADGroup | select -Expand Name}} |
? { $groups = @($_.Groups); $vpnGroups | ? { $groups -contains $_ } } |
select -Expand SamAccountName |
Out-File -Filepath 'C:\Users\3Jake\Desktop\VPN_Users.txt'