Что нового

[Сеть, интернет] Автоматизация очистки winsock, сброс статич.маршрутов и т.д.

G.FREEMAN

Новичок
Сообщения
13
Репутация
0
Всем привет ;) В программировании я полный 0, но разобраться хочется. В силу специфики своей деятельности, задумал сделать утилитку, при запуске которой, будут выполняться следующие команды:
netsh winsock reset
arp -d *
route delete *
Выставление ip на автомат, на всех сет.адаптерах
Очистка файла hosts

Ну и решил я сделать это без GUI, т.е. запустили и сидим смотрим за процессом. Для примера:
Код:
Run(@SystemDir & '\cmd.exe')
Sleep(2000)
; Для примера, что скрипт начал работу
Send("cd / {ENTER}")
; Основная часть
Sleep(500)
Send("netsh winsock reset  {ENTER}")
Sleep(2000)
Send("arp -d *  {ENTER}")
Sleep(500)
Send("route delete *  {ENTER}")

Тут в принципе проблем нет, возможно, продвинутым скриптописателям не понравится реализация - ну тут уж как есть, я не волшебник (с)
Установка ip на всех сет.картах в dhcp тоже неясно (хотя читал в соседней теме подобную проблему, но не понял...) И как быть с очисткой файла hosts ? Инициировать открытие его, затирание всего что там есть и добавлением только
Код:
127.0.0.1 localhost
с последующим сохранением. В конце всего этого сказочного действа хочу добавить автоматическую перезагрузку, но как - пока не понял.
Может кто от себя еще добавить полезные функции, с комментариями - буду только рад
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
G.FREEMAN [?]
И как быть с очисткой файла hosts ? Инициировать открытие его, затирание всего что там есть и добавлением только 127.0.0.1 localhost с последующим сохранением. В конце всего этого сказочного действа хочу добавить автоматическую перезагрузку, но как - пока не понял.
Удалить файл hosts, и записать новый - самое просто решение
Код:
FileDelete()

Код:
FileOpen()
FileWrite()
FileClose()

Перезагрузка - ищем в справке:
Код:
Shutdown()
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
весь скрипт можно свести к последовательному вызову самих функций непосредственно из AutoIt
Код:
Run(@ComSpec & ' /c "netsh winsock reset && arp -d * && route delete *"')
 
Автор
G

G.FREEMAN

Новичок
Сообщения
13
Репутация
0
Kaster сказал(а):
весь скрипт можно свести к последовательному вызову самих функций непосредственно из AutoIt
Код:
Run(@ComSpec & ' /c "netsh winsock reset && arp -d * && route delete *"')
Спасибо, сразу что-то сам не додумался ))

Вот вопрос остается по файлу хостс, делаю так:
Код:
FileDelete("%windir%\system32\drivers\etc\hosts")

ну и само собой, ничего не происходит, видимо из-за того, что у файла hosts отсутствует расширение
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Код:
FileDelete(@WindowsDir & "\system32\drivers\etc\hosts")

Найдите 10 отличий. Это вам не интерпретатор строк cmd :smile:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
А разве
Код:
@WindowsDir & "\system32"
и
Код:
@SystemDir
не равнозначно?
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Равнозначно :smile:
Но я это для понятности написал
 
Автор
G

G.FREEMAN

Новичок
Сообщения
13
Репутация
0
Код:
FileDelete(@WindowsDir & "\system32\drivers\etc\hosts")
FileOpen(@WindowsDir & "\system32\drivers\etc\hosts", 0)
FileWrite(@WindowsDir & "\system32\drivers\etc\hosts", 0)
FileClose(@WindowsDir & "\system32\drivers\etc\hosts")
FileDelete(@WindowsDir & "\system32\drivers\etc\lmhosts.sam")

Вот таким образом сделал. Правда не уверен, нужно ли делать
Код:
FileClose(@WindowsDir & "\system32\drivers\etc\hosts")


