过滤Get-ADComputer,在Powershell中“Name-notlike”

时间:2018-02-21 13:43:29

标签: windows powershell active-directory

我的目标是获取AD计算机对象的列表,而不遵循使用whenCreated属性的命名约定。我正在尝试使用以下PowerShell函数导出HTML文件:

function get_bad_names
{
$result = Get-ADComputer -searchbase $OU
-Filter {Name -notlike 'name1' -and 
         Name -notlike 'name2' -and
         Name -notlike 'name3'} 
-Properties whenCreated | sort whenCreated

$result | ConvertTo-Html | Out-File $dir\badnames.html
}

get_bad_names

是否有更优雅的方式来构建Name过滤行?我们有超过40行不同的“名字”。换句话说,我的剧本中有超过40行代表Name -notlike 'name#' -and

理想情况下,我希望代码从文本文件中读取并导出相同的结果。

仅供参考:此功能有效,但理想情况并非如此。任何建议,将不胜感激。

4 个答案:

答案 0 :(得分:1)

如果您要过滤查询,请构建LDAP过滤器:

# Define the names to exclude
$NamesToExclude = "Name1","Name2","Name3"
# Turn them into LDAP clauses in the form of "(!(Name=Name1))"
$LDAPClauses = $NamesToExclude |ForEach-Object {
    '(!(Name={0}))' -f $_
}
# Create a single query filter string with all the clauses from above
$LDAPFilter = "(&$LDAPClauses)"

$result = Get-ADComputer -LDAPFilter $LDAPFilter -SearchBase $OU -Properties whenCreated |Sort-Object whenCreated

答案 1 :(得分:0)

您可以使用Select-Object使用正则表达式进行过滤,但是您应该使用-filter *获取OU中的所有计算机,这可能会使您的网络紧张。我会进行过滤,如果需要更多属性,请仅为匹配项再次运行Get-Computer

Get-ADComputer -searchbase $OU -Filter * |
? { $_.name -match "name\d{1,2}" } | # Match if string "name" is followed one or two digits
Get-ADComputer -property * # Get all properties for the computers if needed

答案 2 :(得分:0)

  

是否有更优雅的方式来构建Name过滤器行?

不完全是。当您在ActiveDirectory模块中使用命令的-Filter参数时,您有一组相当有限的运算符,因为它必须将它们全部转换为LDAP过滤器。

但是,您可以这样做:

$ExcludedPatterns = 'Name1', 'Name2', 'Name3'
$ComputerFilter = foreach ($Pattern in $ExcludedPatterns) { "(Name -notlike '$Pattern')" }
$ComputerFilter = $ComputerFilter -join ' -and '
Get-ADComputer -Filter $ComputerFilter

现在您可以维护名称模式列表。

请记住,ActiveDirectory命令中的-Filter属性是一个ScriptBlock。它们都是字符串,尽管有这些命令的文档,但它们应该以这种方式编写。将它们写为ScriptBlocks最终会导致变量扩展问题。

比较

$ComputerName = hostname
Get-ADComputer -Filter "Name -eq '$ComputerName'"
Get-ADComputer -Filter { Name -eq '$ComputerName' }

答案 3 :(得分:0)

感谢大家的反馈。回应的速度让我印象深刻。

我能够使用从文本文件中读取的正则表达式来实现我的目标。

我的代码现在看起来像这样:

[regex]$Expression = Get-Content $dir\regex.txt

function get_bad_names
{
$result = Get-ADComputer -searchbase $OU 
-Filter {Enabled -eq $true} 
-Properties whenCreated | Where-Object {$_.Name -notmatch $Expression}| sort whenCreated

$result | ConvertTo-Html | Out-File $dir\badnames.html
}

get_bad_names