java - 无法启动在 powerShell 中使用 Procrun 创建的 Windows 服务

标签 java windows powershell procrun

我使用 Procrun 创建了一个 java 应用程序(.jar)作为 Windows 服务。当我使用批处理(.bat)文件时,此服务已安装并成功运行。但我有使用 Windows powerShell 创建相同服务的要求。

当我使用 PowerShell 时,服务已安装,但无法启动该服务我在 Windows 事件查看器中检查,它显示为“不正确的功能”任何人都可以告诉我这可能是什么原因。

这是我在 PowerShell 脚本中用于安装 Windows 服务的字符串

$CmdInstall=@'

--Description="$Description"
--DisplayName="$DisplayName"
--Install="$DAEMON"
--Startup=auto
--Type=
--DependsOn=
--Environment=
--User=
--Password=
--ServiceUser=
--ServicePassword=
--LibraryPath=
--JavaHome
--Jvm=auto
--JvmOptions=-Xmx1024M
--Classpath=server.jar
--JvmMs=
--JvmMx=
--JvmSs=
--StartMode=jvm
--StartImage=
--StartPath=
--StartClass=at.mrdevelopment.esl.server.Server
--StartMethod=main
--StartParams=
--StopMode=jvm
--StopImage=
--StopPath=
--StopClass=at.mrdevelopment.esl.server.ServerServiceStarter
--StopMethod=stop
--StopParams=
--StopTimeout=120
--LogPath=$LogPath
--LogPrefix=$InstanceName
--LogLevel=DEBUG
--LogJniMessages=
--StdOutput=auto
--StdError=auto
--PidFile=${InstanceName}.pid
'@

如有任何帮助,我们将不胜感激。

这是我使用的 PowerShell 脚本。

  #region Parameters
   [CmdletBinding(SupportsShouldProcess=$true)]
param(
   [ValidateNotNullOrEmpty()]
   [string]$Action="//IS"
   ,
   [ValidateNotNullOrEmpty()]
   [string]$ServiceName="//ESL_SERVICE"
   ,
   [ValidateNotNullOrEmpty()]
   [string]$DisplayName="ESL_SERVICE"
   ,
   [ValidateNotNullOrEmpty()]
   [string]$Description="ESL Service"
   ,
   [ValidateNotNullOrEmpty()]
   [string]$InstanceName="server.jar"
   ,
   [ValidateNotNullOrEmpty()]
   [string]$LogPath='C:\Apachelogs'
   ,
   [string]$Pause=60
)
#endregion

#region Main

$CmdInstall=@'

--Description="$Description"
--DisplayName="$DisplayName"
--Install="$DAEMON"
--Startup=auto
--Type=
--DependsOn=
--Environment=
--User=
--Password=
--ServiceUser=
--ServicePassword=
--LibraryPath=
--JavaHome
--Jvm=auto
--JvmOptions=-Xmx1024M
--Classpath=server.jar
--JvmMs=
--JvmMx=
--JvmSs=
--StartMode=jvm
--StartImage=
--StartPath=
--StartClass=at.mrdevelopment.esl.server.Server
--StartMethod=main
--StartParams=
--StopMode=jvm
--StopImage=
--StopPath=
--StopClass=at.mrdevelopment.esl.server.ServerServiceStarter
--StopMethod=stop
--StopParams=
--StopTimeout=120
--LogPath=$LogPath
--LogPrefix=$InstanceName
--LogLevel=DEBUG
--LogJniMessages=
--StdOutput=auto
--StdError=auto
--PidFile=${InstanceName}.pid
'@

$DAEMON_HOME         = "C:\imagotag\server"
$DAEMON              = "$DAEMON_HOME\prunsrv_64.exe"                                               
$ESL_HOME            = "C:\imagotag\server"  

$CmdArgsDict=@{}

$CmdArgsDict.Add('//IS',      "$Action$ServiceName $CmdInstall")

$CmdArgs             = $CmdArgsDict[$action]
# Convert backslashes in the paths to java-friendly forward slashes
$CmdArgs             = $CmdArgs -replace "\\","/"
# Variable interpolation: expand embedded variables references (need to call this twice)
$CmdArgs             = $ExecutionContext.InvokeCommand.ExpandString($CmdArgs)
$CmdArgs             = $ExecutionContext.InvokeCommand.ExpandString($CmdArgs)
# Split on newlines to convert to an array of lines
$CmdArgsString       = $CmdArgs -split "`n"
# Convert array of lines into a string
$CmdArgsString       = "$CmdArgsString"


