maggreg Opublikowano 5 Września 2010 Zgłoś Udostępnij Opublikowano 5 Września 2010 WinPE do celów diagnostyczno naprawczych Szczególnie rozwiązania problemów z partycjami Recovery Co prawda na sieci istnieje wiele zestawów PE często bogato wyposażonych ale zastosowanie ich przez niedoświadczonego użytkownika może być trudne. W wyniku prowadzonych przez kilka ostatnich dni dyskusji, część na tym forum (nie wszystkie były publiczne) zaświtała we mnie myśl, że istnieje zapotrzebowanie na proste narzędzie które ułatwi nam pomoc osobom z problemami uruchomieniowymi. W szczególności chodzi o przypadki kiedy dostęp do fabrycznej partycji recovery został uszkodzony w związku z działaniami użytkownika bądź błędami systemu. Pod poniższym linkiem znajduje się archiwum które należy wypakować na pena (lub inną pamięć przenośną, np SD), najlepiej jeśli pen będzie wcześniej wyczyszczony aby uniknąć ew konfliktów. WinPE lub WinPE Linki do wersji rozszerzonej o obsługę skryptów HTA: WinPE z HTA lub WinPE z HTA Następnie należy wykonać na penie skrypt bt.vbs dzięki temu pen zostanie ustawiony jako urządzenie botowalne. A tak powinien wyglądać efekt jego działania: W głównym katalogu pena znajdują się katalogi: libs, tools, skrypty, wyniki oraz boot. Ten ostatni jest właściwym katalogiem dla systemu PE pozostałe posłużą naszym celom. Do katalogu "skrypty" wrzucamy skrypty które będziemy wykonywać w w/w środowisku, przykładowy skrypt umieszczony w archiwum listuje zawartość pierwszej partycji pierwszego dysku twardego (domyślnie w większości laptopów będzie to partycja odzyskiwania) oraz listuje zawartość kontenerów rozruchowych na partycjach pierwszej i drugiej, inne skrypty które pojawią się w tym temacie trzeba będzie umieszczać właśnie w tym katalogu. Do katalogu "wyniki" trafiają właśnie wyniki użycia powyższych skryptów - w przykładowym skrypcie są to trzy pliki tekstowe. Katalog "tools" służy do umieszczania różnych narzędzi które będą nam pomocne podczas pracy z winpe a nie są skryptami napisanymi na potrzeby tego narzędzia, mogą to być np. przeglądarka internetowy w wersji PE czy choćby Total Commander, w archiwum jest to ghost na wszelki wypadek w wersji OEM służącej tylko do odtwarzania obrazów, ta wersja nie powinna naruszać licencji firmy Symantec. Niektóre narzędzia mogą wymagać dodatkowych plików, choćby bibliotek dll które nie są dostępne w środowisku PE, do tego właśnie służy katalog "libs" do którego należy takie dodatkowe pliki wrzucać. Wszystkie powyższe katalogi zostają dopisane do systemowej zmiennej "path" dzięki temu są dostępne w konsoli PE bez podawania ścieżek. W katalogu boot znajduje się plik znacznik o nazwie "455asd8.znk", na tej podstawie skrypty odnajdują właściwe ścieżki niezależnie pod jaką literą zostanie zamontowany nasz pen, nie należy tego pliku kasować ani powielać na innych partycjach w katalogu boot. W samym WinPE znajduje się bardzo przydatny w zastosowaniach recovery imagex więc nie należy już go dorzucać do "tools" WinPE nie zawiera środowiska RE, uznałem że nie ma potrzeby "rozrastać" środowiska w tym kierunku, takie coś zawsze można odpalić z płyty instalacyjnej a jak skrypty zadziałają to i pewnie z dysku się da . Następne skrypty wkrótce. Update 08.09.2010 - Nowa wersja skryptu bt.vbs która dodatkowo dba o to aby partycja na penie dostała atrybut "aktywna". Listing ponizej - pod linkami są wersje aktualne . If WScript.Arguments.length =0 Then Set objShell = CreateObject("Shell.Application") objShell.ShellExecute "wscript.exe", Chr(34) & _ WScript.ScriptFullName & Chr(34) & " uac", "", "runas", 1 Else Set objShell = CreateObject("WScript.Shell") Set objFSO = CreateObject("Scripting.FileSystemObject") Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2") Set colDisks = objWMIService.ExecQuery("Select DeviceID from Win32_LogicalDisk Where DriveType =2 AND DeviceID <> 'A:' AND DeviceID <> 'B:'") For Each objDisk in colDisks strFolder = objDisk.DeviceID & "\\boot\\455asd8.znk" Set colFiles = objWMIService.ExecQuery("Select Drive From CIM_DataFile Where Name = '" & strFolder & "'") For Each colFile in colFiles objShell.CurrentDirectory = colFile.Drive objShell.Run ("%comspec% /c bootsect /nt60 " &colFile.Drive& " /mbr /force"),1,true literka = colFile.Drive objFSO.DeleteFile "BootSect.exe" objFSO.DeleteFile "bt.vbs" NEXT NEXT Set colDiskDrives = objWMIService.ExecQuery("SELECT Caption, DeviceID FROM Win32_DiskDrive") For Each objDrive In colDiskDrives Set colPartitions = objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" & objDrive.DeviceID & "'} WHERE AssocClass = " & "Win32_DiskDriveToDiskPartition") For Each objPartition In colPartitions Set colLogicalDisks = objWMIService.ExecQuery("ASSOCIATORS OF {Win32_LogicalDisk.DeviceID='" &literka& "'} WHERE AssocClass = " & "Win32_LogicalDiskToPartition") For Each objLogicalDisk In colLogicalDisks DP = "Select Disk " & objLogicalDisk.DiskIndex & VbCrLf &"Select Partition " & objLogicalDisk.Index + 1 Next Next Next If Not objFSO.FileExists(objShell.ExpandEnvironmentStrings("%temp%") & "\dp.txt") Then Set objFile = objFSO.CreateTextFile(objShell.ExpandEnvironmentStrings("%temp%") & "\dp.txt", True) objFile.WriteLine dp & vbCrLf & "active" & vbCrLf & "exit" objFile.close End If objShell.Run ("%comspec% /c diskpart /s " &objShell.ExpandEnvironmentStrings("%temp%") & "\dp.txt"),1,true objFSO.DeleteFile objShell.ExpandEnvironmentStrings("%temp%") & "\dp.txt" End If WScript.quit Jeżeli powyższy skrypt nie działa lub wyświetla błędy może to oznaczać problem z dostępem do pena (zajętość) lub niekompatybilność z danym systemem operacyjnym (nie gwarantuję działania w systemie XP). 08-10-2010 - Aktualizacja dla próbujących szczęścia pod XP patrz Post 8 W pierwszym przypadku można spróbować przekopiować skrypt poza pendrive (np na pulpit) wraz z plikiem bootsect.exe i wykonać przy zamkniętym napędzie przenośnym. W innych przypadkach można spróbować ręcznie ustawić odpowiednie parametry, otwieramy systemową konsolę w trybie administratora i wykonujemy komendy: bootsect /nt60 X: /mbr /force diskpart select disk 7 select partition 11' active exit X: to litera pod którą system widzi nasz napęd disk 7 - numer sprzetowy dysku w naszym systemie - można go sprawdzić uruchamiając diskmgmt.msc: Alternatywnie, gdy opcja "/force" powoduje błędy (plus alternatywny sposób podawania komend dla diskparta - jako ciekawostka) : bootsect /nt60 X: /mbr diskpart sel dis 7 sel par 12' act exit Jeżeli w zarządzaniu dyskami nasza partycja będzie miała atrybut "aktywna" wykonujemy tylko pierwszą linijkę z powyższego ciągu. Uwaga - parametr /force może powodować zawieszenie bootsect w systemach XP. 2k3 itp - należy spróbować wykonać komendę bez tego parametru ale bootsect musi się znajdować na innym napędzie/ścieżce np na pulpicie pzdr Uwaga - pod tym linkiem będzie się pojawiała paczka z na bieżąco aktualizowaną kolekcją skryptów Skrypty 1' - lub: select volume x: 2' - lub: sel vol x: UPDATE - Dodałem rozszerzoną wersję środowiska WinPE wzbogaconą o obsługę skryptów HTA, więcej informacji i linki w poście "WinPE z obsługą HTA" Linki dostępne również w bieżącym poście Update 21.12.2010 Ponieważ w przypadku niektórych konfiguracji sprzętowych skrypt startowy nie potrafi (w pierwszym przebiegu) prawidłowo wykryć i przypisać ścieżki do pena troszeczkę zmodyfikowałem skrypt startowy. Nowy skrypt należy podmienić wewnątrz pliku wim (wiec należy go uprzednio podmontować), odsyłam do dokumentacji programów imagex bądź dism. Obecna wersja skryptu: Set objShell = CreateObject("WScript.Shell") Set objFSO = CreateObject("Scripting.FileSystemObject") Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") strlitera = "" DO Set colDisks = objWMIService.ExecQuery("Select DeviceID from Win32_LogicalDisk Where DriveType =2 AND DeviceID <> 'A:' AND DeviceID <> 'B:'") For Each objDisk in colDisks strFolder = objDisk.DeviceID & "\\boot\\455asd8.znk" Set colFiles = objWMIService.ExecQuery("Select Drive From CIM_DataFile Where Name = '" & strFolder & "'") For Each colFile in colFiles Set WshEnv = objShell.Environment("PROCESS") WshEnv("Path") = colFile.Drive&"\libs;" &colFile.Drive&"\skrypty;" &colFile.Drive&"\tools;" &WshEnv("Path") WshEnv("Litera") = colFile.Drive strLitera = colFile.Drive NEXT NEXT Loop Until strlitera <> "" objShell.Run("%comspec% /k"),1,true Wscript.Quit Odnośnik do komentarza
maggreg Opublikowano 5 Września 2010 Autor Zgłoś Udostępnij Opublikowano 5 Września 2010 Aby formalności stało się za dość oto skrypt który jest domyślnie dostępny razem z archiwum. Skrypt NR #0 list.vbs: Set objShell = CreateObject("WScript.Shell") Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2") Set colDisks = objWMIService.ExecQuery("Select DeviceID from Win32_LogicalDisk Where DriveType =2 AND DeviceID <> 'A:' AND DeviceID <> 'B:'") For Each objDisk in colDisks strFolder = objDisk.DeviceID & "\\boot\\455asd8.znk" Set colFiles = objWMIService.ExecQuery("Select Drive From CIM_DataFile Where Name = '" & strFolder & "'") For Each colFile in colFiles objShell.CurrentDirectory = colFile.Drive destination = colFile.Drive NEXT NEXT On Error Resume Next Set colDiskDrives = objWMIService.ExecQuery("SELECT * FROM Win32_DiskDrive") For Each objDrive In colDiskDrives strDeviceID = Replace(objDrive.DeviceID, "\", "\\") Set colPartitions = objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskDrive.DeviceID=""" & strDeviceID & """} WHERE AssocClass = " & "Win32_DiskDriveToDiskPartition") For Each objPartition In colPartitions Set colLogicalDisks = objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID=""Disk #0, Partition #0""} WHERE AssocClass = " & "Win32_LogicalDiskToPartition") For Each objLogicalDisk In colLogicalDisks sciezka = objLogicalDisk.DeviceID Next Next Next Set fso = CreateObject("Scripting.FileSystemObject") Set NewFile = fso.CreateTextFile(destination & "\wyniki\FileList.txt", True) Set folder = fso.GetFolder(sciezka) For Each objSubfolder in Folder.Subfolders NewFile.WriteLine("\" & objSubfolder.name) next NewFile.WriteLine vbcrlf ShowSubFolders folder, "" NewFile.WriteLine vbcrlf For each folderIdx In folder.Files NewFile.WriteLine("\" & folderIdx.Name) Next NewFile.Close objShell.Run ("%comspec% /c bcdedit /store \\?\GLOBALROOT\device\harddisk0\partition1\boot\bcd /enum all >" &destination& "\wyniki\bcd_part1.txt"),0,true objShell.Run ("%comspec% /c bcdedit /store \\?\GLOBALROOT\device\harddisk0\partition2\boot\bcd /enum all >" &destination& "\wyniki\bcd_part2.txt"),0,true msgbox "Kliknij aby zamknąć skrypt",vbOKOnly,"Gotowe" WScript.quit Sub ShowSubFolders(folder,nazwa) For Each Subfolder In Folder.SubFolders For Each file In SubFolder.Files NewFile.WriteLine(nazwa & "\" & subfolder.name & "\" & file.Name) Next NewFile.WriteLine vbcrlf ShowSubFolders Subfolder ,nazwa & "\" & Subfolder.name Next End Sub Odnośnik do komentarza
maggreg Opublikowano 6 Września 2010 Autor Zgłoś Udostępnij Opublikowano 6 Września 2010 Drugi skrypt który ustawia atrybuty botowalności dla partycji pierwszej pierwszego dysku (w laptopach najczęściej jest to partycja odzyskiwania). Używać z umiarem gdyż w nieodpowiednich konfiguracjach może się skończyć brakiem możliwości uruchomienia systemu. Sam skrypt jednak nie jest destrukcyjny więc w każdej chwili można (ręcznie) wykonać operację odwrotną. Skrypt wpisuje odpowiedni sektor rozruchowy, ustawia atrybut partycji aktywnej, w razie potrzeby kopiuje plik bootmgr. Skrypt NR #1 act.vbs: Set objShell = CreateObject("WScript.Shell") Set objFSO = CreateObject("Scripting.FileSystemObject") if MsgBox ("Po wykonaniu skryptu system może przestać startować!!!" &vbCrLf& "Kliknij OK tylko jeżeli naprawdę wiesz co robisz" &vbCrLf& "Czy na pewno kontynuować?" ,VbOKCancel + vbDefaultButton2 + VbExclamation,"Podejmij decyzję") = 2 then wscript.quit End If Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2") Set colDiskDrives = objWMIService.ExecQuery("SELECT * FROM Win32_DiskDrive") For Each objDrive In colDiskDrives strDeviceID = Replace(objDrive.DeviceID, "\", "\\") Set colPartitions = objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskDrive.DeviceID=""" & strDeviceID & """} WHERE AssocClass = " & "Win32_DiskDriveToDiskPartition") For Each objPartition In colPartitions Set colLogicalDisks = objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID=""Disk #0, Partition #0""} WHERE AssocClass = " & "Win32_LogicalDiskToPartition") For Each objLogicalDisk In colLogicalDisks sciezka = objLogicalDisk.DeviceID Next Next Next If Not objFSO.FileExists("x:\windows\temp\dp.txt") Then Set objFile = objFSO.CreateTextFile("x:\windows\temp\dp.txt", True) objFile.WriteLine "select disk 0" & vbCrLf & "select partition 1" & vbCrLf & "active" & vbCrLf & "setid id=27 override" & vbCrLf & "exit" objFile.close End If objShell.Run ("%comspec% /c bootsect /nt60 " &sciezka& " /mbr /force"),0,true objShell.Run ("%comspec% /c diskpart /s x:\windows\temp\dp.txt"),0,true If Not objFSO.FileExists(sciezka &"\bootmgr") Then Set colDisks = objWMIService.ExecQuery("Select DeviceID from Win32_LogicalDisk Where DriveType =2 AND DeviceID <> 'A:' AND DeviceID <> 'B:'") For Each objDisk in colDisks strFolder = objDisk.DeviceID & "\\boot\\455asd8.znk" Set colFiles = objWMIService.ExecQuery("Select Drive From CIM_DataFile Where Name = '" & strFolder & "'") For Each colFile in colFiles objFSO.CopyFile colFile.Drive& "\bootmgr" , sciezka& "\" NEXT NEXT End If msgbox "Kliknij aby zamknąć skrypt",vbOKOnly,"Gotowe" WScript.quit Odnośnik do komentarza
maggreg Opublikowano 6 Września 2010 Autor Zgłoś Udostępnij Opublikowano 6 Września 2010 Trzeci skrypt dodaje do kontenera rozruchowego BCD na pierwszej partycji wpis uruchamiający środowisko Windows Recovery w wersji systemowej. Skrypt sprawdza czy partycja w ogóle zawiera kontener BCD a następnie sprawdza czy istnieje jedno z możliwych wystąpień pakietu WinRE. Domyślnie sprawdzane są dwie możliwości - recovery\winre.wim lub sources\boot.wim, oczywiscie mozna dopisać więcej możliwych opcji. Odpowiedni wpis pojawi się w sekcji "TOOLS/NARZĘDZIA" menu rozruchowego. Skrypt NR #2 bcdrec.vbs Set objFSO = CreateObject("Scripting.FileSystemObject") Set objShell = CreateObject("WScript.Shell") if MsgBox ("Skrypt doda do kontenera BCD wpis uruchamiający Windows Recovery" &vbCrLf& "Czy na pewno kontynuować?" ,VbOKCancel + vbDefaultButton2 + VbExclamation,"Podejmij decyzję") = 2 then wscript.quit End If Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2") Set colDiskDrives = objWMIService.ExecQuery("SELECT * FROM Win32_DiskDrive") For Each objDrive In colDiskDrives strDeviceID = Replace(objDrive.DeviceID, "\", "\\") Set colPartitions = objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskDrive.DeviceID=""" & strDeviceID & """} WHERE AssocClass = " & "Win32_DiskDriveToDiskPartition") For Each objPartition In colPartitions Set colLogicalDisks = objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID=""Disk #0, Partition #0""} WHERE AssocClass = " & "Win32_LogicalDiskToPartition") For Each objLogicalDisk In colLogicalDisks sciezka = objLogicalDisk.DeviceID Next Next Next If Not objFSO.FileExists(sciezka &"\boot\BCD") Then msgbox "Partycja nie zawiera kontenera BCD" &vbCrLf& "Dalsze wykonywanie skryptu jest niemożliwe",vbOKOnly,"Błąd" wscript.quit End If If objFSO.FileExists(sciezka & "\recovery\winre.wim") Then strwim = "\recovery\winre.wim" ElseIf objFSO.FileExists(sciezka & "\sources\boot.wim") Then strwim = "\sources\boot.wim" Else msgbox "Nie znaleziono pakietu WinRE" &vbCrLf& "Dalsze wykonywanie skryptu jest niemożliwe",vbOKOnly,"Błąd" wscript.quit End If If Not objFSO.FileExists(sciezka &"\boot.sdi") Then Set colDisks = objWMIService.ExecQuery("Select DeviceID from Win32_LogicalDisk Where DriveType =2 AND DeviceID <> 'A:' AND DeviceID <> 'B:'") For Each objDisk in colDisks strFolder = objDisk.DeviceID & "\\boot\\455asd8.znk" Set colFiles = objWMIService.ExecQuery("Select Drive From CIM_DataFile Where Name = '" & strFolder & "'") For Each colFile in colFiles objFSO.CopyFile colFile.Drive& "\boot\boot.sdi" , sciezka& "\" NEXT NEXT End If If Not objFSO.FileExists("x:\windows\temp\temprecovery.cmd") Then Set objFile = objFSO.CreateTextFile("x:\windows\temp\temprecovery.cmd", True) objFile.WriteLine "@for /f " &chr(34)& "tokens=2" &chr(34)& " %%a in ('bcdedit /create /d " &chr(34)& "Ram Disk" &chr(34)& " /device') do set RAM=%%a" objFile.WriteLine "@bcdedit /set %RAM% ramdisksdidevice partition=\device\harddisk0\partition1" objFile.WriteLine "@bcdedit /set %RAM% ramdisksdipath \boot.sdi" objFile.WriteLine "@bcdedit /deletevalue %RAM% description" objFile.WriteLine "" objFile.WriteLine "@for /f " &chr(34)& "tokens=2" &chr(34)& " %%a in ('bcdedit /create /d " &chr(34)& "Windows Recovery" &chr(34)& " /application osloader') do set WINPETEMP=%%a" objFile.WriteLine "@bcdedit /set %WINPETEMP% path \windows\system32\winload.exe" objFile.WriteLine "@bcdedit /set %WINPETEMP% systemroot \windows" objFile.WriteLine "@bcdedit /set %WINPETEMP% winpe yes" objFile.WriteLine "@bcdedit /set %WINPETEMP% nx OptIn" objFile.WriteLine "@bcdedit /set %WINPETEMP% detecthal yes" objFile.WriteLine "@bcdedit /set %WINPETEMP% ems yes" objFile.WriteLine "@bcdedit /set %WINPETEMP% locale pl-PL" objFile.WriteLine "@bcdedit /set %WINPETEMP% device ramdisk=[\device\harddisk0\partition1]" &strwim& ",%RAM%" objFile.WriteLine "@bcdedit /set %WINPETEMP% osdevice ramdisk=[\device\harddisk0\partition1]" &strwim& ",%RAM%" objFile.WriteLine "@bcdedit /toolsdisplayorder %WINPETEMP% /addlast" objFile.Close End If objShell.Run ("%comspec% /c x:\windows\temp\temprecovery.cmd"),0,true msgbox "Kliknij aby zamknąć skrypt",vbOKOnly,"Gotowe" WScript.quit Odnośnik do komentarza
maggreg Opublikowano 8 Września 2010 Autor Zgłoś Udostępnij Opublikowano 8 Września 2010 Mały skrypcik który wyrzuca z partycji nr 2 (domyślnie systemowej) pliki i katalogi które nie muszą trafić do obrazu partycji (śmieci), imagex np pomija te dane automatycznie. Może się przydać przed zrzuceniem takiej partycji do obrazu np ghostem. Skrypt NR #3 czyść.vbs On Error Resume Next Set objFSO = CreateObject("Scripting.FileSystemObject") Set objShell = CreateObject("WScript.Shell") kasuj "katalog", "\\?\GLOBALROOT\device\harddisk0\partition2\System Volume Information" kasuj "katalog", "\\?\GLOBALROOT\device\harddisk0\partition2\$windows.~bt" kasuj "katalog", "\\?\GLOBALROOT\device\harddisk0\partition2\$windows.~ls" kasuj "plik", "\\?\GLOBALROOT\device\harddisk0\partition2\winpepge.sys" kasuj "katalog", "\\?\GLOBALROOT\device\harddisk0\partition2\Windows\CSC" kasuj "katalog", "\\?\GLOBALROOT\device\harddisk0\partition2\Recycled" kasuj "katalog", "\\?\GLOBALROOT\device\harddisk0\partition2\Recycler" kasuj "plik", "\\?\GLOBALROOT\device\harddisk0\partition2\pagefile.sys" kasuj "plik", "\\?\GLOBALROOT\device\harddisk0\partition2\hiberfil.sys" kasuj "katalog", "\\?\GLOBALROOT\device\harddisk0\partition2\$Recycle.Bin" wscript.quit(0) Sub kasuj(FLD,scz) IF FLD = "katalog" Then If objfso.FolderExists(scz) then objFSO.DeleteFolder(scz) End If ElseIf FLD = "plik" Then If objfso.FileExists(scz) then objFSO.DeleteFile(scz) End If End If End Sub Odnośnik do komentarza
maggreg Opublikowano 9 Września 2010 Autor Zgłoś Udostępnij Opublikowano 9 Września 2010 W Windows Seven jest dostępne narzędzie które tworzy standardową konfigurację rozruchu dla tego systemu. Jest ono również dostępne w powyższym pakiecie. Oto przykład jego zastosowania: bcdboot D:\Windows /l pl-pl /s C: Gdzie D:\windows jest ścieżką do katalogu windows w naszym systemie - oznacza to, ze bcdboot do zadziałania wymaga zainstalowanego systemu oraz dostępu do niego. W powyższej ścieżce narzędzie szuka też plików które zostaną użyte do budowy pakietu startowego (choćby bootmgr) oraz pliku BCD-Temtlate (znajduje się w system32\config) który jest bazą do stworzenia kontenera rozruchu. Nie należy zmieniać pozycji tych plików i podawać innej ścieżki gdyż będzie ona wpisana jako domyślna w zbudowanym BCD. /l pl-pl - konfiguracja lokalizacji dla plików rozruchowych (i tylko dla nich a nie dla systemu). /s C: - litera partycji na której konfiguracja rozruchowa będzie utworzona. Utworzone BCD jest wersją minimalistyczną, wkrótce wkleję skrypt który buduje bardziej skomplikowany zestaw jednak w połączeniu ze Skryptem NR #1 pozwala zbudować praktycznie na zgliszczach podstawy pozwalające zbotować system. Update 11-09-2010 Oto skrypt który załatwia sprawę automatycznie: Skrypt NR #4 bcdbt.vbs Set objShell = CreateObject("WScript.Shell") Set objFSO = CreateObject("Scripting.FileSystemObject") if MsgBox ("Skrypt zbuduje minimalną konfigurację rozruchową" &vbCrLf& "opartą na szablonie systemowym" &vbCrLf& "Czy kontynuować?" ,VbOKCancel + vbDefaultButton2 + VbExclamation,"Podejmij decyzję") = 2 then wscript.quit End If Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2") Set colDiskDrives = objWMIService.ExecQuery("SELECT Caption, DeviceID FROM Win32_DiskDrive") For Each objDrive In colDiskDrives Set colPartitions = objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" & objDrive.DeviceID & "'} WHERE AssocClass = " & "Win32_DiskDriveToDiskPartition") For Each objPartition In colPartitions Set colLogicalDisks = objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='Disk #0, Partition #0'} WHERE AssocClass = " & "Win32_LogicalDiskToPartition") For Each objLogicalDisk In colLogicalDisks bootpart = objLogicalDisk.DeviceID Next Next Next For Each objDrive In colDiskDrives Set colPartitions = objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" & objDrive.DeviceID & "'} WHERE AssocClass = " & "Win32_DiskDriveToDiskPartition") For Each objPartition In colPartitions Set colLogicalDisks = objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='Disk #0, Partition #1'} WHERE AssocClass = " & "Win32_LogicalDiskToPartition") For Each objLogicalDisk In colLogicalDisks syspart = objLogicalDisk.DeviceID Next Next Next objShell.Run ("%comspec% /c bcdboot.exe " &syspart& "\Windows /l PL-pl /s " &bootpart),0,true msgbox "Kliknij aby zamknąć skrypt",vbOKOnly,"Gotowe" WScript.quit Oczywiście tak jak i w przypadku podanych skryptów ten przykład opiera się o schemat w którym system znajduje się na partycji drugiej a pierwsza jest partycją odzyskiwania/recovery pzdr Odnośnik do komentarza
maggreg Opublikowano 11 Września 2010 Autor Zgłoś Udostępnij Opublikowano 11 Września 2010 A oto skrypt który może się na pierwszy rzut oka wydawać skryptem koncepcyjnym. Jego zadaniem jest zbudowanie w kontenerze BCD na partycji pierwszej wpisów uruchamiających system z partycji drugiej. Dlaczego koncepcyjny? Bo jeżeli partycja 1 zawiera BCD to nie wykluczone, że ma on już w środku odpowiedni wpis, jeżeli nie ma to i tak nie zostanie on utworzony a wtedy można użyć skryptu NR #4. Mimo wszystko jest sytuacja kiedy i taki skrypt da się wykorzystać - mamy z nią do czynienia w przypadku kiedy posiadamy dwie odrębne konfiguracje rozruchowe - jedna na partycji pierwszej druga na drugiej i chcemy z tej drugiej zrezygnować. Coś takiego wbrew pozorom ma sens ponieważ chroni nas przed sytuacją w której uszkodzenie partycji z systemem uszkadza nam też konfigurację rozruchu, recovery nie do końca działa albo po przywróceniu nie odtwarza konfiguracji rozruchu a my nie bardzo wiemy jak taką odbudować, oczywiście przyda się też w przypadku kiedy chcemy mieć porządek lub po prostu ukryć pliki rozruchowe przed niefrasobliwymi użytkownikami (zakładam, że partycja nr 1 będzie zablokowana dla edycji narzędziami okienkowymi). Dodatkowo - choć to raczej tylko teoria) możemy wykorzystać skrypt do zbudowania konfiguracji na ręcznie skopiowanym szablonie (bo np nie ufamy narzędziu bcdboot bądź z jakiegoś powodu ono nie działa), dla przypomnienia szablon znajduje się na partycji systemowej w katalogu "Windows\System32\config" a plik nazywa się BCD-Template. Oczywiście aby powyższe założenia zostały spełnione należy z pomocą skryptu NR #1 ustawić partycję 1 jako rozruchową. Oto skrypt NR #5 bcdsysmin.vbs Set objFSO = CreateObject("Scripting.FileSystemObject") Set objShell = CreateObject("WScript.Shell") if MsgBox ("Skrypt doda do kontenera BCD minimalistyczny" &vbCrLf& "wpis uruchamiający system" &vbCrLf& "Czy na pewno kontynuować?" ,VbOKCancel + vbDefaultButton2 + VbExclamation,"Podejmij decyzję") = 2 then wscript.quit End If Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2") Set colDiskDrives = objWMIService.ExecQuery("SELECT * FROM Win32_DiskDrive") For Each objDrive In colDiskDrives strDeviceID = Replace(objDrive.DeviceID, "\", "\\") Set colPartitions = objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskDrive.DeviceID=""" & strDeviceID & """} WHERE AssocClass = " & "Win32_DiskDriveToDiskPartition") For Each objPartition In colPartitions Set colLogicalDisks = objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID=""Disk #0, Partition #0""} WHERE AssocClass = " & "Win32_LogicalDiskToPartition") For Each objLogicalDisk In colLogicalDisks sciezka = objLogicalDisk.DeviceID Next Next Next If Not objFSO.FileExists(sciezka &"\boot\BCD") Then msgbox "Partycja nie zawiera kontenera BCD" &vbCrLf& "Dalsze wykonywanie skryptu jest niemożliwe",vbOKOnly,"Błąd" wscript.quit End If If Not objFSO.FileExists("x:\windows\temp\tempsysmin.cmd") Then Set objFile = objFSO.CreateTextFile("x:\windows\temp\tempsysmin.cmd", True) objFile.WriteLine "@for /f " &chr(34)& "tokens=2" &chr(34)& " %%a in ('bcdedit /create /d " &chr(34)& "System Windows" &chr(34)& " /application osloader') do set WINPETEMP=%%a" objFile.WriteLine "@bcdedit /set %WINPETEMP% path \windows\system32\winload.exe" objFile.WriteLine "@bcdedit /set %WINPETEMP% systemroot \windows" objFile.WriteLine "@bcdedit /set %WINPETEMP% nx OptIn" objFile.WriteLine "@bcdedit /set %WINPETEMP% locale pl-PL" objFile.WriteLine "@bcdedit /set %WINPETEMP% device partition=\device\harddisk0\partition2" objFile.WriteLine "@bcdedit /set %WINPETEMP% osdevice partition=\device\harddisk0\partition2" objFile.WriteLine "@bcdedit /set %WINPETEMP% detecthal yes" objFile.WriteLine "@bcdedit /displayorder %WINPETEMP% /addfirst" objFile.WriteLine "@bcdedit /default %WINPETEMP%" objFile.Close End If objShell.Run ("%comspec% /c x:\windows\temp\tempsysmin.cmd"),0,true msgbox "Kliknij aby zamknąć skrypt",vbOKOnly,"Gotowe" WScript.quit Skrypt nie buduje wpisu odpowiedzialnego za przywracanie ze stanu hibernacji, taki powinien pojawić się sam po uruchomieniu systemu z włączoną odpowiednią opcją. Wkrótce udostępnię bardziej sensowny skrypt budujący pełną konfigurację od podstaw wraz z narzędziem recovery i klawiszem rozruchowym. pzdr Odnośnik do komentarza
maggreg Opublikowano 13 Września 2010 Autor Zgłoś Udostępnij Opublikowano 13 Września 2010 Tym razem coś z innej beczki a mianowicie skrypty do instalacji Windowsa XP z użyciem udostępnionego pakietu. Trochę to wykracza poza główną tematykę tego cyklu a i sam system już leciwy i przydatność takich produktów powinna maleć no ale na forach wciąż ten temat się powtarza (zwłaszcza w kontekście sterowników massstorage - ale o tym za chwilę). Udostępnię dwa skrypty - jeden do przygotowania dysku a drugi do samej instalacji. Skrypt instalacyjny uwzględnia możliwość użycia pliku instalacji nienadzorowanej oraz potrafi zainstalować sterowniki massstorage (SATA, AHCI, RAID itp). Aby skrypt zadziałał należy na penie założyć dodatkowy katalog o nazwie XP, do tego katalogu należy przegrać cały folder i386 z płyty instalacyjnej windowsa. Aby zainstalować system w trybie nienadzorowanym należy plik odpowiedzi o nazwie unattend.txt umieścić również w katalogu XP. Aby zainstalowały się sterowniki massstorage należy umieścić je w podkatalogu txtsetup wewnątrz folderu XP, dodatkowo katalogowi musi towarzyszyć niewielki plik tekstowy o nazwie txtsetup.txt wewnątrz folderu XP a sam pakiet sterowników powinien spełniać pewne kryteria (większość sterowników spełnia je z marszu ale nie wszystkie o czym napiszę za chwilę. Skrypt NR #6 xpdisk.vbs Set objShell = CreateObject("WScript.Shell") Set objFSO = CreateObject("Scripting.FileSystemObject") if MsgBox ("Skrypt usunie wszystkie partycje z dysku nr 0" &vbCrLf& "a nastepnie założy jedną partycję o określonym rozmiarze" &vbCrLf& "Kliknij OK tylko jeżeli naprawdę wiesz co robisz" &vbCrLf& "Czy na pewno kontynuować?" ,VbOKCancel + vbDefaultButton2 + VbExclamation,"Podejmij decyzję") = 2 then wscript.quit End If If Not objFSO.FileExists("x:\windows\temp\dp.txt") Then Set objFile = objFSO.CreateTextFile("x:\windows\temp\dp.txt", True) objFile.WriteLine "select disk 0" & vbCrLf & "clean" & vbCrLf & "create partition primary size=10240" & vbCrLf & "exit" objFile.close End If objShell.Run ("%comspec% /c diskpart /s x:\windows\temp\dp.txt"),0,true objFSO.DeleteFile "x:\windows\temp\dp.txt" msgbox "Kliknij aby zamknąć skrypt",vbOKOnly,"Gotowe" WScript.quit Skrypt czyści dysk i zakłada na nim partycje o rozmiarze 10 GB - jeżeli mamy już założoną partycję z której chcemy skorzystać ten skrypt można pominąć, jeżeli chcemy założyć partycję o innym rozmiarze wystarczy wy edytować fragment size=10240 wstawiając własną wartość. I właściwy skrypt instalacyjny: Skrypt NR #7 xpinst.vbs Set objShell = CreateObject("WScript.Shell") Set objFSO = CreateObject("Scripting.FileSystemObject") if MsgBox ("Skrypt zainstaluje system XP na pierwszej partycji" &vbCrLf& "Kliknij OK tylko jeżeli naprawdę wiesz co robisz" &vbCrLf& "Czy na pewno kontynuować?" ,VbOKCancel + vbDefaultButton2 + VbExclamation,"Podejmij decyzję") = 2 then wscript.quit End If Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2") Set colDisks = objWMIService.ExecQuery("Select DeviceID from Win32_LogicalDisk Where DriveType =2 AND DeviceID <> 'A:' AND DeviceID <> 'B:'") For Each objDisk in colDisks strFolder = objDisk.DeviceID & "\\boot\\455asd8.znk" Set colFiles = objWMIService.ExecQuery("Select Drive From CIM_DataFile Where Name = '" & strFolder & "'") For Each colFile in colFiles zrodlo = colFile.Drive & "\xp" NEXT NEXT If Not objFSO.FileExists(zrodlo & "\i386\winnt32.exe") Then msgbox "Nie znaleziono plików instalacyjnych windowsa" &vbCrLf& "Dalsze wykonywanie skryptu jest niemożliwe",vbOKOnly,"Błąd" wscript.quit End If If Not objFSO.FileExists("x:\windows\temp\dpxp.txt") Then Set objFile = objFSO.CreateTextFile("x:\windows\temp\dpxp.txt", True) objFile.WriteLine "select disk 0" & vbCrLf & "select partition 1" & vbCrLf & "format fs=ntfs label=WinXP quick" & vbCrLf & "active" & vbCrLf & "assign" & vbCrLf & "exit" objFile.close End If objShell.Run ("%comspec% /c diskpart /s x:\windows\temp\dpxp.txt"),0,true objFSO.DeleteFile "x:\windows\temp\dpxp.txt" On Error Resume Next Set colDiskDrives = objWMIService.ExecQuery("SELECT * FROM Win32_DiskDrive") For Each objDrive In colDiskDrives strDeviceID = Replace(objDrive.DeviceID, "\", "\\") Set colPartitions = objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskDrive.DeviceID=""" & strDeviceID & """} WHERE AssocClass = " & "Win32_DiskDriveToDiskPartition") For Each objPartition In colPartitions Set colLogicalDisks = objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID=""Disk #0, Partition #0""} WHERE AssocClass = " & "Win32_LogicalDiskToPartition") For Each objLogicalDisk In colLogicalDisks sciezka = objLogicalDisk.DeviceID Next Next Next If objFSO.FileExists(zrodlo & "\unattend.txt") Then struntd = " /unattend:" & zrodlo &"\unattend.txt" Else stroem = "[unattended]" & vbCrLf & "OemPreinstall=Yes" &vbCrLf& "DriverSigningPolicy=Ignore" &vbCrLf End If objShell.run (zrodlo & "\i386\winnt32.exe /makelocalsource /noreboot /syspart:" & sciezka & " /tempdrive:" & sciezka & struntd),0,true objShell.Run ("%comspec% /c bootsect /nt52 "&sciezka& " /mbr /force"),0,true If objFSO.FileExists(zrodlo & "\txtsetup.txt") Then If Not objFso.FolderExists(sciezka&"\$WIN_NT$.~LS\$OEM$") Then objFso.CreateFolder(sciezka&"\$WIN_NT$.~LS\$OEM$") End If objFso.CopyFolder zrodlo&"\txtsetup", sciezka&"\$WIN_NT$.~LS\$OEM$\TEXTMODE", True objFso.CopyFolder zrodlo&"\txtsetup", sciezka&"\$WIN_NT$.~BT\$OEM$", True Set objFile = objFSO.OpenTextFile(zrodlo&"\txtsetup.txt",1,true) strMass = objFile.ReadAll objFile.close Set objFile = objFSO.OpenTextFile(sciezka&"\$WIN_NT$.~BT\winnt.sif",1,true) strUnAtt = objFile.ReadAll objFile.Close Set objFile = objFSO.CreateTextFile(sciezka&"\$WIN_NT$.~BT\winnt.sif",true) objFile.Write strUnAtt & strMass & vbCrLf & stroem objFile.Close End If if MsgBox ("Zakończono wstępną fazę instalacji" &vbCrLf& "Kliknij OK aby zrestartować komputer" &vbCrLf& "lub Cancel aby powrócić do konsoli" ,VbOKCancel + vbDefaultButton2,"Podejmij decyzję") = 1 then objShell.Run ("Wpeutil reboot"),0,true End If WScript.quit Skrypt instaluje system na pierwszej partycji pierwszego dysku twardego w komputerze, odpowiednie dane startowe zostają ustawione automatycznie. Pora wrócić do sterowników massstorage Sterowniki muszą się znajdować bezpośredni wewnątrz katalogu txtsetup, nie mogą być zagnieżdżone wewnątrz podkatalogów, większość sterowników spełnia te kryteria ale są wyjątki, np sterowniki VIA, SI czy Promise, w takiej sytuacji należy sterownik przenieść do katalogu txtsetup i wy edytować ścieżki wewnątrz plików txtsetup.oem w sekcji [disk]. Dodatkowo sterownikom musi towarzyszyć mały plik tekstowy txtsetup.txt o następującej strukturze: Przykład dla nvidia ahci [MassStorageDrivers] "NVIDIA nForce Storage Controller (required)"="OEM" "IDE CD-ROM (ATAPI 1.2)/PCI IDE Controller"="RETAIL" Przykład dla Intela (bardziej rozbudowana wersja): [MassStorageDrivers] "Intel(R) ESB2 SATA AHCI Controller" = "OEM" "Intel(R) ICH7R/DH SATA AHCI Controller" = "OEM" "Intel(R) ICH7M/MDH SATA AHCI Controller" = "OEM" "Intel(R) ICH8R/DH/DO SATA AHCI Controller" = "OEM" "Intel(R) ICH8M-E/M SATA AHCI Controller" = "OEM" "Intel(R) ICH9R/DO/DH SATA AHCI Controller" = "OEM" "Intel(R) ICH9M-E/M SATA AHCI Controller" = "OEM" "Intel(R) ICH10D/DO SATA AHCI Controller" = "OEM" "Intel(R) ICH10R SATA AHCI Controller" = "OEM" "Intel(R) ESB2 SATA RAID Controller" = "OEM" "Intel(R) ICH7R/DH SATA RAID Controller" = "OEM" "Intel(R) ICH7MDH SATA RAID Controller" = "OEM" "Intel(R) ICH8R/ICH9R/ICH10R/DO SATA RAID Controller" = "OEM" "Intel(R) ICH8M-E/ICH9M-E SATA RAID Controller" = "OEM" "IDE CD-ROM (ATAPI 1.2)/PCI IDE Controller" = "RETAIL" Dane te są analogią sekcji [scsi] pliku txtsetup.oem właściwą dla plików odpowiedzi instalacji nienadzorowanej. Mała uwaga - ponieważ instalacja takich sterowników teoretycznie wymaga aby cały proces odbył się w trybie nienadzorowanym w skrypcie xpinst.vbs jest małe oszustwo które to umożliwia, skutkiem ubocznym jest zautomatyzowanie części tekstowej instalacji nawet w trybe nadzorowanym (ale myślę, że jest to miły dodatek. Na wszelki wypadek udostępniam paczki odpowiednio dopasowanych sterowników wraz z plikami txtsetup.txt, nie są może to najnowsze wersje bo paczka powstawała jakiś czas temu ale większość sterowników sprawdziłem osobiście (i działały), zawsze można też ich użyć jako szablonu dla nowszych wersji bądź innych kontrolerów. Sterowniki massstorage lub Sterowniki massstorage Więcej sterowników można znaleźć na driverpacks.net Niestety nie wszystkie sterowniki z tej strony zawierają plik do instalacji w trybie tekstowym, co prawda nie jest on zbyt skomplikowany i można go napisać od podstaw ale początkującym może to sprawić pewien problem, w takim wypadku proszę o kontakt - postaram się pomóc. Ponieważ budzi to wątpliwości a nie każdy jak się przekonałem umie odczytać zawartość skryptów wyjaśniam iż należy użyć tylko jednego sterownika MASSstorage, użycie wspólnej paczki wymagałoby napisania jednego wspólnego pliku txtsetup.oem dla wszystkich sterowników na dodatek takie coś potrafi spowodować kłopoty w środowisku XP ponieważ sterowniki w tym trybie zostają dołączone obligatoryjnie niezależnie czy dany kontroler występuje czy nie i pojaiwiają się konflikty prowadzace do BSOD-ów,Prawidłowa zawartość katalogu XP na penie powinna mieć postać jak na poniższym obrazku: W przykładzie widzimy sterowniki LSI działające np z kontrolerem SCSI w maszynach wirtualnych opartych o vmware lub virtualbox i żeby była jasność, plik unattend.txt widoczny na obrazku jest opcjonalny, można użyć sterowników mass bez niego (w trybie nadzorowanym) jak i viceversa (tryb nienadzorowany bez sterowników), natomiast jeżeli chcemy użyć trybu nienadzorowanego łącznie ze sterownikami massstorage musimy zadbać aby nie zdublować wpisów w obu plikach txt, możemy oczywiście wypełnić odpowiednią sekcję w unattend.txt a plik txtsetup.txt pozostawić pusty (ale obecny jako triger dla skryptu). pzdr Odnośnik do komentarza
maggreg Opublikowano 11 Października 2010 Autor Zgłoś Udostępnij Opublikowano 11 Października 2010 Postanowiłem przygotować alternatywny zestaw WinPE z obsługą skryptów HTA. Niewykluczone, że pojawią się wkrótce w tym temacie właśnie takie skrypty. Skrypty HTA rozszerzają możliwości tego zestawu o tworzenie prostych acz funkcjonalnych GUI. W skryptach HTA można używać praktycznie dowolnych języków skryptowych wykonywanych po stronie użytkownika obsługiwanych przez IE choć w praktyce nie zawsze działają prawidłowo HTA z mieszanymi skryptami. Ja ograniczę się praktycznie do skryptów budowany w oparciu o VBS ale zapraszam innych "skrypciarzy" do eksperymentów i publikacji swoich prac. Dość rozbudowana wersja takiego skryptu pokazująca co można w ten sposób osiągnąć była przeze mnie opisywana na forum którego nazwę zjada cenzura, sam skrypt (nie koniecznie najnowsza wersja) można znaleźć tutaj: menu.hta Tamten skrypt wymagał pewnej automatyki odpalającej go, w tym miejscu (jeżeli pozwoli czas i starczy zapału) postaram się zaprezentować jakby pocietą na części jego wersję dedykowaną do konkretnych zastosowań: 1.instalacje systemów rodziny NT5 z folderu dystrybucyjnego 2.jw z plików wim 3.instalacje visty i serwera 2008 4.instalacje siódemki i serwera 2008 R2 5.przygotowanie dysku 6.odpalanie programów Jaki można uzyskać przykładowy efekt - oto kilka obrazków: A oto przykład jak wyglądało/wygląda menu.hta Oto linki to tej rozszerzonej wersji WinPE (znajdą się także w poście pierwszym). WinPE z HTA lub WinPE z HTA Proszę o dalsze opinie i sugestie pzdr Odnośnik do komentarza
maggreg Opublikowano 18 Października 2010 Autor Zgłoś Udostępnij Opublikowano 18 Października 2010 Pora powrócić do pracy nad przydatnymi skryptami. Na pierwszy ogień skrypt który już obiecałem przy okazji skryptu NR #5 a mianowicie skrypt budujący cały kontener BCD ładujący system dla standardowego układu (pierwsza partycja rozruchowa druga systemowa). Dodatkowo skrypt tworzy wpis dla ramdysku który można wykorzystać później dla dodania plików wim. Opcjonalnie skrypt zakłada też wpis dla Windows Recovery (zakładamy, że recovery znajduje się w katalogu o takiej samej nazwie czyli "recovery" a plik ma nazwę winre.wim, czyli taki standard dla windowsa seven z tą róznicą, że szukamy pliku na partycji pierwszej). A oto bohater: Skrypt NR #8 bcdfull.vbs Set objFSO = CreateObject("Scripting.FileSystemObject") Set objShell = CreateObject("WScript.Shell") if MsgBox ("Skrypt utworzy nowy kontener BCD na partycji pierwszej" &vbCrLf& "Skrypt skopiuje również niezbędne pliki rozruchowe" &vbCrLf& "Czy na pewno kontynuować?" ,VbOKCancel + vbDefaultButton2 + VbExclamation,"Podejmij decyzję") = 2 then wscript.quit End If Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2") Set colDiskDrives = objWMIService.ExecQuery("SELECT * FROM Win32_DiskDrive") For Each objDrive In colDiskDrives strDeviceID = Replace(objDrive.DeviceID, "\", "\\") Set colPartitions = objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskDrive.DeviceID=""" & strDeviceID & """} WHERE AssocClass = " & "Win32_DiskDriveToDiskPartition") For Each objPartition In colPartitions If objPartition.DeviceID = "Disk #0, Partition #0" Then Set colLogicalDisks = objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID=""Disk #0, Partition #0""} WHERE AssocClass = " & "Win32_LogicalDiskToPartition") For Each objLogicalDisk In colLogicalDisks sciezka = objLogicalDisk.DeviceID strBootPartition = objPartition.BootPartition Next End IF Next Next If objFSO.FileExists(sciezka &"\boot\BCD") Then If MsgBox ("Partycja zawiera kontener BCD" &vbCrLf& "Dalsze wykonywanie skryptu spowoduje jego nadpisanie" &vbCrLf& "Czy kontynuować?",VbOKCancel + vbDefaultButton2 + VbExclamation,"Podejmij decyzję") = 2 then wscript.quit End If objFSO.DeleteFile(sciezka &"\boot\BCD") End If If Not objFSO.FolderExists(sciezka &"\boot") Then objFSO.CreateFolder(sciezka &"\boot") End If If Not objFSO.FileExists(sciezka &"\boot\boot.sdi") Then Set colDisks = objWMIService.ExecQuery("Select DeviceID from Win32_LogicalDisk Where DriveType =2 AND DeviceID <> 'A:' AND DeviceID <> 'B:'") For Each objDisk in colDisks strFolder = objDisk.DeviceID & "\\boot\\455asd8.znk" Set colFiles = objWMIService.ExecQuery("Select Drive From CIM_DataFile Where Name = '" & strFolder & "'") For Each colFile in colFiles objFSO.CopyFile colFile.Drive& "\boot\boot.sdi" , sciezka& "\boot\" NEXT NEXT End If If Not objFSO.FileExists("x:\windows\temp\tempfull.cmd") Then Set objFile = objFSO.CreateTextFile("x:\windows\temp\tempfull.cmd", True) objFile.WriteLine "@setlocal" objFile.WriteLine "@set BCD-File=\\?\globalroot\device\harddisk0\partition1\boot\bcd" objFile.WriteLine "@bcdedit.exe /createstore %BCD-File%" objFile.WriteLine "@bcdedit.exe /store %BCD-File% /create {bootmgr} /d " &chr(34)& "Windows Boot Manager" &chr(34) objFile.WriteLine "@bcdedit.exe /store %BCD-File% /set {bootmgr} device partition=\device\harddisk0\partition1" objFile.WriteLine "@bcdedit.exe /store %BCD-File% /set {bootmgr} locale pl-PL" objFile.WriteLine "@for /f " &chr(34)& "tokens=2" &chr(34)& " %%a in ('bcdedit /store %BCD-File% /create {ramdiskoptions} /d " &chr(34)& "Device options" &chr(34)& "') do set RamDiskBCD=%%a" objFile.WriteLine "@bcdedit.exe /store %BCD-File% /set %RamDiskBCD% ramdisksdidevice partition=\device\harddisk0\partition1" objFile.WriteLine "@bcdedit.exe /store %BCD-File% /set %RamDiskBCD% ramdisksdipath \boot\boot.sdi" objFile.WriteLine "@bcdedit.exe /store %BCD-File% /deletevalue %RamDiskBCD% description" objFile.WriteLine "@for /f " &chr(34)& "tokens=2" &chr(34)& " %%a in ('bcdedit /store %BCD-File% /create /d " &chr(34)& "System Windows" &chr(34)& " /application osloader') do set SystemBCD=%%a" objFile.WriteLine "@bcdedit /store %BCD-File% /set %SystemBCD% path \windows\system32\winload.exe" objFile.WriteLine "@bcdedit /store %BCD-File% /set %SystemBCD% systemroot \windows" objFile.WriteLine "@bcdedit /store %BCD-File% /set %SystemBCD% nx OptIn" objFile.WriteLine "@bcdedit /store %BCD-File% /set %SystemBCD% locale pl-PL" objFile.WriteLine "@bcdedit /store %BCD-File% /set %SystemBCD% device partition=\device\harddisk0\partition2" objFile.WriteLine "@bcdedit /store %BCD-File% /set %SystemBCD% osdevice partition=\device\harddisk0\partition2" objFile.WriteLine "@bcdedit /store %BCD-File% /set %SystemBCD% detecthal yes" objFile.WriteLine "@bcdedit /store %BCD-File% /displayorder %SystemBCD% /addfirst" objFile.WriteLine "@bcdedit /store %BCD-File% /default %SystemBCD%" If MsgBox ("Czy dodać wpis dla Windows Recovery" &vbCrLf& "Odpowiedni plik WinRE.wim musi się znajdować w katalogu recovery na partycji pierwszej",VbOKCancel + vbDefaultButton1 + VbExclamation,"Podejmij decyzję") = 1 then objFile.WriteLine "@for /f " &chr(34)& "tokens=2" &chr(34)& " %%a in ('bcdedit /store %BCD-File% /create /d " &chr(34)& "Windows Recovery" &chr(34)& " /application osloader') do set RecoveryBCD=%%a" objFile.WriteLine "@bcdedit /store %BCD-File% /set %RecoveryBCD% path \windows\system32\winload.exe" objFile.WriteLine "@bcdedit /store %BCD-File% /set %RecoveryBCD% systemroot \windows" objFile.WriteLine "@bcdedit /store %BCD-File% /set %RecoveryBCD% winpe yes" objFile.WriteLine "@bcdedit /store %BCD-File% /set %RecoveryBCD% nx OptIn" objFile.WriteLine "@bcdedit /store %BCD-File% /set %RecoveryBCD% detecthal yes" objFile.WriteLine "@bcdedit /store %BCD-File% /set %RecoveryBCD% locale pl-PL" objFile.WriteLine "@bcdedit /store %BCD-File% /set %RecoveryBCD% device ramdisk=[\device\harddisk0\partition1]\source\winre.wim,%RamDiskBCD%" objFile.WriteLine "@bcdedit /store %BCD-File% /set %RecoveryBCD% osdevice ramdisk=[\device\harddisk0\partition1]\source\winre.wim,%RamDiskBCD%" objFile.WriteLine "@bcdedit /store %BCD-File% /toolsdisplayorder %RecoveryBCD% /addlast" objFile.WriteLine "@bcdedit /store %BCD-File% /set %SystemBCD% recoverysequence %RecoveryBCD%" objFile.WriteLine "@bcdedit /store %BCD-File% /set %SystemBCD% recoveryenabled Yes" End If objFile.Close End If objShell.Run ("%comspec% /c x:\windows\temp\tempfull.cmd"),0,true objFSO.DeleteFile "x:\windows\temp\tempfull.cmd" If Not objFSO.FileExists(sciezka &"\bootmgr") And strBootPartition = "Fałsz" Then If MsgBox ("Partycja nie jest partycją startową i nie zawiera pliku bootmgr" &vbCrLf& "Czy aktywować partycję i przekopiować odpowiedni plik",VbOKCancel + vbDefaultButton1 + VbExclamation,"Podejmij decyzję") = 1 then If Not objFSO.FileExists("x:\windows\temp\dp.txt") Then Set objFile = objFSO.CreateTextFile("x:\windows\temp\dp.txt", True) objFile.WriteLine "select disk 0" & vbCrLf & "select partition 1" & vbCrLf & "active" & vbCrLf & "setid id=27 override" & vbCrLf & "exit" objFile.close End If objShell.Run ("%comspec% /c bootsect /nt60 " &sciezka& " /mbr /force"),0,true objShell.Run ("%comspec% /c diskpart /s x:\windows\temp\dp.txt"),0,true objFSO.DeleteFile "x:\windows\temp\dp.txt" For Each colFile in colFiles objFSO.CopyFile colFile.Drive& "\bootmgr" , sciezka& "\" NEXT End If ElseIf Not objFSO.FileExists(sciezka &"\bootmgr") Then If MsgBox ("Partycja nie zawiera pliku bootmgr" &vbCrLf& "Czy przekopiować odpowiedni plik",VbOKCancel + vbDefaultButton1 + VbExclamation,"Podejmij decyzję") = 1 then For Each colFile in colFiles objFSO.CopyFile colFile.Drive& "\bootmgr" , sciezka& "\" NEXT End IF ElseIf strBootPartition = "Fałsz" Then If MsgBox ("Partycja nie jest partycją startową" &vbCrLf& "Czy aktywować partycję",VbOKCancel + vbDefaultButton1 + VbExclamation,"Podejmij decyzję") = 1 then If Not objFSO.FileExists("x:\windows\temp\dp.txt") Then Set objFile = objFSO.CreateTextFile("x:\windows\temp\dp.txt", True) objFile.WriteLine "select disk 0" & vbCrLf & "select partition 1" & vbCrLf & "active" & vbCrLf & "setid id=27 override" & vbCrLf & "exit" objFile.close End If objShell.Run ("%comspec% /c bootsect /nt60 " &sciezka& " /mbr /force"),0,true objShell.Run ("%comspec% /c diskpart /s x:\windows\temp\dp.txt"),0,true objFSO.DeleteFile "x:\windows\temp\dp.txt" End If End IF msgbox "Kliknij aby zamknąć skrypt",vbOKOnly,"Gotowe" WScript.quit Dodatkowo skrypt sprawdza czy partycja jest partycją aktywną i czy zawiera niezbędny plik rozruchowy, jeżeli stwierdzi że kryteria nie zostały spełnione mamy możliwość to naprawić odpowiednią decyzją (jest to opcja). Z takim skryptem możemy postawić system 7 lub 2008 R2 bez użycia setupu z pomocą imagex-a na czystym dysku (niestety Vista i 2008 nie radzą sobie domyślnie z konfiguracją dwu partycjową, trzeba się posiłkowac setupem).Aby to osiągnąć należy założyć, sformatować partycje oraz nadać tej pierwszej literę. pzdr Odnośnik do komentarza
maggreg Opublikowano 1 Grudnia 2010 Autor Zgłoś Udostępnij Opublikowano 1 Grudnia 2010 Od zawsze na różnych forach pojawiają się pytania o możliwość instalacji systemów windows (głównie XP) na pamięciach/dyskach USB, zawsze odpowiadając na takie pytania staram się uzmysłowić bezcelowość takiego działania w przypadku samego systemu gdyż taka instalacja przywiązuje się ściśle do sprzętu na którym jest wykonywana więc nie zyskujemy przenośności natomiast ze względu na niską prędkość pamięci usb (przynajmniej do czasu upowszechnienia się usb3) tracimy na wydajności - i w tym miejscu mógłbym zakończyć ale co z odpaleniem winpe bezpośrednio z pominięciem ram dysku. Wiemy, że winpe można bez problemu odpalić z dysku niestety w przypadku usb napotykamy na stary problem ze sterownikami usb które nie działają w trybie "boot", już wcześniej poruszałem ten temat i teoretyzowałem o możliwości użycia pliku vhd ale i tutaj winpe wymagałoby przeróbki. Pisałem przy tej okazji, że nie spotkałem jeszcze opisu instalacji systemów z linii vista na usb co można by wykorzystać w takim przypadku, nie spotkałem aż do teraz, jak się okazuje odpowiedni opis - i to już jakiś czas temu - popełnił na swoim blogu Karol Stilger link i co najważniejsze można go użyć bez problemu do odpalenia winpe (może z pominięciem fragmentu "bcdboot Z:\windows /s Z:" który na winpe nie zadziała - odpowiednie bcd trzeba utworzyć samemu - oraz sekcji o pliku stronicowania który nie ma zastosowania). Co zyskujemy - Winpe jest dostępne bezpośrednio co ułatwia zmiany konfiguracyjne (przydatne np w procesie tworzenia nowego zestawu), brak ram dysku oszczędza pamięć więc jest nadzieja odpalenia takowego na bardzo okrojonej konfiguracji, teoretycznie taki zestaw powinien startować szybciej co na wolniejszych penach powinno być odczuwalne. Są oczywiście też pewne minusy, po pierwsze system wykonuje zapis bezpośrednio na penie czego jak wiemy pamięci flash nie lubią, istnieje dużo większe ryzyko uszkodzenia zestawu, zmienia się też kolejność napędów, ponieważ w tej sytuacji pen jest traktowany jako dysk automatycznie (jako urządzenie boot) otrzymuje numer 0, należy o tym pamiętać choćby używając moich skryptów które z automatu odwołują się do dysku 0, co więcej inne urządzenia massstorage usb też pojawią się prawdopodobnie przed dyskami na liście (np czytniki kart nawet jeżeli żadna karta nie będzie obsadzona) co w ogóle utrudnia automatyzację, dodatkowo zmiany nie znikają po restarcie więc należy pilnować plików tymczasowych itp. Jak widać większość przemawia za tym aby również winpe nie używać w tej formie ale należy mieć na uwadze, że taka możliwość istnieje. Udanego eksperymentowania. pzdr Odnośnik do komentarza
maggreg Opublikowano 2 Stycznia 2011 Autor Zgłoś Udostępnij Opublikowano 2 Stycznia 2011 Obiecałem wam wcześniej rozwinięcie idei o zastosowanie skryptów w formacie HTA do budowy "ciekawszych" zestawów z ładnym GUI. Trochę to trwało ale pora coś zademonstrować, jest to rozwinięcie idei którą opisywałem wcześniej na poprzednim forum, rozwinięcie ale w kawałkach, mianowicie wersja tam zademonstrowana była multizestawem który mógł zaciemniać całą ideę dlatego postanowiłem go rozbić na mniejsze fragmenty a dopiero na końcu zademonstrować jak z tego uzyskać pełny zestaw. Tym razem przedstawię skrypt służący do instalacji systemów z linii NT5 (od 2000 poprzez XP do 2003) z użyciem jako źródła plików wim. Jak spreparować same pliki wim oraz odpowiednie katalogi (katalog) przedstawię w odrębnym wątku poświęconym tylko skryptom służącym do instalacji, tutaj natomiast przedstawię sam skrypt i postaram się opisać jego funkcjonalność. <HEAD> <TITLE>Instalatory</TITLE> <HTA:APPLICATION APPLICATIONNAME="Instalatory" ID="Instalatory" BORDER="none" INNERBORDER="no" CAPTION="no" SYSMENU="no" SCROLL="auto" SINGLEINSTANCE="yes" WINDOWSTATE="maximize" SHOWINTASKBAR="no" CONTEXTMENU="no" NAVIGABLE="yes" SELECTION="no"/> <script language="vbscript" type="text/vbscript"> window.resizeTo 1024,768 window.focus </script> <style type="text/css"> body {background-image:url('img\winpe.jpg'); background-repeat:no-repeat; background-attachment:fixed; background-position:center; margin:0px; width:0%; height:100%; left:0%; top:0%; padding:0px; overflow:hidden; z-index:0; font-family:Arial; font-size:20px; font-weight:bold;} #TextArea {font-family:Albertus Medium; font-size:20pt; font-weight:bold; text-align:center; position:absolute; overflow:hidden; width:100%; height:100%; Left:0%; vertical-align:middle; Top:25%;} #menu {border-style:none; position:absolute; overflow:auto; top:5%; height:90%; width:90%; left:5%; right:5%; z-index:2;} p {position:relative; text-align:center; z-index:0;} .button {position:relative; width:325px; color:#000000; font-family:Arial; font-size:12px; font-weight:bold; border-style:ridge; z-index:2;} .button2 {position:relative; width:200px; color:#000000; font-family:Arial; font-size:12px; font-weight:bold; border-style:ridge; z-index:2;} h2 {position:relative; text-align:center; z-index:0;} </style> </HEAD> <script language="vbscript" type="text/vbscript"> dim system_install, objShell, objWMIService, strDrive, strSystem, objFso, strName dim wim_oembios, wim_massstorage, Wim_name, Wim_index, pliki_oem, plik_unattended, default_key Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2") Set objShell = CreateObject("WScript.Shell") Set objFso = CreateObject("Scripting.FileSystemObject") dim arrCommands arrCommands = Split(Instalatory.commandLine, "$") If objShell.Environment("Process").Item("SystemDrive") = "X:" Then objShell.Environment("Process").Item("Temp") = "X:\Windows\Temp" objShell.Environment("Process").Item("Tmp") = "X:\Windows\Temp" If Not objFSO.FolderExists("X:\Windows\System32\config\systemprofile\Desktop") Then objFSO.CreateFolder "X:\Windows\System32\config\systemprofile\Desktop" End If End If Sub Window_onLoad DataArea.InnerHTML = "" TextArea.InnerHTML = "" MENU.InnerHTML = "" MenuSystem End Sub Sub MenuSystem Set folder = objfso.GetFolder(arrCommands(1)&"\wim\systemy") Set files = folder.Files For each folderIdx In files Set objFile = objFSO.OpenTextFile(arrCommands(1)&"\wim\systemy\"& folderIdx.Name,1) strName = split(objFile.ReadAll,vbcrlf) strinstalki_WIM = strinstalki_WIM & "<input class='button' type='button' value='Zainstaluj "&strName(1)&"' onClick='Install_WIM ""&strName(1)&"",""&strName(3)&"",""&strName(5)&"",""&strName(7)&"",""&strName(9)&"",""&strName(11)&"",""&strName(13)&"",""&strName(15)&""'> " objFile.Close Next strmenu1 = "<p><input class='button2' type='button' value='Partitioner' onClick='partitioner' > <input class='button2' type='button' value='FreeCommander' onClick='fc'></p>" strmenu2 = "<p><input class='button2' type='button' value='Ghost 32' onClick='ghost'> <input class='button2' type='button' value='Cmd' onClick='cmd'></p>" strmenu3 = "<p><input class='button2' type='button' value='Notatnik' onClick='ntp'> <input class='button2' type='button' value='Taskmgr' onClick='tskmgr'></p>" strmenu5 = "<p><input class='button2' type='button' value='Quit' onClick='wyjscie(1)'> <input class='button2' type='button' value='Restart' onClick='wyjscie(2)'></p>" MENU.InnerHTML = "<h2>Instalki oparte na pliku WIM</h2>" & "<p>" & strinstalki_WIM & "</p>" & "<h2>Narzędzia</h2>" & strmenu1 & strmenu2 & strmenu3 & strmenu5 End Sub Sub Install_WIM(system,arg_1,arg_2,arg_3,arg_4,arg_5,arg_6,arg_7) Window.resizeTo 800,350 MENU.InnerHTML = "" DataArea.InnerHTML = "" TextArea.InnerHTML = "" On Error Resume Next Set colDisks = objWMIService.ExecQuery("Select * from Win32_LogicalDisk Where DriveType = 3 AND DeviceID <> 'x:' AND DeviceID <> '" & arrCommands(1) & "'") For Each objDisk in colDisks strBody4 = strBody4 & "<option value='"& objDisk.DeviceID &"'>"& objDisk.DeviceID &"</option>" Next set colSubfolders = objWMIService.ExecQuery("Associators of {Win32_Directory.Name='"&arrCommands(1)&"\"&arg_3&"'} Where AssocClass = Win32_Subdirectory ResultRole = PartComponent") For Each objFolder in colSubfolders strBody5 = strBody5 & "<option value='"&arrCommands(1)&"\"&arg_3&"\"&objFolder.fileName&"'>"& objFolder.fileName &"</option>" Next Set colSubfolders = objWMIService.ExecQuery("Associators of {Win32_Directory.Name='"&arrCommands(1)&"\"&arg_4&"'} Where AssocClass = Win32_Subdirectory ResultRole = PartComponent") For Each objFolder in colSubfolders strBody6 = strBody6 & "<option value='"&arrCommands(1)&"\"&arg_4&"\"&objFolder.fileName&"'>"& objFolder.fileName &"</option>" Next Set folder = objfso.GetFolder(arrCommands(1)&"\wim\pliki\dp") Set files = folder.Files For each folderIdx In files strBody8 = strBody8 & "<option value='"&folderIdx.Name&"'>"& folderIdx.Name &"</option>" Next str0 = "<option value='null'>null</option>" str1 = "<span style='display:inline width:60px; position:absolute; top:15%; left:5%'><select size='1' name='AvailableDrives'>" str2 = "<input class='button' type='button' value='Potwierdź wybór' onClick='sys_inst_WIM' style='left:25%; top:70%; width:125px;'>" str3 = "<input class='button' type='button' value='Rezygnuję' onClick='Cancel' style='left:45%; top:70%; width:125px;'>" str4 = "<span style='display:inline width:60px; position:absolute; top:22%; left:5%'><select size='1' name='AvailableOEMS'>" str5 = "<span style='display:inline width:60px; position:absolute; top:45%; left:5%'><input type='checkbox' name='chkbox1' checked='True'> Nienadzorowana</span>" str6 = "<span style='display:inline width:60px; position:absolute; top:29%; left:5%'><select size='1' name='AvailableMASS'>" str7 = "<span style='display:inline width:60px; position:absolute; top:55%; left:5%'><input type='checkbox' name='chkbox2'> Użyj katalogu $OEM&</span>" str9 = "<span style='display:inline width:60px; position:absolute; top:65%; left:5%'><input type='checkbox' name='chkbox3'> Autorestart</span>" str8 = "<span style='display:inline width:100px; position:absolute; top:36%; left:5%'><select size='1' name='AvailableDP'>" str10 = "<span style='display:inline width:60px; position:absolute; top:75%; left:5%'><input type='checkbox' name='chkbox4'> Użyj klucza domyślnego</span>" DataArea.InnerHTML = "<h2>Instalacja WIM " & system & "</h2>" & str1 & str0 & strBody4 & "</select>" & " Proszę wybrać partycę docelową</Span>" & str4 & str0 & strBody5 & "</select>" & " Proszę wybrać dostawcę OEM</Span>" & str6 & str0 & strBody6 & "</select>" & " Proszę wybrać Sterowniki MassStorage</Span>" & str5 & str8 & str0 & strBody8 & "</select>" & " Proszę wybrać plik konfiguracji dysku</Span>" & str7 & str9 & str10 & str2 & str3 strSystem = system Wim_name = arg_1 Wim_index = arg_2 wim_oembios = arg_3 wim_massstorage = arg_4 pliki_oem = arg_5 plik_unattended = arg_6 default_key = arg_7 End Sub Sub sys_inst_WIM If AvailableDP.Value <> "null" Then strDrive = "V:" ElseIf AvailableDrives.Value = "null" Then Func_Back_WIM Exit Sub Else strDrive = AvailableDrives.Value End If strMassStorage = AvailableMASS.Value strOEM = AvailableOEMS.Value strDP = AvailableDP.Value if chkbox1.Checked then chkbox1_WIM = "TAK" Set objFile = objFSO.OpenTextFile(arrCommands(1)&"\"&plik_unattended,1,true) strUnAtt = objFile.ReadAll objFile.Close Else if chkbox4.Checked then chkbox4_WIM = "TAK" strdefkey = "[userdata]" & vbCrLf & "productid=" & default_key & vbCrLf & "productkey=" & default_key & vbCrLf end if strUnAtt = "[data]" & vbCrLf & "msdosinitiated=1" & vbCrLf & "floppyless=1" & vbCrLf & "AutoPartition=1" & vbCrLf & "UseSignatures=yes" & vbCrLf & "OriSrc=A:\I386" & vbCrLf & "OriTyp=5" & vbCrLf strnonunat = "[unattended]" & vbCrLf & "OemPreinstall=Yes" &vbCrLf& "DriverSigningPolicy=Ignore" &vbCrLf end If if chkbox2.Checked then chkbox2_WIM = "TAK" end if if chkbox3.Checked then chkbox3_WIM = "TAK" end if DataArea.InnerHTML = "" TextArea.InnerHTML = "" window.resizeTo 768,120 TextArea.InnerHTML = "Proszę czekać,<br>trwa Instalacja " & strSystem If strdp <> "null" Then objShell.run ("%comspec% /c diskpart /s "&chr(34)&arrCommands(1)&"\wim\pliki\DP\"&strDP&chr(34)),0,true Else set colVolumes = objWMIService.ExecQuery("select * from Win32_Volume Where Name = '"&strDrive&"\\'") For Each objVolume in colVolumes objVolume.Format "NTFS",True,,"",False If Not objFSO.FileExists("x:\windows\temp\dp.txt") Then Set objFile = objFSO.CreateTextFile("x:\windows\temp\dp.txt", True) objFile.WriteLine "select volume " & strDrive & vbCrLf & "active" & vbCrLf & "exit" objFile.close End If objShell.Run ("%comspec% /c diskpart /s x:\windows\temp\dp.txt"),0,true objFSO.DeleteFile "x:\windows\temp\dp.txt" Next End If objShell.run ("bootsect.exe /nt52 " & strDrive & " /force /mbr"),0,true objShell.run ("imagex.exe /apply "&arrCommands(1)&"\wim\"&Wim_name&" "&Wim_index&" "&strDrive),0,true Set objFile = objFSO.CreateTextFile(strDrive&"\$WIN_NT$.~BT\winnt.sif",true) objFile.Write strUnAtt & strdefkey objFile.Close 'objShell.run ("wpeutil.exe reboot"),0,false if chkbox2_WIM = "TAK" then objFso.CopyFolder arrCommands(1)&"\"&pliki_oem, strDrive&"\$WIN_NT$.~LS\$OEM$", True end if If strOEM <> "null" Then objFSO.CopyFile strOEM&"\*", strDrive&"\$WIN_NT$.~LS\I386\", True End IF If strMassStorage <> "null" Then Set objFile = objFSO.OpenTextFile(strMassStorage&"\untd.txt",1,true) strMass = objFile.ReadAll objFile.close Set objFile = objFSO.CreateTextFile(strDrive&"\$WIN_NT$.~BT\winnt.sif",true) objFile.Write strUnAtt & strnonunat & strdefkey & strMass objFile.Close If Not objFso.FolderExists(strDrive&"\$WIN_NT$.~LS\$OEM$") Then Set f = objFso.CreateFolder(strDrive&"\$WIN_NT$.~LS\$OEM$") End If Set f = Nothing objFso.CopyFolder strMassStorage&"\txtsetup", strDrive&"\$WIN_NT$.~LS\$OEM$\TEXTMODE", True objFso.CopyFolder strMassStorage&"\txtsetup", strDrive&"\$WIN_NT$.~BT\$OEM$", True End If IF chkbox3_Wim = "TAK" then objShell.Run ("Wpeutil Reboot"),0,false End If window.resizeTo 1024,768 MenuSystem DataArea.InnerHTML = "" TextArea.InnerHTML = "" End sub Sub Func_Back_WIM DataArea.InnerHTML = "" TextArea.InnerHTML = "" window.resizeTo 512,120 strbck1 = "<input class='button' type='button' value='Wróć' onClick='Install_WIM ""&strSystem&"",""&Wim_name&"",""&Wim_index&"",""&wim_oembios&"",""&wim_massstorage&"",""&pliki_oem&"",""&plik_unattended&"",""&default_key&""' style='left:5%; top:65%; width:125px;'>" strbck2 = "<input class='button' type='button' value='Diskpart' onClick='diskpart' style='left:10%; top:65%; width:125px;'>" strbck3 = "<input class='button' type='button' value='Rezygnuję' onClick='Cancel' style='left:15%; top:65%; width:125px;'>" TextArea.InnerHTML = "Nie wybrano partycji docelowej" DataArea.InnerHTML = strbck1 & strbck2 & strbck3 End Sub sub cancel DataArea.InnerHTML = "" TextArea.InnerHTML = "" window.resizeTo 1024,768 MenuSystem end sub Sub ghost MENU.InnerHTML = "" window.resizeTo 512,80 TextArea.InnerHTML = "Uruchomiono Ghost 32" objShell.Run (arrCommands(1) & "\tools\ghost32.exe -prefos"),0,True window.resizeTo 1024,768 MenuSystem TextArea.InnerHTML = "" End Sub Sub ntp MENU.InnerHTML = "" window.resizeTo 512,80 TextArea.InnerHTML = "Uruchomiono Notatnik" objShell.Run ("notepad"),1,True window.resizeTo 1024,768 MenuSystem TextArea.InnerHTML = "" End Sub Sub cmd MENU.InnerHTML = "" window.resizeTo 512,80 TextArea.InnerHTML = "Uruchomiono Wiersz Poleceń" objShell.Run ("%comspec%"),1,True window.resizeTo 1024,768 MenuSystem TextArea.InnerHTML = "" End Sub Sub partitioner MENU.InnerHTML = "" window.resizeTo 512,80 TextArea.InnerHTML = "Uruchomiono DiskPartitioner" objShell.Run (arrCommands(1) & "\tools\DiskPartitioner\DiskPartitioner.exe"),0,True window.resizeTo 1024,768 MenuSystem TextArea.InnerHTML = "" End Sub Sub FC MENU.InnerHTML = "" window.resizeTo 512,80 TextArea.InnerHTML = "Uruchomiono FreeCommander" objShell.Run (arrCommands(1) & "\tools\FreeCommanderPortable\FreeCommanderPortable.exe"),0,True window.resizeTo 1024,768 MenuSystem TextArea.InnerHTML = "" End Sub Sub tskmgr MENU.InnerHTML = "" window.resizeTo 512,80 TextArea.InnerHTML = "Uruchomiono Menedżer zadań" objShell.Run ("taskmgr"),1,True window.resizeTo 1024,768 MenuSystem TextArea.InnerHTML = "" End Sub sub wyjscie(str_str) If str_str = 1 Then self.close() ElseIf str_str = 2 Then objShell.Run ("Wpeutil Reboot"),0,false End If end sub </script> <body id=body> <span id=menu></span> <span id=DataArea></span> <span id=TextArea></span> </body> wersje na zewnętrznych hostach: menu_min.hta lub menu_min.hta plik należy wrzucić do katalogu ze skryptami, opcjonalnie można w tym katalogu założyć podkatalog img i umieścić w nim plik winpe.wim o rozmiarze 1024x768 który automatycznie stanie się tłem dla odpalanego GUI. Uwaga - skrypt ten uruchamiamy inaczej niż wcześniejsze: po pierwsze należy podać pełną nazwę z rozszerzeniem po drugie należy podać argument w formacie - $ "litera przypisana penowi" Przykład - dolar jest obligatoryjny, potrzebny do zadziałania skryptu natomiast zamiast litery można podać zmienną którą ustawia skrypt startowy w winpe: menu_mini.hta $%litera% menu_mini.hta jest propozycją, plik można nazwać w dowolny sposób. Jak to wygląda po odpaleniu: menu główne - tutaj widać 6 systemów, ilość zależy od zawartości katalogu z konfigami który będzie opisany w oddzielnym wątku i jest generowana automatycznie przy starcie menu: a tutaj samo podmenu instalacji systemów z pokazanym wyborem poszczególnych opcji: Poszczególne opcje pozwalają na (patrząc od góry): 1' wybór partycji docelowej dla instalowanego systemu, partycja zostanie sformatowana i ustawiona jako aktywna, zostanie też ustawiony odpowiedni botsektor. 2' pozwala wybrać pliki służące do preaktywacji systemu na sprzęcie danego producenta (pliki oczywiście muszą się znajdować w odpowiednim katalogu), w ten sposób można również dokonać w locie konwersji mędzy systemem OEM <> VLK 3' pozwala wybrać sterowniki kontrolera dysków (ahci, raid) jeżeli są dostępne w odpowiednim katalogu, wymagany format jest identyczny jek ten opisany w poście skrypt do instalacji xp 4' pozwala na ustawienie dysku z użyciem skryptu dla diskparta, jeżeli ta opcja zostanie wybrana ignorowany jest wybór z punktu 1', w tym przypadku windows jest instalowany zawsze na partycji o literze v: co należy w skryptach uwzględnić teraz checkboxy: 5' jeżeli jest zaznaczony (taka jest wersja domyślna) podczas instalacji uzywany jest plik odpowiedzi dla instalacji nienadzorowanej w przeciwnym wypadku zostanie wygenerowany plik w wersji minimalistycznej potrzebnej aby instalacja w ogóle była możliwa - obostrzenia zostaną opisane w zapowiadanym temacie dotyczącym samej instalacji. 6' określa czy podczas instalacji ma zostać uzyta zawartość katalogu $OEM$, z pomocą tego katalogu (i pliku odpowiedzi dla instalacji nienadzorowanej) można bardzo rozbudować i scustomizować instalację systemu, można zainstalować sterowniki, programy, dokonać zmian w rejestrze itp. itd. - odsyłam do moich odpowiedzi na posty @GoblinWizard-a - link oraz link - temat jest bardzo obszerny i nie zamierzam się nad nim pastwić głębiej ze względu na ogólne zanikanie potrzeby skupiania się na Win XP (i pochodnych) 7' zaznaczenie opcji autostart spowoduje automatyczne zresetowanie się komputera po pierwszej fazie (przerzuceniu plików na partycję), właściwa faza instalacji nastąpi po restarcie (przydatne przy nienadzorowanej, po ustawieniu opcji można iść na kawę i wrócić kiedy system już będzie odpalony i gotowy do pracy). 8' Nowa opcja która pozwala na użycie podczas instalacji wcześniej zdefiniowanego klucza produktu jeżeli nie decydujemy się na instalację nienadzorowaną a chcemy jednak sobie troszkę zautomatyzować. Jak widać memy wiele możliwości do wykorzystania (zwłaszcza przez osoby bardziej zaawansowane), część z nich bardzo się przyda osobom które zajmują się grzecznościowo czy zawodowo instalacją na wielu sprzętach, dla domorosłych "instalatorów" to raczej ciekawostka choć nadal do wykorzystania, ja uważam że skorzystanie z winpe jest najlogiczniejszą i najprostszą metodą na instalację systemów z tej rodziny, nie przerabiamy plików instalacyjnych, nie dodajemy żadnych sterowników ramdysku, fake sterowników itp. itd. mających ogłupić instaler na dodatek dostajemy dość sporą uniwersalność. Oczywiście nic nie jest idealne, największym brakiem tej wersji instalatora jest jej przywiązanie do konkretnej (jednej) partycji która jest docelową dla instalacji i automatycznie staje się też aktywną, można to oczywiście obejść ale za bardzo (wg mnie) skomplikowałoby to sam skrypt a zapotrzebowanie na takie cuś jest chyba minimalne (a może jednak - proszę o głosy/opinie w tej sprawie), być może wrócę do tego przy "remasteringu" skryptu dla instalacji z folderu dystrybucyjnego. Instalacja na dwie partycje nadal jest oczywiście możliwa, należy tylko ręcznie wykonać kilka zabiegów, po pierwsze nie używamy skryptu ustawiającego dysk tylko przygotowujemy sobie dysk wcześniej, po drugie po fazie kopiowania plików (czyli autorestart musi być wyłączony) poprawiamy atrybuty (ustawiamy właściwą partycję jako aktywną) i instalujemy botsektor na tej właściwej partycji, po trzecie w końcu kopiujemy (przenosimy) na tą partycję pliki startowe windowsa czyli boot.ini, ntdetect, ntldr (nie jestem pewny czy txtsetup.sif również nie powinien się na niej znaleźć, jak sprawdzę dam znać), być może trzeba będzie też wyedytować docelowe boot.ini. Po opis przygotowania samego zestawu zapraszam do wątku Instalacja systemów z pendriva GUI oparte o HTA do instalacji z użyciem WinPE, dla pena lub sieci pzdr Odnośnik do komentarza
maggreg Opublikowano 22 Stycznia 2011 Autor Zgłoś Udostępnij Opublikowano 22 Stycznia 2011 Tym razem kontynuujemy wątek skryptów poświęconych instalacji systemów. Poniższy skrypt służy do instalacji systemów z lini NT60 (czyli Vista, Server2008, Seven, 2008 R2). Problematykę przygotowania odpowiedniego repozytorium jak i poprzednio opiszę w równoległym wątku, także samą sensowność skryptowania tych instalerów postaram się tam wyjaśnić, tutaj przedstawię sam skrypt i jego funkcje. A oto bohater niniejszego wywodu: <HEAD> <TITLE>Instalatory</TITLE> <HTA:APPLICATION APPLICATIONNAME="Instalatory" ID="Instalatory" BORDER="none" INNERBORDER="no" CAPTION="no" SYSMENU="no" SCROLL="auto" SINGLEINSTANCE="yes" WINDOWSTATE="maximize" SHOWINTASKBAR="no" CONTEXTMENU="no" NAVIGABLE="yes" SELECTION="no"/> <script language="vbscript" type="text/vbscript"> window.resizeTo 800,600 window.focus </script> <style type="text/css"> body {background-image:url('img\winpe.jpg'); background-repeat:no-repeat; background-attachment:fixed; background-position:center; margin:0px; width:0%; height:100%; left:0%; top:0%; padding:0px; overflow:hidden; z-index:0; font-family:Arial; font-size:20px; font-weight:bold;} #TextArea {font-family:Albertus Medium; font-size:20pt; font-weight:bold; text-align:center; position:absolute; overflow:hidden; width:100%; height:100%; Left:0%; vertical-align:middle; Top:25%;} #menu {border-style:none; position:absolute; overflow:auto; top:5%; height:90%; width:90%; left:5%; right:5%; z-index:2;} p {position:relative; text-align:center; z-index:0;} .button {background-image:url('img\background.gif'); position:relative; width:325px; color:#000000; font-family:Arial; font-size:12px; font-weight:bold; border-style:ridge; z-index:2;} .button2 {background-image:url('img\background.gif'); position:relative; width:200px; color:#000000; font-family:Arial; font-size:12px; font-weight:bold; border-style:ridge; z-index:2;} h2 {position:relative; text-align:center; z-index:0;} </style> </HEAD> <script language="vbscript" type="text/vbscript"> dim system_install, objShell, objWMIService, strDrive, strSystem, objFso, strName dim wim_oembios, wim_massstorage, Wim_name, Wim_index, pliki_oem, plik_unattended, default_key dim strdp, straoems, strunattend Set objShell = CreateObject("WScript.Shell") Set objFso = CreateObject("Scripting.FileSystemObject") dim arrCommands arrCommands = Split(Instalatory.commandLine, "$") If objShell.Environment("Process").Item("SystemDrive") = "X:" Then objShell.Environment("Process").Item("Temp") = "X:\Windows\Temp" objShell.Environment("Process").Item("Tmp") = "X:\Windows\Temp" If Not objFSO.FolderExists("X:\Windows\System32\config\systemprofile\Desktop") Then objFSO.CreateFolder "X:\Windows\System32\config\systemprofile\Desktop" End If End If Sub Window_onLoad DataArea.InnerHTML = "" TextArea.InnerHTML = "" MENU.InnerHTML = "" MenuSystem End Sub Sub MenuSystem Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2") strmenu1 = "<p><input class='button2' type='button' value='Start Sieci' onClick='NET' > Â Â <input class='button2' type='button' value='FreeCommander' onClick='fc'></p>" strmenu2 = "<p><input class='button2' type='button' value='Ghost 32' onClick='ghost'> Â Â <input class='button2' type='button' value='Cmd' onClick='cmd'></p>" strmenu3 = "<p><input class='button2' type='button' value='Notatnik' onClick='ntp'> Â Â <input class='button2' type='button' value='Taskmgr' onClick='tskmgr'></p>" strmenu5 = "<p><input class='button2' type='button' value='Quit' onClick='wyjscie(1)'> Â Â <input class='button2' type='button' value='Restart' onClick='wyjscie(2)'></p>" strmenu4 = "<p><input class='button' type='button' value='Instalacja systemów Vista lub Server 2008' onClick='Vista_Inst'> Â Â <input class='button' type='button' value='Instalacja systemów Seven lub Server 2008 R2' onClick='Seven_Inst'></p>" MENU.InnerHTML = "<h2>Instalki systemów z lini Vista i Seven (Vista, Win 7, Server2k8, Server2k8 R2)</h2>" & strmenu4 & "<h2>Narzędzia</h2>" & strmenu1 & strmenu2 & strmenu3 & strmenu5 End Sub Sub Vista_Inst Window.resizeTo 750,250 MENU.InnerHTML = "" DataArea.InnerHTML = "" TextArea.InnerHTML = "" On Error Resume Next Set folder = objfso.GetFolder(arrCommands(1)&"\vista_Installer\vista_unattend") Set files = folder.Files For each folderIdx In files strBody42 = strBody42 & "<option value='"&folderIdx.Name&"'>"& folderIdx.Name &"</option>" Next Set colSubfolders = objWMIService.ExecQuery("Associators of {Win32_Directory.Name='"&arrCommands(1)&"\vista_Installer\vista_unattend\AOems'} Where AssocClass = Win32_Subdirectory ResultRole = PartComponent") For Each objFolder in colSubfolders strBody45 = strBody45 & "<option value='"&objFolder.Name&"'>"& objFolder.fileName &"</option>" Next Set folder = objfso.GetFolder(arrCommands(1)&"\vista_Installer\vista_unattend\dp") Set files = folder.Files For each folderIdx In files strBody48 = strBody48 & "<option value='"&folderIdx.Name&"'>"& folderIdx.Name &"</option>" Next str40 = "<option value='null'>null</option>" str41 = "<span style='display:inline width:60px; position:absolute; top:15%; left:5%'><select size='1' name='AvailableUnattend'>" str43 = "<input class='button' type='button' value='Potwierdź wybór' onClick='Vista_Instal' style='left:25%; top:50%; width:125px;'>" str44 = "<input class='button' type='button' value='Rezygnuję' onClick='Cancel' style='left:35%; top:50%; width:125px;'>" str46 = "<span style='display:inline width:80px; position:absolute; top:30%; left:5%'><select size='1' name='AvailableAOems'>" str47 = "<span style='display:inline width:60px; position:absolute; top:60%; left:5%'><input type='checkbox' name='chkbox1'> Autorestart</span>" str48 = "<span style='display:inline width:100px; position:absolute; top:45%; left:5%'><select size='1' name='AvailableDP'>" DataArea.InnerHTML = "<h2>Instalacja Systemu Vista lub Server 2008</h2>" & str41 & str40 & strBody42 & "</select>" & " Proszę wybrać plik instalacji nienadzorowanej</Span>" & str46 & str40 & strBody45 & "</select>" & " Proszę wybrać Alternatywny katalog $OEM$</Span>" & str48 & str40 & strBody48 & "</select>" & " Proszę wybrać skrypt przygotowujący dysk</Span>" & str47 & str43 & str44 End Sub Sub Vista_Instal strunattend = AvailableUnattend.Value straoems = AvailableAOems.Value strdp = AvailableDP.Value if chkbox1.Checked then chkbox1_Vista = "TAK" end if MENU.InnerHTML = "" DataArea.InnerHTML = "" TextArea.InnerHTML = "" window.resizeTo 725,160 TextArea.InnerHTML = "Instalacja systemów z lini Vista<br>Windows Vista, Serwer 2008" If strdp <> "null" Then objShell.run ("%comspec% /c" & "diskpart /s "&chr(34)&arrCommands(1)&"\vista_Installer\vista_unattend\DP\"&strDP&chr(34)),0,true End If If strunattend = "null" AND straoems = "null" Then objShell.run (arrCommands(1) & "\vista_Installer\setup.exe /noreboot"),0,true ElseIF strunattend <> "null" AND straoems = "null" Then objShell.run (arrCommands(1) & "\vista_Installer\setup.exe /noreboot /unattend:"&arrCommands(1)&"\vista_Installer\vista_unattend\"&strunattend),0,true ElseIF strunattend = "null" AND straoems <> "null" Then objShell.run (arrCommands(1) & "\vista_Installer\setup.exe /noreboot /m:"&straoems),0,true Else objShell.run (arrCommands(1) & "\vista_Installer\setup.exe /noreboot /m:"&straoems&" /unattend:"&arrCommands(1)&"\vista_Installer\vista_unattend\"&strunattend),0,true End If IF chkbox1_Vista = "TAK" then self.close() End If window.resizeTo 1024,768 MenuSystem TextArea.InnerHTML = "" End Sub Sub Seven_Inst Window.resizeTo 750,250 MENU.InnerHTML = "" DataArea.InnerHTML = "" TextArea.InnerHTML = "" On Error Resume Next Set folder = objfso.GetFolder(arrCommands(1)&"\seven_Installer\seven_unattend") Set files = folder.Files For each folderIdx In files strBody22 = strBody22 & "<option value='"&folderIdx.Name&"'>"& folderIdx.Name &"</option>" Next Set colSubfolders = objWMIService.ExecQuery("Associators of {Win32_Directory.Name='"&arrCommands(1)&"\seven_Installer\seven_unattend\AOems'} Where AssocClass = Win32_Subdirectory ResultRole = PartComponent") For Each objFolder in colSubfolders strBody25 = strBody25 & "<option value='"&objFolder.Name&"'>"& objFolder.FileName &"</option>" Next Set folder = objfso.GetFolder(arrCommands(1)&"\seven_Installer\seven_unattend\dp") Set files = folder.Files For each folderIdx In files strBody28 = strBody28 & "<option value='"&folderIdx.Name&"'>"& folderIdx.Name &"</option>" Next str20 = "<option value='null'>null</option>" str21 = "<span style='display:inline width:60px; position:absolute; top:15%; left:5%'><select size='1' name='AvailableUnattend'>" str23 = "<input class='button' type='button' value='Potwierdź wybór' onClick='Seven_Instal' style='left:25%; top:50%; width:125px;'>" str24 = "<input class='button' type='button' value='Rezygnuję' onClick='Cancel' style='left:35%; top:50%; width:125px;'>" str26 = "<span style='display:inline width:80px; position:absolute; top:30%; left:5%'><select size='1' name='AvailableAOems'>" str27 = "<span style='display:inline width:60px; position:absolute; top:60%; left:5%'><input type='checkbox' name='chkbox1'> Autorestart</span>" str28 = "<span style='display:inline width:100px; position:absolute; top:45%; left:5%'><select size='1' name='AvailableDP'>" DataArea.InnerHTML = "<h2>Instalacja Systemu z lini Seven</h2>" & str21 & str20 & strBody22 & "</select>" & " Proszę wybrać plik instalacji nienadzorowanej</Span>" & str26 & str20 & strBody25 & "</select>" & " Proszę wybrać Alternatywny katalog $OEM$</Span>" & str28 & str20 & strBody28 & "</select>" & " Proszę wybrać skrypt przygotowujący dysk</Span>" & str27 & str23 & str24 End Sub Sub Seven_Instal strunattend = AvailableUnattend.Value straoems = AvailableAOems.Value strdp = AvailableDP.Value if chkbox1.Checked then chkbox1_Seven = "TAK" end if MENU.InnerHTML = "" DataArea.InnerHTML = "" TextArea.InnerHTML = "" window.resizeTo 725,160 TextArea.InnerHTML = "Instalacja systemów z lini Seven<br>Windows Seven, Serwer 2008 R2" If strdp <> "null" Then objShell.run ("%comspec% /c" & "diskpart /s "&chr(34)&arrCommands(1)&"\seven_Installer\seven_unattend\DP\"&strDP&chr(34)),0,true End If If strunattend = "null" AND straoems = "null" Then objShell.run (arrCommands(1) & "\seven_Installer\setup.exe /noreboot"),0,true ElseIF strunattend <> "null" AND straoems = "null" Then objShell.run (arrCommands(1) & "\seven_Installer\setup.exe /noreboot /unattend:"&arrCommands(1)&"\seven_Installer\seven_unattend\"&strunattend),0,true ElseIF strunattend = "null" AND straoems <> "null" Then objShell.run (arrCommands(1) & "\seven_Installer\setup.exe /noreboot /m:"&straoems),0,true Else objShell.run (arrCommands(1) & "\seven_Installer\setup.exe /noreboot /m:"&straoems&" /unattend:"&arrCommands(1)&"\seven_Installer\seven_unattend\"&strunattend),0,true End If IF chkbox1_Seven = "TAK" then self.close() End If window.resizeTo 1024,768 MenuSystem TextArea.InnerHTML = "" End Sub sub cancel DataArea.InnerHTML = "" TextArea.InnerHTML = "" window.resizeTo 800,600 MenuSystem end sub Sub ghost MENU.InnerHTML = "" window.resizeTo 512,80 TextArea.InnerHTML = "Uruchomiono Ghost 32" objShell.Run (arrCommands(1) & "\tools\ghost32.exe -prefos"),0,True window.resizeTo 800,600 MenuSystem TextArea.InnerHTML = "" End Sub Sub ntp MENU.InnerHTML = "" window.resizeTo 512,80 TextArea.InnerHTML = "Uruchomiono Notatnik" objShell.Run ("notepad"),1,True window.resizeTo 800,600 MenuSystem TextArea.InnerHTML = "" End Sub Sub cmd MENU.InnerHTML = "" window.resizeTo 512,80 TextArea.InnerHTML = "Uruchomiono Wiersz Poleceń" objShell.Run ("%comspec%"),1,True window.resizeTo 800,600 MenuSystem TextArea.InnerHTML = "" End Sub Sub NET MENU.InnerHTML = "" window.resizeTo 512,80 TextArea.InnerHTML = "Startuje sieć" objShell.Run ("wpeutil InitializeNetwork"),0,True objShell.Run ("wpeutil DisableFirewall"),0,True window.resizeTo 800,600 MenuSystem TextArea.InnerHTML = "" End Sub Sub FC MENU.InnerHTML = "" window.resizeTo 512,80 TextArea.InnerHTML = "Uruchomiono FreeCommander" objShell.Run (arrCommands(1) & "\tools\FreeCommanderPortable\FreeCommanderPortable.exe"),0,True window.resizeTo 800,600 MenuSystem TextArea.InnerHTML = "" End Sub Sub tskmgr MENU.InnerHTML = "" window.resizeTo 512,80 TextArea.InnerHTML = "Uruchomiono Menedżer zadań" objShell.Run ("taskmgr"),1,True window.resizeTo 800,600 MenuSystem TextArea.InnerHTML = "" End Sub sub wyjscie(str_str) If str_str = 1 Then self.close() ElseIf str_str = 2 Then objShell.Run ("Wpeutil Reboot"),0,false End If end sub </script> <body id=body> <span id=menu></span> <span id=DataArea></span> <span id=TextArea></span> wersje na zewnętrznych hostach: Menu_Vista.hta lub Menu_Vista.hta Sposób uruchomienia skryptu w przypadku winpe z domyślnie odpalaną konsolą jest taki sam jak we wcześniejszym opisie instalatorów dla lini XP. Pierwszy obrazek pokazuje podstawowe menu które w tym przypadku nie jest generowane automatycznie, oba batony są obligatoryjne (docelowy skrypt konsolidujący wszystkie wersje będzie zawierał znaczniki pozwalające na włącznie lub wyłączanie poszczególnych podprocedur - przynajmniej taki jest plan). Z pewnych względów które wyjaśnię w równoległym wątku musimy zastosować oddzielne instalatory dla wcześniejszej lini systemów - dlatego mamy dwa batony. A oto funkcjonalność jaka się za nimi kryje: 1' - Po pierwsze menu pozwala nam wybrać z listy jeden z predefiniowanych plików odpowiedzi dla instalacji nienadzorowanej - i to w zasadzie już byłoby powodem do zainteresowania się tym zestawem - reszta jest w bonusie. 2' - Alternatywny katalog $OEM$, katalog ten nie zastępuje swojego głównego odpowiednika ale dodaje się do niego (jeżeli zawartość wewnętrzna się zdubluje zostanie jednak nadpisana), ja osobiście używam tylko tych katalogów wybieranych z menu, katalog główny/domyślny pozostaje pusty (może w ogóle nie istnieć), dzięki takiej konstrukcji możemy stworzyć predefiniowane zestawy instalujące programy czy sterowniki a także tworzyć odpowiedniki nośników recovery dla różnych producentów nie kolidujące ze sobą (w najprostszej wersji katalogi mogą zawierać pliki licencji dla instalacji SLP) 3' - Pozycja pozwala użyć predefiniowanego skryptu do partycjonowania dysku, opcja przydatna jedynie wtedy kiedy używamy stałych szablonów, tak naprawdę wygodniej manipulować dyskiem poprzez plik instalacji nienadzorowanej. 4 - Autostart wymusza automatyczny reset środowiska WinPE po przejściu tego etapu przez setup - w przeciwnym razie skrypt powróci do menu głównego. Funkcjonalność teoretycznie niewielka w praktyce bardzo automatyzująca różne scenariusze instalacji i upraszczająca cały proces - oczywiście podstawą jest zbudowanie sobie zestawu odpowiednich plików odpowiedzi, raz wykonana praca będzie później bardzo procentowała. Opis przygotowania samego zestawu i kilka przykładów wkrótce w wątku równoległym, niedługo też postaram się zaprezentować video pokazujące jak w praktyce wykorzystać można moje narzędzia. Opis struktury katalogów dla tego zestawy w równoległym wątku w poście #5 link pzdr Odnośnik do komentarza
maggreg Opublikowano 23 Stycznia 2011 Autor Zgłoś Udostępnij Opublikowano 23 Stycznia 2011 Pora na ostatni fragment instalerów systemów windows, tym razem będzie to skrypt służący znów do instalacji systemów serii XP ale w odróżnieniu od wersji poprzednio opisanej w tym przypadku pliki instalacyjne nie będą przechowywane w pliku wim tylko w katalogu. Technicznie katalog = zawartość folderu i386 z płyty instalacyjnej więc przygotowanie samego zestawu sprowadza się (w tym zakresie) do przekopiowania odpowiedniego folderu. Jest to rozwiniecie podstawowego instalera opisywanego przeze mnie dawniej na forum SearchEngines, tym razem jednak zdecydowałem się połączyć zalety tego rozwiązania z konstrukcją zastosowaną w instalatorach wim a mianowicie o ile pliki instalacyjne przechowywane są w formie natywnej to już samo menu jak i ścieżki do folderów i plików dodatkowych budowane są na podstawie plików konfiguracyjnych. Zdecydowałem się na taką zmianę uznając, że proste wylistowanie katalogów buduje dość ograniczone i mało elastyczne środowisko na dodatek niewiele automatyzujące proces w stosunku do ręcznego przeklikania składni w konsoli. A oto rzeczony skrypt: <HEAD> <TITLE>Instalatory</TITLE> <HTA:APPLICATION APPLICATIONNAME="Instalatory" ID="Instalatory" BORDER="none" INNERBORDER="no" CAPTION="no" SYSMENU="no" SCROLL="auto" SINGLEINSTANCE="yes" WINDOWSTATE="maximize" SHOWINTASKBAR="no" CONTEXTMENU="no" NAVIGABLE="yes" SELECTION="no"/> <script language="vbscript" type="text/vbscript"> window.resizeTo 800,600 window.focus </script> <style type="text/css"> body {background-image:url('img\winpe.jpg'); background-repeat:no-repeat; background-attachment:fixed; background-position:center; margin:0px; width:0%; height:100%; left:0%; top:0%; padding:0px; overflow:hidden; z-index:0; font-family:Arial; font-size:20px; font-weight:bold;} #TextArea {font-family:Albertus Medium; font-size:20pt; font-weight:bold; text-align:center; position:absolute; overflow:hidden; width:100%; height:100%; Left:0%; vertical-align:middle; Top:25%;} #menu {border-style:none; position:absolute; overflow:auto; top:5%; height:90%; width:90%; left:5%; right:5%; z-index:2;} p {position:relative; text-align:center; z-index:0;} .button {background-image:url('img\background.gif'); position:relative; width:325px; color:#000000; font-family:Arial; font-size:12px; font-weight:bold; border-style:ridge; z-index:2;} .button2 {background-image:url('img\background.gif'); position:relative; width:200px; color:#000000; font-family:Arial; font-size:12px; font-weight:bold; border-style:ridge; z-index:2;} h2 {position:relative; text-align:center; z-index:0;} </style> </HEAD> <script language="vbscript" type="text/vbscript"> dim system_install, objShell, objWMIService, strDrive, strSystem, objFso, strName dim rc_oembios, rc_massstorage, rc_name, rc_index, pliki_oem, plik_unattended, default_key Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2") Set objShell = CreateObject("WScript.Shell") Set objFso = CreateObject("Scripting.FileSystemObject") dim arrCommands arrCommands = Split(Instalatory.commandLine, "$") If objShell.Environment("Process").Item("SystemDrive") = "X:" Then objShell.Environment("Process").Item("Temp") = "X:\Windows\Temp" objShell.Environment("Process").Item("Tmp") = "X:\Windows\Temp" If Not objFSO.FolderExists("X:\Windows\System32\config\systemprofile\Desktop") Then objFSO.CreateFolder "X:\Windows\System32\config\systemprofile\Desktop" End If End If Sub Window_onLoad DataArea.InnerHTML = "" TextArea.InnerHTML = "" MENU.InnerHTML = "" MenuSystem End Sub Sub MenuSystem Set folder = objfso.GetFolder(arrCommands(1)&"\repozytorium\systemy") Set files = folder.Files For each folderIdx In files Set objFile = objFSO.OpenTextFile(arrCommands(1)&"\repozytorium\systemy\"& folderIdx.Name,1) strName = split(objFile.ReadAll,vbcrlf) strinstalki_repo_conf = strinstalki_repo_conf & "<input class='button' type='button' value='Zainstaluj "&strName(1)&"' onClick='Install_repo_conf ""&strName(1)&"",""&strName(3)&"",""&strName(5)&"",""&strName(7)&"",""&strName(9)&"",""&strName(11)&""'> " objFile.Close Next strmenu1 = "<p><input class='button2' type='button' value='Start Sieci' onClick='NET' > <input class='button2' type='button' value='FreeCommander' onClick='fc'></p>" strmenu2 = "<p><input class='button2' type='button' value='Ghost 32' onClick='ghost'> <input class='button2' type='button' value='Cmd' onClick='cmd'></p>" strmenu3 = "<p><input class='button2' type='button' value='Notatnik' onClick='ntp'> <input class='button2' type='button' value='Taskmgr' onClick='tskmgr'></p>" strmenu5 = "<p><input class='button2' type='button' value='Quit' onClick='wyjscie(1)'> <input class='button2' type='button' value='Restart' onClick='wyjscie(2)'></p>" MENU.InnerHTML = "<h2>Instalki oparte na repozytorium z konfiguracją</h2>" & "<p>" & strinstalki_repo_conf & "</p>" & "<h2>Narzędzia</h2>" & strmenu1 & strmenu2 & strmenu3 & strmenu5 End Sub Sub Install_repo_conf(system,arg_1,arg_2,arg_3,arg_4,arg_5) Window.resizeTo 800,350 MENU.InnerHTML = "" DataArea.InnerHTML = "" TextArea.InnerHTML = "" On Error Resume Next Set colDisks = objWMIService.ExecQuery("Select * from Win32_LogicalDisk Where (DriveType = 3 OR DriveType = 2) AND DeviceID <> 'A:' AND DeviceID <> 'X:' AND DeviceID <> '" & arrCommands(1) & "'") For Each objDisk in colDisks strBody4 = strBody4 & "<option value='"& objDisk.DeviceID &"'>"& objDisk.DeviceID &"</option>" Next set colSubfolders = objWMIService.ExecQuery("Associators of {Win32_Directory.Name='"&arrCommands(1)&"\"&arg_2&"'} Where AssocClass = Win32_Subdirectory ResultRole = PartComponent") For Each objFolder in colSubfolders strBody5 = strBody5 & "<option value='"&arrCommands(1)&"\"&arg_2&"\"&objFolder.fileName&"'>"& objFolder.fileName &"</option>" Next Set colSubfolders = objWMIService.ExecQuery("Associators of {Win32_Directory.Name='"&arrCommands(1)&"\"&arg_3&"'} Where AssocClass = Win32_Subdirectory ResultRole = PartComponent") For Each objFolder in colSubfolders strBody6 = strBody6 & "<option value='"&arrCommands(1)&"\"&arg_3&"\"&objFolder.fileName&"'>"& objFolder.fileName &"</option>" Next Set folder = objfso.GetFolder(arrCommands(1)&"\repozytorium\pliki\dp") Set files = folder.Files For each folderIdx In files strBody8 = strBody8 & "<option value='"&folderIdx.Name&"'>"& folderIdx.Name &"</option>" Next str0 = "<option value='null'>null</option>" str1 = "<span style='display:inline width:60px; position:absolute; top:15%; left:5%'><select size='1' name='AvailableDrives'>" str2 = "<input class='button' type='button' value='Potwierdź wybór' onClick='sys_inst_repo_conf' style='left:25%; top:60%; width:125px;'>" str3 = "<input class='button' type='button' value='Rezygnuję' onClick='Cancel' style='left:45%; top:60%; width:125px;'>" str4 = "<span style='display:inline width:60px; position:absolute; top:22%; left:5%'><select size='1' name='AvailableOEMS'>" str5 = "<span style='display:inline width:60px; position:absolute; top:45%; left:5%'><input type='checkbox' name='chkbox1' checked='True'> Nienadzorowana</span>" str6 = "<span style='display:inline width:60px; position:absolute; top:29%; left:5%'><select size='1' name='AvailableMASS'>" str7 = "<span style='display:inline width:60px; position:absolute; top:55%; left:5%'><input type='checkbox' name='chkbox2'> Użyj katalogu $OEM$</span>" str9 = "<span style='display:inline width:60px; position:absolute; top:65%; left:5%'><input type='checkbox' name='chkbox3'> Autorestart</span>" str8 = "<span style='display:inline width:100px; position:absolute; top:36%; left:5%'><select size='1' name='AvailableDP'>" DataArea.InnerHTML = "<h2>Instalacja repozytorium z konfiguracją " & system & "</h2>" & str1 & str0 & strBody4 & "</select>" & " Proszę wybrać partycę docelową</Span>" & str4 & str0 & strBody5 & "</select>" & " Proszę wybrać dostawcę OEM</Span>" & str6 & str0 & strBody6 & "</select>" & " Proszę wybrać Sterowniki MassStorage</Span>" & str5 & str8 & str0 & strBody8 & "</select>" & " Proszę wybrać plik konfiguracji dysku</Span>" & str7 & str9 & str10 & str2 & str3 strSystem = system rc_name = arg_1 rc_oembios = arg_2 rc_massstorage = arg_3 pliki_oem = arg_4 plik_unattended = arg_5 End Sub Sub sys_inst_repo_conf If AvailableDP.Value <> "null" Then strDrive = "V:" ElseIf AvailableDrives.Value = "null" Then Func_Back_repo_conf Exit Sub Else strDrive = AvailableDrives.Value End If strMassStorage = AvailableMASS.Value strOEM = AvailableOEMS.Value strDP = AvailableDP.Value if chkbox1.Checked then chkbox1_rc = "TAK" strunattended = " /unattend:" & arrCommands(1)&"\"&plik_unattended Set objFile = objFSO.OpenTextFile(arrCommands(1)&"\"&plik_unattended,1,true) strUnAtt = objFile.ReadAll objFile.Close Else strnonunat = "[unattended]" & vbCrLf & "OemPreinstall=Yes" &vbCrLf& "DriverSigningPolicy=Ignore" &vbCrLf end If if chkbox2.Checked then chkbox2_rc = "TAK" end if if chkbox3.Checked then chkbox3_rc = "TAK" end if DataArea.InnerHTML = "" TextArea.InnerHTML = "" window.resizeTo 768,120 TextArea.InnerHTML = "Proszę czekać,<br>trwa Instalacja " & strSystem If strdp <> "null" Then objShell.run ("%comspec% /c diskpart /s "&chr(34)&arrCommands(1)&"\repozytorium\pliki\DP\"&strDP&chr(34)),0,true Else set colVolumes = objWMIService.ExecQuery("select * from Win32_Volume Where Name = '"&strDrive&"\\'") For Each objVolume in colVolumes objVolume.Format "NTFS",True,,"",False If Not objFSO.FileExists("x:\windows\temp\dp.txt") Then Set objFile = objFSO.CreateTextFile("x:\windows\temp\dp.txt", True) objFile.WriteLine "select volume " & strDrive & vbCrLf & "active" & vbCrLf & "exit" objFile.close End If objShell.Run ("%comspec% /c diskpart /s x:\windows\temp\dp.txt"),0,true objFSO.DeleteFile "x:\windows\temp\dp.txt" Next End If objShell.run ("bootsect.exe /nt52 " & strDrive & " /force /mbr"),0,true objShell.run (arrCommands(1) & "\repozytorium\instalatory\"&rc_name&"\i386\winnt32.exe /makelocalsource /noreboot /syspart:" & strDrive & " /tempdrive:" & strDrive &strunattended),0,true if chkbox2_rc = "TAK" then objFso.CopyFolder arrCommands(1)&"\"&pliki_oem, strDrive&"\$WIN_NT$.~LS\$OEM$", True end if If strOEM <> "null" Then objFSO.CopyFile strOEM&"\*", strDrive&"\$WIN_NT$.~LS\I386\", True End IF If strMassStorage <> "null" Then Set objFile = objFSO.OpenTextFile(strDrive&"\$WIN_NT$.~BT\winnt.sif",1,true) strUnAtt = objFile.ReadAll objFile.Close Set objFile = objFSO.OpenTextFile(strMassStorage&"\untd.txt",1,true) strMass = objFile.ReadAll objFile.close Set objFile = objFSO.CreateTextFile(strDrive&"\$WIN_NT$.~BT\winnt.sif",true) objFile.Write strUnAtt & strnonunat & strMass objFile.Close If Not objFso.FolderExists(strDrive&"\$WIN_NT$.~LS\$OEM$") Then Set f = objFso.CreateFolder(strDrive&"\$WIN_NT$.~LS\$OEM$") End If Set f = Nothing objFso.CopyFolder strMassStorage&"\txtsetup", strDrive&"\$WIN_NT$.~LS\$OEM$\TEXTMODE", True objFso.CopyFolder strMassStorage&"\txtsetup", strDrive&"\$WIN_NT$.~BT\$OEM$", True End If IF chkbox3_rc = "TAK" then objShell.Run ("Wpeutil Reboot"),0,false End If window.resizeTo 800,600 MenuSystem DataArea.InnerHTML = "" TextArea.InnerHTML = "" End sub Sub Func_Back_repo_conf DataArea.InnerHTML = "" TextArea.InnerHTML = "" window.resizeTo 512,120 strbck1 = "<input class='button' type='button' value='Wróć' onClick='install_repo_conf ""&strSystem&"",""&rc_name&"",""&rc_oembios&"",""&rc_massstorage&"",""&pliki_oem&"",""&plik_unattended&""' style='left:5%; top:65%; width:125px;'>" strbck2 = "<input class='button' type='button' value='Diskpart' onClick='diskpart' style='left:10%; top:65%; width:125px;'>" strbck3 = "<input class='button' type='button' value='Rezygnuję' onClick='Cancel' style='left:15%; top:65%; width:125px;'>" TextArea.InnerHTML = "Nie wybrano partycji docelowej" DataArea.InnerHTML = strbck1 & strbck2 & strbck3 End Sub sub cancel DataArea.InnerHTML = "" TextArea.InnerHTML = "" window.resizeTo 800,600 MenuSystem end sub Sub ghost MENU.InnerHTML = "" window.resizeTo 512,80 TextArea.InnerHTML = "Uruchomiono Ghost 32" objShell.Run (arrCommands(1) & "\tools\ghost32.exe -prefos"),0,True window.resizeTo 800,600 MenuSystem TextArea.InnerHTML = "" End Sub Sub ntp MENU.InnerHTML = "" window.resizeTo 512,80 TextArea.InnerHTML = "Uruchomiono Notatnik" objShell.Run ("notepad"),1,True window.resizeTo 800,600 MenuSystem TextArea.InnerHTML = "" End Sub Sub cmd MENU.InnerHTML = "" window.resizeTo 512,80 TextArea.InnerHTML = "Uruchomiono Wiersz Poleceń" objShell.Run ("%comspec%"),1,True window.resizeTo 800,600 MenuSystem TextArea.InnerHTML = "" End Sub Sub NET MENU.InnerHTML = "" window.resizeTo 512,80 TextArea.InnerHTML = "Startuje sieć" objShell.Run ("wpeutil InitializeNetwork"),0,True objShell.Run ("wpeutil DisableFirewall"),0,True window.resizeTo 800,600 MenuSystem TextArea.InnerHTML = "" End Sub Sub FC MENU.InnerHTML = "" window.resizeTo 512,80 TextArea.InnerHTML = "Uruchomiono FreeCommander" objShell.Run (arrCommands(1) & "\tools\FreeCommanderPortable\FreeCommanderPortable.exe"),0,True window.resizeTo 800,600 MenuSystem TextArea.InnerHTML = "" End Sub Sub tskmgr MENU.InnerHTML = "" window.resizeTo 512,80 TextArea.InnerHTML = "Uruchomiono Menedżer zadań" objShell.Run ("taskmgr"),1,True window.resizeTo 800,600 MenuSystem TextArea.InnerHTML = "" End Sub sub wyjscie(str_str) If str_str = 1 Then self.close() ElseIf str_str = 2 Then objShell.Run ("Wpeutil Reboot"),0,false End If end sub </script> <body id=body> <span id=menu></span> <span id=DataArea></span> <span id=TextArea></span> </body> I linki zewnętrzne: menu_rc.hta lub menu_rc.hta I kilka obrazków: Menu główne z sekcją instalatorów budowaną na podstawie plików konfiguracyjnych: Sekcja wybranego systemu: I poszczególne opcje: Same opcje pokrywają się z tym co mieliśmy w przypadku instalacji z pliku wim, różnicą jest brak opcji "domyślnego klucza", zdecydowałem że w tym przypadku przy instalacji nadzorowanej mamy możliwość wpisania klucza a w razie czego możemy się posiłkować plikiem pid.inf do którego mamy dostęp bezpośredni natomiast wprowadzanie do kodu sekcji podmieniającej klucz byłoby kłopotliwe - sam kod byłby dość rozbudowany, dla pewności oparty o wyrażenia regularne. W stosunku do instalatorów wim - jak już pisałem - taka wersja posiada tą zaletę, że dużo prościej ją przygotować, ponieważ mamy dostęp do natywnego setupu można mieć też pewność, że możemy skorzystać z opcji upgradu lub instalacji nakładkowej (choć oczywiście te opcje z konsoli), wadą natomiast jest na pewno wolniejsze działanie na malowydajnych pamięciach flash oraz brak możliwości postawienia tą metodą windowsa 2000 (setup nie uruchomi się z winpe nowszego niż 1.6). To już koniec fragmentu poświęconego instalacją - wkleję jeszcze tylko skrypt łączący wszystkie wcześniejsze opcje razem (z opcją wyłączenia nieużywanych), zachęcam do własnych eksperymentów oraz oczywiście do dyskusji. Opis struktury katalogów dla tego zestawy w równoległym wątku w poście #6 link pzdr Odnośnik do komentarza
maggreg Opublikowano 23 Stycznia 2011 Autor Zgłoś Udostępnij Opublikowano 23 Stycznia 2011 Oto obiecany skrypt łączący wszystkie instalatory w jedną całość - wersja rozwijana ze względu na wielkość: <HEAD> <TITLE>Instalatory</TITLE> <HTA:APPLICATION APPLICATIONNAME="Instalatory" ID="Instalatory" BORDER="none" INNERBORDER="no" CAPTION="no" SYSMENU="no" SCROLL="auto" SINGLEINSTANCE="yes" WINDOWSTATE="maximize" SHOWINTASKBAR="no" CONTEXTMENU="no" NAVIGABLE="yes" SELECTION="no"/> <script language="vbscript" type="text/vbscript"> window.resizeTo 800,600 window.focus </script> <style type="text/css"> body {background-image:url('img\winpe.jpg'); background-repeat:no-repeat; background-attachment:fixed; background-position:center; margin:0px; width:0%; height:100%; left:0%; top:0%; padding:0px; overflow:hidden; z-index:0; font-family:Arial; font-size:20px; font-weight:bold;} #TextArea {font-family:Albertus Medium; font-size:20pt; font-weight:bold; text-align:center; position:absolute; overflow:hidden; width:100%; height:100%; Left:0%; vertical-align:middle; Top:25%;} #menu {border-style:none; position:absolute; overflow:auto; top:5%; height:90%; width:90%; left:5%; right:5%; z-index:2;} p {position:relative; text-align:center; z-index:0;} .button {background-image:url('img\background.gif'); position:relative; width:325px; color:#000000; font-family:Arial; font-size:12px; font-weight:bold; border-style:ridge; z-index:2;} .button2 {background-image:url('img\background.gif'); position:relative; width:160px; color:#000000; font-family:Arial; font-size:12px; font-weight:bold; border-style:ridge; z-index:2;} h2 {position:relative; text-align:center; z-index:0;} </style> </HEAD> <script language="vbscript" type="text/vbscript"> dim system_install, objShell, objWMIService, strDrive, strSystem, objFso, strName dim wim_oembios, wim_massstorage, Wim_name, Wim_index, pliki_oem, plik_unattended, default_key dim strdp, straoems, strunattend, rc_oembios, rc_massstorage, rc_name, rc_index Set objShell = CreateObject("WScript.Shell") Set objFso = CreateObject("Scripting.FileSystemObject") dim arrCommands arrCommands = Split(Instalatory.commandLine, "$") If objShell.Environment("Process").Item("SystemDrive") = "X:" Then objShell.Environment("Process").Item("Temp") = "X:\Windows\Temp" objShell.Environment("Process").Item("Tmp") = "X:\Windows\Temp" If Not objFSO.FolderExists("X:\Windows\System32\config\systemprofile\Desktop") Then objFSO.CreateFolder "X:\Windows\System32\config\systemprofile\Desktop" End If End If Sub Window_onLoad DataArea.InnerHTML = "" TextArea.InnerHTML = "" MENU.InnerHTML = "" MenuSystem End Sub Sub MenuSystem Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") If objFSO.FileExists(arrCommands(1)&"\repozytorium\455asd8.znk") Then Set folder = objfso.GetFolder(arrCommands(1)&"\repozytorium\systemy") Set files = folder.Files For each folderIdx In files Set objFile = objFSO.OpenTextFile(arrCommands(1)&"\repozytorium\systemy\"& folderIdx.Name,1) strName = split(objFile.ReadAll,vbcrlf) strinstalki_repo_conf = strinstalki_repo_conf & "<input class='button' type='button' value='Zainstaluj "&strName(1)&"' onClick='Install_repo_conf ""&strName(1)&"",""&strName(3)&"",""&strName(5)&"",""&strName(7)&"",""&strName(9)&"",""&strName(11)&""'> " objFile.Close Next strmenurpinstall = "<h2>Instalki oparte na repozytorium z konfiguracją</h2>" & strinstalki_repo_conf End If If objFSO.FileExists(arrCommands(1)&"\wim\455asd8.znk") Then Set folder = objfso.GetFolder(arrCommands(1)&"\wim\systemy") Set files = folder.Files For each folderIdx In files Set objFile = objFSO.OpenTextFile(arrCommands(1)&"\wim\systemy\"& folderIdx.Name,1) strName = split(objFile.ReadAll,vbcrlf) strinstalki_WIM = strinstalki_WIM & "<input class='button' type='button' value='Zainstaluj "&strName(1)&"' onClick='Install_WIM ""&strName(1)&"",""&strName(3)&"",""&strName(5)&"",""&strName(7)&"",""&strName(9)&"",""&strName(11)&"",""&strName(13)&"",""&strName(15)&""'> " objFile.Close Next strmenuwiminstall = "<h2>Instalki oparte na pliku WIM</h2>" & strinstalki_WIM End If strmenu1 = "<input class='button2' type='button' value='Notatnik' onClick='ntp'> <input class='button2' type='button' value='Taskmgr' onClick='tskmgr'> <input class='button2' type='button' value='Konsola' onClick='cmd'><br>" strmenu2 = "<input class='button2' type='button' value='Free Commander' onClick='fc'> <input class='button2' type='button' value='Ghost 32' onClick='ghost'> <input class='button2' type='button' value='Opera Portable' onClick='Opera'><br>" strmenu3 = "<input class='button2' type='button' value='Start Sieci' onClick='NET'> <input class='button2' type='button' value='Quit' onClick='wyjscie(1)'> <input class='button2' type='button' value='Restart' onClick='wyjscie(2)'><br>" IF objFSO.FileExists(arrCommands(1)&"\Vista_installer\455asd8.znk") And objFSO.FileExists(arrCommands(1)&"\Seven_Installer\455asd8.znk") Then strmenu4 = "<input class='button' type='button' value='Instalacja systemów Vista lub Server 2008' onClick='Vista_Inst'> <input class='button' type='button' value='Instalacja systemów Seven lub Server 2008 R2' onClick='Seven_Inst'>" strmenuvistainstall = "<h2>Instalki systemów z lini Vista i Seven</h2>" & strmenu4 ElseIf objFSO.FileExists(arrCommands(1)&"\Seven_Installer\455asd8.znk") Then strmenu4 = "<input class='button' type='button' value='Instalacja systemów Seven lub Server 2008 R2' onClick='Seven_Inst'>" strmenuvistainstall = "<h2>Instalki systemów z lini Seven</h2>" & "<p>" & strmenu4 & "</p>" ElseIf objFSO.FileExists(arrCommands(1)&"\Vista_installer\455asd8.znk") Then strmenu4 = "<input class='button' type='button' value='Instalacja systemów Vista lub Server 2008' onClick='Vista_Inst'>" strmenuvistainstall = "<h2>Instalki systemów z lini Vista</h2>" & "<p>" & strmenu4 & "</p>" End If MENU.InnerHTML = "<p>" & strmenurpinstall & "</p>" & "<p>" & strmenuwiminstall & "</p>" & "<p>" & strmenuvistainstall & "</p>" & "<h2>Narzędzia</h2>" & "<p>" & strmenu1 & strmenu2 & strmenu3 & "</p>" End Sub Sub Install_WIM(system,arg_1,arg_2,arg_3,arg_4,arg_5,arg_6,arg_7) Window.resizeTo 800,350 MENU.InnerHTML = "" DataArea.InnerHTML = "" TextArea.InnerHTML = "" On Error Resume Next Set colDisks = objWMIService.ExecQuery("Select * from Win32_LogicalDisk Where (DriveType = 3 OR DriveType = 2) AND DeviceID <> 'A:' AND DeviceID <> 'X:' AND DeviceID <> '" & arrCommands(1) & "'") 'Set colDisks = objWMIService.ExecQuery("Select * from Win32_LogicalDisk Where DriveType = 3 AND DeviceID <> 'x:' AND DeviceID <> '" & arrCommands(1) & "'") For Each objDisk in colDisks strBody4 = strBody4 & "<option value='"& objDisk.DeviceID &"'>"& objDisk.DeviceID &"</option>" Next set colSubfolders = objWMIService.ExecQuery("Associators of {Win32_Directory.Name='"&arrCommands(1)&"\"&arg_3&"'} Where AssocClass = Win32_Subdirectory ResultRole = PartComponent") For Each objFolder in colSubfolders strBody5 = strBody5 & "<option value='"&arrCommands(1)&"\"&arg_3&"\"&objFolder.fileName&"'>"& objFolder.fileName &"</option>" Next Set colSubfolders = objWMIService.ExecQuery("Associators of {Win32_Directory.Name='"&arrCommands(1)&"\"&arg_4&"'} Where AssocClass = Win32_Subdirectory ResultRole = PartComponent") For Each objFolder in colSubfolders strBody6 = strBody6 & "<option value='"&arrCommands(1)&"\"&arg_4&"\"&objFolder.fileName&"'>"& objFolder.fileName &"</option>" Next Set folder = objfso.GetFolder(arrCommands(1)&"\wim\pliki\dp") Set files = folder.Files For each folderIdx In files strBody8 = strBody8 & "<option value='"&folderIdx.Name&"'>"& folderIdx.Name &"</option>" Next str0 = "<option value='null'>null</option>" str1 = "<span style='display:inline width:60px; position:absolute; top:15%; left:5%'><select size='1' name='AvailableDrives'>" str2 = "<input class='button' type='button' value='Potwierdź wybór' onClick='sys_inst_WIM' style='left:25%; top:70%; width:125px;'>" str3 = "<input class='button' type='button' value='Rezygnuję' onClick='Cancel' style='left:45%; top:70%; width:125px;'>" str4 = "<span style='display:inline width:60px; position:absolute; top:22%; left:5%'><select size='1' name='AvailableOEMS'>" str5 = "<span style='display:inline width:60px; position:absolute; top:45%; left:5%'><input type='checkbox' name='chkbox1' checked='True'> Nienadzorowana</span>" str6 = "<span style='display:inline width:60px; position:absolute; top:29%; left:5%'><select size='1' name='AvailableMASS'>" str7 = "<span style='display:inline width:60px; position:absolute; top:55%; left:5%'><input type='checkbox' name='chkbox2'> Użyj katalogu $OEM$</span>" str9 = "<span style='display:inline width:60px; position:absolute; top:65%; left:5%'><input type='checkbox' name='chkbox3'> Autorestart</span>" str8 = "<span style='display:inline width:100px; position:absolute; top:36%; left:5%'><select size='1' name='AvailableDP'>" str10 = "<span style='display:inline width:60px; position:absolute; top:75%; left:5%'><input type='checkbox' name='chkbox4'> Użyj klucza domyślnego</span>" DataArea.InnerHTML = "<h2>Instalacja WIM " & system & "</h2>" & str1 & str0 & strBody4 & "</select>" & " Proszę wybrać partycę docelową</Span>" & str4 & str0 & strBody5 & "</select>" & " Proszę wybrać dostawcę OEM</Span>" & str6 & str0 & strBody6 & "</select>" & " Proszę wybrać Sterowniki MassStorage</Span>" & str5 & str8 & str0 & strBody8 & "</select>" & " Proszę wybrać plik konfiguracji dysku</Span>" & str7 & str9 & str10 & str2 & str3 strSystem = system Wim_name = arg_1 Wim_index = arg_2 wim_oembios = arg_3 wim_massstorage = arg_4 pliki_oem = arg_5 plik_unattended = arg_6 default_key = arg_7 End Sub Sub sys_inst_WIM If AvailableDP.Value <> "null" Then strDrive = "V:" ElseIf AvailableDrives.Value = "null" Then Func_Back_WIM Exit Sub Else strDrive = AvailableDrives.Value End If strMassStorage = AvailableMASS.Value strOEM = AvailableOEMS.Value strDP = AvailableDP.Value if chkbox1.Checked then chkbox1_WIM = "TAK" Set objFile = objFSO.OpenTextFile(arrCommands(1)&"\"&plik_unattended,1,true) strUnAtt = objFile.ReadAll objFile.Close Else if chkbox4.Checked then chkbox4_WIM = "TAK" strdefkey = "[userdata]" & vbCrLf & "productid=" & default_key & vbCrLf & "productkey=" & default_key & vbCrLf end if strUnAtt = "[data]" & vbCrLf & "msdosinitiated=1" & vbCrLf & "floppyless=1" & vbCrLf & "AutoPartition=1" & vbCrLf & "UseSignatures=yes" & vbCrLf & "OriSrc=A:\I386" & vbCrLf & "OriTyp=5" & vbCrLf strnonunat = "[unattended]" & vbCrLf & "OemPreinstall=Yes" &vbCrLf& "DriverSigningPolicy=Ignore" &vbCrLf end If if chkbox2.Checked then chkbox2_WIM = "TAK" end if if chkbox3.Checked then chkbox3_WIM = "TAK" end if DataArea.InnerHTML = "" TextArea.InnerHTML = "" window.resizeTo 768,120 TextArea.InnerHTML = "Proszę czekać,<br>trwa Instalacja " & strSystem If strdp <> "null" Then objShell.run ("%comspec% /c diskpart /s "&chr(34)&arrCommands(1)&"\wim\pliki\DP\"&strDP&chr(34)),0,true Else set colVolumes = objWMIService.ExecQuery("select * from Win32_Volume Where Name = '"&strDrive&"\\'") For Each objVolume in colVolumes objVolume.Format "NTFS",True,,"",False If Not objFSO.FileExists("x:\windows\temp\dp.txt") Then Set objFile = objFSO.CreateTextFile("x:\windows\temp\dp.txt", True) objFile.WriteLine "select volume " & strDrive & vbCrLf & "active" & vbCrLf & "exit" objFile.close End If objShell.Run ("%comspec% /c diskpart /s x:\windows\temp\dp.txt"),0,true objFSO.DeleteFile "x:\windows\temp\dp.txt" Next End If objShell.run ("bootsect.exe /nt52 " & strDrive & " /force /mbr"),0,true objShell.run ("imagex.exe /apply "&arrCommands(1)&"\wim\"&Wim_name&" "&Wim_index&" "&strDrive),0,true Set objFile = objFSO.CreateTextFile(strDrive&"\$WIN_NT$.~BT\winnt.sif",true) objFile.Write strUnAtt & strdefkey objFile.Close 'objShell.run ("wpeutil.exe reboot"),0,false if chkbox2_WIM = "TAK" then objFso.CopyFolder arrCommands(1)&"\"&pliki_oem, strDrive&"\$WIN_NT$.~LS\$OEM$", True end if If strOEM <> "null" Then objFSO.CopyFile strOEM&"\*", strDrive&"\$WIN_NT$.~LS\I386\", True End IF If strMassStorage <> "null" Then Set objFile = objFSO.OpenTextFile(strMassStorage&"\untd.txt",1,true) strMass = objFile.ReadAll objFile.close Set objFile = objFSO.CreateTextFile(strDrive&"\$WIN_NT$.~BT\winnt.sif",true) objFile.Write strUnAtt & strnonunat & strdefkey & strMass objFile.Close If Not objFso.FolderExists(strDrive&"\$WIN_NT$.~LS\$OEM$") Then Set f = objFso.CreateFolder(strDrive&"\$WIN_NT$.~LS\$OEM$") End If Set f = Nothing objFso.CopyFolder strMassStorage&"\txtsetup", strDrive&"\$WIN_NT$.~LS\$OEM$\TEXTMODE", True objFso.CopyFolder strMassStorage&"\txtsetup", strDrive&"\$WIN_NT$.~BT\$OEM$", True End If IF chkbox3_Wim = "TAK" then objShell.Run ("Wpeutil Reboot"),0,false End If window.resizeTo 800,600 MenuSystem DataArea.InnerHTML = "" TextArea.InnerHTML = "" End sub Sub Func_Back_WIM DataArea.InnerHTML = "" TextArea.InnerHTML = "" window.resizeTo 512,120 strbck1 = "<input class='button' type='button' value='Wróć' onClick='Install_WIM ""&strSystem&"",""&Wim_name&"",""&Wim_index&"",""&wim_oembios&"",""&wim_massstorage&"",""&pliki_oem&"",""&plik_unattended&"",""&default_key&""' style='left:5%; top:65%; width:125px;'>" strbck2 = "<input class='button' type='button' value='Diskpart' onClick='diskpart' style='left:10%; top:65%; width:125px;'>" strbck3 = "<input class='button' type='button' value='Rezygnuję' onClick='Cancel' style='left:15%; top:65%; width:125px;'>" TextArea.InnerHTML = "Nie wybrano partycji docelowej" DataArea.InnerHTML = strbck1 & strbck2 & strbck3 End Sub Sub Install_repo_conf(system,arg_1,arg_2,arg_3,arg_4,arg_5) Window.resizeTo 800,350 MENU.InnerHTML = "" DataArea.InnerHTML = "" TextArea.InnerHTML = "" On Error Resume Next Set colDisks = objWMIService.ExecQuery("Select * from Win32_LogicalDisk Where (DriveType = 3 OR DriveType = 2) AND DeviceID <> 'A:' AND DeviceID <> 'X:' AND DeviceID <> '" & arrCommands(1) & "'") For Each objDisk in colDisks strBody4 = strBody4 & "<option value='"& objDisk.DeviceID &"'>"& objDisk.DeviceID &"</option>" Next set colSubfolders = objWMIService.ExecQuery("Associators of {Win32_Directory.Name='"&arrCommands(1)&"\"&arg_2&"'} Where AssocClass = Win32_Subdirectory ResultRole = PartComponent") For Each objFolder in colSubfolders strBody5 = strBody5 & "<option value='"&arrCommands(1)&"\"&arg_2&"\"&objFolder.fileName&"'>"& objFolder.fileName &"</option>" Next Set colSubfolders = objWMIService.ExecQuery("Associators of {Win32_Directory.Name='"&arrCommands(1)&"\"&arg_3&"'} Where AssocClass = Win32_Subdirectory ResultRole = PartComponent") For Each objFolder in colSubfolders strBody6 = strBody6 & "<option value='"&arrCommands(1)&"\"&arg_3&"\"&objFolder.fileName&"'>"& objFolder.fileName &"</option>" Next Set folder = objfso.GetFolder(arrCommands(1)&"\repozytorium\pliki\dp") Set files = folder.Files For each folderIdx In files strBody8 = strBody8 & "<option value='"&folderIdx.Name&"'>"& folderIdx.Name &"</option>" Next str0 = "<option value='null'>null</option>" str1 = "<span style='display:inline width:60px; position:absolute; top:15%; left:5%'><select size='1' name='AvailableDrives'>" str2 = "<input class='button' type='button' value='Potwierdź wybór' onClick='sys_inst_repo_conf' style='left:25%; top:60%; width:125px;'>" str3 = "<input class='button' type='button' value='Rezygnuję' onClick='Cancel' style='left:45%; top:60%; width:125px;'>" str4 = "<span style='display:inline width:60px; position:absolute; top:22%; left:5%'><select size='1' name='AvailableOEMS'>" str5 = "<span style='display:inline width:60px; position:absolute; top:45%; left:5%'><input type='checkbox' name='chkbox1' checked='True'> Nienadzorowana</span>" str6 = "<span style='display:inline width:60px; position:absolute; top:29%; left:5%'><select size='1' name='AvailableMASS'>" str7 = "<span style='display:inline width:60px; position:absolute; top:55%; left:5%'><input type='checkbox' name='chkbox2'> Użyj katalogu $OEM$</span>" str9 = "<span style='display:inline width:60px; position:absolute; top:65%; left:5%'><input type='checkbox' name='chkbox3'> Autorestart</span>" str8 = "<span style='display:inline width:100px; position:absolute; top:36%; left:5%'><select size='1' name='AvailableDP'>" DataArea.InnerHTML = "<h2>Instalacja repozytorium z konfiguracją " & system & "</h2>" & str1 & str0 & strBody4 & "</select>" & " Proszę wybrać partycę docelową</Span>" & str4 & str0 & strBody5 & "</select>" & " Proszę wybrać dostawcę OEM</Span>" & str6 & str0 & strBody6 & "</select>" & " Proszę wybrać Sterowniki MassStorage</Span>" & str5 & str8 & str0 & strBody8 & "</select>" & " Proszę wybrać plik konfiguracji dysku</Span>" & str7 & str9 & str10 & str2 & str3 strSystem = system rc_name = arg_1 rc_oembios = arg_2 rc_massstorage = arg_3 pliki_oem = arg_4 plik_unattended = arg_5 End Sub Sub sys_inst_repo_conf If AvailableDP.Value <> "null" Then strDrive = "V:" ElseIf AvailableDrives.Value = "null" Then Func_Back_repo_conf Exit Sub Else strDrive = AvailableDrives.Value End If strMassStorage = AvailableMASS.Value strOEM = AvailableOEMS.Value strDP = AvailableDP.Value if chkbox1.Checked then chkbox1_rc = "TAK" strunattended = " /unattend:" & arrCommands(1)&"\"&plik_unattended Set objFile = objFSO.OpenTextFile(arrCommands(1)&"\"&plik_unattended,1,true) strUnAtt = objFile.ReadAll objFile.Close Else strnonunat = "[unattended]" & vbCrLf & "OemPreinstall=Yes" &vbCrLf& "DriverSigningPolicy=Ignore" &vbCrLf end If if chkbox2.Checked then chkbox2_rc = "TAK" end if if chkbox3.Checked then chkbox3_rc = "TAK" end if DataArea.InnerHTML = "" TextArea.InnerHTML = "" window.resizeTo 768,120 TextArea.InnerHTML = "Proszę czekać,<br>trwa Instalacja " & strSystem If strdp <> "null" Then objShell.run ("%comspec% /c diskpart /s "&chr(34)&arrCommands(1)&"\repozytorium\pliki\DP\"&strDP&chr(34)),0,true Else set colVolumes = objWMIService.ExecQuery("select * from Win32_Volume Where Name = '"&strDrive&"\\'") For Each objVolume in colVolumes objVolume.Format "NTFS",True,,"",False If Not objFSO.FileExists("x:\windows\temp\dp.txt") Then Set objFile = objFSO.CreateTextFile("x:\windows\temp\dp.txt", True) objFile.WriteLine "select volume " & strDrive & vbCrLf & "active" & vbCrLf & "exit" objFile.close End If objShell.Run ("%comspec% /c diskpart /s x:\windows\temp\dp.txt"),0,true objFSO.DeleteFile "x:\windows\temp\dp.txt" Next End If objShell.run ("bootsect.exe /nt52 " & strDrive & " /force /mbr"),0,true objShell.run (arrCommands(1) & "\repozytorium\instalatory\"&rc_name&"\i386\winnt32.exe /makelocalsource /noreboot /syspart:" & strDrive & " /tempdrive:" & strDrive &strunattended),0,true if chkbox2_rc = "TAK" then objFso.CopyFolder arrCommands(1)&"\"&pliki_oem, strDrive&"\$WIN_NT$.~LS\$OEM$", True end if If strOEM <> "null" Then objFSO.CopyFile strOEM&"\*", strDrive&"\$WIN_NT$.~LS\I386\", True End IF If strMassStorage <> "null" Then Set objFile = objFSO.OpenTextFile(strDrive&"\$WIN_NT$.~BT\winnt.sif",1,true) strUnAtt = objFile.ReadAll objFile.Close Set objFile = objFSO.OpenTextFile(strMassStorage&"\untd.txt",1,true) strMass = objFile.ReadAll objFile.close Set objFile = objFSO.CreateTextFile(strDrive&"\$WIN_NT$.~BT\winnt.sif",true) objFile.Write strUnAtt & strnonunat & strMass objFile.Close If Not objFso.FolderExists(strDrive&"\$WIN_NT$.~LS\$OEM$") Then Set f = objFso.CreateFolder(strDrive&"\$WIN_NT$.~LS\$OEM$") End If Set f = Nothing objFso.CopyFolder strMassStorage&"\txtsetup", strDrive&"\$WIN_NT$.~LS\$OEM$\TEXTMODE", True objFso.CopyFolder strMassStorage&"\txtsetup", strDrive&"\$WIN_NT$.~BT\$OEM$", True End If IF chkbox3_rc = "TAK" then objShell.Run ("Wpeutil Reboot"),0,false End If window.resizeTo 800,600 MenuSystem DataArea.InnerHTML = "" TextArea.InnerHTML = "" End sub Sub Func_Back_repo_conf DataArea.InnerHTML = "" TextArea.InnerHTML = "" window.resizeTo 512,120 strbck1 = "<input class='button' type='button' value='Wróć' onClick='install_repo_conf ""&strSystem&"",""&rc_name&"",""&rc_oembios&"",""&rc_massstorage&"",""&pliki_oem&"",""&plik_unattended&""' style='left:5%; top:65%; width:125px;'>" strbck2 = "<input class='button' type='button' value='Diskpart' onClick='diskpart' style='left:10%; top:65%; width:125px;'>" strbck3 = "<input class='button' type='button' value='Rezygnuję' onClick='Cancel' style='left:15%; top:65%; width:125px;'>" TextArea.InnerHTML = "Nie wybrano partycji docelowej" DataArea.InnerHTML = strbck1 & strbck2 & strbck3 End Sub Sub Vista_Inst Window.resizeTo 750,250 MENU.InnerHTML = "" DataArea.InnerHTML = "" TextArea.InnerHTML = "" On Error Resume Next Set folder = objfso.GetFolder(arrCommands(1)&"\vista_Installer\vista_unattend") Set files = folder.Files For each folderIdx In files strBody42 = strBody42 & "<option value='"&folderIdx.Name&"'>"& folderIdx.Name &"</option>" Next Set colSubfolders = objWMIService.ExecQuery("Associators of {Win32_Directory.Name='"&arrCommands(1)&"\vista_Installer\vista_unattend\AOems'} Where AssocClass = Win32_Subdirectory ResultRole = PartComponent") For Each objFolder in colSubfolders strBody45 = strBody45 & "<option value='"&objFolder.Name&"'>"& objFolder.fileName &"</option>" Next Set folder = objfso.GetFolder(arrCommands(1)&"\vista_Installer\vista_unattend\dp") Set files = folder.Files For each folderIdx In files strBody48 = strBody48 & "<option value='"&folderIdx.Name&"'>"& folderIdx.Name &"</option>" Next str40 = "<option value='null'>null</option>" str41 = "<span style='display:inline width:60px; position:absolute; top:15%; left:5%'><select size='1' name='AvailableUnattend'>" str43 = "<input class='button' type='button' value='Potwierdź wybór' onClick='Vista_Instal' style='left:25%; top:50%; width:125px;'>" str44 = "<input class='button' type='button' value='Rezygnuję' onClick='Cancel' style='left:35%; top:50%; width:125px;'>" str46 = "<span style='display:inline width:80px; position:absolute; top:30%; left:5%'><select size='1' name='AvailableAOems'>" str47 = "<span style='display:inline width:60px; position:absolute; top:60%; left:5%'><input type='checkbox' name='chkbox1'> Autorestart</span>" str48 = "<span style='display:inline width:100px; position:absolute; top:45%; left:5%'><select size='1' name='AvailableDP'>" DataArea.InnerHTML = "<h2>Instalacja Systemu Vista lub Server 2008</h2>" & str41 & str40 & strBody42 & "</select>" & " Proszę wybrać plik instalacji nienadzorowanej</Span>" & str46 & str40 & strBody45 & "</select>" & " Proszę wybrać Alternatywny katalog $OEM$</Span>" & str48 & str40 & strBody48 & "</select>" & " Proszę wybrać skrypt przygotowujący dysk</Span>" & str47 & str43 & str44 End Sub Sub Vista_Instal strunattend = AvailableUnattend.Value straoems = AvailableAOems.Value strdp = AvailableDP.Value if chkbox1.Checked then chkbox1_Vista = "TAK" end if MENU.InnerHTML = "" DataArea.InnerHTML = "" TextArea.InnerHTML = "" window.resizeTo 725,160 TextArea.InnerHTML = "Instalacja systemów z lini Vista<br>Windows Vista, Serwer 2008" If strdp <> "null" Then objShell.run ("%comspec% /c" & "diskpart /s "&chr(34)&arrCommands(1)&"\vista_Installer\vista_unattend\DP\"&strDP&chr(34)),0,true End If If strunattend = "null" AND straoems = "null" Then objShell.run (arrCommands(1) & "\vista_Installer\setup.exe /noreboot"),0,true ElseIF strunattend <> "null" AND straoems = "null" Then objShell.run (arrCommands(1) & "\vista_Installer\setup.exe /noreboot /unattend:"&arrCommands(1)&"\vista_Installer\vista_unattend\"&strunattend),0,true ElseIF strunattend = "null" AND straoems <> "null" Then objShell.run (arrCommands(1) & "\vista_Installer\setup.exe /noreboot /m:"&straoems),0,true Else objShell.run (arrCommands(1) & "\vista_Installer\setup.exe /noreboot /m:"&straoems&" /unattend:"&arrCommands(1)&"\vista_Installer\vista_unattend\"&strunattend),0,true End If IF chkbox1_Vista = "TAK" then self.close() End If window.resizeTo 1024,768 MenuSystem TextArea.InnerHTML = "" End Sub Sub Seven_Inst Window.resizeTo 750,250 MENU.InnerHTML = "" DataArea.InnerHTML = "" TextArea.InnerHTML = "" On Error Resume Next Set folder = objfso.GetFolder(arrCommands(1)&"\seven_Installer\seven_unattend") Set files = folder.Files For each folderIdx In files strBody22 = strBody22 & "<option value='"&folderIdx.Name&"'>"& folderIdx.Name &"</option>" Next Set colSubfolders = objWMIService.ExecQuery("Associators of {Win32_Directory.Name='"&arrCommands(1)&"\seven_Installer\seven_unattend\AOems'} Where AssocClass = Win32_Subdirectory ResultRole = PartComponent") For Each objFolder in colSubfolders strBody25 = strBody25 & "<option value='"&objFolder.Name&"'>"& objFolder.FileName &"</option>" Next Set folder = objfso.GetFolder(arrCommands(1)&"\seven_Installer\seven_unattend\dp") Set files = folder.Files For each folderIdx In files strBody28 = strBody28 & "<option value='"&folderIdx.Name&"'>"& folderIdx.Name &"</option>" Next str20 = "<option value='null'>null</option>" str21 = "<span style='display:inline width:60px; position:absolute; top:15%; left:5%'><select size='1' name='AvailableUnattend'>" str23 = "<input class='button' type='button' value='Potwierdź wybór' onClick='Seven_Instal' style='left:25%; top:50%; width:125px;'>" str24 = "<input class='button' type='button' value='Rezygnuję' onClick='Cancel' style='left:35%; top:50%; width:125px;'>" str26 = "<span style='display:inline width:80px; position:absolute; top:30%; left:5%'><select size='1' name='AvailableAOems'>" str27 = "<span style='display:inline width:60px; position:absolute; top:60%; left:5%'><input type='checkbox' name='chkbox1'> Autorestart</span>" str28 = "<span style='display:inline width:100px; position:absolute; top:45%; left:5%'><select size='1' name='AvailableDP'>" DataArea.InnerHTML = "<h2>Instalacja Systemu z lini Seven</h2>" & str21 & str20 & strBody22 & "</select>" & " Proszę wybrać plik instalacji nienadzorowanej</Span>" & str26 & str20 & strBody25 & "</select>" & " Proszę wybrać Alternatywny katalog $OEM$</Span>" & str28 & str20 & strBody28 & "</select>" & " Proszę wybrać skrypt przygotowujący dysk</Span>" & str27 & str23 & str24 End Sub Sub Seven_Instal strunattend = AvailableUnattend.Value straoems = AvailableAOems.Value strdp = AvailableDP.Value if chkbox1.Checked then chkbox1_Seven = "TAK" end if MENU.InnerHTML = "" DataArea.InnerHTML = "" TextArea.InnerHTML = "" window.resizeTo 725,160 TextArea.InnerHTML = "Instalacja systemów z lini Seven<br>Windows Seven, Serwer 2008 R2" If strdp <> "null" Then objShell.run ("%comspec% /c" & "diskpart /s "&chr(34)&arrCommands(1)&"\seven_Installer\seven_unattend\DP\"&strDP&chr(34)),0,true End If If strunattend = "null" AND straoems = "null" Then objShell.run (arrCommands(1) & "\seven_Installer\setup.exe /noreboot"),0,true ElseIF strunattend <> "null" AND straoems = "null" Then objShell.run (arrCommands(1) & "\seven_Installer\setup.exe /noreboot /unattend:"&arrCommands(1)&"\seven_Installer\seven_unattend\"&strunattend),0,true ElseIF strunattend = "null" AND straoems <> "null" Then objShell.run (arrCommands(1) & "\seven_Installer\setup.exe /noreboot /m:"&straoems),0,true Else objShell.run (arrCommands(1) & "\seven_Installer\setup.exe /noreboot /m:"&straoems&" /unattend:"&arrCommands(1)&"\seven_Installer\seven_unattend\"&strunattend),0,true End If IF chkbox1_Seven = "TAK" then self.close() End If window.resizeTo 1024,768 MenuSystem TextArea.InnerHTML = "" End Sub sub cancel DataArea.InnerHTML = "" TextArea.InnerHTML = "" window.resizeTo 800,600 MenuSystem end sub Sub ghost MENU.InnerHTML = "" window.resizeTo 512,80 TextArea.InnerHTML = "Uruchomiono Ghost 32" objShell.Run (arrCommands(1) & "\tools\ghost32.exe -prefos"),0,True window.resizeTo 800,600 MenuSystem TextArea.InnerHTML = "" End Sub Sub ntp MENU.InnerHTML = "" window.resizeTo 512,80 TextArea.InnerHTML = "Uruchomiono Notatnik" objShell.Run ("notepad"),1,True window.resizeTo 800,600 MenuSystem TextArea.InnerHTML = "" End Sub Sub cmd MENU.InnerHTML = "" window.resizeTo 512,80 TextArea.InnerHTML = "Uruchomiono Wiersz Poleceń" objShell.Run ("%comspec%"),1,True window.resizeTo 800,600 MenuSystem TextArea.InnerHTML = "" End Sub Sub NET MENU.InnerHTML = "" window.resizeTo 512,80 TextArea.InnerHTML = "Startuje sieć" objShell.Run ("wpeutil InitializeNetwork"),0,True objShell.Run ("wpeutil DisableFirewall"),0,True window.resizeTo 800,600 MenuSystem TextArea.InnerHTML = "" End Sub Sub FC MENU.InnerHTML = "" window.resizeTo 512,80 TextArea.InnerHTML = "Uruchomiono FreeCommandera" objShell.Run (arrCommands(1) & "\tools\FreeCommanderPortable\FreeCommanderPortable.exe"),0,True window.resizeTo 800,600 MenuSystem TextArea.InnerHTML = "" End Sub Sub Opera MENU.InnerHTML = "" window.resizeTo 512,80 TextArea.InnerHTML = "Uruchomiono Operę" objShell.Run (arrCommands(1) & "\tools\OperaPortable\OperaPortable.exe"),0,True window.resizeTo 800,600 MenuSystem TextArea.InnerHTML = "" End Sub Sub tskmgr MENU.InnerHTML = "" window.resizeTo 512,80 TextArea.InnerHTML = "Uruchomiono Menedżer zadań" objShell.Run ("taskmgr"),1,True window.resizeTo 800,600 MenuSystem TextArea.InnerHTML = "" End Sub sub wyjscie(str_str) If str_str = 1 Then self.close() ElseIf str_str = 2 Then objShell.Run ("Wpeutil Reboot"),0,false End If end sub </script> <body id=body> <span id=menu></span> <span id=DataArea></span> <span id=TextArea></span> I jak zwykle linki zewnętrzne: menu.hta lub menu.hta Skrypt posiada funkcjonalność wszystkich trzech wcześniej opisanych zestawów, dodatkowo menu zostało lekko przearanżowane głównie dla oszczędności miejsca ale też ze względów estetycznych. Dodatkowo (co wcześniej zapowiedziałem) skrypt posiada funkcjonalność włączania poszczególnych sekcji w ramach potrzeby, aby dana sekcja pojawiła się w GUI przynależny jej katalog musi zawierać ten sam znacznik który znajduje się w katalogu boot, jeżeli katalog nie istnieje lub nie zawiera rzeczonego pliku "455asd8.znk" nie zostanie wyrenderowany odpowiadający jej fragment. Znacznik opcjonalnie jest szukany w następujących katalogach: "wim", "repozytorium", "Seven_Installer", "Vista_installer". Jak widać również w przypadku visty i siódemki można jeden z batonów (bądź oba) pozostawić niewłączone. A tak wygląda GUI Menu w całej okazałości: ps w przypadku sekcji dotyczącej narzędzi zostawiłem ją włączoną ale myślę, że zainteresowane osoby bez problemu znajdą sposób na jej ewentualne wyłączenie - tak naprawdę tą sekcję i tak należałoby zdefiniować wg własnych potrzeb, być może w przyszłości również dla niej zbuduję jakiś automat generujący wg prostych plików konfiguracyjnych (typu nazwa w menu, nazwa i ścieżka do pliku exe). I to tyle, wydaje mi się, że wyczerpałem temat choć dopuszczam zmiany i poprawki. Ponownie zapraszam do dyskusji. Postaram się też wrzucić WinPE z szablonem katalogów dostosowanych do tego konkretnego menu. pzdr Odnośnik do komentarza
maggreg Opublikowano 15 Lipca 2011 Autor Zgłoś Udostępnij Opublikowano 15 Lipca 2011 Dawno nic w temacie nie umieszczałem więc może żeby całkiem nie umarł mały skrypcik listujący dyski w systemie i przypisane im partycje. Wersja standardowa: Set objDictionary = CreateObject("Scripting.Dictionary") Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") Set wmiDiskDrives = objWMIService.ExecQuery("Select * from Win32_DiskDrive") For Each wmiDiskDrive In wmiDiskDrives objDictionary.Add wmiDiskDrive.DeviceID, "Dysk fizyczny: " & wmiDiskDrive.Caption & " (" & wmiDiskDrive.DeviceId & ")" strEscapedDeviceID = Replace(wmiDiskDrive.DeviceID, "\", "\\", 1, -1, vbTextCompare) Set wmiDiskPartitions = objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskDrive.DeviceID=""" & strEscapedDeviceID & """} WHERE " & "AssocClass = Win32_DiskDriveToDiskPartition") objDictionary.Add "partycje" & wmiDiskDrive.DeviceID, "Posiada partycji " & wmiDiskDrive.Partitions & " a oto one:" & vbCr For Each wmiDiskPartition In wmiDiskPartitions objDictionary.Add wmiDiskPartition.DeviceID, "Dysk " & wmiDiskPartition.DiskIndex & " Partycja " & wmiDiskPartition.Index + 1 Set wmiLogicalDisks = objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID=""" & wmiDiskPartition.DeviceID & """} WHERE " & "AssocClass = Win32_LogicalDiskToPartition") For Each wmiLogicalDisk In wmiLogicalDisks objDictionary.Add wmiLogicalDisk.DeviceID, "Partycja " & wmiDiskPartition.Index + 1 & " ma przypisaną literę - " & wmiLogicalDisk.DeviceID Next Next objDictionary.Add wmiDiskDrive.DeviceID & "koniec", vbCr & vbCr Next For Each wpis in objDictionary.items wpisy = wpisy & wpis & vbCrLf Next objDictionary.RemoveAll msgbox wpisy I wersja wykluczająca z listingu napędy USB: Set objDictionary = CreateObject("Scripting.Dictionary") Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") Set wmiDiskDrives = objWMIService.ExecQuery("Select * from Win32_DiskDrive Where InterfaceType <> 'USB'") For Each wmiDiskDrive In wmiDiskDrives objDictionary.Add wmiDiskDrive.DeviceID, "Dysk fizyczny: " & wmiDiskDrive.Caption & " (" & wmiDiskDrive.DeviceId & ")" strEscapedDeviceID = Replace(wmiDiskDrive.DeviceID, "\", "\\", 1, -1, vbTextCompare) Set wmiDiskPartitions = objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskDrive.DeviceID=""" & strEscapedDeviceID & """} WHERE " & "AssocClass = Win32_DiskDriveToDiskPartition") objDictionary.Add "partycje" & wmiDiskDrive.DeviceID, "Posiada partycji " & wmiDiskDrive.Partitions & " a oto one:" & vbCr For Each wmiDiskPartition In wmiDiskPartitions objDictionary.Add wmiDiskPartition.DeviceID, "Dysk " & wmiDiskPartition.DiskIndex & " Partycja " & wmiDiskPartition.Index + 1 Set wmiLogicalDisks = objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID=""" & wmiDiskPartition.DeviceID & """} WHERE " & "AssocClass = Win32_LogicalDiskToPartition") For Each wmiLogicalDisk In wmiLogicalDisks objDictionary.Add wmiLogicalDisk.DeviceID, "Partycja " & wmiDiskPartition.Index + 1 & " ma przypisaną literę - " & wmiLogicalDisk.DeviceID Next Next objDictionary.Add wmiDiskDrive.DeviceID & "koniec", vbCr & vbCr Next For Each wpis in objDictionary.items wpisy = wpisy & wpis & vbCrLf Next objDictionary.RemoveAll msgbox wpisy A takie dane skrypt produkuje wersja bez i z USB: Odnośnik do komentarza
Rekomendowane odpowiedzi