早上好,
我正在为嵌入 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
进一步阅读
- Windows CMD 命令行的 AZ 索引- 与 Windows cmd 行相关的所有事物的绝佳参考。
- 陣容- 服务控制 - 创建、启动、停止、查询或删除任何 Windows 服务。
- 韦夫图利- Windows 事件命令行实用程序。