这一直困扰着我,因此我将询问Server Fault社区。
我喜欢Process Explorer,因为它不仅可以跟踪在任务管理器中获得的高级任务,还可以跟踪更多的任务。但是我一直想知道在svchost下的单个进程中托管的数十个服务中的哪些正在使我的处理器达到峰值。
那么...有没有非侵入性的方式可以找到这些信息?
这一直困扰着我,因此我将询问Server Fault社区。
我喜欢Process Explorer,因为它不仅可以跟踪在任务管理器中获得的高级任务,还可以跟踪更多的任务。但是我一直想知道在svchost下的单个进程中托管的数十个服务中的哪些正在使我的处理器达到峰值。
那么...有没有非侵入性的方式可以找到这些信息?
Answers:
是的,有一种(几乎)非侵入性且简单的方法:
将每个服务拆分为在其自己的SVCHOST.EXE进程中运行,并且消耗CPU周期的服务将在Process Explorer中轻松显示(“ =“之后的空格是必需的)):
SC Config Servicename Type= own
在命令行窗口中执行此操作,或将其放入BAT脚本中。需要具有管理特权,并且必须重新启动计算机才能生效。
可以通过以下方式恢复原始状态:
SC Config Servicename Type= share
示例:使Windows Management Instrumentation在单独的SVCHOST.EXE中运行:
SC Config winmgmt Type= own
该技术没有不良影响,只是可能会稍微增加内存消耗。而且,除了观察每个服务的CPU使用率之外,还可以轻松观察每个服务的页面错误增量,磁盘I / O读取速率和磁盘I / O写入速率。对于“进程资源管理器”,分别在菜单“查看/选择列”中:“进程内存/页面错误增量”选项卡,“进程性能/ IO增量写字节数”选项卡,“进程性能/ IO增量读字节”选项卡。
在大多数系统上,只有一个SVCHOST.EXE进程具有很多服务。我使用了以下顺序(可以将其直接粘贴到命令行窗口中):
rem 1. "Automatic Updates"
SC Config wuauserv Type= own
rem 2. "COM+ Event System"
SC Config EventSystem Type= own
rem 3. "Computer Browser"
SC Config Browser Type= own
rem 4. "Cryptographic Services"
SC Config CryptSvc Type= own
rem 5. "Distributed Link Tracking"
SC Config TrkWks Type= own
rem 6. "Help and Support"
SC Config helpsvc Type= own
rem 7. "Logical Disk Manager"
SC Config dmserver Type= own
rem 8. "Network Connections"
SC Config Netman Type= own
rem 9. "Network Location Awareness"
SC Config NLA Type= own
rem 10. "Remote Access Connection Manager"
SC Config RasMan Type= own
rem 11. "Secondary Logon"
SC Config seclogon Type= own
rem 12. "Server"
SC Config lanmanserver Type= own
rem 13. "Shell Hardware Detection"
SC Config ShellHWDetection Type= own
rem 14. "System Event Notification"
SC Config SENS Type= own
rem 15. "System Restore Service"
SC Config srservice Type= own
rem 16. "Task Scheduler"
SC Config Schedule Type= own
rem 17. "Telephony"
SC Config TapiSrv Type= own
rem 18. "Terminal Services"
SC Config TermService Type= own
rem 19. "Themes"
SC Config Themes Type= own
rem 20. "Windows Audio"
SC Config AudioSrv Type= own
rem 21. "Windows Firewall/Internet Connection Sharing (ICS)"
SC Config SharedAccess Type= own
rem 22. "Windows Management Instrumentation"
SC Config winmgmt Type= own
rem 23. "Wireless Configuration"
SC Config WZCSVC Type= own
rem 24. "Workstation"
SC Config lanmanworkstation Type= own
rem End.
尝试使用服务披露工具。它:
欢迎您提出意见和建议。
@Peter Mortensen:谢谢你的想法。
警告:在应用此方法之前,请进行必要的研究,还原点和备份过程,并确保此后一切仍然正常。仅通过非RAID系统上的“恢复环境”以及RAID和非RAID系统上的“安全模式”就可以从中进行恢复。已在开发人员机器上而非服务器上进行了测试。
在Powershell中,可以使用以下命令对所有非lass服务执行此操作:
Get-Service | ForEach-Object `
{ SC.EXE config $_.Name type= own }
ForEach ($svc in @("efs", "keyiso", "netlogon", "policyagent", "samss", "vaultsvc", `
"was", "w3svc")) `
{ SC.EXE config $svc type= share }
此处排除的列表都需要在共享的lsass.exe中运行,policyagent除外,这是组策略代理在引导期间正常通信所必需的。
最近还发现了(进程激活)和W3SVC(IIS万维网)需要分享他们的流程,因此他们已被添加到排除。
这已经在Windows 10(1607,构建14393.953)测试后,排除是在XP不同,...。
如今,您可以使用PowerShell将服务类型更改为“自己的进程”,并分别查看每个进程的内存。本要点显示了完整的代码。中心思想是尝试将服务类型从侵入最小的方式更改为侵入最大的方式:
$win32Service = Get-CimInstance -ClassName Win32_Service -Filter "Name = '$ServiceName'" -Verbose:$false
if ($win32Service)
{
if (!(Set-ServiceTypeToOwnProcessByCim $win32Service))
{
if (!(Set-ServiceTypeToOwnProcessByWindowsRegistry $win32Service))
{
if (Grant-FullControlRightsOnServiceRegistryKeyToCurrentUser $win32Service)
{
Set-ServiceTypeToOwnProcessByWindowsRegistry $win32Service | Out-Null
}
}
}
}
else
{
Write-Warning "[$ServiceName] Service not found"
}
当把 Set-ServiceTypeToOwnProcess.ps1
和Enable-Privilege.ps1
文件放在同一文件夹中时,可以执行以下脚本:
.\Set-ServiceTypeToOwnProcess.ps1 -ServiceName 'Appinfo', 'gpsvc', 'Schedule', 'SENS', 'SessionEnv', 'wuauserv'