Войти

Показать полную графическую версию : [решено] get-aduser -filter с массивом?


nokogerra
05-11-2014, 11:29
Доброго времени суток. Есть список txt с samaccountname, но мне нужно выбрать всех пользователей, которых НЕТ в этом списке. Обычно для выбора пользователей из списка использовал:
get-content путь_к_файлу_txt | foreach-object {get-aduser -i $_}. Чтобы выбрать всех, кого в этом списке нет удобнее всего использовать фильтр -f {samaccountname -ne $_ или $x}, но фильтр не работает таким образом, кто-нибудь подскажет решение?
Спасибо заранее.

Kazun
05-11-2014, 11:44
Compare-Object (get-content путь_к_файлу_txt) (get-aduser -fi * | foreach {$_.samaccountname}) |Where {$_.SideIndicator -eq "=>"}

nokogerra
05-11-2014, 12:06
Да, действительно, спасибо. Не знал об этом командлете.
Один вопрос: почему при Compare-Object (get-content путь_к_файлу_txt) (get-aduser -filter '*' | select samaccountname) выдает такое:

.......................
@{samaccountname=loor} =>
@{samaccountname=neupokoev} =>
..........................
Fedorenko <=
hogaev <=
.............................

и в списке с "=>" есть вхождения из списка "<="

Kazun
05-11-2014, 12:11
Что пишете, то и выдает, никакого обмана.

Compare-Object (get-content путь_к_файлу_txt) (get-aduser -filter '*' | select -exp samaccountname) |Where {$_.SideIndicator -eq "=>"}

nokogerra
05-11-2014, 12:29
Спасибо за ответ.
Теперь стало чуть больше понятно, но лыжи еще не едут. Я написал то же самое, но без -exp. Это что, expression? И не ясно почему мой вариант не отработал - в txt стринг, я делаю ...| select samaccountname - тоже получаю стринг, а выдается невесть что.

Kazun
05-11-2014, 12:36
Это что, expression? - Нет, -ExpandProperty.
делаю ...| select samaccountname - тоже получаю стринг - Получается не String,a тип Selected.Microsoft.ActiveDirectory.Management.ADUser

Разница использования -ExpandProperty и без:
PS > [string](Get-ADUser test | select samaccountname)
@{samaccountname=test}

PS > [string](Get-ADUser test | select -exp samaccountname)
test

nokogerra
05-11-2014, 12:52
Понял, спасибо большое. Если не затруднит - осталась последняя неясность. После

Compare-Object (get-content путь_к_файлу_txt) (get-aduser -fi * | foreach {$_.samaccountname})

были строки с => - что логично, но были и <=, т.е. в 1м объекте были найдены строки, которых нет во 2м (т.е. все пользователи), но текстовый файл выбирался get-aduser командлетом, и там не может быть пользователей, которых нет в get-aduser -f '*'. Я и руками проверил, взяв одного пользователя из <= - и он нашелся с помощью get-aduser. Как такое возможно?

Kazun
05-11-2014, 12:57
Легко, когда есть лишние пробелы. На будущее приводите полный вывод с неправильными результатами, а так только гадать остается.

#Убрать лишние пробелы

Compare-Object (get-content путь_к_файлу_txt | foreach {$_.Trim()}) (get-aduser -fi * | foreach {$_.samaccountname})

nokogerra
05-11-2014, 13:10
От пробелов я предварительно избавился в текстовом редакторе, но вывод с Trim() точно такой же, например:

........................................
testx =>
testx2 =>
falk =>
btg <=
kuzmina <=
bogdanova <=
us12 <=
baa <=
sartakova <=
Osinceva <=
stepanenko <=

Т.е. stepanenko якобы есть в первом объекте (в txt) - и это правда, но ее нет в списке всех пользователей, но это не так. вот опровержение:

PS C:\Windows\system32> Get-ADUser -f '*' | where {$_.samaccountname -eq "stepanenko"}


DistinguishedName : CN=Евгения В. Степаненко,CN=Users,DC=domain,DC=local
Enabled : True
GivenName : Евгения
Name : Евгения В. Степаненко
ObjectClass : user
ObjectGUID : xx
SamAccountName : stepanenko
SID : xx
Surname : Степаненко
UserPrincipalName : stepanenko@domain.local

Kazun
05-11-2014, 13:26
Что возвращает код:
Compare-Object (get-content путь_к_файлу_txt | foreach {$_.Trim()}) (get-aduser -fi * | foreach {$_.samaccountname}) |
Where {$_.SideIndicator -eq "<="} | Foreach { try {Get-ADUser $_.InputObject} catch {}}

nokogerra
05-11-2014, 13:59
Compare-Object (Get-Content C:\Users\nokogerra\Desktop\us.txt | foreach {$_.Trim()}) (Get-ADUser
-fi * | foreach {$_.samaccountname}) | where {$_.sideindicator -eq "<="} | foreach {try {get-aduser $_.inputobject} catch {}}

вывело список пользователей тех пользователей, которые помечены "<=".

Kazun
05-11-2014, 14:10
Странное поведение, а код:
$users = Get-Content C:\Users\nokogerra\Desktop\us.txt
Get-ADUser -Filter * | Where {$users -notcontains $_.SamAccountName} | Select Name,SamAccountName

nokogerra
05-11-2014, 14:24
вывело всех пользователей, samaccountname которых нет в текстовом файле. хм, т.е. это еще одно решение моей первоначальной задачи, но не совсем понятное, разве contains и notcontains так работают? они вроде должны возвращать булевое значение. И должно оцениваться, входит ли $_.samaccountname в $users, а не наоборот, разве нет?

Kazun
05-11-2014, 14:35
они вроде должны возвращать булевое значение - Так и возвращается булевое значение, если пользователь есть в AD, но нет в файле, то выводим объект на консоль.

nokogerra
05-11-2014, 14:54
Сначала я не понял логики, но потом все же дошло: проверка "пообъектно", где объект - это атрибут samaccountname, т.е. если совпало, значит FALSE, не совпало - TRUE (при частичном совпадении тоже) и при TRUE, пользователь будет выведен.
Спасибо большое за помощь, Вы предложили 2 рабочих варианта, не вижу особого смысла ковыряться в лишних "<=".




© OSzone.net 2001-2012