CMD/BAT - [решено] Нужен специфический скрипт для форума Лечение.

Аватара пользователя
Drongo

CMD/BAT - [решено] Нужен специфический скрипт для форума Лечение.

Сообщение Drongo »

Привет всем.



В общем навеяно из раздела Лечение -
[решено] Вирус не дает сделать логи, как написано в закрепленке.
. Каждый раз такую рекомендацию давать конечно можно, но обилие "сделайте\сохраните\запустите" путает пользователя. Хочется немного автоматизировать эту рекомендацию в один клик. Хочется не только рабочую версию, но и красоту скрипта. Логика пока такая:

1. Проверить есть ли папка C:\avz4

Если есть

2. Переименовать файл C:\avz4\avz.exe в C:\avz4\active.com

Иначе

Скачать отсюда -
http://z-oleg.com/avz4.zip
в корень диска С: и распаковать архив в папку C:\avz4 и также переименовать.

3. Создать текстовый файл script.txt с содержимым и сохранить на диск С:



Код:

Код: Выделить всё

begin
 ExecuteStdScr(7);
end.

4. Создать файл .vbs с содержимым и выполнить его



Код:

Код: Выделить всё

set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "taskkill /f /im Explorer.exe", 0
WScript.Sleep 500
WshShell.Run "C:\avz4\active.com AM=Y script=C:\script.txt"

Читая раздел скриптовые языки смог самостоятельно сделать вот так:



Код:

Код: Выделить всё

@Echo off
Set DirAVZ=C:\avz4
del C:\script.txt
del C:\SafeZone.vbs
ren C:\avz4\avz.exe C:\avz4\active.com
Set sScript1=begin
Set sScript2= ExecuteStdScr(7);
Set sScript3=end.
Set sRunVBS1=set WshShell = WScript.CreateObject("WScript.Shell")
Set sRunVBS2=WshShell.Run "taskkill /f /im Explorer.exe", 0
Set sRunVBS3=WScript.Sleep 500
Set sRunVBS4=WshShell.Run "C:\avz4\active.com AM=Y script=C:\script.txt"
Echo %sScript1%>>C:\script.txt
Echo %sScript2%>>C:\script.txt
Echo %sScript3%>>C:\script.txt
Echo %sRunVBS1%>>C:\SafeZone.vbs
Echo %sRunVBS2%>>C:\SafeZone.vbs
Echo %sRunVBS3%>>C:\SafeZone.vbs
Echo %sRunVBS4%>>C:\SafeZone.vbs
If Exist "%DirAVZ%\*.*"(
  Start C:\SafeZone.vbs
  )
Else(
   Echo Папки %systemdrive%\avz4\avz - не найдено!>>C:\log.txt
  )
exit.

Можно ли как-то облагородить данный скрипт и добавить проверку папки, скачивание и распаковку?



Если реально выполнить всё одним скриптом .vbs то это будет здорово.



Спасибо
Аватара пользователя
Foreigner

Re: CMD/BAT - [решено] Нужен специфический скрипт для форума Лечение.

Сообщение Foreigner »

Два вопроса. Зачем vbs-скрипт и чем скачивать?



Код:

Код: Выделить всё

@echo off
setlocal
if not exist "c:\avz4" (
    wget http://z-oleg.com/avz4.zip
    "%programfiles%\7-zip\7z" x avz4.zip -oc:\
    del avz4.zip
)
ren c:\avz4\avz.exe active.com
1>"c:\script.txt" (
echo begin
echo  ExecuteStdScr(7^);
echo end.
)
taskkill /f /im explorer.exe && start C:\avz4\active.com AM=Y script=C:\script.txt

PS. Если в системе есть bitsadmin.exe ( в 7 HP есть из коробки ), то можно закачать им:



Код:

Код: Выделить всё

bitsadmin /transfer /download /priority high http://z-oleg.com/avz4.zip avz4.zip
Аватара пользователя
Iska

Re: CMD/BAT - [решено] Нужен специфический скрипт для форума Лечение.

Сообщение Iska »

Drongo, для категории CMD/BAT я бы сделал примерно так (для реальной работы заменить «notepad.exe» на «explorer.exe»):



Код:

Код: Выделить всё

