Tomcat Nsis服务删除

Tomcat Nsis服务删除,tomcat,service,nsis,Tomcat,Service,Nsis,您好,我与NSIS卸载程序有问题 我安装了软件并创建了一个服务。服务名称由用户命名(例如troll) 所以我有服务troll它正在运行,一切正常 如果我想卸载软件,我必须删除此服务;我已经尝试了几种方法来使用插件simpleSC和nsSCM,但没有任何帮助 如果我为ex写信: nsSCM::删除“巨魔”服务已删除 但是,当我编写nsSCM::删除“$0”->时,什么都没有发生 我的错在哪里?从堆栈中获取服务名称时出错?我不知道该服务的名称,因为它是自定义的。任何帮助都将是helpfull:D

您好,我与NSIS卸载程序有问题

我安装了软件并创建了一个服务。服务名称由用户命名(例如
troll

所以我有服务
troll
它正在运行,一切正常

如果我想卸载软件,我必须删除此服务;我已经尝试了几种方法来使用插件
simpleSC
nsSCM
,但没有任何帮助

如果我为ex写信:

  • nsSCM::删除“巨魔”
    服务已删除
  • 但是,当我编写
    nsSCM::删除“$0”
    ->时,什么都没有发生

我的错在哪里?从堆栈中获取服务名称时出错?我不知道该服务的名称,因为它是自定义的。任何帮助都将是helpfull:D

安装程序中变量的内容不会在卸载程序中自动恢复。您必须在注册表中写入服务名称或在安装程序中写入.INI文件,然后在卸载程序中读取此值。

我没有任何声誉,否则这将出现在注释中。不管怎样,您说服务的名称是“由用户命名”

你是说最终用户指定了服务名称还是仅仅是最终用户的用户名

如果是后者,您可以在不使用任何插件(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机器上使用。然而,如果你搞砸了,宏中有一个故障保护,可以帮你躲开这颗子弹。孩子,那太多了,是吗?幸运的是,这对你毫无帮助。哈哈。希望这对其他人有所帮助。

如何获取已安装的服务名称?如果显示代码,问题可能在另一边。我在tomcat服务上测试它,我以这种方式安装了服务:`nsExec::ExecToLog'$INSTDIR\TamasAppServer\bin\tomcat7.exe”//IS//tomcat7`+关于描述、日志路径、JVM…等的其他信息安装后是否存储名称?如何读回该名称?通过
pop$0
当我执行
DetailPrint“$0”
时,它会显示服务名称,所以我认为它是确定的,是的,我尝试通过//DS卸载服务