在Get-ADComputer中排序

时间:2020-11-06 13:28:50

标签: powershell active-directory


我不擅长Powershell,所以我向社区寻求帮助。
任务是按不同文件过滤Get-ADComputer输出。按属性IPv4Address排序。在文件本身中,您需要查看所有具有排序的IPv4Address + Measure-Object输出的对象。
例子。\

SAD-MAZINA                                                                                          192.168.8.172                                                                                      
SAD-DISPETCHER                                                                                      192.168.8.173                                                                                      
SAD-POHORSKA                                                                                        192.168.8.179                                                                                      
SAD-PROPUSKA                                                                                        192.168.8.181                                                                                      
SAD-DERADMIN1                                                                                       192.168.8.182                                                                                      
SAD-LIZUNKINA                                                                                       192.168.8.184                                                                                      
SAD-CHEGLAKOV                                                                                       192.168.8.33                                                                                       
184-DSKTP                                                                                           192.168.8.34                                                                                       
LAPTOP-1                                                                                            192.168.8.35                                                                                       
SAD-MAKAROVA                                                                                        192.168.8.50
All                                                                                                 10

起初,我尝试使用 foreach if 构造自己实现它,但是没有足够的知识来完成任务。任何帮助,谢谢!
例子。\

$regex = [Regex]"192.168.0.*"

$scan = Get-ADComputer -Filter * -ResultPageSize 0 -Prop CN,lastLogonTimestamp,IPv4Address |
Where {[datetime]::FromFileTime($_.lastLogonTimestamp) -ge (Get-Date).AddDays(-30)} | Sort-Object -Property IPv4Address | FT CN,IPv4Address
foreach ($onepc in $scan){

if ($onepc = $regex){
out-file -filepath C:\comps192.168.csv
}
}

1 个答案:

答案 0 :(得分:2)

根据我的评论,您的代码有很多错误。

您正在定义一个正则表达式,它实际上是一个通配符字符串。稍后,您可以使用赋值运算符=

将IP地址与此“ regex”进行比较

通过使用| FT CN,IPv4Address,变量$ scan将包含一个字符串数组,而不是创建有效CSV文件所需的对象数组

尝试

$ipRange = "192.168.0.*"
$refDate = (Get-Date).AddDays(-30).Date  # set time part to all 0, so this date is midnight
$scan = Get-ADComputer -Filter * -Properties CN,LastLogonDate,IPv4Address |
        Where {$_.LastLogonDate -ge $refDate -and $_.IPv4Address -like $ipRange} | 
        Sort-Object -Property @{Expression = {[int]($_.IPv4Address.Split(".")[-1])}}

# output to console
$scan | Format-Table -AutoSize

# output to CSV
$scan | Export-Csv -Path 'C:\comps192.168.csv' -NoTypeInformation

Sort-Object -Property @{Expression = {[int]($_.IPv4Address.Split(".")[-1])}}行使用计算所得的属性进行排序。在这种情况下,最后一个IP地址字节的整数值。这样,IP 192.186.0.2将在192.168.0.11之前排序,而如果您对ip 字符串进行排序,则结果将相反。
另外,使用Get-ADComputer,您可以请求属性LastLogonDate,它是已经转换为(本地)DateTime对象的lastLogonTimeStamp的值。


修改

如果正如您所评论的那样,如果您的目的是测试IP地址是否在某个子网内,则可以使用以下帮助功能

function Test-IsIPv4InSubnet ([string]$IpAndCidr, [string]$IpAddress) {
    $network, [int]$subnetlen = $IpAndCidr.Split('/')
    $a = [uint32[]]$network.split('.')
    [uint32] $unetwork = ($a[0] -shl 24) + ($a[1] -shl 16) + ($a[2] -shl 8) + $a[3]

    $subnetlen = [Math]::Min([Math]::Max([Math]::Abs($subnetlen), 0), 32)
    $mask = (-bnot [uint32]0) -shl (32 - $subnetlen)

    $a = [uint32[]]$IpAddress.split('.')
    [uint32] $uip = ($a[0] -shl 24) + ($a[1] -shl 16) + ($a[2] -shl 8) + $a[3]

    return ($unetwork -eq ($mask -band $uip))
}

将其放置在脚本顶部后,代码可以像这样:

$ipSubnet = "192.168.0.0/24"
$refDate = (Get-Date).AddDays(-30).Date  # set time part to all 0, so this date is midnight
$scan = Get-ADComputer -Filter * -Properties CN,LastLogonDate,IPv4Address |
        Where {$_.LastLogonDate -ge $refDate -and (Test-IsIPv4InSubnet $ipSubnet $_.IPv4Address)} | 
        Sort-Object -Property @{Expression = {[int]($_.IPv4Address.Split(".")[-1])}}

# output to console
$scan | Format-Table -AutoSize

# output to CSV
$scan | Export-Csv -Path 'C:\comps192.168.csv' -NoTypeInformation
相关问题