适用于多种操作系统的Powershell Get-ADComputer过滤器

时间:2018-04-17 10:04:53

标签: powershell active-directory

我正在尝试从Get-ADComputer过滤/匹配操作系统,并且仅返回具有Windows 7及更高版本的计算机:

$computer = Get-ADComputer -properties OperatingSystem | Where-Object {operatingsystem -match "*Windows 7*|*Windows 8*|*Windows 10*"} |
Where-Object {$_.name -like "*-*"} |
Where-Object {$_.name -NotLike "V7-*"} |
Where-Object {$_.name -NotLike "*-NONE"} |
Where-Object {$_.name -NotLike "*-ONCALL"} |
Where-Object {$_.name -NotLike "*-BLACKBAUD"} |
Where-Object {$_.name -NotLike "SC-WIN7-1"} |
Where-Object {$_.name -NotLike "UT-SWCLIENT-01"} |
Select-Object -Expand Name 

但是当我这样做时,调试器会要求-Filter参数

我也尝试过:

$computer = Get-ADComputer -properties OperatingSystem -filter {(operatingsystem -match "*Windows 7*|*Windows 8*|*Windows 10*")} |

但是我收到了错误:

Get-ADComputer : Error parsing query: '(operatingsystem -match "*Windows 7*|*Windows 8*|*Windows 10*")' Error Message: 'Operator Not supported: 
    -match' at position: '18'.

那么正确/最好的方法是什么?

2 个答案:

答案 0 :(得分:2)

使用Where-Object进行高级过滤时,需要引用迭代器对象。同样在您的第一个代码示例中,包含-Filter *以获取所有计算机的完整列表。即尝试运行

$computer = Get-ADComputer -properties OperatingSystem -Filter * `
    | Where-Object {$_.operatingsystem -match "*Windows 7*|*Windows 8*|*Windows 10*"}

或者,您可以执行简单过滤并排除此{/ 1}} $_运算符

Get-Process | where name -like svchost

但是,-match运算符似乎不支持这种过滤方式。

您还可以在对所有AD计算机执行查询时过滤返回的结果,例如

Get-ADComputer -Properties OperatingSystem `
    -Filter {OperatingSystem -like "*Windows 7*" -or OperatingSystem -like "*Windows 8*"}

有关对Active Directory执行高级筛选时允许的内容,请参阅此blog post

在我看来,值得尝试在"服务器"尽可能多地进行过滤。查询结束,只返回您真正需要的内容。好处是所有进一步处理都会更快,因为要处理的数据更少。

答案 1 :(得分:1)

您正尝试在filters cmdlet中使用多个Get-AdComputer条件。我建议使用-match参数,而不是使用-like参数。我不确定Get-AdComputer是否支持-match参数。您可以执行以下操作 -

$computer = Get-ADComputer -properties OperatingSystem -filter 'operatingsystem -like "*Windows 7*" -or operatingsystem -like "*Windows 8*" -or operatingsystem -like "*Windows 10*"' | 

如果您看到Get-Help Get-ADComputer -Examples,则可以看到-filter参数的使用方式。