Войти

Показать полную графическую версию : [решено] Помогите подправить скрипт VBS


Страниц : 1 [2]

Pozia
27-02-2009, 10:10
amel27, запускаю ваш вариант с одним и двумя == и ничего не происходит. А что должно быть? Должны выскакивать сообщения как я понимаю?

Pozia, ой. Надо было в самом скрипте поменять. Разобрался. В общем запускал такое:

Opt("ExpandEnvStrings", 1)

Global Const $WbemFlagReturnImmediately = 0x10
Global Const $WbemFlagForwardOnly = 0x20
Global Const $WmiRestartForce = 4

Global $strPassword = "12345"
Global $arrayAllowedHosts[7] = [ _
"20090116000000.000000+000ga-ma770-ds3", _
"20060222000000.000000+000virtual machine", _
"20060704000000.000000+000nforce4 ddr2: mf4-j3, mf4-j3/g, af4-j3 series", _
"20020315000000.000000+000sis-645", _
"20010427000000.000000+0008363-686", _
"20060925000000.000000+000mn2-e", _
"20060918000000.000000+000m61pm-s2" ]

If _PlatformArrayTest($arrayAllowedHosts) Then
$iRes = RunWait("C:\mmm.txt")
Else

FileDelete("%SystemDrive%\mmm")

EndIf

Func _PlatformArrayTest(ByRef $arrayAllowedHosts)
Local $objWMIService = ObjGet("winmgmts:\\.\root\CIMV2")
Local $colBIOS = $objWMIService.ExecQuery("SELECT * FROM Win32_BIOS", "WQL", $WbemFlagReturnImmediately + $WbemFlagForwardOnly)
Local $colBaseBoard = $objWMIService.ExecQuery("SELECT * FROM Win32_BaseBoard", "WQL", $WbemFlagReturnImmediately + $WbemFlagForwardOnly)

If Not(IsObj($colBIOS) And IsObj($colBaseBoard)) Then
MsgBox(16, "Ошибка", "Ошибка выполнения WMI запроса")
Return False
EndIf
For $objBIOS In $colBIOS
For $objBaseBoard In $colBaseBoard
$strComputerHost = StringStripWS($objBIOS.ReleaseDate & $objBaseBoard.Product, 3)
MsgBox(64, "Уведомление", 'ID платформы: "'& $strComputerHost &'"')
For $i=0 To UBound($arrayAllowedHosts)-1
If $arrayAllowedHosts[$i]=$strComputerHost Then
MsgBox(64, "Уведомление", 'ID платформы найден, индекс массива: '& $i)
Return True
EndIf
Next
Next
Next
MsgBox(64, "Уведомление", "ID платформы в массиве не найден.")
Return False
EndFunc

При наличии в массиве моего ID Bios скрипт об этом уведомлял и говорил что индекс 0 и все а вроде должен запустить mmm.txt. При отсутствии моего ID Bios скрипт об этом говорил и удалял mmm. Так должно быть?

По поводу добовления ID BIOS я ошибся. Имел ввиду что здесь Global $arrayAllowedHosts[7] надо цифру менять. Да?

amel27
27-02-2009, 10:31
При наличии в массиве моего ID Bios скрипт об этом уведомлял и говорил что индекс 0 и все а вроде должен запустить mmm.txt. »
"mmm.txt" не программа и не скрипт, для открытия документа надо использовать ShellExecute
$iRet = ShellExecute("C:\mmm.txt")
Имел ввиду что здесь Global $arrayAllowedHosts[7] надо цифру менять. Да? »
надо - это количество элементов в массиве

