Показать полную графическую версию : [решено] get-aduser -filter с массивом?
nokogerra
05-11-2014, 11:29
Доброго времени суток. Есть список txt с samaccountname, но мне нужно выбрать всех пользователей, которых НЕТ в этом списке. Обычно для выбора пользователей из списка использовал:
get-content путь_к_файлу_txt | foreach-object {get-aduser -i $_}. Чтобы выбрать всех, кого в этом списке нет удобнее всего использовать фильтр -f {samaccountname -ne $_ или $x}, но фильтр не работает таким образом, кто-нибудь подскажет решение?
Спасибо заранее.
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 <=
.............................
и в списке с "=>" есть вхождения из списка "<="
Что пишете, то и выдает, никакого обмана.
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 - тоже получаю стринг, а выдается невесть что.
Это что, 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. Как такое возможно?
Легко, когда есть лишние пробелы. На будущее приводите полный вывод с неправильными результатами, а так только гадать остается.
#Убрать лишние пробелы
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
Что возвращает код:
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 {}}
вывело список пользователей тех пользователей, которые помечены "<=".
Странное поведение, а код:
$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, а не наоборот, разве нет?
они вроде должны возвращать булевое значение - Так и возвращается булевое значение, если пользователь есть в AD, но нет в файле, то выводим объект на консоль.
nokogerra
05-11-2014, 14:54
Сначала я не понял логики, но потом все же дошло: проверка "пообъектно", где объект - это атрибут samaccountname, т.е. если совпало, значит FALSE, не совпало - TRUE (при частичном совпадении тоже) и при TRUE, пользователь будет выведен.
Спасибо большое за помощь, Вы предложили 2 рабочих варианта, не вижу особого смысла ковыряться в лишних "<=".
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.