Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] get-aduser -filter с массивом? (http://forum.oszone.net/showthread.php?t=290453)

nokogerra 05-11-2014 11:29 2424885

get-aduser -filter с массивом?
 
Доброго времени суток. Есть список txt с samaccountname, но мне нужно выбрать всех пользователей, которых НЕТ в этом списке. Обычно для выбора пользователей из списка использовал:
Код:

get-content путь_к_файлу_txt | foreach-object {get-aduser -i $_}
. Чтобы выбрать всех, кого в этом списке нет удобнее всего использовать фильтр -f {samaccountname -ne $_ или $x}, но фильтр не работает таким образом, кто-нибудь подскажет решение?
Спасибо заранее.

Kazun 05-11-2014 11:44 2424894

Код:

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

nokogerra 05-11-2014 12:06 2424903

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

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

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

Kazun 05-11-2014 12:11 2424905

Что пишете, то и выдает, никакого обмана.

Код:

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

nokogerra 05-11-2014 12:29 2424914

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

Kazun 05-11-2014 12:36 2424919

Это что, 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 2424928

Понял, спасибо большое. Если не затруднит - осталась последняя неясность. После
Код:

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 2424930

Легко, когда есть лишние пробелы. На будущее приводите полный вывод с неправильными результатами, а так только гадать остается.

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

Код:

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

nokogerra 05-11-2014 13:10 2424936

От пробелов я предварительно избавился в текстовом редакторе, но вывод с 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 2424947

Что возвращает код:
Код:

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 2424958

Код:

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 2424962

Странное поведение, а код:
Код:

$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 2424972

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

Kazun 05-11-2014 14:35 2424979

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

nokogerra 05-11-2014 14:54 2424986

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


Время: 00:30.

Время: 00:30.
© OSzone.net 2001-