Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #© Kirill 'kf' Nikolaev, 2011
- # Все вопросы по скрипту: E-mail/Live: kf@animasub.ru, ICQ: 5181158
- #Сбор статистики с DHCP-серверов. Т.к. в Windows 2003 нет нормального способа сделать это, используется разбор вывода утилиты netsh.
- #Из-за этого, скрипт языкозависимый. Тем не менее я реализовал поддержку как русского, так и английского языков.
- $LogFile = "C:\Scripts\Get-DHCP-State.txt" #Выходной файл
- $Domain = 'example\.com' #DNS-имя домена, в котором искать DHCP-сервера
- $OSCode = Get-WmiObject Win32_OperatingSystem -ErrorAction continue | foreach {$_.oslanguage}
- $OSCode = 'L' + $OSCode #Простейший способ изменения типа на строку.
- $LangRows = @{ #Массив для локализованных строк. Вы можете, разумеется, легко и просто добавить собственные языки.
- 'L1033' = @{ #English
- Row1 = 'Subnet'
- Row2 = 'No\.\sof\sAddresses\sin\suse'
- Row3 = 'No\.\sof\sfree\sAddresses'
- };
- 'L1049' = @{ #Russian
- Row1 = 'Подсеть'
- Row2 = 'Число\sиспользуемых\sадресов'
- Row3 = 'Число\sсвободных\sадресов'
- }
- }
- Clear-Content $LogFile
- 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'
- $DHCPList = netsh dhcp show server
- $DHCPArray = $DHCPList -match "\[[\w\.\-]*" + $Domain + "\]"
- $i = 0
- ForEach ($DHCPServer in $DHCPArray) {
- $DHCPServer -match "[\w\.\-]*" + $Domain
- $DHCPArray[$i] = $Matches[0]
- $i=$i+1
- }
- foreach ($DHCPServer in $DHCPArray) {
- $Counter = 0
- $Subnets = @()
- $IPInUse = @()
- $IPFree = @()
- $DHCPServerStat = netsh dhcp server \\$DHCPServer show mibinfo
- $DHCPServerStat |where{$_ -match $LangRows.$OSCode.Row1 + '\s=\s([\d\.]*)\.'}|foreach{$Subnets += $matches[1]}
- $DHCPServerStat |where{$_ -match $LangRows.$OSCode.Row2 + '\s=\s(\d*)'}|foreach{$IPInUse += $matches[1]}
- $DHCPServerStat |where{$_ -match $LangRows.$OSCode.Row3 + '\s=\s(\d*)'}|foreach{$IPFree += $matches[1]}
- While ($Counter -ne $Subnets.Length) {
- $LogLine = $DHCPServer + ';' + $Subnets[$Counter] + ';' #+ $IPInUse[$Counter] + ';' + $IPFree[$Counter] + ';'
- $SubnetIPReserved = @()
- $Counter2 = 0
- #Начинаем получать маску
- $SubnetsStat = netsh dhcp server \\$DHCPServer show scope
- $SubnetsStat |where{$_ -match $Subnets[$Counter] + '\s+-\s+([\d\.]*)'}
- $Mask = $matches[1]
- $LogLine = $LogLine + $Mask + ';'
- #Закончили получать маску
- #Начинаем получать IP Range
- $SubnetIPRangesStat = netsh dhcp server \\$DHCPServer scope $Subnets[$Counter] show iprange
- $SubnetIPRangesStat |where{$_ -match '([\d\.]+)\s+-\s+([\d\.]+)'}
- $SubnetIPRangeStart = $Matches[1]
- $SubnetIPRangeEnd = $Matches[2]
- $LogLine = $LogLine + $SubnetIPRangeStart + ';' + $SubnetIPRangeEnd + ';'
- #Закончили получать IP Range
- #Начали получать Reserved IPs
- $SubnetIPReservedStat = netsh dhcp server \\$DHCPServer scope $Subnets[$Counter] show reservedip
- $SubnetIPReservedStat |where{$_ -match '([\d\.]+)\s+-\s+'}|foreach{$SubnetIPReserved +=$matches[1]}
- While ($Counter2 -ne $SubnetIPReserved.Length) {
- $LogLine = $LogLine + ',' + $SubnetIPReserved[$Counter2]
- $Counter2 = $Counter2 + 1
- }
- $LogLine = $LogLine + ';'
- $SubnetIPReservedStat |where{$_ -match '\w+:\s(\d+)\s\w+'}
- $SubnetIPReservedNum = $Matches[1]
- #Закончили получать Reserved IPs
- #Начали получать Exclude Range
- $SubnetExcludeRangesStat = netsh dhcp server \\$DHCPServer scope $Subnets[$Counter] show excluderange
- $SubnetExcludeRangesStat |where{$_ -match '([\d\.]+)\s+-\s+([\d\.]+)'}|foreach{$LogLine = $LogLine + ',' + $Matches[1] + '-' + $Matches[2]}
- $LogLine = $LogLine + ';'
- #Закончили получать Exclude Range
- $IpInUseClear = $IPInUse[$Counter]-$SubnetIPReservedNum
- $LogLine = $LogLine + $IPInUse[$Counter] + ';' + $IpInUseClear + ';' + $IPFree[$Counter]
- Add-Content $LogFile $LogLine
- $Counter = $Counter + 1
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement