如何查询创建Windows服务的账户

如何查询创建Windows服务的账户

早上好,
我正在为嵌入 Windows 服务的产品编写安装程序。为了安装该服务,需要使用包装器,参考配置 ( java -jar wrapper.jar -i <product>.conf)。

现在似乎与帐户存在某种联系:当 Windows 服务作为帐户 1 安装时,帐户 2 就无法启动/停止它。

所以,我(Account2)想询问 Windows 服务,并说“如果您是由 Account1 安装的,那么您需要被卸载,然后我会自己安装您”。

现在的问题是:我如何知道哪个帐户安装了上述 Windows 服务?我已经尝试过了:

  • sc query <Service_Name>
  • sc qc <Service_Name>
  • sc qprivs <Service_Name>
  • sc qmanagedaccount <Service_Name>
  • sc quserservice <Service_Name>
  • wmic service <Service_Name> list full

(你看,我越来越绝望了:-))

上述命令均未给出用户名“Account1”。

有人知道怎么做这个吗?

答案1

我如何知道哪个帐户安装了 Windows 服务?

您可以使用wevtutil检索此信息:

检索有关事件日志和发布者的信息。以自包含格式存档日志,枚举可用日志,安装和卸载事件清单,运行查询,将事件(从事件日志、日志文件或使用结构化查询)导出到指定文件,清除事件日志。

您需要寻找的事件是事件 ID 4697:系统中安装了一项服务。

主题中指明的用户安装了一项新服务。主题通常会将安装的服务标识为本地系统 (SYSTEM),作为本机 Windows 组件的一部分,因此您无法确定实际是谁启动了安装。

主题:

执行操作的用户和登录会话。

  • 安全 ID:帐户的 SID。
  • 账户名:账户登录名。
  • 帐户域:域或(本地帐户的情况下)计算机名称。
  • 登录 ID 是一个半唯一(每次重启后唯一)的数字,用于标识登录会话。登录 ID 允许您向后关联登录事件 (4624) 以及在同一登录会话期间记录的其他事件。

服务信息:

  • 服务名称:新服务的内部系统名称。使用“sc query”可以获取服务名称及其更熟悉的显示名称的交叉引用。

以下命令将显示Account Name最后创建的服务:

wevtutil query-events System /count:1 /rd:true /format:text /q:"Event[System[(EventID=4697)]]"

如果您使用该命令创建了服务sc create,那么您将需要搜索事件 ID:7045 来源:服务控制管理器并查找User Name

wevtutil query-events System /count:1 /rd:true /format:text /q:"Event[System[(EventID=7045)]]"

例子:

> sc create Notepad binpath= c:\windows\system32\Notepad.exe
[SC] CreateService SUCCESS

> wevtutil query-events System /count:1 /rd:true /format:text /q:"Event[System[(EventID=7045)]]"
Event[0]:
  Log Name: System
  Source: Service Control Manager
  Date: 2017-04-07T14:35:32.600
  Event ID: 7045
  Task: N/A
  Level: Information
  Opcode: N/A
  Keyword: Classic
  User: S-1-5-21-1699878757-1063190524-3119395976-1000
  User Name: Hal\DavidPostill
  Computer: Hal
  Description:
A service was installed in the system.

Service Name:  Notepad
Service File Name:  c:\windows\system32\Notepad.exe
Service Type:  user mode service
Service Start Type:  demand start
Service Account:  LocalSystem

进一步阅读

相关内容