0

我正在将文件观察器应用程序作为 Windows 服务 (W10) 运行,并使用以下代码来安装该服务:

var Service = require('node-windows').Service;
const config = require('./SHR_modules/config');

// Create a new service object
var svc = new Service({
  name:'SmartHR',
  description: 'Smart HR file watcher',
  script: require('path').join(__dirname,'watcher.js'),
    workingDirectory: __dirname
});

// Listen for the "install" event, which indicates the
// process is available as a service.
svc.on('install',function(){
  svc.start();
  console.log('installed as user: ' +  svc.logOnAs.account)
});

svc.on('uninstall',function(){
    console.log('Uninstall complete.');
    console.log('The service exists: ',svc.exists);
  });

svc.logOnAs.domain = config.sqlServerLogin.domain;
svc.logOnAs.account = config.sqlServerLogin.user;
svc.logOnAs.password = config.sqlServerLogin.password;

svc.install();

//svc.uninstall();

以管理员身份运行代码并且服务确实安装正确,但它已停止,所以当我尝试启动它时,消息是服务无法启动错误密码。用户名和域是正确的。如果我将密码从我的 config.js 复制/粘贴到服务管理器中,该服务将从现在开始启动并运行。为什么密码(无论它是什么)没有通过该行传递:

svc.logOnAs.password = config.sqlServerLogin.password;

正确吗?

4

1 回答 1

0

winsw.js 中的 XML 生成器函数缺少服务帐户的一行。原始代码:

    if (config.logOnAs) {
      xml.push({
        serviceaccount: [
          {domain: config.logOnAs.domain || 'NT AUTHORITY'},
          {user: config.logOnAs.account || 'LocalSystem'},
          {password: config.logOnAs.password || ''},
        ]
      });
    }

工作代码:

    if (config.logOnAs) {
      xml.push({
        serviceaccount: [
          {domain: config.logOnAs.domain || 'NT AUTHORITY'},
          {user: config.logOnAs.account || 'LocalSystem'},
          {password: config.logOnAs.password || ''},
          {allowservicelogon: 'true'}
        ]
      });
    }

我会将更改提交给项目 git。

于 2020-07-06T13:05:26.123 回答