我正在尝试按名称筛选ADC计算机。
我们的命名约定如下<CuntryCode>-<Location>-<DeviceType And Number>
我们在美国和墨西哥都有不同的位置,我们也有几种类型的设备
示例:<Device Type>
Servers = S
Desktops = D
Laptops = L
Tablet = T
Routers = R
Switches = U
实际命名示例:
MX-BCN-D002或US-TAM-L001
我正在创建一个脚本,它将查看远程PC文件系统,并检查用户是否有本地文件系统。PST文件。我只想要类型为:台式机和笔记本电脑的设备,但似乎无法创建过滤所有其他设备类型的条件
部分脚本:
$Enabled_PC_list =@()
$Enabled_Online_PC_List =@()
# $Enabled_Offline_PC_list =@()
$data = @()
$PCs = Get-ADComputer -filter "Enabled -eq '$true'" -SearchBase "DC=some,DC=domain" -properties name | Select-Object -ExpandProperty name
$Enabled_PC_list += $PCs
foreach($device in $Enabled_PC_list){
Write-Output ">>> testing Device: $device <<<"
if ($device -like "*-*-D*" -or $device -like "*-*-L*" ) {
if(Test-Connection -TargetName $device -Count 1 -Quiet){
$Enabled_Online_PC_List += $device
}
}else{
Write-Output "Device $device not valid "
}
}
}
因此,通过这条线路if ($device -like "*-*-D*" -or $device.name -like "*-*-L*" )
,我希望过滤掉所有与我想要的相匹配的设备,并在这些设备上进行测试连接。
我需要使用regex吗
如何在powershell中使用regex?有更好的方法吗?
您可以让Active Directory为您进行筛选,而不是从您这边进行筛选,从而更好地做到这一点。您可以通过字符串操作生成LDAP筛选器,为每种设备类型添加LDAP子句:
$filter = '(&(!userAccountControl:1.2.840.113556.1.4.803:=2)(|'
'S', 'D', 'L', 'T', 'R', 'U' | ForEach-Object {
$filter += '(name=*-*-{0}*)' -f $_
}
$filter += '))'
$onlinePCs = Get-ADComputer -LDAPFilter $filter -SearchBase "DC=some,DC=domain" | Where-Object {
Test-Connection -TargetName $_.DNSHostName -Count 1 -Quiet
}
生成的LDAP筛选器如下所示(带有一些格式(:
(&
(!userAccountControl:1.2.840.113556.1.4.803:=2)
(|
(name=*-*-S*)
(name=*-*-D*)
(name=*-*-L*)
(name=*-*-T*)
(name=*-*-R*)
(name=*-*-U*)
)
)
并且可以读取为,所有启用的对象(在这种情况下是计算机,因为我们使用的是Get-ADComputer
(,其Name属性类似于*-*-S*
、*-*-D*
或*-*-L*
,依此类推
阅读您的回复,我开始思考,如果LDAP可以进行过滤,powershsell能做到吗?所以我试了一下,它能自动识别
where子句起了作用Where-Object {$_.Name -like "*-*-D*" -or $_.Name -like "*-*-L*" -or $_.Name -like "*-*-T*"}
$Enabled_Online_PC_List =[System.Collections.ArrayList]@()
$Enabled_Offline_PC_list =[System.Collections.ArrayList]@()
# $data = @()
$searchBase = "OU=USA,DC=some,DC=domain"
$Enabled_PC_list = Get-ADComputer -filter "Enabled -eq '$true'" -SearchBase $searchBase -properties name | Where-Object {$_.Name -like "*-*-D*" -or $_.Name -like "*-*-L*" -or $_.Name -like "*-*-T*"} | Select-Object -ExpandProperty name
foreach($device in $Enabled_PC_list){
# Write-Output "testing now $device"
if(Test-Connection -ComputerName $device -Count 1 -Quiet){
Write-Output " Now Adding $device to Enabled_Online_PC-List"
$Enabled_Online_PC_List.Add($device)
}else{
Write-Output " Now Adding $device to Enabled_Offline_PC_list"
$Enabled_Offline_PC_list.Add($device)
}
}
Write-Output $Enabled_Online_PC_List
所以剧本的工作时间被戏剧性地缩短了,现在我又问有更好的方法吗?出于某种原因,LDAP不想停留在我的脑海中