Я добавляю OU пользователей в группу и хочу записать:
- Пользователи добавлены
- Пользователи, уже включенные в список
- , выводят вышеуказанноев файл
Текущий код ниже работает и выводит:
UserName GroupName TimeStamp
-------- --------- ---------
%Username% %groupname% 14/10/2019 15:50:49
Но catch
не перехватывает пользователей, уже входящих в группу, и выдает отчет о выводе на консоли,Экспорт в CSV просто содержит всех пользователей в OU и показывает, сколько времени он добавил.
Я бы хотел, чтобы вывод catch
активировался на экране, и чтобы в экспортированном файле CSV был какой-то способ показать, еслиПользователь уже был добавлен или был добавлен в этот прогон.
Код, который я использую:
$groupName = 'SOMEGROUP'
$ou = 'OU=Users,DC=DC,DC=LOCAL'
$cred = Get-Credential -Credential bsg\myusername$
$results = Get-ADUser -Filter * -SearchBase $ou -Credential $cred | ForEach-Object {
#Add the user to the group here
$userName = $_.Name
try {
Add-ADGroupMember -Identity $groupName -Members $_.DistinguishedName -Credential $cred -ErrorAction Stop
} catch {
Write-Warning "User $userName is already a member of group $groupName"
}
# output a PsCustomObject that gets collected in the $results variable
[PsCustomObject]@{
'UserName' = $userName
'GroupName' = $groupName
'TimeStamp' = Get-Date
}
}
# output on console
$results | Format-Table -AutoSize
# Export to CSV file
$results | Export-Csv C:\PS\AddADGroupToUsers.csv -NoTypeInformation
Read-Host -Prompt "Press Enter to exit"
Я не уверен насчет Add-ADGroupMember
. Имеет ли значение, что это DistinghedName, а не, может быть, $userName
?
Мне бы хотелось, чтобы на выходе было показано catch
, которое не работает.
Я использовал -Credential $cred
В обоих утверждениях есть ли более простой способ заставить все работать как -Credential
как сеанс, а не как команды для аккуратности?
Ответы прочитаны и поняты. Я запустил сценарий. Пользователи уже находятся в группе, поэтому я ожидал, что они все вернутся как «пользователь уже является членом группы…». но вместо этого, похоже, ошибка.
Сообщение об ошибке после последнего обновления (в группе уже было много участников):
Add-ADGroupMember : Cannot validate argument on parameter 'Members'. The argument is null, empty, or an element of the
argument collection contains a null value. Supply a collection that does not contain any null values and then try the
command again.
At C:\PS\add to usersNEW2.ps1:28 char:57
+ ... oupMember -Identity $groupName -Members $_.DistinghuishedName -ErrorA ...
+ ~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidData: (:) [Add-ADGroupMember], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.ActiveDirectory.Management.Commands.AddADGrou
pMember
Вывод CSV неверен, поскольку пользователи не были добавленыони уже были в этом. Итак, результаты неверны:
UserName GroupName TimeStamp Status
TheUser GROUPSActual 16/10/2019 15:23 User added successfully
Так что, отойдя от кода Тео, я попробовал предложение Ивана, но это занимает ДЛИННОЕ время:
# I'll use the DistinghuishedName because this is always unique in the forest
$currentMembers = Get-ADGroupMember -Identity $groupName | Select-Object -ExpandProperty DistinghuishedName
$results = Get-ADUser -Filter * -SearchBase $ou -credential $cred | ForEach-Object {
# test if the user is already a member by checking the array
If ((Get-ADGroupMember -Identity $groupname).distinguishedName -contains $_.distinguishedName) {
Write-Warning "User $userName is already a member of group $groupName"
}
else {
Add-ADGroupMember -Identity $groupName -Members $_.DistinguishedName -Credential $cred -ErrorAction Stop
}
# output a PsCustomObject that gets collected in the $results variable
[PsCustomObject]@{
'UserName' = $_.Name
'GroupName' = $groupName
'TimeStamp' = Get-Date
'Status' = $status
}
}
Это работает, я думаю, ноПотребовалось несколько минут, чтобы получить 3 результата из 7, тогда как оригинальный код работал в считанные секунды. Изменить: Код завершен, и написал для размещения предупреждения. Я знаю, что могу настроить часть статуса, чтобы добавить ошибку в статус. Просто не стоит так долго!
Метки времени были разделены секундами, но теперь:
TimeStamp
16/10/2019 16:12
16/10/2019 16:14
16/10/2019 16:15
16/10/2019 16:16
16/10/2019 16:17
16/10/2019 16:18
16/10/2019 16:19