java - Tomcat Windows 服务 (Apache Commons procsrv) "The user name or password is incorrect"

标签 java windows tomcat winapi

我花了 2 天多的时间试图让它工作,希望有人能给我指明正确的方向......

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

当服务运行时,我在公共(public)日志中收到以下错误:

[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 和--ServicePassword 我也试过--User 和--Password。失败也是一样。

当我使用 --ServiceUser 并进入 Windows 服务时,找到 MyServer -> Properties -> LogOn -> This Account 显示 myuser@contoso.com。当我使用 --User 时,属性面板将“此帐户”设为空白并选择“本地系统”。

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

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

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

当我查看 Apache Commons procsrv C 代码时,我发现这部分似乎是触发“创建进程失败”和“用户名或密码不正确”错误的地方:

  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 程序,并验证了如果 szPassword 为 NULL 或与 myuser@contoso.com 的 AD 密码不匹配,我得到“用户名或密码不正确”。

我想不出还有什么可以尝试的。我卡住了。 :(

最佳答案

查看 Apache Commons Daemon code ,我看到 Tomcat 真正需要用户详细信息的唯一时间是当它作为单独的可执行文件启动时 - 即当您将其安装为 -StartMode exe 时。

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

或者,如果您确实需要 Tomcat 作为单独的可执行文件运行...您可以在上面链接的同一 Apache Commons 代码中看到,它从命令行和 Windows 注册表的组合中获取所有数据。由于您安装的服务没有命令行参数,它会尝试在注册表中查找用户和密码。此外,由于您在安装时没有指定 UserPassword,因此它也不会将它们保存到注册表中。因此,它会引入空值。

因此,您有两种可能的方法可以解决此问题:

  1. 在 JVM 模式下启动(和停止),在安装服务时使用 -StartMode jvm
  2. 在安装服务时指定两种形式的用户密码。这应该将额外数据放入注册表,以便在服务尝试启动时提供这些数据。

关于java - Tomcat Windows 服务 (Apache Commons procsrv) "The user name or password is incorrect",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37558354/

相关文章:

Java Swing : Changing border width/height on BorderLayout

windows - 创建特定于 Python 的设置

windows - 一次启动3个Windows服务,它们之间有延迟

javascript - 为什么json在不同的应用环境下解析不同?

java - "unchangable"固定大小的 JPanel 是否可能?

java - 从独立应用程序调用 glassfish ejb

java - jsp safari浏览器windows文件下载内容配置文件名变成-

tomcat 7 无法在启用 iptables 的情况下监听端口 8080

java - 如何检测显示器是否处于高对比度模式?

c++ - Qt 程序的速度性能 : Windows vs Linux