#--- Execute the command
if ($PSCmdlet.ShouldProcess(
    "`n$DAEMON`n$CmdArgs","Manage ESL Service"
))
{
   "$DAEMON $CmdArgsString"

   $p=Start-Process "$DAEMON" `
         -ArgumentList "$CmdArgsString" `
         -Wait `
         -NoNewWindow `
         -PassThru

   $rc = $p.ExitCode
   "`nExit Code: $rc"
}
#endregion

我的 PowerShell 脚本是 TestPS.ps1,我像这样执行脚本

.\TestPS.ps1 //IS

最佳答案

要创建服务,请在 PS 中使用以下 cmdlet:

$username = "Username"
$password = "password"
$secstr = New-Object -TypeName System.Security.SecureString
$password.ToCharArray() | ForEach-Object {$secstr.AppendChar($_)}
$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $secstr

new-service -Name [INSERT SERVICE NAME] -DisplayName "[INSERT DISPLAY NAME]" -Description "[INSERT DESCRIPTION]" -BinaryPathName "[INSERT BINARY PATH]" -StartupType Manual -Credential $cred

如果您想远程执行,请使用以下功能:

function Install-Service(
    [string]$serviceName = $(throw "serviceName is required"), 
    [string]$targetServer = $(throw "targetServer is required"),
    [string]$displayName = $(throw "displayName is required"),
    [string]$physicalPath = $(throw "physicalPath is required"),
    [string]$userName = $(throw "userName is required"),
    [string]$password = "",
    [string]$startMode = "Automatic",
    [string]$description = "",
    [bool]$interactWithDesktop = $false
)
{
    # can't use installutil; only for installing services locally
    #[wmiclass]"Win32_Service" | Get-Member -memberType Method | format-list -property:*    
    #[wmiclass]"Win32_Service"::Create( ... )        

    # todo: cleanup this section 
    $serviceType = 16          # OwnProcess
    $serviceErrorControl = 1   # UserNotified
    $loadOrderGroup = $null
    $loadOrderGroupDepend = $null
    $dependencies = $null

    # description?
    $params = `
        $serviceName, `
        $displayName, `
        $physicalPath, `
        $serviceType, `
        $serviceErrorControl, `
        $startMode, `
        $interactWithDesktop, `
        $userName, `
        $password, `
        $loadOrderGroup, `
        $loadOrderGroupDepend, `
        $dependencies `

    $scope = new-object System.Management.ManagementScope("\\$targetServer\root\cimv2", `
        (new-object System.Management.ConnectionOptions))
    "Connecting to $targetServer"
    $scope.Connect()
    $mgt = new-object System.Management.ManagementClass($scope, `
        (new-object System.Management.ManagementPath("Win32_Service")), `
        (new-object System.Management.ObjectGetOptions))

    $op = "service $serviceName ($physicalPath) on $targetServer"    
    "Installing $op"
    $result = $mgt.InvokeMethod("Create", $params)    
    Test-ServiceResult -operation "Install $op" -result $result
    "Installed $op"

    "Setting $serviceName description to '$description'"
    Set-Service -ComputerName $targetServer -Name $serviceName -Description $description
    "Service install complete"
}

这是Guide to Install Windows Service Remotely

注意:确保您正在以提升模式运行所有内容。

希望有帮助。

关于java - 无法启动在 powerShell 中使用 Procrun 创建的 Windows 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42477859/

相关文章:

java - 我需要使用哪种设计模式 Java 应用程序

正则表达式:DOS FindStr 命令没有逆向类功能?

loops - 我无法让 PowerShell 正确转换为 int

string - Powershell在找到另一个字符串后提取字符串

java - Firebase - 按值检索数据到外部变量

java - Java 数组质因数分解

java - AndroidAnnotations 的@UiThread 是如何实现的?

c# - DirectoryEntry IIS 访问权限

c# - Windows是否有一些内置的数据库引擎?

c# - 如何使用 C# 在 exchange server 中获取日历的用户权限