获取AD计算机不像专有名称

时间:2020-08-04 16:11:06

标签: windows powershell active-directory

我正在尝试从AD获取计算机列表,其中不包括不再使用的计算机。 这是我的代码:

$ServerList = Get-ADComputer -Filter * | Where { 
    $_.DistinguishedName -like "*Computers*" -and $_.DistinguishedName -notlike @("*server1*","*Server2*")
} | Select-Object Name 

我试图将要排除的计算机放入阵列中,而不是使用

-and $_.DistinguishedName -notlike "*serverIwantToExclude*"

你们能告诉我如何修改它吗?

3 个答案:

答案 0 :(得分:2)

-notlike不支持右侧(RHS)的集合。一种类似的预期方法是使用-notmatch,它是一个正则表达式字符串:

$ServerList = Get-ADComputer -Filter * |
    Where { $_.DistinguishedName -like "*Computers*" -and $_.DistinguishedName -notmatch 'server1|Server2'} |
        Select-Object Name

如果您希望服务器名称首先出现在列表中,则可以从中创建一个正则表达式字符串。

$serverdown = 'server1','server2'
$regex = $serverdown -join '|'
$ServerList = Get-ADComputer -Filter * |
    Where { $_.DistinguishedName -like "*Computers*" -and $_.DistinguishedName -notmatch $regex} |
        Select-Object Name

如果不锚定正则表达式字符串,它将在目标字符串中的任何位置(有效地带有通配符)查找正则表达式匹配项。 |是一种替代形式(有效的OR)。

还有其他一些支持集合的运算符,例如-contains-in-notin-notcontains。但是,它们必须完全匹配并且不能使用通配符。

答案 1 :(得分:0)

如果知道要排除的服务器的全名,则可以使用-inotin运算符,这意味着您不能在-inotin运算符中使用通配符或正则表达式。如果是这种情况,并且您知道我建议使用Name对象的ADComputer属性的名称。

[string[]] $excludedServers = 'server1','server2'

$ServerList = Get-ADComputer -Filter * | Where { 
    $_.DistinguishedName -like "*Computers*" -and $_.Name -inotin $excludedServers 
} | Select-Object Name 

答案 2 :(得分:0)

排除它们的另一种方法是将所有这些计算机添加到一个组并将其排除

#提供组的DN

$ groupname =“ CN = groupname,OU = Groups,DC = Domain,DC = COM”

get-adcomputer -filter {(OperatingSystem -like“ Windows ”)} |属性* | ?{([string] $ _。memberof -notmatch $ groupname)} |选择名称,lastlogondate