Powershell - 使用get-adcomputer过滤OU

时间:2012-07-17 22:23:06

标签: powershell active-directory filtering ou

我正在尝试创建一个脚本,该脚本根据计算机可能具有的特定属性生成计算机列表。例如,我正在尝试制作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 个答案:

答案 0 :(得分: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,*"}

<强>附录

要结合匹配规则,请使用-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,*"

}

答案 1 :(得分:1)

虽然在收集完所有计算机后过滤没有任何问题,但将数据限制为一个OU的更有效方法是在GET-ADCOMPUTER cmdlt中使用-searchbase开关。 我还注意到你正在过滤你的对象类型以指定计算机,这有点多余,因为get-adcomputer cmdlt已经过滤掉了其他对象类型。

我已经把你的代码修好了一点。

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"

上面的示例应该与您之前的脚本功能相同,它将枚举所有具有恶意OU内的Windows 7或xp的计算机。它位于ds.Domain.Net域的工作站OU中。

您可能还注意到,您的专有名称会在每列的末尾附加“.DistinguishedName”,这是因为您的$ computer.DistinguishedName表达式在引号中未被完全评估,因此很容易解决以下变化:

"$computer.DistinguishedName"

"$($computer.DistinguishedName)"

“$(&lt; ...&gt;)”语法告诉powershell在将输出转换为字符串之前评估括号内的完整表达式。