@echo off
setlocal enableextensions enabledelayedexpansion
set sAVZFolder=%SystemDrive%\avz4
set sAVZNewName=%RANDOM%.%RANDOM%
if exist "%sAVZFolder%\." (
	copy /y "%sAVZFolder%\avz.exe" "%sAVZFolder%\%sAVZNewName%" 1>nul
	(
		echo var
		echo 	sProcessName  : string;
		echo 	sPath2Process : string;
		echo.
		echo begin
		echo 	sProcessName  := 'notepad.exe';
		echo 	sPath2Process := NormalFileName^('%SystemRoot%\' + sProcessName^);
		echo.
		echo 	TerminateProcessByName^(sProcessName^);
		echo 	ExecuteStdScr^(7^);
		echo.
		echo 	if ExecuteFile^(sPath2Process, '', 1, 0, false^) = true then
		echo 		ShowMessage^('[' + sPath2Process + '] єёях°эю чряє∙хэ'^)
		echo 	else
		echo 		ShowMessage^('═х єфрыюё№ чряєёЄшЄ№ [' + sPath2Process + ']'^);
		echo end.
	) 1>"%sAVZFolder%\DrongoScript.txt"
	"%sAVZFolder%\%sAVZNewName%" AM=Y Run=Y Script="%sAVZFolder%\DrongoScript.txt"
	del /f /q "%sAVZFolder%\%sAVZNewName%"
	del /f /q "%sAVZFolder%\DrongoScript.txt"
) else (
	echo Папки [%sAVZFolder%] не найдено!>>"%SystemDrive%\DrongoLog.txt"
)
endlocal
exit /b 0

В XP загрузку с HTTP без сторонних средств (внешняя утилита, WSH, PoSH) в общем случае не решить. Распаковка из zip в рамках заявленной категории без сторонних средств тоже невозможна.



Вопрос: какова необходимость снятия процесса Проводника именно перед запуском AVZ? В приведённом мною примере я отдал сие на откуп самому AVZ (как и его запуск после выполнения скрипта AVZ).



В рамках WSH можно будет попробовать осуществить загрузку с HTTP (и, скорее всего, на этот скрипт будут ругаться антивирусы), и, возможно, распаковку средствами «Shell.Application» — то бишь, самого Проводника.
Аватара пользователя
Drongo

Re: CMD/BAT - [решено] Нужен специфический скрипт для форума Лечение.

Сообщение Drongo »

Цитата Foreigner:



Зачем vbs-скрипт
CMD/BAT - [решено] Нужен специфический скрипт для форума Лечение.




Если можно обойтись без него, это будет идеально. Вижу, можно.


Цитата Foreigner:



чем скачивать?
CMD/BAT - [решено] Нужен специфический скрипт для форума Лечение.




Так как это реализовано здесь -
Утилиты - NoMoreAutorun - утилита для отключения автозапуска.
там вроде бы как-то скачивается без dounloader'ов и без wget
Цитата Foreigner:



PS. Если в системе есть bitsadmin.exe ( в 7 HP есть из коробки ), то можно закачать им:
CMD/BAT - [решено] Нужен специфический скрипт для форума Лечение.




Скрипт будет применяться не только на 7, но и на висте и ХР
Аватара пользователя
Iska

Re: CMD/BAT - [решено] Нужен специфический скрипт для форума Лечение.

Сообщение Iska »

Цитата:



В приведённом мною примере я отдал сие на откуп самому AVZ (как и его запуск после выполнения скрипта AVZ).
CMD/BAT - [решено] Нужен специфический скрипт для форума Лечение.




Да, в принципе это будет правильнее.
Цитата Iska:



В рамках WSH можно будет попробовать осуществить загрузку с HTTP (и, скорее всего, на этот скрипт будут ругаться антивирусы), и, возможно, распаковку средствами «Shell.Application» — то бишь, самого Проводника.
CMD/BAT - [решено] Нужен специфический скрипт для форума Лечение.




А как это выглядит в реализации?
Аватара пользователя
Iska

Re: CMD/BAT - [решено] Нужен специфический скрипт для форума Лечение.

Сообщение Iska »

Цитата Drongo:



Так как это реализовано здесь - NoMoreAutorun - утилита для отключения автозапуска. там вроде бы как-то скачивается без dounloader'ов и без wget
CMD/BAT - [решено] Нужен специфический скрипт для форума Лечение.




Да, без «wget.exe». Но с помощью близкофункциональной утилиты «curl.exe», вложенной в архив вместе со скриптом.


Цитата Drongo:



А как это выглядит в реализации?
CMD/BAT - [решено] Нужен специфический скрипт для форума Лечение.




Уже пробуем лепить Изображение
Аватара пользователя
Foreigner

Re: CMD/BAT - [решено] Нужен специфический скрипт для форума Лечение.

Сообщение Foreigner »

Цитата Drongo:



Скрипт будет применяться не только на 7, но и на висте и ХР
CMD/BAT - [решено] Нужен специфический скрипт для форума Лечение.




В общем не лучший вариант для распаковки и записи в корень системного раздела. Тогда уж лучше в %username% или %temp%
Аватара пользователя
Iska

Re: CMD/BAT - [решено] Нужен специфический скрипт для форума Лечение.

Сообщение Iska »

Примерно так:



Код:

Код: Выделить всё

Option Explicit
Dim objFSO
Dim objShell
Dim objWshShell
Dim strPath2AVZ
Dim strPath2Exe
Dim strPath2AVZScript
Dim strHttpSource
Dim strDownloadDest
Set objFSO      = WScript.CreateObject("Scripting.FileSystemObject")
Set objShell    = WScript.CreateObject("Shell.Application")
Set objWshShell = WScript.CreateObject("WScript.Shell")
strPath2AVZ       = "C:\AVZ"
strPath2Exe       = objFSO.BuildPath(strPath2AVZ, "avz4\avz.exe")
strPath2AVZScript = objFSO.BuildPath(strPath2AVZ, "DrongoScript.avz")
strHttpSource = "http://z-oleg.com/avz4.zip"
strDownloadDest = objFSO.BuildPath(strPath2AVZ, objFSO.GetFileName(strHttpSource))
If Not objFSO.FolderExists(strPath2AVZ) Then
	objFSO.CreateFolder strPath2AVZ
End If
If GetFileFromURL(strHttpSource, strDownloadDest) Then
	ExtractFromZip objFSO.BuildPath(strPath2AVZ, objFSO.GetFileName(strHttpSource)), strPath2AVZ
	CreateAVZScript strPath2AVZScript
	RenameAndExecuteProgram strPath2Exe, strPath2AVZScript
Else
	WScript.Echo "Can't download [" & strHttpSource & "] to [" & strDownloadDest & "]"
End If
Set objWshShell = Nothing
Set objShell    = Nothing
Set objFSO      = Nothing
WScript.Quit 0
'=============================================================================
'=============================================================================
Sub CreateAVZScript(strPath2Script)
	With objFSO.CreateTextFile(strPath2Script, True)
		.Write _
			"var" & vbCrLf & _
			"	sProcessName  : string;" & vbCrLf & _
			"	sPath2Process : string;" & vbCrLf & _
			"" & vbCrLf & _
			"begin" & vbCrLf & _
			"	sProcessName  := 'explorer.exe';" & vbCrLf & _
			"	sPath2Process := NormalFileName('%SystemRoot%\' + sProcessName);" & vbCrLf & _
			"	" & vbCrLf & _
			"	TerminateProcessByName(sProcessName);" & vbCrLf & _
			"	ExecuteStdScr(7);" & vbCrLf & _
			"	" & vbCrLf & _
			"	if ExecuteFile(sPath2Process, '', 1, 0, false) = true then" & vbCrLf & _
			"		ShowMessage('[' + sPath2Process + '] успешно запущен')" & vbCrLf & _
			"	else" & vbCrLf & _
			"		ShowMessage('Не удалось запустить [' + sPath2Process + ']');" & vbCrLf & _
			"end." & vbCrLf
		.Close
	End With
End Sub
'=============================================================================
'=============================================================================
Sub RenameAndExecuteProgram(strPath2Exe, strPath2AVZScript)
	' Enum WshExecStatus
	Const WshRunning  = 0
	Const WshFinished = 1
	Const WshFailed   = 2
	Dim strPath2NewExe
	strPath2NewExe = objFSO.BuildPath(objFSO.GetParentFolderName(strPath2Exe), objFSO.GetTempName())
	objFSO.CopyFile strPath2Exe, strPath2NewExe
	With objWshShell.Exec("""" & strPath2NewExe & """  AM=Y Run=Y Script=""" & strPath2AVZScript & """")
		WScript.Sleep 500
		If .Status = WshRunning And .Status  WshFailed Then
			objWshShell.AppActivate .ProcessID
			Do
				WScript.Sleep 100
			Loop Until .Status = WshFinished
		Else
			WScript.Echo "Can't execute [" & strPath2NewExe & "]"
		End If
	End With
	objFSO.DeleteFile strPath2NewExe, True
	'objFSO.DeleteFile strPath2AVZScript, True
End Sub
'=============================================================================
'=============================================================================
Function ExtractFromZip(strPath2Zip, strPath2Extract)
	Dim objFolderZIP
	Dim objFolderDest
	Set objFolderZIP = objShell.NameSpace(strPath2Zip)
	If Not objFolderZIP Is Nothing Then
		Set objFolderDest = objShell.NameSpace(strPath2Extract)
		If Not objFolderDest Is Nothing Then
			objFolderDest.CopyHere objFolderZIP.Items
			Set objFolderDest = Nothing
		Else
			WScript.Echo "Can't get folder [" & strPath2Extract & "]"
		End If
		Set objFolderZIP = Nothing
	Else
		WScript.Echo "Can't get zip folder [" & strPath2Zip & "]"
	End If
End Function
'=============================================================================
'=============================================================================
Function GetFileFromURL(strURL, strPath)
	' Enum ConnectModeEnum
	Const adModeUnknown         = 0
	Const adModeRead            = 1
	Const adModeWrite           = 2
	Const adModeReadWrite       = 3
	Const adModeShareDenyRead   = 4
	Const adModeShareDenyWrite  = 8
	Const adModeShareExclusive  = 12
	Const adModeShareDenyNone   = 16
	Const adModeRecursive       = 4194304
	' Enum StreamTypeEnum
	Const adTypeBinary          = 1
	Const adTypeText            = 2
	' Enum SaveOptionsEnum
	Const adSaveCreateNotExist  = 1
	Const adSaveCreateOverWrite = 2
	Dim arrContent
	GetFileFromURL = False
	With WScript.CreateObject("MSXML2.XMLHTTP")
		.open "GET", strURL, False
		.send
		arrContent = .responseBody
	End With
	With WScript.CreateObject("ADODB.Stream")
		.Mode = adModeReadWrite
		.Type = adTypeBinary
		.Open
		.Write arrContent
		.SaveToFile strPath, adSaveCreateOverWrite
	End With
	If objFSO.FileExists(strPath) Then
		If objFSO.GetFile(strPath).Size  0 Then
			' Что-то загружено ;)
			GetFileFromURL = True
		End If
	End If
End Function
'=============================================================================
Аватара пользователя
Iska

Re: CMD/BAT - [решено] Нужен специфический скрипт для форума Лечение.

Сообщение Iska »

Iska, Шикарно! Изображение +1000 С вашими знаниями команд и ключей авз вы до сих пор не в лечении? Изображение



Этот ключик командной строки лишний



Код:

Мы ведь уже выполняем



Код:

Код: Выделить всё

ExecuteStdScr(7);
Аватара пользователя
Iska

Re: CMD/BAT - [решено] Нужен специфический скрипт для форума Лечение.

Сообщение Iska »

Drongo, это:


Цитата Drongo:



Этот ключик командной строки лишний
CMD/BAT - [решено] Нужен специфический скрипт для форума Лечение.




как раз убедительно характеризует моё знание ключей AVZ Изображение.



У меня без «Run=Y» в процессе разработки скрипт не запускался на исполнение. Сейчас попробовал ручками — скрипт AVZ сработал без «Run=Y». Скопировал
CMD/BAT - [решено] Нужен специфический скрипт для форума Лечение.
скрипт, запустил — скрипт AVZ сработал. Спишу на издержки долго не перезагружавшейся системы, свои кривые «ручки» Изображение и забуду…




Цитата Drongo:



…вы до сих пор не в лечении?
CMD/BAT - [решено] Нужен специфический скрипт для форума Лечение.




Увы, покамест не научился лечить на расстоянии.



Не требуется ли что-либо подправить? Какие-нибудь дополнительные проверки?



P.S. На текущий момент, я думаю, можно сказать, что AVZ, в принципе, не имеет конкурентов в своей области, и прежде всего — из-за включения в его состав встроенного языка, позволяющего практически неограниченно расширять его функционал и гибко подстраивать на решение конкретных задач по восстановлению работоспособности системы. Встроенный язык — это всегда большой плюс, будь то Microsoft Office, або Far Manager.
Ответить

Вернуться в «Скриптовые языки администрирования Windows»