我想在服务中获取服务名称。粗略的想法是获取进程ID并将进程ID与WMI,ServiceCotroller或EnumServicesStatusEx()API枚举的服务进行比较。
问题是该服务是在域帐户下运行的(它不是本地管理员)。当我想枚举正在运行的服务中的服务时,枚举中缺少正在运行的服务!
如果我将服务帐户移至本地管理员,则会找到正在运行的服务。所以这不是代码问题。 (如果代码问题,行为应该相同:找不到服务。)
如果我将逻辑提取到控制台应用程序(或通过powershell)并在服务帐户下运行应用程序或PowerShell,则也会找到该服务。所以这不是许可问题。 (如果权限问题,行为应该相同:找不到服务。)
当服务帐户不是管理员和INSIDE服务时,不能枚举服务。这是非常有线问题。
我从MSDN检查EnumServicesStatusEx的文档,发现本地管理员比本地认证用户有额外的SC_MANAGER_LOCK。是原因吗?但我无法将锁与服务枚举链接起来。
或者有人请指出一种在服务中查询服务名称的方法。
感谢。
BTW,它在Windows 2008 R2上。
我找到了一个相关的问题:How to get name of windows service from inside the service itself。 1st answer对我来说是不可接受的。我想提供一个公共库,并且无法控制安装程序。 2nd answer和我有同样的想法。我想它应该与我的结果相同。
答案 0 :(得分:0)
这不是一个纯粹的PowerShell答案,但就EXE,DLL和SERVICE而言,你有一个很好的工具TASKLIST.EXE。
了解/ FI和/ FO。在以下示例中,我获取了搜索服务的信息。
tasklist /FI "SERVICES eq WSearch" /FO "CSV"
要将其与PowerShell集成,您可以使用:
tasklist /FI "SERVICES eq WSearch" /FO "CSV" | ConvertFrom-Csv
答案 1 :(得分:0)
这是权限问题。
从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,则服务帐户将变为INTERACTIVE用户。因此它有权查询服务状态。
解决方案是授予服务帐户查询状态权限。