2016-10-22 1 views
1

어디서나 찾을 수있는 정보가없는 것 같습니다. 문제가 발생할 때까지 기다리지 않겠습니다. 불행하게도 이것은 일반적으로 게시하는 것보다 약간 더 광범위한 질문이지만, 아직 원인을 파악하고 재생산하고 세부 정보를 수집하고 완전히 문서화해야하므로 다음에 발생할 때까지 기다릴 수 있습니다. 능력있는 사람들은 더 많은 정보를 수집하고 제공합니다. 그래서, 내가 아는 바를 기반으로, 누군가가 이것을 밝힐 수 있기를 희망합니다.Inno Setup을 다시 시작한 후 관리자 로그인을 완료해야합니다.

경우에 따라 Inno 설치 프로그램을 다시 시작해야 관리자가 다시 시작해야 로그인 할 수 있습니다. 나는 그것이 이미 보류중인 다른 변경 때문에 설치시 할 수없는 System32의 파일 등록과 관련 있다고 생각합니다. 이 (내가 생각하는) 세 가지가 랜덤 (무작위로 생성 된 {temp} 일정 유사)라는 이름의 난 (후 향적으로, 몇 가지 생각 후)을 RunOnce에 연결해야 가정합니다 Windows 디렉토리에있는 파일이 있었다 일어난 한 경우에

레지스트리 키 (다음 번에 내가 이런 일이 일어날 때를 보게 될 것입니다.)는 설치를 완료하기 위해 관리자로 로그인 한 후 다시 실행한다고 가정합니다. 관리자가 로그인하기 전에는 관리자가 로그인 할 때까지 실행되지 않는 것으로 보이며 표준 사용자가 로그인하면 설치가 불완전한 상태로 유지됩니다. 관리자가 로그인하면 이러한 파일이 사라지고 설치된 응용 프로그램이 다음과 같이 표시되지 않고 예상대로 작동합니다.

클래스는 응용 프로그램의 관리자가 로그온하기 전에 실행할 때 나타나고 설치가 완벽하게 완료 할 수

오류를 등록하지.

내가하고 싶은 일은 재부팅 후 로그인 한 사용자의 권한에 관계없이 설치가 완전히 완료되었는지 확인하는 것입니다. 예를 들어 응용 프로그램이 중앙 집중식으로 배포 된 것처럼 (예 : SCCM을 통해) 관리자는 PC에서 로그인 할 수 있으며 응용 프로그램은 SCCM과 같은 것을 사용할 때까지 실행되지 않습니다. 나는 실제로 Inno Setup이 다음 로그온시 또는 유사한 방법으로 SYSTEM 계정으로 실행되도록 파일을 설정하여이 작업을 자동으로 처리하지 않는다는 사실에 상당히 놀랐습니다.

누군가가 여기에 무슨 일이 일어나고 있는지 대략 설명 할 수 있다면 파일의 이름을 찾는 방법 (나는 RunOnce 레지스트리 키를 읽음으로써이를 수행 할 수 있지만 필자는 필요한 값의 이름을 알아야 할 것입니다. 읽기)를 실행하고 설치를 완료하기 위해 수행해야 할 작업은 예를 들어 예약 된 작업을 사용하여 로그온시 SYSTEM으로 실행하거나 다른 방법으로이를 처리 할 수 ​​있어야합니다.

답변

2

귀하의 가정에서 정확합니다.


이노 설치 프로그램이 일부 파일을 등록해야하지만이 또한 일부 설치를 완료하기 위해 컴퓨터를 다시 시작해야하는 것으로 파악

, 그것은 다시 시작 때까지 등록을 연기 할 것이다. 등록해야하는 실제 파일이 성공적으로 설치 되었더라도.


같은 레지스트리 키를 생성합니다

이노 설정하십시오 .lst 파일을 등록 할 파일의 목록이 포함

C:\Windows\is-NGP70.exe 
C:\Windows\is-NGP70.lst 
C:\Windows\is-NGP70.msg 

: 같은

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\RunOnce] 
"InnoSetupRegFile.0000000001"="\"C:\\WINDOWS\\is-NGP70.exe\" /REG /REGSVRMODE" 

그리고 파일을

[s.]C:\Program Files (x86)\My Program\MyClass.dll 

