Вики IT-KB

Пошаговые руководства, шпаргалки, полезные ссылки...

Инструменты пользователя

Инструменты сайта


powershell:security-audit:powershell-script-for-network-scan-to-find-non-standard-non-administrative-shared-folders-on-computers-and-servers

Powershell скрипт опроса сети для поиска нестандартных сетевых каталогов (исключая административные и служебные)

Иногда требуется провести аудит локальной сети на предмет наличия на компьютерах пользователей и серверах общих сетевых каталогов, не учитывая при этом какие-то служебные и стандартные административные сетевые каталоги. Здесь представлен вариант Powershell-скрипта, который решает данную задачу.

Скрипт сканирует указанный в первых двух переменных диапазон IP-адресов. В переменной $ShareNameExclusions перечислены исключения имён сетевых шар, которые нужно игнорировать при обработке результата сканирования. Обнаружив в сканируемом диапазоне доступный хост, скрипт выполняет проверку доступности порта TCP 139 и, в случае успешного ответа, выполняет удалённый анонимный опрос всех сетевых шар, в том числе и скрытых (со знаком $).

Network-Scan-for-SMB-Shares.ps1
[System.Net.IPAddress]$StartScanIP = "10.1.0.1"
[System.Net.IPAddress]$EndScanIP =   "10.2.254.254"
[string]$ShareNameExclusions = "^ADMIN$*|^IPC$*|^print$*|^[A-Z]\`$"
#
$Watch = [System.Diagnostics.Stopwatch]::StartNew()
$Watch.Start()
#
$ScanIPRange = @() 
if($EndScanIP -ne $null) 
{
  $StartIP = $StartScanIP -split '\.' 
  [Array]::Reverse($StartIP)   
  $StartIP = ([System.Net.IPAddress]($StartIP -join '.')).Address  
  #               
  $EndIP = $EndScanIP -split '\.' 
  [Array]::Reverse($EndIP)   
  $EndIP = ([System.Net.IPAddress]($EndIP -join '.')).Address  
  #               
  For ($x=$StartIP; $x -le $EndIP; $x++) {     
      $IP = [System.Net.IPAddress]$x -split '\.' 
      [Array]::Reverse($IP)    
      $ScanIPRange += $IP -join '.'  
  }
} 
  else 
{ 
 $ScanIPRange = $StartScanIP 
} 
 
Workflow Network-Scan{
 param($ippool,$exclusions)    
 $WFResult = @()
 foreach -parallel -throttlelimit 50 ($ip in $ippool)
 {
   $ItemReturn = inlinescript
   {
      [array]$ResultArray = ""
 
      If (Test-Connection -Computername $USING:ip -BufferSize 16 -Count 1 -Quiet) {
      If (Test-NetConnection -Computername $USING:ip -Port 139 -InformationLevel Quiet) {
 
      $Response = (net view $USING:ip /all 2>$null | Where-Object { $_ -match '\sDisk\s' }) `
                   -replace '\s\s+', ',' | ForEach-Object{ ($_ -split ',')[0] }
       ForEach($Line in $Response) {
         If ($Line -notmatch $USING:exclusions) {
            $ResultArray = $ResultArray + $Line
         }
       }
       $ResultArray = $ResultArray | ? {$_}    
 
        If ($ResultArray) {
             try{
                $hName = [System.Net.Dns]::GetHostByAddress($USING:ip).HostName
             } 
             catch{
                $hName = " - "
             }
             $Item = New-Object System.Object
             $Item | Add-Member -MemberType NoteProperty -Name "SrvIP" -Value $USING:ip
             $Item | Add-Member -MemberType NoteProperty -Name "SrvName" $hName
             $Item | Add-Member -MemberType NoteProperty -Name "Shares" $ResultArray
             return $Item
        }
       }
       }           
    } #inlinescript
    $WORKFLOW:WFResult += $ItemReturn
  }
 return $WORKFLOW:WFResult
}
 
$Result = Network-Scan $ScanIPRange $ShareNameExclusions
 
$Result | Sort-Object Version,SrvIP,Status | `
  Format-Table -GroupBy Version -Wrap -Autosize `
  @{Name="Host IP address";Expression = { $_.SrvIP }; Alignment="Center"},
  @{Name="Host name from DNS";Expression = { $_.SrvName }; Alignment="Center"},
  @{Name="Shares List";Expression = { $_.Shares -join ' , ' };Alignment="Left"}
 
Write-Host $Result.Count "hosts found on network range " $StartScanIP "-" $EndScanIP
$Watch.Stop()
Write-Host "Script time:" $Watch.Elapsed

Проверено на следующих конфигурациях:

Версия ОС Версия Powershell
Windows Server 2012 R2 Standard EN (6.3.9600) Windows PowerShell 4.0

Автор первичной редакции:
Алексей Максимов
Время публикации: 04.05.2018 09:02

Обсуждение

Ваш комментарий:
 

powershell/security-audit/powershell-script-for-network-scan-to-find-non-standard-non-administrative-shared-folders-on-computers-and-servers.txt · Последние изменения: 04.05.2018 13:27 — Алексей Максимов