Вопрос по powershell, ou, active-directory, filtering – Powershell - фильтрация подразделений при использовании get-adcomputer

5

Я пытаюсь создать сценарий, который генерирует список компьютеров на основе определенных свойств, которые может иметь компьютер. Например, я пытаюсь составить список компьютеров с Windows XP и компьютеров с Windows 7, выбросить их имена в файл .csv и вывести окончательный счет каждого из них.

Вот мой код до сих пор

import-module ActiveDirectory
$computers = get-adcomputer -Filter 'ObjectClass -eq "Computer"' -properties "OperatingSystem"
$i = 0
$j = 0
Foreach ($computer in $computers) {
    if ($computer.operatingSystem -like "Windows 7*") {
        $i++
        '"{0}","{1}","{2}"' -f $computer.Name, $computer.OperatingSystem, "$computer.DistinguishedName" | Out-file -append C:\users\admin\desktop\test.txt
        }
    elseif ($computer.OperatingSystem -like "Windows XP*") {
        $j++
        '"{0}","{1}","{2}"' -f $computer.Name, $computer.OperatingSystem, "$computer.DistinguishedName" | Out-file -append C:\users\admin\desktop\test.txt
        }
    else {
        $_
        }

}
write-host "$i Win 7"
write-host "$j Win xp"
$k = $i+$j
write-host "$k Total"

Пример вывода:

104 Win 7
86 Win xp
190 Total

Этот сценарий работает, однако я хотел бы сделать его немного лучше, имея возможность сказать, какие OU'ы не нужно изучать, но я не могу понять это.

Если у кого-то есть понимание того, как это сделать, или даже просто улучшить вышеприведенный код, я хотел бы услышать это.

Спасибо!

Ваш Ответ

2   ответа
1

как вы собрали все компьютеры, более эффективным способом ограничения ваших данных одним подразделением было бы использование ключа -searchbase в вашем командлете GET-ADCOMPUTER. Я также заметил, что вы фильтруете тип своего объекта, чтобы указать компьютер, что немного избыточно, поскольку командлет get-adcomputer уже отфильтровывает другие типы объектов.

Я взял ваш код и немного его исправил.

import-module ActiveDirectory
$computers = get-adcomputer -Filter * -properties "OperatingSystem" -SearchBase "OU=evil,OU=workstations,DC=cs,DC=domain,DC=net"
$i = 0
$j = 0
Foreach ($computer in $computers) {
    if ($computer.operatingSystem -like "Windows 7*") {
        $i++
        '"{0}","{1}","{2}"' -f $computer.Name, $computer.OperatingSystem, "$($computer.DistinguishedName)" | Out-file -append C:\users\admin\desktop\test.txt
        }
    elseif ($computer.OperatingSystem -like "Windows XP*") {
        $j++
        '"{0}","{1}","{2}"' -f $computer.Name, $computer.OperatingSystem, "$($computer.DistinguishedName)" | Out-file -append C:\users\admin\desktop\test.txt
        }
    else {
        $_
        }

}
write-host "$i Win 7"
write-host "$j Win xp"
$k = $i+$j
write-host "$k Total"

Приведенный выше пример должен функционировать так же, как ваш предыдущий скрипт, за исключением того, что он будет перечислять все компьютеры с Windows 7 или XP, которые находятся в злой OU. которая находится в подразделении рабочих станций в домене ds.Domain.Net.

Вы, вероятно, также заметили, что ваше выдающееся имя получает & quot; .DistinguishedName & quot; это добавлено в конец каждого столбца, потому что ваше выражение $ computer.DistinguishedName не полностью оценивается, пока оно в кавычках, и его легко разрешить с помощью следующего изменения:

"$computer.DistinguishedName"

в

"$($computer.DistinguishedName)"

the & quot; $ (& lt; ... & gt;) & quot; Синтаксис сообщает PowerShell для оценки полного выражения в скобках перед преобразованием вывода в строку.

Некоторые хорошие моменты здесь. Однако, к сожалению, оригинальный вопрос хочетomit одно или несколько подразделений и включают большинство. Я считаю, что база поиска, как правило, не поможет, если, как вы говорите, ваш сценарий не позволяет сосредоточиться только на одном поддереве OU.
8

-like оператор не работает с подстановочными знаками для DistinguishedName. Итак, очевидная операцияGet-ADComputer -Filter {(DistinguishedName -notlike "*OU=evil,*")} не работает.

Самый простой обходной путь - собрать все компьютеры в единую коллекцию и затем отфильтровать их в соответствии с вашими потребностями. Вот так,

# All the computers from the evil OU:
$evilOU = $computers| ? {$_.DistinguishedName -like "*ou=evil,*"}
# All the computers but the ones from the evil OU:
$goodOU = $computers| ? {$_.DistinguishedName -notlike "*ou=evil,*"}

Addendum

Чтобы объединить соответствующие правила, используйте-and -or а также-like, Не забудьте использовать* подстановочный знак с? (where-object)

# All the computers save the ones from evil and wicked OU:
$goodOU = $computers| ? {
  $_.DistinguishedName -notlike "*ou=evil,*" -and $_.DistinguishedName -notlike "*ou=wicked,*"

}

Могу ли я добавить более одной строки, используя оператор -or? $ goodOU = $ computers | ? {$ _. DistinguishedName -notlike (& quot;ou=evil,& Quot; -или & quot;CN=BadCN,& Quot;)}. это не правильный синтаксис, хотя smierdziel
смотреть на примеры и пробовать это тоже не работает. $ FilterComputers = $ Компьютеры | where-object {($ _. DistinguishedName -notlike & quot;OU=Laptops,& quot;) -or ($ _. DistinguishedName -notlike & quot; * CN = Resources, * & quot;) -or ($ _. DistinguishedName -notlike & quot;CN=Computers,& Quot;)} smierdziel

Похожие вопросы