7 / 2008 R2 - Кошерный Progress Bar при исполнении файла SetupComplete.cmd (Windows 7)

Ответить
Аватара пользователя
DuMakDuk

7 / 2008 R2 - Кошерный Progress Bar при исполнении файла SetupComplete.cmd (Windows 7)

Сообщение DuMakDuk »

Изображение



Когда в SetupComplete.cmd идет установка тонны программ, не совсем ясно когда это безобразие закончится,

к сожалению как использовать прогресс бар при инсталляции не описывается, если это вообще возможно, поэтому решил сделать свой костыль.



Качаем Autoit, кидаем AutoIt3.exe в нашу папку с SetupComplete.cmd



Создаем файл progress.au3 следующего содержания:



Код:

Код: Выделить всё

#NoTrayIcon
Opt("MustDeclareVars", 1)
Main()
Func Main()
	If $CmdLine[0] == 0 Or _
	   StringIsDigit($CmdLine[1]) == 0 Or _
	   $CmdLine[1] < 0 Or _
	   $CmdLine[1] > 100 _
	Then
		Exit
	EndIf
	Local $hControl = ControlGetHandle("[CLASS:NativeHWNDHost]", "", "[CLASS:msctls_progress32; INSTANCE:1]")
	Local $lStyle = _WinAPI_GetWindowLong($hControl, -16)
	If $lStyle  0x50000000 Then
		_WinAPI_SetWindowLong($hControl, -16, 0x50000000)
		_WinAPI_SetWindowLong($hControl, -20, 0x00000000)
	EndIf
	_SendMessage($hControl, 0x402, $CmdLine[1], 0)
EndFunc   ;==>Main
Func _WinAPI_GetWindowLong($hWnd, $iIndex)
	Local $sFuncName = "GetWindowLongW"
	If @AutoItX64 Then $sFuncName = "GetWindowLongPtrW"
	Local $aResult = DllCall("user32.dll", "long_ptr", $sFuncName, "hwnd", $hWnd, "int", $iIndex)
	If @error Or Not $aResult[0] Then Return SetError(@error + 10, @extended, 0)
	Return $aResult[0]
EndFunc   ;==>_WinAPI_GetWindowLong
Func _WinAPI_SetWindowLong($hWnd, $iIndex, $iValue)
	_WinAPI_SetLastError(0) ; as suggested in MSDN
	Local $sFuncName = "SetWindowLongW"
	If @AutoItX64 Then $sFuncName = "SetWindowLongPtrW"
	Local $aResult = DllCall("user32.dll", "long_ptr", $sFuncName, "hwnd", $hWnd, "int", $iIndex, "long_ptr", $iValue)
	If @error Then Return SetError(@error, @extended, 0)
	Return $aResult[0]
EndFunc   ;==>_WinAPI_SetWindowLong
Func _WinAPI_SetLastError($iErrorCode, Const $_iCurrentError = @error, Const $_iCurrentExtended = @extended)
	DllCall("kernel32.dll", "none", "SetLastError", "dword", $iErrorCode)
	Return SetError($_iCurrentError, $_iCurrentExtended, Null)
EndFunc
Func _SendMessage($hWnd, $iMsg, $wParam = 0, $lParam = 0, $iReturn = 0, $wParamType = "wparam", $lParamType = "lparam", $sReturnType = "lresult")
	Local $aResult = DllCall("user32.dll", $sReturnType, "SendMessageW", "hwnd", $hWnd, "uint", $iMsg, $wParamType, $wParam, $lParamType, $lParam)
	If @error Then Return SetError(@error, @extended, "")
	If $iReturn >= 0 And $iReturn _SendMessage



SetupComplete.cmd пример с прогресс баром:





Код:

Код: Выделить всё

@echo off
call:progress 40
windows6.1-kb3177467-x64.msu /quiet /norestart
call:progress 50
windows6.1-kb3042058-x64.msu /quiet /norestart
call:progress 60
vcredist2005_x64.exe /q
call:progress 70
vcredist2005_x86.exe /q
call:progress 80
vcredist2008_x64.exe /q
call:progress 90
vcredist2008_x86.exe /q
call:progress 100
exit
:progress
  set val=%~1
  AutoIt3.exe progress.au3 %val%>nul 2>&1
