我沒有任何聲望,否則就會發表評論。無論如何,你說這個服務的名字是「」,用戶名爲「
你是說最終用戶指定服務名稱還是隻是最終用戶的用戶名?
如果是後者,你可以使用這個沒有任何插件,不包括ExecDos:如果它是第一個選項,那麼你需要做這樣的事情在你的安裝程序,只要用戶指定服務的
Var User
!define SVC `$User`
!define SC `$SYSDIR\sc.exe`
System::Call "advapi32::GetUserName(t.r0,*i${NSIS_MAX_STRLEN})i"
StrCpy $User $0
ClearErrors
ExecDos::Exec /TOSTACK `"${SC}" stop "${SVC}"`
Sleep 50
ExecDos::Exec /TOSTACK `"${SC}" delete "${SVC}"`
名稱。希望這不是太複雜。
;= VARIABLES
;= ################
Var Bit
Var UserService
;= DEFINES
;= ################
!define SVC `$UserService`
!define SCKEY SYSTEM\CurrentControlSet\services\${SVC}
!define HKLM HKLM\${SCKEY}
!define SC `$SYSDIR\sc.exe`
!define GETCURRPROC `kernel32::GetCurrentProcess()i.s`
!define WOW `kernel32::IsWow64Process(is,*i.r0)`
;= MACROS
;= ################
;=#
;= Service::Example
; ${Service::CMD} "ServiceName" /DISABLEFSR $0 $1
; ::CMD = Either QueryConfig, Stop, or Remove.
; ServiceName = The service name to be handled
; /DISABLEFSR = Disables file-system redirection if running on x64. Use "" to skip.
; $0 = Return after call
; $1 = '' '' ''
!define Service::QueryConfig `!insertmacro _Service::QueryConfig`
!macro _Service::QueryConfig _SVC _FSR _ERR1 _ERR2
ReadEnvStr $R0 COMSPEC
StrCmpS $Bit 64 0 +4
StrCmp "${_FSR}" /DISABLEFSR 0 +3
ExecDos::Exec /TOSTACK /DISABLEFSR `"$R0" /c "${SC} qc "${_SVC}" | FIND "BINARY_PATH_NAME""`
Goto +2
ExecDos::Exec /TOSTACK `"$R0" /c "${SC} qc "${_SVC}" | FIND "BINARY_PATH_NAME""`
Pop ${_ERR1}
Pop ${_ERR2}
StrCmpS ${_ERR1} 0 0 +4
StrCpy $R1 ${_ERR2} "" 29
WriteINIStr "$EXEDIR\InstallData.ini" "Service" Path "$R1"
ReadRegStr $R1 HKLM `${SVCKEY}` ImagePath
WriteINIStr "$EXEDIR\InstallData.ini" "Service" Path "$R1"
WriteINIStr "$EXEDIR\InstallData.ini" "Service" Name "${_SVC}"
!macroend
!define Service::Stop `!insertmacro _Service::Stop`
!macro _Service::Stop _SVC _FSR _ERR1 _ERR2
StrCmpS $Bit 64 0 +4
StrCmp "${_FSR}" /DISABLEFSR 0 +3
ExecDos::Exec /TOSTACK /DISABLEFSR `"${SC}" stop "${_SVC}"`
Goto +2
ExecDos::Exec /TOSTACK `"${SC}" stop "${_SVC}"`
Pop ${_ERR1}
Pop ${_ERR2}
!macroend
!define Service::Remove `!insertmacro _Service::Remove`
!macro _Service::Remove _SVC _FSR _ERR1 _ERR2
StrCmpS $Bit 64 0 +4
StrCmp "${_FSR}" /DISABLEFSR 0 +3
ExecDos::Exec /TOSTACK /DISABLEFSR `"${SC}" delete "${_SVC}"`
Goto +2
ExecDos::Exec /TOSTACK `"${SC}" delete "${_SVC}"`
Pop ${_ERR1}
Pop ${_ERR2}
!macroend
Function ".onInit"
System::Call `${GETCURRPROC}`
System::Call `${WOW}`
StrCmpS $0 0 +3
StrCpy $Bit 64
Goto +2
StrCpy $Bit 32
FunctionEnd
;=#
;= I don't know the code you're using but let's assume
;= after the end-user specifies the service's name you
;= copy the name to the variable $UserService. This is
;= somewhere in the install process.
StrCpy $UserService $0
;#=#
;# This will write to an INI file | $EXEDIR\InstallData.ini
;# [Service]
;# Path=X:\Path\to\service\exe
;# Name=ServiceName
;#=#
${Service::QueryConfig} ${SVC} /DISABLEFSR $0 $1
;=#
;= Then in your uninstaller you could simply implement
;= this into your code for easy removal. I usually use
;= this method in my projects and it works pretty good
;= without the need for any extra plugins.
ReadINIStr $0 "$EXEDIR\InstallData.ini" "Service" Name
${Service::Stop} "$0" /DISABLEFSR $0 $1
Sleep 50
${Service::Remove} "$0" /DISABLEFSR $0 $1
的/DISABLEFSR參數應該只在x64機器。但是,如果你搞砸了宏中有一個失敗保險,它會爲你避開這顆子彈。男孩,這很多,是吧?對我來說,這絕對不會幫助你。大聲笑。希望這可以幫助別人。
如何獲得已安裝的服務名稱?顯示代碼,問題可能在另一端。 – Seki
我在tomcat服務上測試它,我以這種方式安裝了服務:'nsExec :: ExecToLog'「$ INSTDIR \ TamasAppServer \ bin \ tomcat7.exe」// IS // tomcat7' +其他有關description,logPath,JVM的信息.. .etc – exofus
安裝後您是否存儲該名稱?你如何回讀*這個名字? – Seki