【问题标题】:Get service name inside service在服务中获取服务名称
【发布时间】:2014-02-16 07:49:34
【问题描述】:

我想在服务中获取服务名称。大致思路是获取进程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 对我来说是不可接受的。我想提供一个通用库并且无法控制安装程序。 2nd answer 跟我的想法一样。我想这应该和我的结果一样。

【问题讨论】:

    标签: c# winapi powershell service permissions


    【解决方案1】:

    这是一个权限问题。

    从 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,服务帐户将变成交互式用户。所以它有查询服务状态的权限。

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

    【讨论】:

      【解决方案2】:

      这不是一个纯粹的 PowerShell 答案,但就 EXE、DLL 和服务而言,你有一个很好的工具,它是 TASKLIST.EXE。

      查看 /FI 和 /FO。在以下示例中,我获取了搜索服务的信息。

      tasklist /FI "SERVICES eq WSearch" /FO "CSV"
      

      要将其与 PowerShell 集成,您可以使用:

      tasklist /FI "SERVICES eq WSearch" /FO "CSV" | ConvertFrom-Csv
      

      【讨论】:

      • 感谢您的回复。我得到服务 PID 并尝试运行任务列表,例如:tasklist /FI "PID eq {PID}" /SVC /NH。它返回服务名称为 N/A。顺便说一句,如果我在 powershell 中使用服务帐户运行 tasklist,它可以返回正确的服务名称。所以你的解决方案失败了。也是。
      • 你确定调用正确吗?你能给出你使用的确切语法吗?
      • tasklist /FI "PID eq 2524" /SVC return "sqlservr.exe 2524 MSSQLSERVER" in console return "sqlservr.exe 2524 N/A" 在服务调试输出中如此连线。
      • 您是否尝试在提升模式下运行您的服务?
      猜你喜欢
      • 2015-06-27
      • 1970-01-01
      • 1970-01-01
      • 2013-06-16
      • 1970-01-01
      • 2014-08-10
      • 1970-01-01
      • 2014-03-21
      • 1970-01-01
      相关资源
      最近更新 更多