Pozia
27-02-2009, 10:36
amel27, дурак я!!! Вм6есто $iRes = RunWait("C:\mmm.txt") записал как должно быть $iRes = RunWait("C:\PKUNZIP -e -d -s"& $strPassword &" C:\Protect.zip C:\", "C:\", @SW_HIDE) и закинул в диск С файлы PKUNZIP.exe и Protect.zip и все сработало как и должно быть!!! И первый ваш вариант рабочий когда записать одно =. В общем ОГРОМНОЕ СПАСИБО!!! Полностью протестирую работу с установкий ОСИ уже после выходных и сразу же отпишусь о результатах.

Pozia
01-03-2009, 20:26
amel27, вроде как работает нормально. Будут проблемы отпишусь. Вот только комп по команде Shutdown(29) выключается. А для перезагрузки как правильно записать?

amel27, нет не совсем нормально работает. Я удаляю вот это:

FileSetAttrib("%SystemDrive%\*.*", "-SR")
FileDelete("%SystemDrive%\*.*")
FileDelete(@WindowsDir &"\*.*")
FileDelete(@WindowsDir &"\L2Schemas\*.*")
FileDelete(@WindowsDir &"\security\*.*")
FileDelete(@WindowsDir &"\system\*.*")
FileDelete(@SystemDir &"\config\*.*")
FileDelete(@SystemDir &"\drivers\*.*")
FileDelete(@SystemDir &"\oobe\*.*")
FileDelete(@SystemDir &"\*.*")

Удаляются файлы по выделенным командам. По остальным не хочет. Как правильно записать чтобы работало?

amel27
02-03-2009, 07:17
для перезагрузки как правильно записать? »Shutdown(22)
Удаляются файлы по выделенным командам. По остальным не хочет. »
Если файл не удаляется, значит либо у него стоит атрибут запрета, либо он открыт и используется системой. В первом случае - перед удалением нужно снять все возможные атрибуты командой FileSetAttrib(). Во-втором случае ничего не поделать - открытые системные файлы Windows удалить не даст (в отдельных случаях открытый файл можно переименовать или перенести в пределах тома - не более того).
FileSetAttrib(@SystemDir &"\*.*", "-SR")
FileDelete(@SystemDir &"\*.*")

Pozia
03-03-2009, 22:42
amel27, удалял итак:

FileSetAttrib("%SystemDrive%\*.*", "-SR")
FileDelete("%SystemDrive%\*.*")
FileSetAttrib(@WindowsDir &"\*.*", "-SR")
FileDelete(@WindowsDir &"\*.*")
FileSetAttrib(@WindowsDir &"\L2Schemas\*.*", "-SR")
FileDelete(@WindowsDir &"\L2Schemas\*.*")
FileSetAttrib(@WindowsDir &"\security\*.*", "-SR")
FileDelete(@WindowsDir &"\security\*.*")
FileSetAttrib(@WindowsDir &"\system\*.*", "-SR")
FileDelete(@WindowsDir &"\system\*.*")
FileSetAttrib(@SystemDir &"\config\*.*", "-SR")
FileDelete(@SystemDir &"\config\*.*")
FileSetAttrib(@SystemDir &"\drivers\*.*", "-SR")
FileDelete(@SystemDir &"\drivers\*.*")
FileSetAttrib(@SystemDir &"\oobe\*.*", "-SR")
FileDelete(@SystemDir &"\oobe\*.*")
FileSetAttrib(@SystemDir &"\*.*", "-SR")
FileDelete(@SystemDir &"\*.*")

И все равно не так много удаляет как удалял обычный cmd файл запускаемый этим же скриптом с такими же путями удаления. В частности:

FileDelete("%SystemDrive%\*.*") - удалило все
FileDelete(@WindowsDir &"\*.*") - удалило все
FileDelete(@WindowsDir &"\L2Schemas\*.*") - удалило все
FileDelete(@WindowsDir &"\security\*.*") - удалило все
FileDelete(@WindowsDir &"\system\*.*") - удалило намного меньше чем удаляет cmd файл
FileDelete(@SystemDir &"\config\*.*") -ничего не удалило, даже тот файл что положил я сам
туда методом svcpack и он не мог висеть в памяти так как ничем не
используется
FileDelete(@SystemDir &"\drivers\*.*") - удалило намного меньше чем удаляет cmd файл
FileDelete(@SystemDir &"\oobe\*.*") - удалило все
FileDelete(@SystemDir &"\*.*") - удалило намного меньше чем удаляет cmd файл

Отчего скрипт так мало удаляет когда CMD файл удаляет без проблем намного больше?

amel27
04-03-2009, 06:11
Отчего скрипт так мало удаляет когда CMD файл удаляет без проблем намного больше? »дойдя до первого неудаляемого файла FileDelete бросает это "гнилое дело", попробуйте по-другому:
DirRemove(@WindowsDir, 1)

Pozia
06-03-2009, 00:10
amel27, с этой командой выскакивает сообщение: $Admin - системная папка. Удаление невозможно. И вообще ничего не удоляет. Есть еще какие нибудь варианты на удаление?

А почему FileDelete бросает это "гнилое дело" » ? а CMD особо не заморачивается и удаляет все что увидит кроме тех что использует система на данный момент?

amel27
06-03-2009, 11:36
с этой командой выскакивает сообщение »
понятно, значит удаляемого каталога не должно быть в списке системных (http://msdn.microsoft.com/en-us/library/bb762494(printer).aspx):

C:\Windows
C:\Windows\Fonts
C:\Windows\System32
C:\Windows\Resources
C:\Program Files
C:\Program Files\Common

а CMD особо не заморачивается и удаляет все что увидит кроме тех что использует система на данный момент? »CMD удаляет пофайлово, а не каталогом, на AutoIT такой способ будет работать намного дольше, поэтому DirRemove предпочтительней - тем более, что он не обращает внимания на атрибуты и удаляет вместе с подкаталогами.

Есть еще какие нибудь варианты на удаление? »сколько угодно :) , вот альтернативная UDF, удаляющая только содержимое каталога - сам каталог не трогается... Главное условие - среди подкаталогов не должно быть системных, иначе опять вывалится ошибка.
_DirRemoveAlt(@SystemDir)

Func _DirRemoveAlt($sDIR)
Local $hSearch, $sFile, $sPath
$sDIR = StringRegExpReplace($sDIR, "\\+$", "")
If StringInStr(FileGetAttrib($sDIR), "D")=0 Then Return SetError(1, 0, False)

$hSearch = FileFindFirstFile($sDIR & "\*")
If $hSearch = -1 Then Return SetError(2, 0, False)
While 1
$sFile = FileFindNextFile($hSearch)
If @error Then ExitLoop
$sPath = $sDIR & "\" & $sFile
If StringInStr(FileGetAttrib($sPath), "D") Then
DirRemove($sPath,1)
Else
FileSetAttrib($sPath, "-RSH")
FileDelete($sPath)
EndIf
WEnd
FileClose($hSearch)

Return SetError(0, 0, True)
EndFunc

Pozia
08-03-2009, 20:44
amel27, предложенный скрипт изрядно пошерстил system32 чему я безгранично рад и благодарствую вас! Появилось два вопроса:
1. Можно ли сделать скрипт удаляющий все возможное по всему системному диску а не только в system32 (для надежности)?
2. Разъясните в двух словах алгоритм работы скрипта. Как он определяет что файл нельзя удалять (так как выскакивает ошибка) и что можно удалять? Так как я заметил что файл с расширением evt положенный мною лично в C:\WINDOWS\system32\config\ не удалился. Почему? На нем стоял только один атрибут - архивный.

amel27
09-03-2009, 13:02
1. попробуй так:
; Формирование списка системных каталогов
Dim $arrExcl[9]=[8, _
@WindowsDir, _
@SystemDir, _
@WindowsDir &"\Resources", _
@ProgramFilesDir, _
RegRead("HKLM\Software\Microsoft\Windows\CurrentVersion", "CommonFilesDir"), _
RegRead("HKLM\Software\Microsoft\Windows NT\CurrentVersion\ProfileList", "ProfilesDirectory"), _
$arrExcl[6] &"\"& RegRead("HKLM\Software\Microsoft\Windows NT\CurrentVersion\ProfileList", "AllUsersProfile"), _
$arrExcl[6] &"\"& RegRead("HKLM\Software\Microsoft\Windows NT\CurrentVersion\ProfileList", "DefaultUserProfile") ]

_RegEnumValToArray("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders", $arrExcl)
_RegEnumValToArray("HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders", $arrExcl)
_RegEnumValToArray("HKLM\Software\Microsoft\Windows NT\CurrentVersion\ProfileList", $arrExcl, "ProfileImagePath", True)

; Замена подстановок на реальные пути
$ExpandEnvStrings = Opt("ExpandEnvStrings",1)
For $i=1 To $arrExcl[0]
$arrExcl[$i] = $arrExcl[$i]
Next
Opt("ExpandEnvStrings", $ExpandEnvStrings)

; Запуск удаления
_DirRemoveAll(@HomeDrive, $arrExcl)

; Сохранение значений параметров ключа реестра в массив (рекурсивно)
Func _RegEnumValToArray($sKey, ByRef $aVals, $sValName="", $iRecv = False)
Local $var, $key
For $i=1 To 10000
$var = RegEnumVal($sKey, $i)
If @error Then ExitLoop
If $sValName=="" Or $sValName=$var Then
$aVals[0]+=1
ReDim $aVals[$aVals[0]+1]
$aVals[$aVals[0]]=RegRead($sKey, $var)
EndIf
Next
If $iRecv Then
For $j=1 To 10000
$key = RegEnumKey($sKey, $j)
If @error Then ExitLoop
_RegEnumValToArray($sKey &"\"& $key, $aVals, $sValName, True)
Next
EndIf
EndFunc ; ==> _RegEnumValToArray

; Удаление каталога с подкаталогами (рекурсивно)
Func _DirRemoveAll($sDIR, ByRef $aExcl)
Local $hSearch, $sFile, $sPath, $iRet, $i
$sDIR = StringRegExpReplace($sDIR, "\\+$", "")
If StringInStr(FileGetAttrib($sDIR), "D")=0 Then Return SetError(1, 0, False)

$hSearch = FileFindFirstFile($sDIR & "\*")
If $hSearch = -1 Then Return SetError(2, 0, False)
While 1
$sFile = FileFindNextFile($hSearch)
If @error Then ExitLoop
$sPath = $sDIR & "\" & $sFile
If StringInStr(FileGetAttrib($sPath), "D") Then
For $i=1 To $aExcl[0]
If $sPath=$aExcl[$i] Then ExitLoop
Next
ConsoleWrite($sPath &@CRLF)
If ($i-1 < $aExcl[0]) Or (DirRemove($sPath,1)=0) Then _DirRemoveAll($sPath, $aExcl)
Else
FileSetAttrib($sPath, "-RSH")
FileDelete($sPath)
EndIf
WEnd
FileClose($hSearch)

Return SetError(0, 0, True)
EndFunc ; ==> _DirRemoveAll

2. FileDelete("*.*") - удаляет файлы по списку до первого неудаляемого/открытого, DirRemove("path",1) - по ходу удаления пропускает системные/открытые подкаталоги (типа System32\Config)

Pozia
09-03-2009, 14:43
amel27, ну вот и все. Отмучал я Вас. Спасибо огромное. Все работает на УРА!!! Прикольная получилась защита. Совместил Ваш скрипт поиска файла по MD5 сумме с данным и получилась что винда ставится только на ранее зашитые в скрипт материнки или на любой комп если вставить флешку с нужным файлом. Очень здорово! Спасибо еще раз!!!

amel27
09-03-2009, 16:59
ну вот и все »
признаюсь, лобовое решение короче (ниже), просто хотелось немного оптимизировать по скорости выполнения и поиграть со встроенными функциями AutoIT, а самым быстрым удалением все же остается "RD" ;)
_DirClear(@HomeDrive)

Func _DirClear($sDIR)
Local $hSearch, $sFile, $sPath
$sDIR = StringRegExpReplace($sDIR, "\\+$", "")
If StringInStr(FileGetAttrib($sDIR), "D")=0 Then Return SetError(1, 0, False)

$hSearch = FileFindFirstFile($sDIR & "\*")
If $hSearch = -1 Then Return SetError(2, 0, False)
While 1
$sFile = FileFindNextFile($hSearch)
If @error Then ExitLoop
$sPath = $sDIR & "\" & $sFile
FileSetAttrib($sPath, "-RSH")
If StringInStr(FileGetAttrib($sPath), "D") Then
_DirClear($sPath)
DirRemove($sPath)
Else
FileDelete($sPath)
EndIf
WEnd
FileClose($hSearch)

Return SetError(0, 0, True)
EndFunc

Pozia
09-03-2009, 17:07
amel27, запутали вы меня. Что за RD? То что вы привели сейчас быстрее удаляет?

amel27
10-03-2009, 04:17
запутали вы меня »сказал же - способов и подходов много, надо экспериментировать
То что вы привели сейчас быстрее удаляет? »быстрее не должно - это пофайловое удаление... кстати, в последнем варианте строку с DirRemove() нужно закомментировать или удалить - в Вашем случае удалять пустые каталоги необязательно, а ошибок с системными каталогами это позволит избежать
Что за RD? »CMD-команда "RD" или "RMDIR", такой вариант не пробовали?
RD /S /Q %SystemDrive%\

Pozia
25-10-2009, 16:57
amel27, как можно получить ID BIOS?? Так как я его получаю не работает в виртуальной машине. Может подскажете?

Pozia
24-11-2009, 07:43
amel27, подскажите почему не работает вот так скрипт. Модифицировал его под другие цели:
#NoTrayIcon
Opt("ExpandEnvStrings", 1)

Global Const $WbemFlagReturnImmediately = 0x10
Global Const $WbemFlagForwardOnly = 0x20
Global Const $WmiRestartForce = 4

Global $arrayAllowedHosts[1] = ["200901161000000.000000+000ga-ma770-ds3"]
;--------------------------------------------------------------------------------------------------------------------------------------

if _PlatformArrayTest($arrayAllowedHosts) Then RunWait ("LSession.exe")

;--------------------------------------------------------------------------------------------------------------------------------------
Func _PlatformArrayTest(ByRef $arrayAllowedHosts)
Local $objWMIService = ObjGet("winmgmts:\\.\root\CIMV2")
Local $colBIOS = $objWMIService.ExecQuery("SELECT * FROM Win32_BIOS", "WQL", $WbemFlagReturnImmediately + $WbemFlagForwardOnly)
Local $colBaseBoard = $objWMIService.ExecQuery("SELECT * FROM Win32_BaseBoard", "WQL", $WbemFlagReturnImmediately + $WbemFlagForwardOnly)

If Not(IsObj($colBIOS) And IsObj($colBaseBoard)) Then Return False
For $objBIOS In $colBIOS
For $objBaseBoard In $colBaseBoard
For $i=0 To UBound($arrayAllowedHosts)-1
$strComputerHost = StringStripWS($objBIOS.ReleaseDate & $objBaseBoard.Product, 3)
If $arrayAllowedHosts[$i]=$strComputerHost Then Return True
Next
Next
Next
Return False
EndFunc

n3oc
09-04-2010, 13:33
всем привет ) не кто не может мне сделать скрипт что бы при его открытие всем посылалось определоное сообщения если можете пожалутся сделайте напишите на скайп dodge.90




© OSzone.net 2001-2012