![](/img/trans.png)
[英]Start application as logged user from NSIS installer launched by system service
[英]NSIS Installer failed to start/stop service
我使用的是WindowsXP,NSIS 2.46和nsSCM
插件,並且具有4台幾乎具有相同環境(硬件和軟件)的計算機,因為它們來自同一GHOST映像,但是應用程序層的更改非常有限(未更改任何系統設置) )。
我正在使用NSIS安裝程序將應用程序安裝到它們,詳細過程為:
CreateShortCut "$SMPROGRAMS\\MyApp\\Stop.lnk" "$SYSDIR\\sc.exe" "stop MyAppService" "C:\\WINDOWS\\system32\\SHELL32.dll" 27 SW_SHOWMINIMIZED CreateShortCut "$SMPROGRAMS\\MyApp\\ShowDemo.lnk" "$PROGRAMFILES\\MyAppPath\\MyAppShowDemoHelper.exe" "-b 102" "C:\\WINDOWS\\system32\\SHELL32.dll" 24 SW_SHOWMINIMIZED
啟動“ Apache2.2”服務。
使用腳本:
nsSCM::Start /NOUNLOAD "Apache2.2" Pop $0 ; return error/success ${If} $0 == "success" MessageBox MB_ICONINFORMATION|MB_OK "Successfully started 'Apache2.2' service" ${Else} MessageBox MB_ICONSTOP|MB_OK "Failed to start 'Apache2.2' service with result: $0, Contact help desk or start it manually!" ${EndIf}
==========================
現在問題出在第4步中 , 在其中兩台計算機中 ,它總是彈出錯誤並始終需要手動啟動服務(沒有錯誤),但是與此同時,快捷方式已成功創建。
我已經檢查了系統日志,Apache日志,但是找不到錯誤日志/消息。
我花了一天時間並嘗試了所有步驟,最后,我發現刪除步驟3后,一切都很好,所以知道為什么嗎?
[Edit0]:
要變通,我必須切換第3步和第4步,至少現在它運行良好。
CreateShortcut對插件應該沒有影響,所以這很奇怪。 如果我們可以將范圍縮小到NSIS中的插件API問題或插件本身的問題,那將是很好的。 也許您可以嘗試SimpleSC插件?
這是一些使用系統插件手動執行的代碼。 它不是很漂亮,但是如果失敗,則應顯示相關的錯誤代碼。
Section
!define MyServiceName "Spooler" ;"stisvc"
ExecWait '"$SysDir\cmd.exe" /c net stop "${MyServiceName}"' ; Hack to make sure the service is stopped so we can try starting it again
Sleep 1111
InitPluginsDir
CreateShortcut "$PluginsDir\Test1.lnk" "$ExePath" ; Create some dummy shortcuts to possibly trigger the bug
CreateShortcut "$PluginsDir\Test2.lnk" "$ExePath"
!include LogicLib.nsh
!include Util.nsh
!define ERROR_SERVICE_ALREADY_RUNNING 1056
!define SC_MANAGER_CONNECT 0x0001
!define SERVICE_QUERY_STATUS 0x0004
!define SERVICE_START 0x0010
!define SERVICE_PAUSE_CONTINUE 0x0040
!define SERVICE_CONTROL_CONTINUE 3
!define SERVICE_STOPPED 1
!define SERVICE_START_PENDING 2
!define SERVICE_STOP_PENDING 3
!define SERVICE_RUNNING 4
!define SERVICE_CONTINUE_PENDING 5
!define SERVICE_PAUSE_PENDING 6
!define SERVICE_PAUSED 7
!macro WaitForServiceRunningStatus_
System::Store S
Pop $6
Pop $1
System::Call KERNEL32::GetTickCount()i.r7
System::Call '*(i,i,i,i,i,i,i)i.r2'
loop:
System::Call 'ADVAPI32::QueryServiceStatus(ir1, ir2)i.r3'
System::Call '*$2(i,i.r4)'
${If} $3 <> 0
${If} $4 = ${SERVICE_RUNNING}
DetailPrint 'Service is now running.'
${Else}
Sleep 250
System::Call KERNEL32::GetTickCount()i.r8
${IfThen} $8 < $7 ${|} StrCpy $7 $8 ${|} ; Reset on GetTickCount rollover
IntOp $8 $8 - $7
IntCmpU $8 $6 "" loop
DetailPrint 'Timeout! Service status is $4'
${EndIf}
${EndIf}
System::Free $2
System::Store L
!macroend
!macro WaitForServiceRunningStatus hSC MsTimeout
Push ${hSC}
Push ${MsTimeout}
${CallArtificialFunction} WaitForServiceRunningStatus_
!macroend
System::Call 'ADVAPI32::OpenSCManager(t"", i0, i${SC_MANAGER_CONNECT})i.r0 ?e'
Pop $9
${If} $0 = 0
DetailPrint 'OpenSCManager(t"", i0, i${SC_MANAGER_CONNECT}) failed with error $9'
${Else}
System::Call 'ADVAPI32::OpenService(ir0, t"${MyServiceName}", i${SERVICE_QUERY_STATUS}|${SERVICE_START}|${SERVICE_PAUSE_CONTINUE})i.r1 ?e'
Pop $9
${If} $1 = 0
DetailPrint 'OpenService("${MyServiceName}") failed with error $9'
${Else}
System::Call '*(i,i,i,i,i,i,i)i.r2'
System::Call 'ADVAPI32::QueryServiceStatus(ir1, ir2)i.r3 ?e'
Pop $9
${If} $3 = 0
DetailPrint 'QueryServiceStatus failed with error $9'
StrCpy $4 0 ; We failed, set to unused code so we stop processing
${Else}
System::Call '*$2(i.r3,i.r4,i.r5,i,i,i,i)'
IntFmt $3 "%#x" $3
IntFmt $4 "%#x" $4
IntFmt $5 "%#x" $5
DetailPrint 'QueryServiceStatus: Type=$3, CurrentState=$4 ControlsAccepted=$5'
${EndIf}
${If} $4 = ${SERVICE_PAUSE_PENDING}
${OrIf} $4 = ${SERVICE_PAUSED}
System::Call 'ADVAPI32::ControlService(ir1, i${SERVICE_CONTROL_CONTINUE}, ir2)i.r3 ?e'
Pop $9
${If} $3 = 0
DetailPrint 'ControlService(SERVICE_CONTROL_CONTINUE) failed with error $9'
${Else}
DetailPrint 'Resuming "${MyServiceName}"...'
!insertmacro WaitForServiceRunningStatus $1 5000
${EndIf}
${ElseIf} $4 = ${SERVICE_CONTINUE_PENDING}
!insertmacro WaitForServiceRunningStatus $1 5000
${ElseIf} $4 >= ${SERVICE_STOPPED}
${If} $4 = ${SERVICE_RUNNING}
DetailPrint "Service already running"
${Else}
System::Call 'ADVAPI32::StartService(ir1, i0, i0)i.r3 ?e'
Pop $9
${If} $3 = 0
DetailPrint 'StartService failed with error $9'
${Else}
DetailPrint 'Starting "${MyServiceName}"...'
!insertmacro WaitForServiceRunningStatus $1 9000
${EndIf}
${EndIf}
${EndIf}
System::Free $2
System::Call 'ADVAPI32::CloseServiceHandle(i.r1)'
${EndIf}
System::Call 'ADVAPI32::CloseServiceHandle(i.r0)'
${EndIf}
SectionEnd
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.