is-??? 이름은 임의이며 설치 프로그램의 임시 폴더와 같지 않습니다.

로그 파일에서

, 당신이 표시됩니다.

2016-10-22 18:13:06.439 Delaying registration of all files until the next logon since a restart is needed. 
2016-10-22 18:13:06.441 Registration executable created: C:\Users\martin\AppData\Local\Temp\is-NGP70.exe 
설치 프로그램이 관리자 권한으로 실행되는 사실

,의 is-???.exe 자동으로 아무것도 수행하지 않습니다에서 비 관리자 로그

관리자 이외의 권한으로 설치 프로그램을 실행하면 파일이 %TEMP%에 기록됩니다. HKCU\...\RunOnce의 열쇠; /REG 스위치 대신 /REGU 스위치가 사용됩니다. 모든 사용자에 대해 등록이 진행됩니다. , 다시 시작이 다른 파일로 인해 필요한 경우

[Setup] 
AlwaysRestart=yes 

[Files] 
Source: "MyClass.dll"; DestDir: "{app}"; Flags: regserver 

:

[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce] 
"InnoSetupRegFile.0000000001"="\"C:\\Users\\user\\AppData\\Local\\Temp\\is-S5KU2.exe\" /REGU /REGSVRMODE" 

쉽게 그냥 .dll을 등록하는 간단한 설치 프로그램을 만들고, 시나리오를 테스트하고 AlwaysRestart=yes을 설정하려면 등록이 필요한 파일이 아닌 경우 을 CodeRegisterServer function을 사용하여 등록하는 것을 고려해보십시오. 기재.

위의 문을 사용하는 예를 들어
RegisterServer(Is64Bit, ExpandConstant('{app}\MyClass.dll'), False); 

, 당신은 이미 자신을 제안에 "ONLOGON"관리자 권한으로 작업을 실행하려면 일정을 윈도우 스케줄러를 사용할 수 있습니다, 또는 Inno Setup: How to remove Abort from regserver error?


참조 is-???.exe 파일 당신이 부분 만 처리로 schtasks (위의 질문에 대한 내 대답은 같이)는 RunOnce 항목을 만든 후 실행하는 [Run] 섹션의 항목을 사용할 수 있지만

How to make the program run on startup with admin permission with Inno Setup?를 참조하십시오. 그러나 RunOnce 항목도 제거해야합니다. 이미 처리되었으므로 [Registry] 섹션에서 수행 할 수 없습니다. 이것을 Pascal Script에 코딩해야합니다. 그렇다면 코드에서 두 가지를 모두 수행하는 것이 좋습니다.

schtasks (Exec function 사용)을 실행하고 CurStepChanged(ssPostInstall) event function에서 항목 (RegDeleteValue function 사용)을 제거 할 수 있습니다.

또한 작업을 삭제해야합니다. 어쩌면 /Z 스위치를 에 "최종 실행 후 삭제 작업 표시"으로 사용할 수 있습니다. 그러나 이것이 /SC onlogon과 결합 될지 확신하지 못합니다. 그렇지 않은 경우 schtasks /Delete을 작업의 일부로 실행해야합니다.

+0

마틴. 이것은 정확히 내가 필요로하는 정보이며, 지금 이것을 테스트 할 수 있어야합니다. 이 사실을 알면 나는 그 원인을 알 수 있다고 생각합니다. 필요할 때만 실행되는 .NET Framework 선행 조건 설치가 다시 시작해야한다는 것을 나타내는 종료 코드를 반환 할 때 발생할 수 있습니다. 그런 다음 'NeedRestart' 함수를 수동으로'True '로 설정합니다. 나는 이것이'AlwaysRestart = yes'를 설정하는 것과 같은 행동을 일으킬 것이라고 생각합니까? –

+0

