Tomcat Windows服务(Apache Commons procsrv)“用户名或密码不正确”

我已经花了2天时间试图让这个工作,并希望有人能够指出我在正确的方向…

我正在尝试将Windows Server 2012 R2上的Tomcat 8作为特定用户名的服务运行。 由于我的应用程序的复杂性,我直接运行tomcat8.exe // IS / …而不是使用service.bat脚本。

当服务运行时,我在公共日志中得到这些错误:

[2016-05-31 18:00:14] [debug] ( prunsrv.c:1679) [ 3280] Commons Daemon procrun log initialized [2016-05-31 18:00:14] [info] ( prunsrv.c:1683) [ 3280] Commons Daemon procrun (1.0.15.0 64-bit) started [2016-05-31 18:00:14] [info] ( prunsrv.c:1580) [ 3280] Debugging 'CertAccordServer' service... [2016-05-31 18:00:14] [debug] ( prunsrv.c:1374) [ 3280] Inside ServiceMain... [2016-05-31 18:00:14] [debug] ( prunsrv.c:844 ) [ 3280] reportServiceStatusE: 2, 0, 3000, 0 [2016-05-31 18:00:14] [info] ( prunsrv.c:1127) [ 3280] Starting service... [2016-05-31 18:00:14] [error] (rprocess.c:497 ) [ 3280] The user name or password is incorrect. [2016-05-31 18:00:14] [error] ( prunsrv.c:1210) [ 3280] Failed to create process [2016-05-31 18:00:14] [error] ( prunsrv.c:1210) [ 3280] The user name or password is incorrect. [2016-05-31 18:00:14] [error] ( prunsrv.c:1536) [ 3280] ServiceStart returned 1 [2016-05-31 18:00:14] [error] ( prunsrv.c:1536) [ 3280] The user name or password is incorrect. [2016-05-31 18:00:14] [debug] ( prunsrv.c:844 ) [ 3280] reportServiceStatusE: 1, 1066, 0, 1 [2016-05-31 18:00:14] [info] ( prunsrv.c:1582) [ 3280] Debug service finished with exit code 1 [2016-05-31 18:00:14] [error] ( prunsrv.c:1755) [ 3280] Commons Daemon procrun failed with exit value: 3 (Failed to run service as console application) [2016-05-31 18:00:14] [error] ( prunsrv.c:1755) [ 3280] The user name or password is incorrect. 

以下是我用来添加服务的完整命令:

 ./tomcat8.exe \ //IS//MyServer \ --LogLevel Debug \ --Description "My service info" \ --DisplayName "My Server" \ --Install 'C:\Program Files\MyServer\tomcat\bin\tomcat8.exe' \ --LogPath 'C:\ProgramData\MyServer\tomcat\logs' \ --ServiceUser 'myuser@contoso.com' \ --ServicePassword test123 \ --StdOutput auto \ --StdError auto \ --StartImage "C:\Program Files\MyServer\java\bin\java.exe" \ --Startup auto \ --StartMode exe \ --StopMode exe \ --StartParams start \ --StopParams stop \ --StartClass org.apache.catalina.startup.Bootstrap \ --StopClass org.apache.catalina.startup.Bootstrap \ --JvmOptions "-Dcmb.productdir=C:\Program Files\MyServer;-Dcmb.datadir=C:\ProgramData\MyServer;-Dcatalina.home=C:\Program Files\MyServer\tomcat;-Dcatalina.base=C:\ProgramData\MyServer\tomcat;-Djava.endorsed.dirs=C:\Program Files\MyServer\tomcat\endorsed;-Djava.io.tmpdir=C:\ProgramData\MyServer\tomcat\temp;-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager;-Djava.util.logging.config.file=C:\ProgramData\MyServer\tomcat\conf\logging.properties" \ --JvmMs 256m \ --JvmMx 1024m \ --Classpath "C:\Program Files\MyServer\tomcat\bin\bootstrap.jar;C:\Program Files\MyServer\tomcat\bin\tomcat-juli.jar;C:\ProgramData\MyServer\resource;C:\Program Files\MyServer\resource" 

代替 – 服务用户和 – 服务密码我也试过了 – 用户和 – 密码。 失败是一样的。

当我使用–ServiceUser进入Windows服务时,findMyServer – >属性 – > LogOn – >这个账户显示myuser@contoso.com。 当我使用 – 用户属性面板有这个帐户作为空白和本地系统select。