exit /b

Можно автоматизировать прогресс, чтобы не вписывать числа самому, я например сделал так:





Код:

Код: Выделить всё

:progress
  set /A val = %val% + 4
  AutoIt3.exe progress.au3 %val%>nul 2>&1
exit /b

+4 потому, что у меня 25 программ которые ставятся, 100 / 25 = 4
Аватара пользователя
ABBAT

Re: 7 / 2008 R2 - Кошерный Progress Bar при исполнении файла SetupComplete.cmd (Windows 7)

Сообщение ABBAT »

Как прикрутить progress.au3 к win 8 ? Имеет ли значение разрядность системы ? (win32->AutoIt3.exe / win64->AutoIt3_x64.exe)
Аватара пользователя
ABBAT

Re: 7 / 2008 R2 - Кошерный Progress Bar при исполнении файла SetupComplete.cmd (Windows 7)

Сообщение ABBAT »

Не тестировал на Win8, для 7ки, берем win32->AutoIt3.exe. Не важно, что в install.wim, 32 или 64, берем всегда 32 разрядный autoit. Если не работает на 8ке, по мануалу выше, значит нужно отреверсить узнать какой контрол используется в инсталляторе 8ки, попробую поковырять под 8ку.
Аватара пользователя
DuMakDuk

Re: 7 / 2008 R2 - Кошерный Progress Bar при исполнении файла SetupComplete.cmd (Windows 7)

Сообщение DuMakDuk »

Не обязательно софт складывать в папке OEM, там все файлы копируются на hdd, лишнее движение, проще создать папку с именем %по вкусу% в корне и от туда выполнять инсталляцию.



Для этого в файле SetupComplete.cmd пишем так:





Код:

Код: Выделить всё

@echo off
:start
for %%i in (Z Y X W V U T S R Q P O N M L K J I H G F E D C) do if exist %%i:\update\e7bd5e04efc1fd404b92e404042f871a set UPDATEPATH=%%i:\update
if not defined UPDATEPATH (
	call:MsgBoxQuestion
)
cd /d %UPDATEPATH%
call Install.cmd>nul
goto:end
:MsgBoxQuestion
for /f %%i in ('cscript //NoLogo msgbox.vbs') do set MsgBoxAnswer=%%i
if %MsgBoxAnswer% == 1 (
	goto:start
) else (
	goto:do_nothing
)
:end
start /min rd /s /q %windir%\Setup\Scripts>nul
start /min %windir%\System32\shutdown.exe -r -f -t 0
exit
:do_nothing
start rd /s /q %windir%\Setup\Scripts>nul
exit

в папке %CD%\update\

создаем файл e7bd5e04efc1fd404b92e404042f871a



Файл может быть любым, я в автосборщике делаю с каждым билдом новый такой файл.



Содержание файла msgbox.vbs (Нужен если пользователь вынул флешку или диск)





Код:

Код: Выделить всё

iBtn = Msgbox("Для продолжения установки подключите съемный носитель с установочными файлами Windows.", vbRetryCancel+vbInformation+vbSystemModal, "Настройка Windows")
If iBtn = 4 Then
	WScript.Echo 1
Else
	WScript.Echo 0
End If

Ну и собственно Install.cmd, тут пишем то, чего нужно поставить.



Еще рекомендую вот это для закручивания гаек в винде при установке.

https://blogs.technet.microsoft.com/...-utility-v1-0/


На чистой системе, под виртуалкой задаешь групповые политики и потом экспортируешь в файл *.pol и можно применять к другой машине через установку, либо вручную. Задавать политики напрямую через реестр, кривой способ, политики работать будут, но если их потом просматривать через mmc не будет видно, какие политики применены, да и вероятность того, что это может слететь вполне себе имеет место быть.



У себя сделал так:



LGPO.exe /m GPO.pol

call:progress_val 100



По поводу улучшения качества зондирования ПО (может пригодится)





Код:

Код: Выделить всё

