有没有 Windows 7 Profesional 内置服务及其依赖项的图表或列表?过去我有时间时曾手动使用 Windows XP 执行此操作,但 Windows 7 中似乎还有几十个服务,而我没有足够的时间。快速谷歌搜索没有找到任何结果。
我试图弄清楚为什么我的事件日志显示如此多的服务正在启动和停止与此相关问题。
编辑: 任何更新?
答案1
一个好的开始是服务团体。Windows 服务愿意根据其依赖关系在组内加载:
服务组是启动时一起加载的类似服务的集合。HKEY_LOCAL_MACHINE\CurrentControlSet\Services 子键中出现的大多数服务都是服务组的一部分。Windows NT 每次加载一个服务组。不属于某个组的服务将在所有服务组加载后加载。
HKEY_LOCAL_MACHINE\CurrentControlSet\Control\ServiceGroupOrder 子项决定了服务组的加载顺序。List 值是一个 REG_MULT_SZ 条目,用于指定服务组的顺序。
HKEY_LOCAL_MACHINE\CurrentControlSet\Control\GroupOrderList 子项决定了服务组中服务的加载顺序。服务组中的服务被分配了一个标签,即服务组中唯一的数值,它决定了服务的加载顺序。GroupOrderList 中的每个值条目代表一个服务组。条目的值是一系列按指定顺序排列的标签。此 REG_BINARY 值中的第一个条目是组中的服务数量,后面是按加载顺序排列的标签。如果您查看 PointerPort,您会发现组中有 3 个服务,并且首先加载带有标签 02 的服务,然后是带有标签 01 的服务,最后是带有标签 03 的服务。
在服务级别,HKEY_LOCAL_MACHINE\CurrentControlSet\Services\ServiceName 子键包含:
组 - 此 REG_SZ 指定服务所属的服务组名称。
标签 - 此 REG_DWORD 指定服务加载序列。
DependOnGroup - 此 REG_MULTI_SZ 条目定义了在此服务加载之前必须成功加载的服务组。
DependOnService - 此 REG_MULTI_SZ 条目定义了在此服务加载之前必须成功加载的服务。
答案2
曾经我找到过一款工具,它完全可以满足您的要求(当时 Windows XP 才刚刚推出),但我手头没有这款工具,也找不到它了。不过,它无法处理服务组,因此实用性有限。
我现在能找到的最接近的东西是Windows 服务依赖项查看器. 但这并不理想。
答案3
有一些 PowerShell 函数可以枚举依赖和所需的服务。我在寻找相同问题的解决方案时偶然发现了这一点.DependentServices
:.ServicesDependedOn
以下是完整脚本(改编自原文/来源):
# https://dkalemis.wordpress.com/2015/03/02/visualize-the-services-graph-of-your-windows-os/
# replace "DisplayName" with "Name" ore vice versa.
function List-DependentServices ($inputService, $inputPadding)
{
if ($inputService.DependentServices)
{
$padding = " " + $inputPadding
$output = $padding + "/\ is required by these services:"
$output
$padding = " " + $padding
foreach ($ds in $inputService.DependentServices)
{
$output = $padding + $ds.Name
$output
List-DependentServices $ds $padding
}
}
}
function List-ServicesDependedOn ($inputService, $inputPadding)
{
if ($inputService.ServicesDependedOn)
{
$padding = " " + $inputPadding
$output = $padding + "\/ depends on these services:"
$output
$padding = " " + $padding
foreach ($rs in $inputService.ServicesDependedOn)
{
$output = $padding + $rs.Name
$output
List-ServicesDependedOn $rs $padding
}
}
}
$services = Get-Service
foreach ($service in $services)
{
$output = $service.Name
$output
List-DependentServices $service ""
List-ServicesDependedOn $service ""
}
这可以帮助执行它(重定向输出> toText.file
)
powershell.exe "-Command" "if((Get-ExecutionPolicy ) -ne 'AllSigned') { Set-ExecutionPolicy -Scope Process Bypass }; & '.\ServiceGraphRecursively.ps1'"
原作者更进一步,解释了如何将该脚本输出的文本解析为实际的图形。