Скрипт сканирует сеть на наличие хостов, определяет вендора по MAC, определяет некоторые открытые порты, определяет имена хостов.
##################################################### #Сканирование диапозона хостов сети #14.01.2016 Сатин Павел # ##################################################### Function Get-MAC ($IP) { $This_IP=((Get-NetIPConfiguration).IPv4Address).IPv4Address if ($IP -eq $This_IP) { $InterfaceAlias=(Get-NetIPConfiguration).InterfaceAlias $This_HWAddr=(Get-NetAdapter | Where-Object{$_.ifAlias -eq $InterfaceAlias}).MACAddress #$This_HWAddr=(Get-NetAdapter).MACAddress | Select-Object -First 1 $HW_Addr=$This_HWAddr } else { ping -4 -n 1 -w 2000 $IP > $Null $Cmd_Arp_Out=arp -a | Where-Object {$_.Contains("$IP ")} if ($Cmd_Arp_Out -ne $NULL) { $HW_Addr=$Cmd_Arp_Out.Substring(24,17) } } $HW_Addr }#Get-MAC Function Get-DNSName ($IP) { (Resolve-DnsName -Name $IP -ErrorAction SilentlyContinue).NameHost } Function Get-NBTName ($IP) { $NETBIOS_Name="" $NETBIOS_Group="" $Cmd_Nbtstat_Out=nbtstat -A $IP if ( ($Cmd_Nbtstat_Out | Select-String(" <00> ")).Count -gt 0) { $NETBIOS_Name=$Cmd_Nbtstat_Out | Where-Object {$_.Contains("<00> Уникальный")} | Select-Object -First 1 if($NETBIOS_Name -ne $NULL) { $NETBIOS_Name=$NETBIOS_Name.Substring(4,15) $NETBIOS_Group=($Cmd_Nbtstat_Out | Where-Object {$_.Contains("<00> Группа")} | Select-Object -First 1) if($NETBIOS_Group -ne $NULL) { $NETBIOS_Group=$NETBIOS_Group.Substring(4,15) } else { $NETBIOS_Group="-" } } else { $NETBIOS_Name="-" } } else { $NETBIOS_Name="-" $NETBIOS_Group="-" } $NETBIOS_Name #$NETBIOS_Group } Function Get-NBTGroup ($IP) { $NETBIOS_Name="" $NETBIOS_Group="" $Cmd_Nbtstat_Out=nbtstat -A $IP if ( ($Cmd_Nbtstat_Out | Select-String(" <00> ")).Count -gt 0) { $NETBIOS_Name=$Cmd_Nbtstat_Out | Where-Object {$_.Contains("<00> Уникальный")} | Select-Object -First 1 if($NETBIOS_Name -ne $NULL) { $NETBIOS_Name=$NETBIOS_Name.Substring(4,15) $NETBIOS_Group=($Cmd_Nbtstat_Out | Where-Object {$_.Contains("<00> Группа")} | Select-Object -First 1) if($NETBIOS_Group -ne $NULL) { $NETBIOS_Group=$NETBIOS_Group.Substring(4,15) } else { $NETBIOS_Group="-" } } else { $NETBIOS_Name="-" } } else { $NETBIOS_Name="-" $NETBIOS_Group="-" } #$NETBIOS_Name $NETBIOS_Group } Function Get-Vendor ($MAC_Address) { $mymac = $MAC_Address $webrequest = Invoke-WebRequest -Uri "http://www.macvendorlookup.com/api/v2/$mymac/csv" $macvendor = (($webrequest.Content -split '\,')[4] -split '\"')[1] $macvendor } #Get-Vendor function Test-Port { Param( [parameter(ParameterSetName='ComputerName', Position=0)] [string] $ComputerName, [parameter(ParameterSetName='IP', Position=0)] [System.Net.IPAddress] $IPAddress, [parameter(Mandatory=$true , Position=1)] [int] $Port, [parameter(Mandatory=$true, Position=2)] [ValidateSet("TCP", "UDP")] [string] $Protocol ) $RemoteServer = If ([string]::IsNullOrEmpty($ComputerName)) {$IPAddress} Else {$ComputerName}; If ($Protocol -eq 'TCP') { $test = New-Object System.Net.Sockets.TcpClient; Try { #Write-Host "Connecting to "$RemoteServer":"$Port" (TCP).."; $test.Connect($RemoteServer, $Port); #Write-Host "Connection successful"; return $true } Catch { #Write-Host "Connection failed"; return $false } Finally { $test.Dispose(); } } If ($Protocol -eq 'UDP') { Write-Host "UDP port test functionality currently not available." <# $test = New-Object System.Net.Sockets.UdpClient; Try { #Write-Host "Connecting to "$RemoteServer":"$Port" (UDP).."; $test.Connect($RemoteServer, $Port); #Write-Host "Connection successful"; return $true } Catch { #Write-Host "Connection failed"; return $false } Finally { $test.Dispose(); } #> } } #Test-Port Function ScanHost ($IP,$LogFullPath=$Null) { #Определяем порты для сканирования $ports = 22,23,80,161,139,443 $MAC_Address=Get-MAC($IP) $Vendor = Get-Vendor($MAC_Address) if ($MAC_Address -ne $Null) { $NETBIOS_Name=Get-NBTName($IP) $NETBIOS_Group=Get-NBTGroup($IP) $DNS_Name=Get-DNSName($IP) $ScanHostObj = New-Object PSObject $ScanHostObj | Add-Member HW_Address $MAC_Address $ScanHostObj | Add-Member HW_Vendor $Vendor $ScanHostObj | Add-Member IP $IP $ScanHostObj | Add-Member NETBIOS_Name $NETBIOS_Name $ScanHostObj | Add-Member NETBIOS_Group $NETBIOS_Group $ScanHostObj | Add-Member DNS_Name $DNS_Name foreach ($port in $ports) { $strResult = Test-Port -IP $IP -Port $port -Protocol TCP $ScanHostObj | Add-Member $port $strResult } #Отдаем результаты сканирования $ScanHostObj } } #ScanHost #################################### Тело скрипта ############################# #Определяем диапозон сети для сканирования $i1=192 $i2=168 $i3=0 $i4 = 1 $i5 = 254 #Массив результатов $a = @() $strIP = "$i1.$i2.$i3.$i4" $prcComplete = 0 Write-Progress -Activity "Работаю..." -PercentComplete $prcComplete -CurrentOperation "$prcComplete% complete" -Status "Сканируется хост: $strIP" For ($i4; $i4 -le $i5; $i4++) { $strIP = "$i1.$i2.$i3.$i4" Write-Progress -Activity "Работаю..." -PercentComplete $prcComplete -CurrentOperation "$prcComplete% complete" -Status "Сканируется хост: $strIP" $a += ScanHost($strIP) [int]$prcComplete = $i4 / $i5 * 100 Write-Progress -Activity "Работаю..." -PercentComplete $prcComplete -CurrentOperation "$prcComplete% complete" -Status "Сканируется хост: $strIP" $a | Format-Table -Property * -AutoSize | Out-String -Width 1024 | Out-File ScanHosts.txt } #Выводим результаты $a | Format-Table -Wrap -AutoSize $a | Format-Table -Property * -AutoSize | Out-String -Width 1024 | Out-File ScanHosts.txt $a | Out-GridView -Title ScanHosts #----- Конец скрипта
Комментариев нет:
Отправить комментарий