gpt4 book ai didi

c# - 在服务中获取服务名称

转载 作者:太空宇宙 更新时间:2023-11-03 16:01:08 25 4
gpt4 key购买 nike

我想在服务中获取服务名称。大致的想法是获取进程id,并将进程id与WMI、ServiceCotroller或EnumServicesStatusEx() API枚举的服务进行比较。

问题是该服务在域帐户下运行(它不是本地管理员)。当我想枚举正在运行的服务中的服务时,正在运行的服务本身在枚举中丢失了!

如果我将服务帐户移至本地管理员,则会找到正在运行的服务。所以这不是代码问题。 (如果代码有问题,行为应该是一样的:找不到服务。)

如果我将逻辑提取到控制台应用程序(或通过 powershell)并在服务帐户下运行应用程序或 powershell,也可以找到该服务。所以这不是权限问题。 (如果权限问题,行为应该相同:找不到服务。)

当服务帐户不是管理员和 INSIDE 服务时,不能枚举服务。这是非常严重的电线问题。

我从 MSDN 查看 EnumServicesStatusEx 的文档,发现本地管理员比本地经过身份验证的用户拥有额外的 SC_MANAGER_LOCK。是这个原因吗?但我不能将锁与服务枚举联系起来。

或者有人请指出一种在服务中查询服务名称的方法。

谢谢。

顺便说一句,它在 Windows 2008 R2 上。

我发现了一个相关问题:How to get name of windows service from inside the service itself .1st answer对我来说是 Not Acceptable 。我想提供一个公共(public)库并且无法控制安装程序。2nd answer和我一样的想法。我想应该和我的结果一样。

最佳答案

这是一个权限问题。

从 Sysinternals 运行 psservice,如:

psservice.exe security InstrumentationTestService

我得到了以下结果:

PsService v2.24 - Service information and configuration utility
Copyright (C) 2001-2010 Mark Russinovich
Sysinternals - www.sysinternals.com

SERVICE_NAME: InstrumentationTestService
DISPLAY_NAME: InstrumentationTestService
ACCOUNT: LocalSystem
SECURITY:
[ALLOW] NT AUTHORITY\SYSTEM
Query status
Query Config
Interrogate
Enumerate Dependents
Pause/Resume
Start
Stop
User-Defined Control
Read Permissions
[ALLOW] BUILTIN\Administrators
All
[ALLOW] NT AUTHORITY\INTERACTIVE
Query status
Query Config
Interrogate
Enumerate Dependents
User-Defined Control
Read Permissions
[ALLOW] NT AUTHORITY\SERVICE
Query status
Query Config
Interrogate
Enumerate Dependents
User-Defined Control
Read Permissions

说明我的服务账号没有权限查询服务状态。

如果我使用服务帐户来运行 powershell/WMI/ServiceController,服务帐户将变成交互式用户。所以它有查询服务状态的权限。

解决方案是授予服务帐户查询状态权限。

关于c# - 在服务中获取服务名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21347562/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com