2017-02-17 44 views
1

я следующий PowerShell сценарийКак получить все частичные совпадения с использованием фильтра Get-ADComputer?

$server = Get-ADComputer -filter {name -like $computerhost} 
write-host $server.name 

Это дает мне ADComputer, который содержит $computerhost в его имени.

Пример:

$computerhost = linuxserver 

соответствия имени компьютера выход: "linuxserver01"


Но я на самом деле хочу ADComputer, если имя компьютера помещается внутри $computerhost. Так что если $ computerhost является «ASDF» Я хочу получить компьютер с именем «а» или «как» или «ASD» или «ASDF», но не «Asda»

Пример:

$computerhost = linuxserver (new) 

соответствие имени компьютера: «linuxserver»


Я понятия не имею, как использовать подстановочные знаки таким образом.

+2

_Но я действительно хочу, чтобы ADComputer, который вписывается в $ computerhost._, я действительно не знаю, что вы подразумеваете под этим? Вы только хотите найти частичное имя из '$ computerhost'? Как вы решаете, что удалить? – Matt

+0

Если имя компьютера в AD помещается внутри $ computerhost. Поэтому, если $ computerhost «asdf», я хочу получить компьютер с именем «a» или «as» или «asd» или «asdf», но не «asda». –

ответ

2

Благодарим за разъяснения. Я думаю, что это может быть то, что вы ищете:

Get-ADComputer -filter * | where-object { $computerhost -like "*$($_.name)*" } 

Например (я использую $ компьютеров здесь вместо Get-adcomputer):

$computers = 'a','as','asd','asdf','asda' 
$computerhost = 'asdf' 

$computers | where-object { $computerhost -like "*$_*" } 

Возвраты:

в

ASD

ASDF

+0

Спасибо за ответ. Это работает, если у меня есть список всех компьютеров вне Active Directory. Должен ли я создавать список со всеми компьютерами из AD или есть простой способ сделать это непосредственно с AD? –

+1

@ Dave494 Вот для чего первая строка кода в этом ответе. Второй является доказательством концепции – Matt

+0

Ohhhhhh !!! Понял. Кажется, работает для меня. Спасибо! –

1

Если вы ищете для частичного совпадения в строку $computerHost фильтр не будет обрабатывать, что, поскольку он не правильно перевести на запрос LDAP. Вам придется обработать этот фильтр после возвращения всех компьютеров в ваш набор. У вас есть такие параметры, как -SearchScope, чтобы уменьшить это, если у вас большая компьютерная база. Простейшее подход заключается в использовании .contains()

Get-ADComputer -filter * | Where-Object{$computerhost.contains($_.name)} 

Нужно быть осторожным, поскольку .contains() чувствителен к регистру. Одна вещь, которую вы могли бы сделать, - заставить вашу строку в том же случае удалить эту проблему.

Where-Object{$computerhost.ToUpper().contains($_.name.toUpper())} 

Можно также использовать -match operatore только учтите, что он поддерживает регулярные выражения. Это не должно быть проблемой здесь, но если у ваших имен компьютеров есть дефисы, они должны быть экранированы.

Where-Object{$_.name -match $computerhost} 
+0

Благодарим вас за ответ Matt. Я просто попробовал это с существующим компьютером и добавил asdf к нему. Не работает. Пробовал это с помощью существующего компьютера, ничего не добавляя. Не работает. Я здесь что-то не так? –

+0

Позвольте мне проверить, если мой код-фу сосет сегодня утром. – Matt

+0

Не нужно, уже получил его. Должен сделать это вот так: Get-ADComputer -filter * | где-object {$ computerhost -like "* $ ($ _. name) *"} Спасибо, что угодно –