diff --git a/installer/setup.iss b/installer/setup.iss index 44dcf99..2c89a77 100644 --- a/installer/setup.iss +++ b/installer/setup.iss @@ -185,7 +185,18 @@ begin SW_HIDE, ewWaitUntilTerminated, Code); end; -procedure InstallService(); +// Запускаем через net start, а не sc start, по той же причине, что и остановку: +// net дожидается фактического запуска и возвращает ошибку, если он не удался. +// sc отдаёт управление сразу, и сломанная установка выглядела бы успешной. +function StartService(): Boolean; +var + Code: Integer; +begin + Result := Exec(ExpandConstant('{sys}\net.exe'), 'start {#ServiceName}', '', + SW_HIDE, ewWaitUntilTerminated, Code) and (Code = 0); +end; + +function InstallService(): Boolean; var Bin: String; begin @@ -204,7 +215,8 @@ begin RunSc('description {#ServiceName} "Родительский контроль: следит за запуском программ."'); // Родительский контроль не должен исчезать из-за одной аварии. RunSc('failure {#ServiceName} reset= 86400 actions= restart/5000/restart/5000/restart/60000'); - RunSc('start {#ServiceName}'); + + Result := StartService(); end; // Каталог данных закрываем от обычных пользователей: унаследованные от @@ -223,6 +235,8 @@ begin end; procedure CurStepChanged(CurStep: TSetupStep); +var + Started: Boolean; begin if CurStep <> ssPostInstall then Exit; @@ -231,7 +245,22 @@ begin // только затем поднимаем службу. LockDownDataDir(); SetPassword(); - InstallService(); + Started := InstallService(); + + // Обе проверки — про молчаливый отказ: без них установка отрапортует об + // успехе, а защиты не будет. При тихой установке (автообновление) человека + // за экраном нет, и разбираться придётся по журналу Inno, /LOG= его пишет. + if WizardSilent() then + Exit; + + if not AuthConfigured() then + MsgBox('Не удалось сохранить пароль панели.'#13#10 + + 'Панель откроется без пароля, и задать его сможет любой, ' + + 'кто зайдёт первым.', mbError, MB_OK); + + if not Started then + MsgBox('Служба не запустилась — контроль сейчас не работает.'#13#10 + + 'Откройте «Службы» и посмотрите System Helper.', mbError, MB_OK); end; procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);