Skocz do zawartości

WinPE do celów diagnostyczno naprawczych


Rekomendowane odpowiedzi

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:

 

obrazzeschowka.th.png

 

 

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:

nowyobrazmapabitowaoe.th.png

 

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
Pomoc jest darmowa, ale proszę rozważ przekazanie dotacji na utrzymanie serwisu: klik.

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

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

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

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

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

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

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:

obrazzeschowka.th.png

 

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
  • 4 tygodnie później...

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:

obrazzeschowka.th.pngobrazzeschowka1.th.pngobrazzeschowka2.th.pngobrazzeschowka3.th.pngobrazzeschowka4.th.pngobrazzeschowka5.th.png

 

A oto przykład jak wyglądało/wygląda menu.hta

windows720100623183615.th.png32618913.th.png13929018.th.pngwindows720100623183638.th.png

 

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

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
  • 1 miesiąc temu...

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
  • 1 miesiąc temu...

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:

obrazzeschowka.th.png

 

a tutaj samo podmenu instalacji systemów z pokazanym wyborem poszczególnych opcji:

obrazzeschowka5.th.pngobrazzeschowka4.th.pngobrazzeschowka3.th.pngobrazzeschowka2.th.pngobrazzeschowka1.th.png

 

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
  • 3 tygodnie później...

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.

 

obrazzeschowka.th.png

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:

obrazzeschowka1.th.png

obrazzeschowka2.th.pngobrazzeschowka3.th.pngobrazzeschowka4.th.png

 

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

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:

obrazzeschowka.th.png

 

Sekcja wybranego systemu:

obrazzeschowka1.th.png

 

I poszczególne opcje:

obrazzeschowka2.th.pngobrazzeschowka3.th.pngobrazzeschowka4.th.pngobrazzeschowka5.th.png

 

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

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:

 

obrazzeschowka.th.png

 

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
  • 5 miesięcy temu...

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:

post-67-0-75892800-1310745046_thumb.png

post-67-0-51462300-1310745048_thumb.png

Odnośnik do komentarza
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...