在交互式会话中启动Windows服务

同事有一个批处理脚本程序,需要在控制台模式下在Windows Server上运行,以便可以访问Windows交互式会话。 服务器会自动定期重启(有一个无关的闭源应用程序在我们无法控制的机器上运行)。 重新启动后,他希望自动启动Windows交互式会话并运行此脚本,此外该服务还需要访问networking资源(特别是CIFS驱动器)。

以下是我们到目前为止的尝试:

  1. 作为Windows服务启动。 这失败了,因为Windows服务可以访问交互式会话networking资源,但从来都没有。
  2. 使用Microsoftpipe理控制台添加脚本以在启动时运行,但是这不起作用。
  3. 使用HKLMregistry项开始运行此脚本,但只有在手动打开服务器上的远程桌面会话时才会启动。
  4. 创build一个计划任务。 被调用的程序没有访问交互式窗口会话。

还有其他build议吗? (或者,当他提出其中一个build议时,他错过了什么?)

如果服务上的“与桌面互动”是不够的(我已经看到了一些不是的情况),您可以将它与AutoAdminLogon结合使用。 在HKLM \ Software \ Microsoft \ Windows NT \ CurrentVersion \ Winlogon下创建三个(或四个域)REG_SZ值:

  • DefaultUsername
  • DefaultPassword
  • 默认域
  • AutoAdminLogon

AutoAdminLogon应设置为字符串 “1”,其他是不言自明的。

显然这有足够大的安全问题,可以通过木星。

你有没有尝试让脚本作为Windows服务运行,但允许它与桌面交互?

特别:

  1. 转到服务属性页面
  2. 点击“登录”标签
  3. 选择“本地系统帐户”
  4. 选中“允许服务与桌面交互”

我建议以另一种方式进行。 您可以构建另一个Windows应用程序,通过IPC与Windows服务进行通信,这可能是关闭的结算应用程序。 但是,如果你必须的话,你可以在服务中指定一个选项(你可以通过MMC,注册表等来做到这一点)。 基本上,你可以看到这个选项,进入计算机管理 – >服务和应用程序 – >服务 – >右键单击您的服务 – >更改帐户到本地系统,并选中“允许系统与桌面交互”。

不过,我再次推荐选择另一条路径。

我最近不得不做类似的事情; 我发现但由于安全问题而丢弃的路由是将交互式服务设置为以交互模式运行,然后在win32 API中运行ImpersonateUser函数,我认为这将提供用户和交互式会话的好处可从LocalSystem获得。

不用说,如果有人闯入这样做的服务,他们将完全控制机器。

看到我的类似问题和真正的答案: 如何从Windows服务启动一个进程到当前登录用户的会话注意:“交互桌面”复选框是不够的。