그게 전부입니다. 필자가 제안한 것처럼'regserver' 플래그를 사용하는 대신''RegisterServer'' 함수 (http://www.jrsoftware.org/ishelp/index.php?topic=isxfunc_registerserver)를'Code'에서 사용하십시오. 괜찮아. –

+1

답변에 대한 몇 가지 세부 정보를 추가했습니다. –

2

마틴의 대답 덕분에 다른 사람들에게 도움이 될 수 있도록이 문제를 해결할 수있는 코드 (테스트 및 작동)가 있습니다. 이것은 설치를 위해 Inno Setup을 사용하는 다른 제품이 필요로하는 보류중인 모든 파일 등록 (관리자 만 로그인해야 함)을 실행하는 추가 이점이 있음을 유의하십시오.

procedure CurStepChanged(CurStep: TSetupStep); 
var 
    intRegFileNumber, intIndex, intCmdFileRegNumber: Integer; 
    strRegFileCmd, strRegFileNumber, strCmdFileRegNumber: String; 
    arrRegFileLines: TArrayOfString; 
    intResultCode: Integer; 
begin 
//Run additional tasks after the installation finishes i.e. after the [Run] section completes 
    if CurStep = ssPostInstall then 
    begin 
     //File registrations after restart require Administrator login fix 
     if RegValueExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce', 'InnoSetupRegFile.0000000001') then 
     begin 
      intRegFileNumber := 1; 
      strRegFileNumber := Format('%.10d', [intRegFileNumber]); 
      intIndex := 1; 
      intCmdFileRegNumber := 0; 
      strCmdFileRegNumber := Format('%.3d', [intCmdFileRegNumber]); 
      SetArrayLength(arrRegFileLines, 100); 
      arrRegFileLines[0] := '@echo off'; 
      while RegValueExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce', 'InnoSetupRegFile.' + strRegFileNumber) do 
      begin 
       RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce', 'InnoSetupRegFile.' + strRegFileNumber, strRegFileCmd); 
       RegDeleteValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce', 'InnoSetupRegFile.' + strRegFileNumber); 
       arrRegFileLines[intIndex] := strRegFileCmd; 
       intRegFileNumber := intRegFileNumber + 1; 
       strRegFileNumber := Format('%.10d', [intRegFileNumber]); 
       intIndex := intIndex + 1; 
      end; 
      while FileExists(ExpandConstant('{win}\is-filereg' + strCmdFileRegNumber + '.cmd')) do 
      begin 
       intCmdFileRegNumber := intCmdFileRegNumber + 1; 
       strCmdFileRegNumber := Format('%.3d', [intCmdFileRegNumber]); 
      end; 
      arrRegFileLines[intIndex] := 'start cmd.exe /c "timeout.exe /t 2 /nobreak & schtasks.exe /delete /f /tn "Inno Setup File Registrations ' + strCmdFileRegNumber + '" & del /f /q "%windir%\is-filereg' + strCmdFileRegNumber + '.cmd""'; 
      arrRegFileLines[intIndex + 1] := 'cls'; 
      arrRegFileLines[intIndex + 2] := 'exit'; 
      SetArrayLength(arrRegFileLines, intIndex + 3); 
      SaveStringsToFile(ExpandConstant('{win}\is-filereg' + strCmdFileRegNumber + '.cmd'), arrRegFileLines, False); 
      Exec(ExpandConstant('{sys}\schtasks.exe'), '/create /ru "SYSTEM" /sc onstart /rl highest /f /tn "Inno Setup File Registrations ' + strCmdFileRegNumber + '" /tr "''' + ExpandConstant('{win}\is-filereg' + strCmdFileRegNumber + '.cmd') + '''', '', SW_HIDE, 
      ewWaitUntilTerminated, intResultCode); 
     end; 
    end; 
end; 
+0

잘 했어! 감사! +1 –

+0

'start cmd.exe'는 별도의 프로세스를 생성하여 예약 된 작업에서 시작한 프로세스가 완료되도록하여 예약 된 작업과 배치 파일 (자체)을 모두 삭제할 수 있도록합니다. 약간의 버릇이 생기면 모든 배치 파일에'cls'와'exit'를 추가하여 닫습니다. 나는 당신이 제안한 다른 변화들을 살펴볼 것이다. 감사. –

+1

중복 루프를 제거하고'if'를'while'으로 변경하는 코드가 업데이트되었습니다. 이는 하나의 파일을 검사하는 것 이상으로 효과가 없었기 때문입니다. 나는이 함수를 사용하는 것에 지나치게 익숙하지 않았기 때문에 미래에'TStringList'를 사용할 것입니다. (하드 코드 된 상한값은 100이지만, 충분해야합니다). –

관련 문제