这个问题的重点在后半部分。
我知道如何提取所有服务的列表以及如何根据其状态进行过滤。但是,我不确定如何提取服务设置为“以...身份运行”的用户帐户。
不幸的是,我没有使用 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
您可以通过两个步骤完成此操作:
- 获取服务列表:
sc \\localhost query | findstr SERVICE_NAME
- 您缺少的部分:
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 类。