Advertisement
k-f

Windows - Get-DHCP-State.ps1

k-f
Jun 7th, 2011
275
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #© Kirill 'kf' Nikolaev, 2011
  2. # Все вопросы по скрипту: E-mail/Live: kf@animasub.ru, ICQ: 5181158
  3.  
  4. #Сбор статистики с DHCP-серверов. Т.к. в Windows 2003 нет нормального способа сделать это, используется разбор вывода утилиты netsh.
  5. #Из-за этого, скрипт языкозависимый. Тем не менее я реализовал поддержку как русского, так и английского языков.
  6.  
  7. $LogFile = "C:\Scripts\Get-DHCP-State.txt" #Выходной файл
  8. $Domain = 'example\.com' #DNS-имя домена, в котором искать DHCP-сервера
  9.  
  10. $OSCode = Get-WmiObject Win32_OperatingSystem -ErrorAction continue | foreach {$_.oslanguage}
  11. $OSCode = 'L' + $OSCode #Простейший способ изменения типа на строку.
  12. $LangRows = @{ #Массив для локализованных строк. Вы можете, разумеется, легко и просто добавить собственные языки.
  13.     'L1033' = @{ #English
  14.         Row1 = 'Subnet'
  15.         Row2 = 'No\.\sof\sAddresses\sin\suse'
  16.         Row3 = 'No\.\sof\sfree\sAddresses'
  17.     };
  18.     'L1049' = @{ #Russian
  19.         Row1 = 'Подсеть'
  20.         Row2 = 'Число\sиспользуемых\sадресов'
  21.         Row3 = 'Число\sсвободных\sадресов'
  22.     }
  23. }
  24.  
  25. Clear-Content $LogFile
  26. Add-Content $LogFile 'Server;Subnet;Mask;IP Range Start;IP Range End;Reserved IPs;Exclude Ranges;Used IPs;Used IPs w/o reserved;Free IPs'
  27.  
  28. $DHCPList = netsh dhcp show server
  29. $DHCPArray = $DHCPList -match "\[[\w\.\-]*" + $Domain + "\]"
  30. $i = 0
  31. ForEach ($DHCPServer in $DHCPArray) {
  32.     $DHCPServer -match "[\w\.\-]*" + $Domain
  33.     $DHCPArray[$i] = $Matches[0]
  34.     $i=$i+1
  35. }
  36. foreach ($DHCPServer in $DHCPArray) {
  37.     $Counter = 0
  38.     $Subnets = @()
  39.     $IPInUse = @()
  40.     $IPFree = @()
  41.     $DHCPServerStat = netsh dhcp server \\$DHCPServer show mibinfo
  42.     $DHCPServerStat |where{$_ -match $LangRows.$OSCode.Row1 + '\s=\s([\d\.]*)\.'}|foreach{$Subnets += $matches[1]}
  43.     $DHCPServerStat |where{$_ -match $LangRows.$OSCode.Row2 + '\s=\s(\d*)'}|foreach{$IPInUse += $matches[1]}
  44.     $DHCPServerStat |where{$_ -match $LangRows.$OSCode.Row3 + '\s=\s(\d*)'}|foreach{$IPFree += $matches[1]}
  45.     While ($Counter -ne $Subnets.Length) {
  46.         $LogLine = $DHCPServer + ';' + $Subnets[$Counter] + ';' #+ $IPInUse[$Counter] + ';' + $IPFree[$Counter] + ';'
  47.         $SubnetIPReserved = @()
  48.         $Counter2 = 0
  49.         #Начинаем получать маску
  50.         $SubnetsStat = netsh dhcp server \\$DHCPServer show scope
  51.         $SubnetsStat |where{$_ -match $Subnets[$Counter] + '\s+-\s+([\d\.]*)'}
  52.         $Mask = $matches[1]
  53.         $LogLine = $LogLine + $Mask + ';'
  54.         #Закончили получать маску
  55.         #Начинаем получать IP Range
  56.         $SubnetIPRangesStat = netsh dhcp server \\$DHCPServer scope $Subnets[$Counter] show iprange
  57.         $SubnetIPRangesStat |where{$_ -match '([\d\.]+)\s+-\s+([\d\.]+)'}
  58.         $SubnetIPRangeStart = $Matches[1]
  59.         $SubnetIPRangeEnd = $Matches[2]
  60.         $LogLine = $LogLine + $SubnetIPRangeStart + ';' + $SubnetIPRangeEnd + ';'
  61.         #Закончили получать IP Range
  62.         #Начали получать Reserved IPs
  63.         $SubnetIPReservedStat = netsh dhcp server \\$DHCPServer scope $Subnets[$Counter] show reservedip
  64.         $SubnetIPReservedStat |where{$_ -match '([\d\.]+)\s+-\s+'}|foreach{$SubnetIPReserved +=$matches[1]}
  65.         While ($Counter2 -ne $SubnetIPReserved.Length) {
  66.             $LogLine = $LogLine + ',' + $SubnetIPReserved[$Counter2]
  67.             $Counter2 = $Counter2 + 1
  68.         }
  69.         $LogLine = $LogLine + ';'
  70.         $SubnetIPReservedStat |where{$_ -match '\w+:\s(\d+)\s\w+'}
  71.         $SubnetIPReservedNum = $Matches[1]
  72.         #Закончили получать Reserved IPs
  73.         #Начали получать Exclude Range
  74.         $SubnetExcludeRangesStat = netsh dhcp server \\$DHCPServer scope $Subnets[$Counter] show excluderange
  75.         $SubnetExcludeRangesStat |where{$_ -match '([\d\.]+)\s+-\s+([\d\.]+)'}|foreach{$LogLine = $LogLine + ',' + $Matches[1] + '-' + $Matches[2]}
  76.         $LogLine = $LogLine + ';'
  77.         #Закончили получать Exclude Range
  78.         $IpInUseClear = $IPInUse[$Counter]-$SubnetIPReservedNum
  79.         $LogLine = $LogLine + $IPInUse[$Counter] + ';' + $IpInUseClear + ';' + $IPFree[$Counter]
  80.         Add-Content $LogFile $LogLine
  81.         $Counter = $Counter + 1
  82.     }
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement