Przyszły wakacje, a więc czas odświeżania oprogramowania w salach laboratoryjnych w PJWSTK. Oczywiście wszystko powinno być nienadzorowane itd. Przez lata instalacje WinXP leżące na RIS było modyfikowane wielokrotnie – Peki, który jest autorem systemu teraz by go już nie poznał ;)
Dobra – zadnie polega na nienadzorowanej instalacji MSSQL2008 (tylko narzędzia klienckie) i Visual Studio 2008. Pierwszą rzeczą jest ustalenie kolejności instalacji. Gdyby zaczynać on VS, to trzeba by zrobić tak:
- .NET 3.5 + Windows Installer 4.5 (wymaganie SQL2008)
- restart
- VS2008
- restart
- SP1 do VS2008
- restart
- SQL2008
- restart
No i jakoś dużo tych restartów :/ gdyby zrobić odwrotnie? Zazwyczaj staram się instalować oprogramowanie według kolejności w jakiej wychodzi na świat, ale tutaj zrobię na odwrót :)
- .NET 3.5 + Windows Installer 4.5
- restart
- SQL2008
- restart
- VS2008
- teoretycznie restart, ale już nie wymagany :)
Jest krócej i to sporo :) Dzielimy to na 3 skrypty vbs. stage1.vbs, stage2.vbs i stage3.vbs
Pierwszy wygląda tak:
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.run "C:scriptsfrmwrkdotnetfx35.exe /qb /norestart",1,true ’.NET 3.5
Wait "msiexec.exe","Administrator"
Wait "setup.exe","Administrator"
WshShell.run "C:scriptsfrmwrkdotnetfx35SP1.exe /qb /norestart",1,true ’.NET 3.5 SP1
Wait "msiexec.exe","Administrator"
Wait "setup.exe","Administrator"
’Windows Installer 4.5
WshShell.run "C:scriptsWindowsInstallerWindowsXP-KB942288-v3-x86.exe /passive /norestart /overwriteoem /nobackup",1,true
Wait "msiexec.exe","Administrator"
Wait "setup.exe","Administrator"
’autologin do stage 2
WshShell.run "c:Windowsregedit.exe /s c:scriptsstage2.reg",1,true
WshShell.run "c:scriptsshutdown.exe -r -t 30 -f",1,false Sub Wait (processName, userName)
On Error Resume Next
Dim objProcess
Dim wmi
Dim isRunning
Dim strUser
Dim return
isRunning = True
set wmi=GetObject("winmgmts:")
Do While isRunning
isRunning = False
for Each objProcess in wmi.ExecQuery("select * from Win32_Process")
strUser = ""

