在服务中获取服务名称

时间:2014-01-25 06:37:37

标签: c# winapi powershell service permissions

我想在服务中获取服务名称。粗略的想法是获取进程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 itself1st answer对我来说是不可接受的。我想提供一个公共库,并且无法控制安装程序。 2nd answer和我有同样的想法。我想它应该与我的结果相同。

2 个答案:

答案 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用户。因此它有权查询服务状态。

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

相关问题