Вопрос по автоматической установке DHCP на все сетевухи остается открытым :(
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
А теперь немного грамматики. Потому что ваша запись в корне неверная и она не будет работать :smile:
Код:
FileDelete(@WindowsDir & "\system32\drivers\etc\hosts")
$hOpen = FileOpen(@WindowsDir & "\system32\drivers\etc\hosts", 2)
FileWrite($hOpen, "127.0.0.1 localhost")
FileClose($hOpen)

Тем более, используя аттрибут 2 в функции FileOpen можно не удалять предварительно файл hosts, т.к. в этом режиме будет стерта первоначальная информация. Но можно и оставить "на всякий пожарный"

G.FREEMAN [?]
Вопрос по автоматической установке DHCP на все сетевухи остается открытым
sad.gif
Вы знаете как это сделать не на autoit?
 
Автор
G

G.FREEMAN

Новичок
Сообщения
13
Репутация
0
Medic84 сказал(а):
А теперь немного грамматики. Потому что ваша запись в корне неверная и она не будет работать :smile:
Код:
FileDelete(@WindowsDir & "\system32\drivers\etc\hosts")
$hOpen = FileOpen(@WindowsDir & "\system32\drivers\etc\hosts", 2)
FileWrite($hOpen, "127.0.0.1 localhost")
FileClose($hOpen)

Тем более, используя аттрибут 2 в функции FileOpen можно не удалять предварительно файл hosts, т.к. в этом режиме будет стерта первоначальная информация. Но можно и оставить "на всякий пожарный"

G.FREEMAN [?]
Вопрос по автоматической установке DHCP на все сетевухи остается открытым
sad.gif
Вы знаете как это сделать не на autoit?
Но у меня же работает, как я написал. Или Вы имеете именно содержимое файла hosts ? Попробую так, как Вы написали, спасибо! :ok:

Medic84 сказал(а):
Вы знаете как это сделать не на autoit?
Только если скриптом, что в теме на пару страниц назад. Т.е. пользователю придется самому тыкать и выбирать статику или дхцп.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
G.FREEMAN
сокращение кода 8)
Код:
$sPath = @WindowsDir & "\system32\drivers\etc\hosts"
FileDelete($sPath)
FileWrite($sPath, "127.0.0.1 localhost")
FileDelete(@WindowsDir & "\system32\drivers\etc\lmhosts.sam")

или как показал Medic84


Добавлено:
Сообщение автоматически объединено:

G.FREEMAN
неплохо бы привести ссылку на эту тему, или предлагаешь перелопатить все в поисках нужной? ;D
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
G.FREEMAN [?]
Вопрос по автоматической установке DHCP на все сетевухи остается открытым
Примерно так:
СКРИПТ ПРИВОДИТ К СБРОСУ СЕТЕВЫХ НАСТРОЕК!
Код:
#include <Array.au3>
RunWait(@ComSpec & ' /c ' & 'netsh interface ip show interfaces > c:\out.txt', '', @SW_HIDE)
$hFile = FileRead('C:\out.txt')
$aInterfaces = StringRegExp($hFile, '(?m)^[\s+\d+]+\s+\w+\s+(.*).$', 3)
Dim $aInt[UBound($aInterfaces) - 1], $iCount = 0
For $i = 0 To UBound($aInterfaces) - 1
	If Not StringInStr($aInterfaces[$i], 'Loopback') Then
		$aInt[$iCount] = _Encoding_866To1251($aInterfaces[$i])
		$iCount += 1
	EndIf
Next
;~ _ArrayDisplay($aInt)
For $j = 0 To UBound($aInt) - 1
	RunWait(@ComSpec & ' /c ' & 'netsh interface ip set address "' & $aInt[$j] & '" dhcp', '', @SW_HIDE)
	RunWait(@ComSpec & ' /c ' & 'netsh interface ip set dns "' & $aInt[$j] & '" dhcp', '', @SW_HIDE)
Next
FileClose($hFile)
FileDelete('C:\out.txt')
;Description: Converts cyrillic string from IBM 866 codepage to Microsoft 1251 codepage
;Author: Latoid
Func _Encoding_866To1251($sString)
	Local $sResult = "", $iCode
	Local $Var866Arr = StringSplit($sString, "")

	For $i = 1 To $Var866Arr[0]
		$iCode = Asc($Var866Arr[$i])

		Select
			Case $iCode >= 128 And $iCode <= 175
				$Var866Arr[$i] = Chr($iCode + 64)
			Case $iCode >= 224 And $iCode <= 239
				$Var866Arr[$i] = Chr($iCode + 16)
			Case $iCode = 240
				$Var866Arr[$i] = Chr(168)
			Case $iCode = 241
				$Var866Arr[$i] = Chr(184)
			Case $iCode = 252
				$Var866Arr[$i] = Chr(185)
		EndSelect

		$sResult &= $Var866Arr[$i]
	Next

	Return $sResult
EndFunc   ;==>_Encoding_866To1251

PS: не тестировал!
 
Автор
G

G.FREEMAN

Новичок
Сообщения
13
Репутация
0
Kaster сказал(а):
неплохо бы привести ссылку на эту тему, или предлагаешь перелопатить все в поисках нужной? ;D
Вот жеж она ))) http://autoit-script.ru/index.php/topic,2827.0.html

Все советы принял к сведению и всё работает как надо! Спасибо Вам! Саппорт вас не забудет ))
 

FlatX007

Tattoo!
Сообщения
197
Репутация
35
Есть у меня вот такая программка ... могу кинуть все ресурсы.
 

Heler

Знающий
Сообщения
70
Репутация
11
FlatX007, было бы интересно посмотреть ;)
 
Автор
G

G.FREEMAN

Новичок
Сообщения
13
Репутация
0
Вот окончательный код, при компилировании выдает ошибку
Код:
Error opening the destination file
Я так и не понял, какой он файл назначения не может открыть...
Либо, если собирать exe-шник не через нажатие ПКМ на файле и "compile", а через Scite4Autoit3 с помощью "Build", exe-шник собирается, но при запуске на тестовой машине появляется кратковременно окно командной строки (т.е. часть скрипта отрабатывает), а далее пишет ошибку такого плана