0; return = objProcess.GetOwner(strUser)
If return = 0 Then
if UCase(objProcess.name) = UCase(processName) And UCase(strUser) = UCase(userName) then
isRunning = True
End if
End If
Next
wscript.sleep 1000
Loop
wscript.sleep 10000
End Sub
Dla Ciekawskich: Plik stage2.reg wygląda tak:
"DefaultDomainName"="PJWSTK"
"DefaultUserName"="Administrator"
"DefaultPassword"="StandardoweHasloAdmina"
"AutoAdminLogon"="3"
"ForceAutoLogon"="1" [HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun]
"afterreboot"="c:\scripts\stage2.vbs"
Jedziemy dalej. Żeby zrobić nienadzorowaną instalację SQL 2008 trzeba przygotować response file. Jako, że informatycy są z natury ludźmi leniwymi pozwoliłem, żeby setup MSSQL zrobił go za mnie :) Po wyklikaniu jakie składniki chcemy mieć na komputerze (w procesie zwykłej instalacji – więcej szczegółów tutaj). Jak już mamy plik odpowiedzi, to jedziemy.
stage2.vbs:
Set WshShell = WScript.CreateObject("WScript.Shell")
’naprawiamy MSDTC – czasami przez zepsuty log instalacja potrafi sie wywalać. polega to na zatrzymaniu usługi MSDTC, wywołaniu msdtc -resetlog i ponownym uruchomieniu MSDTC
WshShell.run "c:scriptsfixmsdtc.cmd",0,true
’zatrzymanie usługi Automatic Updates – nie chcemy, żeby jakiś inny setup chodził w tle i nam coś popsuł :)
WshShell.run "c:scriptsupdatesstop.cmd",1,true
WshShell.run "P:DbMicrosoftMsSQL2008devsetup.exe /q /CONFIGURATIONFILE=P:DbMicrosoftMsSQL2008devConfigurationFile.ini",0,true
Wait "setup.exe","Administrator"
’znów MSDTC – same kłopoty z tą usługą :/
WshShell.run "c:scriptsfixmsdtc.cmd",0,true
’autologin do stage 3
WshShell.run "c:Windowsregedit.exe /s c:scriptsstage3.reg",1,true
WshShell.run "c:scriptsshutdown.exe -r -t 30 -f"< font color="#000000">,1,false Sub Wait (processName, userName)
On Error Resume Next
Dim objProcess
Dim wmi
Dim isRunning
Dim strUser
Dim return
isRunning = True
set wmi=GetObject("winmgmts:")
Do While isRunning
isRunning = False
for Each objProcess in wmi.ExecQuery("select * from Win32_Process")
strUser = ""
return = objProcess.GetOwner(strUser)
If return = 0 Then
if UCase(objProcess.name) = UCase(processName) And UCase(strUser) = UCase(userName) then
isRunning = True
End if
End If
Next
wscript.sleep 1000
Loop
wscript.sleep 10000
End Sub
No już prawie koniec – jeszcze tylko Visual Studio. I tu zaczynają się schody. Teoretycznie robię to według tej instrukcji http://www.msfn.org/board/index.php?showtopic=117875, ale coś się nie udawało. Troszkę poczytać i wiem, że mój system to WinXP SP3. Ta aktualizacja zawiera już w sobie Windows Installera 3.5, więc trzeba odpowiednie wpisy usunąć z pliczku ini (więcej informacji tutaj). Ale to niestety jeszcze nie wszystko. Próba ciche instalacji się kończy po paru minutach. Wystarczy spojrzeć do Event Viewer-a, żeby zobaczyć, że Windows Installer próbuje zainstalować .NET 3.5. Jako, że już mamy nowszą wersję, to setup zwraca błąd i sie kończy. Więc znów trzeba grzebać się w pliczku. Usuwamy wpisy dotyczące net framework z [PreInstallOrder], [InstallOrder] i [PostInstallOrder] oraz zmieniamy InstallActionInteger komponentu na 1. Teraz bangladesz :) dzięki temu mamy taki pliczek stage3.vbs:
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.run "P:InstalkiMICROSOFTDevelopervisual_studio_2008Setupsetup.exe /UnattendFile P:InstalkiMICROSOFTDevelopervisual_studio_20082008v3.ini",0,true
Wait "setup.exe","Administrator"
WshShell.run "cmd /c""echo y|gpupdate /force """,1,true
WshShell.run "c:winntshutdown.exe -r -t 30",1,false Sub Wait (processName, userName)
On Error Resume Next
Dim objProcess
Dim wmi
Dim isRunning
Dim strUser
Dim return
isRunning = True
set wmi=GetObject("winmgmts:")
Do While isRunning
isRunning = False
for Each objProcess in wmi.ExecQuery("select * from Win32_Process")
strUser = ""
return = objProcess.GetOwner(strUser)
If return = 0 Then
if UCase(objProcess.name) = UCase(processName) And UCase(strUser) = UCase(userName) then
isRunning = True
End if
End If
Next
wscript.sleep 1000
Loop
wscript.sleep 10000
End Sub
To by było na tyle :) Działa aż miło :D
Mnich
domel
kaarol
sasha
kaarol
domel