我的目标是获取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
理想情况下,我希望代码从文本文件中读取并导出相同的结果。
仅供参考:此功能有效,但理想情况并非如此。任何建议,将不胜感激。
答案 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