Возникли проблемы с фильтрацией Get-ADUser с помощью команды whenCreated powershell
Я могу использовать некоторую помощь в структурировании / вложении приведенного ниже кода PowerShell, чтобы получить желаемый результат.
Когда я использую команду:
Get-ADGroupMember -Identity $groupname |
Get-ADUser -Properties * -Erroraction Ignore |
select @{N='UserName';E={$_.UserPrincipalName}} |
Export-csv $filename -NoTypeInformation
Он работает, как ожидалось, и выбирает только людей из группы AD, но когда я изменяю код и пытаюсь отфильтровать только НОВЫЕ учетные записи в зависимости от того, когда была создана учетная запись, теперь он включает учетные записи пользователей, которые НЕ входят в эту группу.
Get-ADGroupMember -Identity $groupname |
Get-ADUser -Filter { whenCreated -ge $when } -Properties * -Erroraction Ignore |
select @{N = 'UserName'; E = { $_.UserPrincipalName } } |
Export-csv $filename -NoTypeInformation
Я не уверен, почему он теперь включает все новые учетные записи пользователей в нашу AD, даже некоторые из них вне группы
$groupname
1 ответ
Вы не можете использовать при прокладке трубопроводов в объектах. Если вы вставляете объекты в трубопровод, вы будете считать, что хотите их получить. Однако это сводится к ошибке привязки параметра, поскольку вы установили, что вы не получаете обратную связь об ошибке, которая могла бы так сказать.
У вас должны возникнуть проблемы с получением пользователей AD, которые, как мы знаем, существуют в силу их членства в группах. Итак, я бы спросил, действительно ли вам нужно игнорировать ошибки. Тем не менее, удаление
-ErrorAction Ignore
не решит проблему привязки параметров. Для этого, боюсь, вам придется прибегнуть к постфильтрации с
Where{}
пункт. Например:
$When = (Get-Date "12/31/2020").ToUniversalTime()
Get-ADGroupMember -Identity $groupname |
Get-ADUser -Properties WhenCreated |
Where-Object{ $_.WhenCreated -ge $when }
Select-Object @{Name = 'UserName'; Expression = { $_.UserPrincipalName } } |
Export-csv $filename -NoTypeInformation
Примечание. Свойство хранится в формате UTC, поэтому, преобразовав интересующее нас местное время, мы должны получить правильные результаты.
Примечание: вам не нужно получать все свойства. UserPrincipalName входит в набор по умолчанию. Для постфильтрации вам нужно будет добавить к результатам WhenCreated.
Замечание: старайтесь не использовать блоки сценария в качестве аргумента. Если вы посмотрите справочную документацию Get-ADUser, то обнаружите, что этот параметр на самом деле является строковым. Таким образом, указание блока сценария требует переделки под капотом и может привести к проблемам. поэтому, если вы использовали параметр в этом проекте или где-либо еще, просто используйте обычную строку, например:
-Filter "Name -like '*steve*'"
Другой в сторону: A
[DateTime]
например, возвращенный
Get-Date
нельзя напрямую использовать в аргументе. Вероятно, это связано с If, когда и как командлет управляет WhenCreated. Значение атрибута WhenCreated LDAP больше похоже на "20200820040000.Z", поэтому вы можете настроить его для использования в качестве
-Filter
или аргумент соответственно, как показано ниже:
$when = (Get-Date '8/20/20' ).ToUniversaltime().ToString('yyyMMddHHmmss.Z')
Get-ADUser -Filter "WhenCreated -ge '$when'"
Или с
-LDAPFilter
Get-ADUser -LDAPFilter "(whencreated>=$when)"
Я свяжусь с документацией по фильтруемым свойствам, если смогу ее найти.
Обновлять:
Судя по комментариям @SantiagoSquarzon, вы можете не захотеть использовать
Get-ADGroupMember
вообще, поскольку вы можете передавать непользовательские объекты в
Get-ADUser
. Комбинируя его предложение, можно получить такой пример:
$when = (Get-Date '8/20/20' ).ToUniversaltime().ToString('yyyMMddHHmmss.Z')
$groupDN = (Get-ADGroup -Identity $groupname).DistinguishedName
Get-ADUser -LDAPFilter "(&(memberOf=$groupDN)(whencreated>=$when))" |
Select-Object @{Name = 'UserName'; Expression = { $_.UserPrincipalName }} |
Export-csv $filename -NoTypeInformation