PowerShell的 - 过滤OU中同时使用get-adcomputer(Powershell -

2019-06-26 09:18发布

我试图创建一个基于该计算机可以具有特定属性的计算机列表的脚本。 例如,我试图使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不是寻找到使其更好一点,但我不能完全弄清楚。

如果任何人有任何深入了解如何做到这一点,甚至只是为了让上面的代码没有更好的我很乐意听到它。

谢谢!

Answer 1:

-like操作似乎不使用通配符的distinguishedName工作。 因此,明显的操作Get-ADComputer -Filter {(DistinguishedName -notlike "*OU=evil,*")}不起作用。

最简单的解决方法是让在colleciton所有计算机,之后过滤,以满足您的需求。 像现在这样,

# 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) ? (where-object)

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

}



Answer 2:

虽然你已经收集了所有的电脑后没有错,过滤,限制你的数据到一个OU的更有效的方式是在你的GET-ADCOMPUTER cmdlt使用-SearchBase开关。 我也注意到你筛选对象类型指定的计算机,这是一个有点多余的,因为一开始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"

上述上面的例子中的作用应与您以前的纸条保存,这将枚举所有的计算机与Windows 7或XP是邪恶的OU内。 位于内工作站上ds.Domain.Net域OU。

你可能也注意到,您的专有名称越来越“.DistinguishedName”附加到每个列的末端,这是因为你的$ computer.DistinguishedName表达没有被充分评估,而它的报价,很容易与下面的变化解析:

"$computer.DistinguishedName"

"$($computer.DistinguishedName)"

在“$(<...>)”语法告诉的powershell输出转换为字符串之前评估括号内的充分表达。



文章来源: Powershell - Filtering OUs while using get-adcomputer