我如何提取服务列表以及它们以哪个帐户运行?

我如何提取服务列表以及它们以哪个帐户运行?

这个问题的重点在后半部分。

我知道如何提取所有服务的列表以及如何根据其状态进行过滤。但是,我不确定如何提取服务设置为“以...身份运行”的用户帐户。

不幸的是,我没有使用 PowerShell 的选项,因此我正在寻找一种本机 CMD 方式。我以为有一种方法可以使用 sc 查询命令,但列出的内容只有:

SERVICE_NAME
TYPE
STATE
WIN32_EXIT_CODE
SERVICE_EXIT_CODE
CHECKPOINT
WAIT_HINT

仅供参考 - 操作系统是 Windows 2003 SP2,我需要所有服务的信息,因此如果我必须为每个服务手动执行此操作,那么这是一个漫长的过程。

答案1

wmic:
所有服务的名称和帐户:
wmic service get name,startname

仅启动服务:
wmic service where started=true get name, startname

名称具有特定模式的服务:
wmic service where 'name like "%sql%"' get name, startname

格式化为 html 表格(然后在浏览器中打开):
(wmic service where 'name like "%sql%"' get name, startname /format:htable >out.html) && out.html

完整语法在这里:https://msdn.microsoft.com/en-us/library/aa394531%28v=vs.85%29.aspx

答案2

您可以通过两个步骤完成此操作:

  1. 获取服务列表:sc \\localhost query | findstr SERVICE_NAME
  2. 您缺少的部分:sc \\localhost qc+ SERVICE_NAME +| findstr SERVICE_START_NAME

我推荐一个这样的批处理脚本:

@echo off
setlocal EnableDelayedExpansion
sc \\localhost query | findstr SERVICE_NAME > services.lst
for /f "tokens=1,2" %%A in (services.lst) do (
    echo %%B
    sc \\localhost qc %%B | findstr SERVICE_START_NAME
)
del services.lst

这将给出如下输出: 在此处输入图片描述

当然,您可以以任何您想要的方式进一步清理该输出或写入 CSV 文件。

答案3

CMD 没有原生的方式来实现这一点。SC 和 NET 是 Windows 内置的应用程序,但这并不意味着它们是原生的。管理员可以随时删除它们,然后 CMD 就一无所知了。

sc sdshow 可以获取您的安全描述符,但如果您不知道如何读取 SDDL 字符串,这会使事情变得复杂。

最简单的方法是从工具包中获取 Sysinternals PsService.exe 并将其用作 psservice security [service]。它将以可读格式列出 SDDL,包括帐户名称。

答案4

虽然您不能使用 PowerShell,但您仍然可以使用 VBScript 从 WMI 中提取信息:

这是一个 VBS 脚本,它将列出所有服务及其启动的帐户:

strComputer = "."

Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colServices = objWMIService.ExecQuery ("Select * from Win32_Service")

For Each objService in colServices 
    wscript.echo objService.Name & ": " & objService.StartName
Next

保存它然后用 运行它cscript ScriptName.vbs

objService.State将为您提供服务的当前状态(因为您提到您希望通过它进行过滤)。

更多信息Win32_Service 类

相关内容