myuser@contoso.com是一个AD帐户。 在tomcat8服务被添加的本地系统上,它有一个组策略,它将“作为服务login”。

我还validation了myuser@contoso.com是一个有效的帐户,并通过从cmd提示符运行此密码匹配:

 runas /noprofile /user:myuser@contoso.com notepad Enter the password for myuser@contoso.com: test123 

当我看到Apache Commons procsrv C代码时,我发现这个部分看起来是“创build进程失败”,然后是“用户名或密码不正确”错误的地方:

  if (!LogonUserW(szUsername, NULL, szPassword, bLogonAsService ? LOGON32_LOGON_SERVICE : LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, &hUser)) { /* Logon Failed */ apxLogWrite(APXLOG_MARK_SYSERR); return NULL; } 

我用上面的代码编写了一个简单的C程序,并validation了如果szPassword为NULL或不与myuser@contoso.com的AD密码匹配,则会得到“用户名或密码不正确”。

我想不出别的办法。 我卡住了。 🙁

看看Apache Commons Daemon代码 ,我发现Tomcat实际上只需要用户的详细信息就是当它作为一个单独的可执行文件启动的时候 – 也就是说,当你将它安装为-StartMode exe

看看tomcat通常安装在service.bat中的方式 ,我看到这使用JNI形式的调用 – 即-StartMode jvm 。 这不会通过有问题的路径,所以应该避免您的用户/密码问题。

另外,如果你真的需要Tomcat作为一个单独的可执行文件来运行……你可以在上面链接的Apache Commons代码中看到,它从命令行和Windows注册表中获取所有的数据。 由于您已经安装了没有命令行参数的服务,它将尝试在注册表中查找用户和密码。 另外,由于您在安装时没有指定UserPassword ,所以也不会将它们保存到注册表中。 因此,它拉空值。

所以,你有两种可能的方法可以解决这个问题:

  1. 在JVM模式下启动(并停止),在安装服务时使用-StartMode jvm
  2. 在安装服务时指定UserPassword 两种形式。 这应该将额外的数据放入注册表中,并在服务尝试启动时使其可用。

输入命令时,应该以管理员身份进行。 例如,从Windows开始菜单中,输入cmd ,右键单击cmd.exe或其提供的命令提示符,然后select Run as administrator

安装TomcatN作为服务:

只要运行tomcat的c:\path\to\TomcatN\bin\service.bat然后给它一个服务名即可,比如Tomcat8 。 要么,

 sc Create TomcatN binPath= "c:\path\to\TomcatN\bin\tomcatN.exe" displayName= "Apache Tomcat N" 

将服务设置为以特定用户身份运行:

大多数时候你不需要这个。 但有时您需要以注册用户身份访问Windows网络。 例如,如果您正在利用某些Active Directory功能。 它可能会使用以下内容:

 C:\path\to\tomcatN\bin\service.bat install TomcatN --user=George --password=abc123 

但可能不是。 您可以手动配置服务。

手动配置服务以使用特定的用户名和密码:

在Windows命令提示符下,您可以使用服务配置程序。 一些感兴趣的命令:

 sc sc query TomcatN sc qc TomcatN sc config TomcatN obj= "MyHostName\George" password= "abc123" 

注意最后一个命令中等号之后的空格。

确保用户有权限:

输入gpedit.msc命令。 在出现的GUI中,导航到

 Local Computer Policy | ... - Computer Configuration | ... - Windows Settings | []Log on as a service - Security Settings | ... User Rights Assignment | ... 

双击Log on as a service和“ Add User or Group....在该字段中键入要使用服务的用户名的简写形式,单击Check Names ,然后按OK

确认TomcatN正按预期运行:

您可以使用以下命令来启动,停止和检查服务的状态:

 net start TomcatN net stop TomcatN sc query TomcatN 

检查登录是否按预期工作

确保你已经开始运行服务。 打开Windows任务管理器并查看进程选项卡。 如有必要,点击Show processes from all usersTomcatN应该用你在其旁边指定的用户名列出。

信贷到@ andrewk

资源链接:

  1. 如何在Windows中以特定用户的身份运行Tomcat服务?
  2. 在Windows 7上以不同用户身份运行Tomcat服务

您使用了不正确的参数名称作为您的用户名和密码。

– 服务用户'myuser@contoso.com' – 服务密码test123

它应该是:

– 用户'myuser@contoso.com' – 密码test123

要么

试试这个https://superuser.com/a/842867