Код:
Line 702 "File "путь к файлу"
Error: array variable subscript badly formatted

Вот, ниже код
Код:
MsgBox(0, "Предупреждение", "Поехали!")

Run(@ComSpec & ' /c "netsh winsock reset && ipconfig /flushdns && arp -d * && route delete *"')


; Удаляем и заменяем на чистый hosts, удаляем lmhosts
FileDelete(@WindowsDir & "\system32\drivers\etc\hosts")
$hOpen = FileOpen(@WindowsDir & "\system32\drivers\etc\hosts", 2)
FileWrite($hOpen, "127.0.0.1 localhost")
FileClose($hOpen)

;MsgBox(0, "Информация", "сетевые и хостс почищено какбэ"
; Сброс сетевых настроек в ноль
#include <Array.au3>
RunWait(@ComSpec & ' /c ' & 'netsh interface ip show interfaces > c:\out.txt', '', @SW_HIDE)
$hFile = FileRead('C:\out.txt')
$aInterfaces = StringRegExp($hFile, '(?m)^[\s+\d+]+\s+\w+\s+(.*).$', 3)
Dim $aInt[UBound($aInterfaces) - 1], $iCount = 0
For $i = 0 To UBound($aInterfaces) - 1
    If Not StringInStr($aInterfaces[$i], 'Loopback') Then
        $aInt[$iCount] = _Encoding_866To1251($aInterfaces[$i])
        $iCount += 1
    EndIf
Next
;~ _ArrayDisplay($aInt)
For $j = 0 To UBound($aInt) - 1
    RunWait(@ComSpec & ' /c ' & 'netsh interface ip set address "' & $aInt[$j] & '" dhcp', '', @SW_HIDE)
    RunWait(@ComSpec & ' /c ' & 'netsh interface ip set dns "' & $aInt[$j] & '" dhcp', '', @SW_HIDE)
Next
FileClose($hFile)
FileDelete('C:\out.txt')
;Description: Converts cyrillic string from IBM 866 codepage to Microsoft 1251 codepage
;Author: Latoid
Func _Encoding_866To1251($sString)
    Local $sResult = "", $iCode
    Local $Var866Arr = StringSplit($sString, "")

    For $i = 1 To $Var866Arr[0]
        $iCode = Asc($Var866Arr[$i])

        Select
            Case $iCode >= 128 And $iCode <= 175
                $Var866Arr[$i] = Chr($iCode + 64)
            Case $iCode >= 224 And $iCode <= 239
                $Var866Arr[$i] = Chr($iCode + 16)
            Case $iCode = 240
                $Var866Arr[$i] = Chr(168)
            Case $iCode = 241
                $Var866Arr[$i] = Chr(184)
            Case $iCode = 252
                $Var866Arr[$i] = Chr(185)
        EndSelect

        $sResult &= $Var866Arr[$i]
    Next

    Return $sResult
EndFunc   ;==>_Encoding_866To1251
MsgBox(0, "Успешно!", "Перезагрузите компьютер!")
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
G.FREEMAN [?]
Похоже ошибка в моей части :smile: netsh по разному отрабатывает на Win7 i Win XP.
Вот попробуй решение на WMI (это поиск адаптеров и перевод их на DHCP)
Код:
$oWMI = ObjGet('winmgmts:{impersonationLevel=impersonate}!\\' & @ComputerName & '\root\cimv2')
$oItems = $oWMI.ExecQuery('SELECT * FROM Win32_NetworkAdapter WHERE NetConnectionStatus >= 0')
For $oItem In $oItems
	RunWait(@ComSpec & ' /c ' & 'netsh interface ip set address "' & $oItem.NetConnectionID & '" dhcp', '', @SW_HIDE)
	RunWait(@ComSpec & ' /c ' & 'netsh interface ip set dns "' & $oItem.NetConnectionID & '" dhcp', '', @SW_HIDE)
Next
 
Автор
G

G.FREEMAN

Новичок
Сообщения
13
Репутация
0
Redline сказал(а):
G.FREEMAN [?]
Похоже ошибка в моей части :smile: netsh по разному отрабатывает на Win7 i Win XP.
Вот попробуй решение на WMI (это поиск адаптеров и перевод их на DHCP)
Код:
$oWMI = ObjGet('winmgmts:{impersonationLevel=impersonate}!\\' & @ComputerName & '\root\cimv2')
$oItems = $oWMI.ExecQuery('SELECT * FROM Win32_NetworkAdapter WHERE NetConnectionStatus >= 0')
For $oItem In $oItems
	RunWait(@ComSpec & ' /c ' & 'netsh interface ip set address "' & $oItem.NetConnectionID & '" dhcp', '', @SW_HIDE)
	RunWait(@ComSpec & ' /c ' & 'netsh interface ip set dns "' & $oItem.NetConnectionID & '" dhcp', '', @SW_HIDE)
Next

Работает! :IL_AutoIt_1:
 
Верх