Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Автоматическая установка Windows 11 / 10 / 8 / 7 / Vista (http://forum.oszone.net/forumdisplay.php?f=83)
-   -   Кошерный Progress Bar при исполнении файла SetupComplete.cmd (Windows 7) (http://forum.oszone.net/showthread.php?t=326652)

DuMakDuk 10-05-2017 16:31 2735670

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


Когда в 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 <= 4 Then Return $aResult[$iReturn]
        Return $aResult
EndFunc  ;==>_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 28-05-2017 15:53 2740289

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

DuMakDuk 31-05-2017 01:08 2740916

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

DuMakDuk 03-06-2017 00:21 2741752

Не обязательно софт складывать в папке 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 03-06-2017 13:37 2741831

Цитата:

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

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

DuMakDuk 06-06-2017 02:06 2742346

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

Iska 06-06-2017 03:33 2742348

Цитата:

Цитата DuMakDuk
по моим религиозным соображениям »

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


Время: 15:49.

Время: 15:49.
© OSzone.net 2001-