DeisGood
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору 'Скрипт очистки DHCP сервера, от андроид и прочих устройства 'Протестирован на ОС: Windows 2008R2 'Автор скрипта: blackrodger@yandex.ru icq:310296194 'Скрипт производит очистку методом выгрузки клиентов заданной области DHCP в файл, ' выборкой и последующим удалением, с использованием команд: ' netsh dhcp server scope ID_SCOPE show clients 1 ' netsh dhcp server scope ID_SCOPE delete lease IP_Clients '=========================================================================================================================' ' БЛОК НАСТРОЕК. РЕДАКТИРУЕТСЯ АДМИНИСТРАТОРОМ ПОД МЕСТНЫЕ УСЛОВИЯ ' '=========================================================================================================================' '======================================= Блок входных параметров: Файловая система.=======================================' AllScp = "192.168.0.0" 'задаем область(области) dhcp для очистки. При наличии нескольких областей указывать через 'запятую, например "192.168.0.0,10.103.4.0,....,10.202.245.000" DevMask = "android,galaxy,honor,ipad,iphone,miphone,redmi" 'маска(маски) поиска в именах устройств DHCP подлежащие 'удалению. Перечисляем через запятую, например "android,galaxy,.....,ipad" LogFileName = "\Logs\ClearDhcp.log" 'задаем имя файла лога(путь), если оставить пустым файл лога создается 'в папке запуска скрипта с именем %ИмяСкрипта%.log '============================================ Блок параметров работы скрипта. ============================================' DebugLog = 0 'уровень лога '0 - облегченный лог, 1 - полный лог со всеми выполняемыми действиями, LogFile = 1 '0 - выполнямые действия записываются в лог-файл, лог файл пересоздается по новой '1 - выполнямые действия записываются в лог-файл, добавлением в существующий файл лога '2 - лог файл не создается '=========================================================================================================================' ' ***** КОНЕЦ БЛОКА НАСТРОЕК!!! ***** Дальше ничего править не нужно!!!!! ***** ' '=========================================================================================================================' Dim Flog Dim FolderScript Dim Fvygr Dim ScrName Dim KolScp Dim KolMask Dim KolRec 'On Error Resume Next Set objShell = CreateObject("WScript.Shell") Set objFSO = CreateObject("Scripting.FileSystemObject") Set objNet = CreateObject("WScript.Network") 'Блок 0. Опрос параметров необходимых для работы скрипта. 'Определяем папку запуска и имя файла скрипта Set FileScripts = objFSO.GetFile(Wscript.ScriptFullName) FolderScript = objFSO.GetParentFolderName(FileScripts) ScrName = WScript.ScriptName Set FileScripts = Nothing 'Подготовка файла лога ScrFlNm = "\" & Left(ScrName,Len(ScrName) - 3) & "log" ObrFlNm = StrSh(LogFileName) 'определяем имя файла лога If ObrFlNm = 0 OR StrSh(LogFileName) = 4 Then Flog = FolderScript & ScrFlNm If ObrFlNm = 1 Then Flog = LogFileName & ScrFlNm If ObrFlNm = 2 Then Flog = LogFileName If ObrFlNm = 3 Then Flog = FolderScript & "\" & LogFileName Flog = Replace(Flog,"\\","\") 'создаем/начинаем запись в файл лога If objFSO.FileExists(Flog) and LogFile = 0 Then objFSO.DeleteFile(Flog) If Logfile < 2 Then If Not objFSO.FileExists(Flog) Then Set lf = objFSO.CreateTextFile(Flog, True) lf.WriteLine("Файл лога очистки DHCP. Создан " & Cdate(Now) & VbLf) lf.Close End If Set lf = objFSO.OpenTextFile(Flog, 8) lf.WriteLine ("Запуск процедуры очистки. " & Cdate(Now)) If StrSh(LogFileName) = 4 Then lf.WriteLine("Ошибка в параметре имени файла лога (LogFileName)." & VbLf) lf.Close End If 'Производим проверку корректности указанных областей и маски поиска, определяем количество заданных параметров. KolScp = StrFnd(AllScp,0,0,0) 'получим количество заданных областей KolMask = StrFnd(DevMask,1,0,0) 'получим количество заданных элементов маски RecLog "Задано " & KolScp & " областей для очистки, количество фильтров: " & KolMask & "." , 0 'Блок 1. Выгрузка, обработка и очистка по заданным маскам. WrkDhcp 0 'выгружаем области WrkDhcp 1 'производим очистку по заданным маскам. GoodBye '============================================================================= 'Функции '============================================================================= 'Функция обработки параметра пути файла лога: 'определяет что прописанно в переменной, создает требуемую структуру каталогов если не было 'передаваемые параметры: 'St - строка для обработки 'Возвращает: 0-путь не указан, 1-указано имя диска, 2-указан полный путь с именем файла '3-указано только имя файла, 4-ошибка в параметре, используется стандартное имя. Function StrSh(St) LogFileName = Trim(Replace(St,"/","\")) If St = "" Then StrSh = 0 Else If Mid(St,2,1) = ":" Then StrSh = 1 'ищем имя диска If Len(St)>4 And Mid(Right(St,4),1,1) = "." And StrSh = 1 Then StrSh = 2 'ищем полный путь If Len(St)>4 And Mid(Right(St,4),1,1) = "." And Not StrSh = 2 Then StrSh = 3 'ищем имя файла If StrSh = "" Then StrSh = 4 'переменная записана с ошибкой, используем как пустую If StrSh = 1 And Not objFSO.FolderExists(St) Then objFSO.CreateFolder(St) 'создаем папку если нет If StrSh = 2 Or StrSh = 3 Then FlNm = Left(St,InStrRev(St,"\")) If Not Mid(St,2,1) = ":" Then FlNm = Replace(FolderScript & "\" & FlNm,"\\","\") If Not objFSO.FolderExists(FlNm) Then objFSO.CreateFolder(FlNm) End If End If End Function 'Функция обработки параметров области (AllScp) или маски поиска(DevMask): 'поэлементный разбор строк параметров областей или маски поиска 'передаваемые параметры: 'St - строка для обработки 'TipPar - тип параметра: 0-области, 1-маски 'TipFind - тип поиска, возможные значения: ' 0-определение общего количества элементов в параметре ' 1-запрос определённого элемента с заданым номером (NumF) 'NumF - номер элемента 'Возвращает в зависимости от TipFind количество элементов, либо заданный элемент из списка, 'либо прерывает выполнение скрипта если в одном из указанных диапазонов будет обнаружена ошибка Function StrFnd(St,TipPar,TipFind,NumF) arrStrFind = Split(St, ",") RazMass = UBound(arrStrFind) If Not (KolScp > 0 And KolMask > 0) Then If TipPar = 0 Then StrQ = "области" Else StrQ = "маски" If RazMass = -1 Then 'если параметр пустой завершаем работу msb = "Неверно указан параметр " & StrQ & ". Дальнейшее выполнение скрипта невозможно." RecLog msb, 0 GoodBye End If 'проверяем корректность указанных областей If TipPar = 0 Then On Error Resume Next For i=0 To RazMass ElObl = Split(arrStrFind(i), ".") RazEl = UBound(ElObl) msb = "Неверно указана область ''" & arrStrFind(i) & "''. Дальнейшее выполнение скрипта невозможно." If RazEl = 3 Then For y=0 To RazEl If Not ElObl(y)<= 255 Or Not ElObl(3) = 0 Or Err.Number <> 0 Then RecLog msb, 0 GoodBye End If Next Else RecLog msb, 0 GoodBye End If Next On Error Goto 0 End If End If If TipFind = 0 Then StrFnd = RazMass + 1 Else StrFnd = Trim(arrStrFind(Numf)) End Function '============================================================================= 'Процедуры '============================================================================= 'Процедура закрытия скрипта с сохранением файла лога (если задано) Sub GoodBye () RecLog "Все операции завершены. Скрипт закрывается. " & Cdate(Now) & VbLf, 0 Set objShell = Nothing Set objFSO = Nothing Set objNet = Nothing WScript.Quit End Sub 'Процедура записи в файл лога 'передаваемые параметры: 'msb - текст сообщения 'dl - приоритетность отображения в логе Sub RecLog (msb,dl) If Logfile < 2 And dl <= DebugLog Then Set lf = objFSO.OpenTextFile(Flog, 8) lf.WriteLine (msb) lf.Close End If End Sub 'Процедура выгрузки/удаления по маске списка арендованых адресов Dhcp: 'передаваемые параметры: 'TipWrk - параметры работы с файлом выгрузки: ' 0-выгрузка области в файл, ' 1-поиск и удаление по маске, Sub WrkDhcp(TipWrk) For i=0 To KolScp - 1 TekObl = StrFnd(AllScp,0,1,i) If Not objFSO.FolderExists(FolderScript & "\Scope") Then objFSO.CreateFolder(FolderScript & "\Scope") FileScope = FolderScript & "\Scope\Scope" & Replace(TekObl,".","") & ".csv" If TipWrk = 0 Then 'выгружаем область в файл If objFSO.FileExists(FileScope) Then objFSO.DeleteFile(FileScope) objShell.Run "cmd /c netsh dhcp server scope " & TekObl & " show clients 1 >" & FileScope, 0, true RecLog "Выгружена область: " & TekObl & " в файл " & FileScope & "." , 0 ElseIf TipWrk = 1 Then 'производим поиск и удаление по маске KolRec = 0 ' обнулим счётчик удаленных записей для текущей области Set FlWrk = objFSO.OpenTextFile(FileScope, 1) Do Until FlWrk.AtEndOfStream 'обрабатываем выгруженные записи TekStr = FlWrk.ReadLine For y=0 To KolMask - 1 TekMask = StrFnd(DevMask,1,1,y) Fn = InStr(1,TekStr,TekMask,1) If Fn > 0 Then ClrIp = Trim(Left(TekStr,(InStr(TekStr," ")))) objShell.Run "cmd /c netsh dhcp server scope " & TekObl & " delete lease " & ClrIp, 0, true RecLog "Удален IP " & ClrIp & ". Запись DHCP: " & TekStr , 1 KolRec = KolRec + 1 End If Next Loop FlWrk.Close Set FlWrk = Nothing RecLog "Согласно заданых масок в области " & TekObl & " удалено " & KolRec & " записей." , 0 End If Next End Sub |