如何提取服务列表以及它们以什么帐户运行?


13

这个问题的重点是下半年。

我知道如何提取所有服务的列表以及如何过滤它们的状态。但是,我不确定该怎么做是提取服务设置为“运行身份”的用户帐户。

我没有选择使用PowerShell的选项(不幸的是),所以我正在寻找一种本机CMD方式。我以为会有一种使用sc查询命令的方法,但是所有列出的是:

SERVICE_NAME
TYPE
STATE
WIN32_EXIT_CODE
SERVICE_EXIT_CODE
CHECKPOINT
WAIT_HINT

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

Answers:


20

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/zh-cn/library/aa394531%28v=vs.85%29.aspx


sc query和之间有什么区别wmic
Pacerier '17

1
@Pacerier在什么方面有所不同?它们只是不同的(cmd行)工具,使您可以查询/与服务交互。sc仅用于此目的,而wmic更通用(因为它允许查询系统的各个部分)。Wmic也更易于用于此特定问题(仅一个查询)
wmz

5

您可以分两步完成此操作:

  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文件。


1

CMD没有本地方法。SC和NET是Windows附带的内置应用程序,但这并不意味着它们是本地的。管理员可以随时将其删除,甚至CMD都被保留在黑暗中。

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

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


“没有本机的方法”是什么意思?不是C:\Windows\System32\sc.exe所有版本的Windows都可以使用吗?
Pacerier '17

再读一次。内置意味着不可移动,如CMD。如果管理员禁用PowerShell,那么他也可以禁用sc和net。最简单的方法是使用可移植的应用程序,该应用程序默认情况下可以完成所有任务,并且与操作系统无关。
JasonXA

1

尽管您无法使用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类的更多信息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.