6

我正在尝试创建一个脚本,该脚本根据计算机可能具有的特定属性生成计算机列表。例如,我正在尝试列出 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 来使它变得更好,但我无法弄清楚。

如果有人对如何做到这一点有任何见解,或者只是为了使上面的代码更好,我很想听听。

谢谢!

4

2 回答 2

9

-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,*"

}

于 2012-07-18T07:25:09.570 回答
2

虽然在收集了所有计算机之后进行过滤并没有什么问题,但将数据限制到一个 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)"

"$(<...>)" 语法告诉 powershell 在将输出转换为字符串之前评估括号内的完整表达式。

于 2014-01-09T21:15:35.413 回答