for %%? in (
	"\Microsoft\Windows\Application Experience\AitAgent"
	"\Microsoft\Windows\Application Experience\Microsoft Compatibility Appraiser"
	"\Microsoft\Windows\Application Experience\ProgramDataUpdater"
	"\Microsoft\Windows\Autochk\Proxy"
	"\Microsoft\Windows\Customer Experience Improvement Program\Consolidator"
	"\Microsoft\Windows\Customer Experience Improvement Program\KernelCeipTask"
	"\Microsoft\Windows\Customer Experience Improvement Program\UsbCeip"
	"\Microsoft\Windows\DiskDiagnostic\Microsoft-Windows-DiskDiagnosticDataCollector"
	"\Microsoft\Windows\PI\Sqm-Tasks"
	"\Microsoft\Windows\Power Efficiency Diagnostics\AnalyzeSystem"
	"\Microsoft\Windows\Windows Error Reporting\QueueReporting"
	"\Microsoft\Windows\Maintenance\WinSAT"
	"\Microsoft\Windows\Media Center\ActivateWindowsSearch"
	"\Microsoft\Windows\Media Center\ConfigureInternetTimeService"
	"\Microsoft\Windows\Media Center\DispatchRecoveryTasks"
	"\Microsoft\Windows\Media Center\ehDRMInit"
	"\Microsoft\Windows\Media Center\InstallPlayReady"
	"\Microsoft\Windows\Media Center\mcupdate"
	"\Microsoft\Windows\Media Center\MediaCenterRecoveryTask"
	"\Microsoft\Windows\Media Center\ObjectStoreRecoveryTask"
	"\Microsoft\Windows\Media Center\OCURActivate"
	"\Microsoft\Windows\Media Center\OCURDiscovery"
	"\Microsoft\Windows\Media Center\PBDADiscovery"
	"\Microsoft\Windows\Media Center\PBDADiscoveryW1"
	"\Microsoft\Windows\Media Center\PBDADiscoveryW2"
	"\Microsoft\Windows\Media Center\PvrRecoveryTask"
	"\Microsoft\Windows\Media Center\PvrScheduleTask"
	"\Microsoft\Windows\Media Center\RegisterSearch"
	"\Microsoft\Windows\Media Center\ReindexSearchRoot"
	"\Microsoft\Windows\Media Center\SqlLiteRecoveryTask"
	"\Microsoft\Windows\Media Center\UpdateRecordPath"
) do call:disable_task %%?
:disable_task
  set task_name=%~1
  schtasks /Change /TN "%task_name%" /DISABLE>nul 2>&1
exit /b

Еще стоит обратить внимание на HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates\CA\Certificates\FEE449EE0E3965A5246F000E87F DE2A065FD89D4

Если ставится NET, без некоторых обновлений винды (
https://support.microsoft.com/en-us/help/2661254
) на длину ключа, есть шанс в 0.000000001%, что похачат Изображение
Аватара пользователя
Vadikan

Re: 7 / 2008 R2 - Кошерный Progress Bar при исполнении файла SetupComplete.cmd (Windows 7)

Сообщение Vadikan »

Цитата DuMakDuk:



По поводу улучшения качества зондирования ПО (может пригодится)
7 / 2008 R2 - Кошерный Progress Bar при исполнении файла SetupComplete.cmd (Windows 7)




И этим отключаем WinSAT, который выполняет оценку производительности после установки, а также убиваем диагностику эффективности электропитания.
Аватара пользователя
DuMakDuk

Re: 7 / 2008 R2 - Кошерный Progress Bar при исполнении файла SetupComplete.cmd (Windows 7)

Сообщение DuMakDuk »

Верно, просто брал из своего конфига, по моим религиозным соображениям эти вещи были отключены.
Аватара пользователя
DuMakDuk

Re: 7 / 2008 R2 - Кошерный Progress Bar при исполнении файла SetupComplete.cmd (Windows 7)

Сообщение DuMakDuk »

Цитата DuMakDuk:



по моим религиозным соображениям
7 / 2008 R2 - Кошерный Progress Bar при исполнении файла SetupComplete.cmd (Windows 7)




Вот уж, точно — «ваистену» по «религиозным», бо пользуется не научный подход, а вера Изображение.
Ответить

Вернуться в «Автоматическая установка Windows 11 / 10 / 8 / 7 / Vista»