当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 用于故障排除的 PowerShell 远程处理

作者:精品下载站 日期:2024-12-14 08:11:28 浏览:15 分类:玩电脑

用于故障排除的 PowerShell 远程处理


[玩转系统] 用于故障排除的 PowerShell 远程处理

本文不会指导您设置 PowerShell (PS) 远程处理,因为这已在本博客的早期 PowerShell 远程处理入门文章中进行了解释。

相反,我将向您展示远程执行故障排除的方法,例如当问题是基于 GUI 的登录(例如通过 mstsc 或物理或虚拟控制台挂起/运行缓慢)时。

确保您对可能需要进行故障排除的计算机进行了 PS 远程设置,并在问题发生之前对其进行测试,因为到那时可能已经太晚了。

自我远程 Cmdlet

许多 cmdlet 都采用 -Computername 参数,因此可以针对一台或多台远程计算机运行(取决于它们是采用字符串还是字符串数组类型作为该参数 - 请参阅下面的屏幕截图)。我们可以使用 PowerShell 来查询有多少 cmdlet 采用 -Computername 参数,而不是进行大量 RTFM 操作:

Get-Command | Where { $_.Parameters -and $_.Parameters.ContainsKey('ComputerName') } | select Name,@{n='Array';e={$_.Parameters['ComputerName'].ParameterType.IsArray}},source

[玩转系统] 用于故障排除的 PowerShell 远程处理

采用 -computername 参数的所有 cmdlet 列表

这些通常不使用 PS 远程处理来运行,但通常需要打开防火墙端口(我不建议在面向内部的服务器上禁用 Windows 防火墙!)。在可以传递数组的情况下,有些数组将在某种程度上并行操作,这意味着结果可以比单独查询每台计算机更快地返回。在 PowerShell v7.1 中,只有 20 个 cmdlet 采用 -Computername 参数,其中大部分与远程处理有关。

事件日志

我经常使用的一个可以自我远程控制的命令是 Get-WinEvent,因为问题的线索/答案通常包含在事件日志中。与过去只有 4 个事件日志不同,现在我们的事件日志通常超过 300 个,手动查看/搜索这些日志既乏味又耗时。在这里,我们可以使用 PowerShell 从有问题的计算机检索事件日志,并手动查看它们或搜索特定术语。

例如,这里有一个单行代码,它将显示今天指定时间范围内发生的所有事件(将 dd/mm/yyyy 或 mm/dd/yyyy 添加到时间字符串以在另一天搜索)在指定计算机上“弗雷德”:

Get-WinEvent -ListLog * -ComputerName fred | Where-Object { $_.RecordCount } | ForEach-Object{ Get-WinEvent -ComputerName fred -EA SilentlyContinue -FilterHashtable @{logname=$_.logname;starttime='07:45:15';endtime='07:47:15'}} | Select-Object * -ExcludeProperty ?Id,Version,Qualifiers,Level,Task,OpCode,Keywords,Bookmark,*Ids,Properties | sort TimeCreated

将结果放入 csv 文件(通过 Export-CSV,别名 epcsv)或屏幕网格视图(通过 Out-Gridview,别名ogv),使得搜索/过滤特定搜索词变得非常容易。

[玩转系统] 用于故障排除的 PowerShell 远程处理

网格视图中的事件日志

远程失败的常见原因 Get-WinEvent 是远程防火墙未启用“远程事件日志管理”规则或未启用“远程事件日志管理”规则。用于查询事件日志的帐户没有权限。

[玩转系统] 用于故障排除的 PowerShell 远程处理

阅读我们的由两部分组成的博客系列,了解有关使用 PowerShell 和 .NET 或 WMI 处理和监视事件的更多信息。

阅读该系列的第 1 部分 >

远程处理单个 Cmdlet

如果 cmdlet/函数没有内在远程处理,则可以使用 PowerShell 通过 Invoke-Command cmdlet 对其进行远程处理,假设 PS 远程处理具有已成功配置并且具有足够权限的帐户可用(默认情况下只有管理员可以使用 PS 远程处理,但也允许内置本地组“远程管理用户”的成员)。

以具有 PS 远程处理权限的用户身份运行 Invoke-Command ,或者传递一个凭证对象,可通过 轻松交互式构建Get-Credential),通过 -credential 参数。 PowerShell 的基本原则之一是在管道上拥有对象,以便随后可以通过进一步的 cmdlet/函数/脚本和 Invoke-Command 处理它们> 尊重这一点,以便可以在运行脚本/cmdlet 的本地计算机上处理从远程计算机返回的对象。

下面是一个示例,我们从远程计算机获取进程,并查看哪些进程使用了最多的 CPU,这可以很好地指示导致性能问题的原因 - 特别是当您登录到出现问题的计算机时却发现当你检查时,CPU消耗很低。

[玩转系统] 用于故障排除的 PowerShell 远程处理

机器列表,按 CPU 使用率排序

请注意,我们已从远程计算机检索所有进程,但已排序并选择了运行 Invoke-Command 的计算机上的前 10 个使用者。根据操作的不同,最好在远程端进行过滤,以减少需要传输和处理的数据量 - 最佳 PowerShell 性能的黄金法则之一是“尽可能过滤到左侧” 。

另请注意,-HideComputerName 参数用于整理结果,尽管当 Invoke-Command 传递计算机名称数组以便其运行时通常不建议这样做同时多台机器,否则知道什么结果来自哪台计算机可能会很棘手(如果相关)。

远程会话

Invoke-Command 与 -Computername 参数一起使用,可为每次调用建立和拆除一个新的远程会话,以便您将对同一台计算机进行大量远程处理(s) 与建立单个会话并将其用于每个远程命令并最终在一切完成后将其拆除一次相比,它变得效率低下并且需要更多的时间和资源。

PowerShell 以远程会话的形式提供此功能,它支持上述用法,非交互式,或者它可以交互式使用,就像在 Unix 的旧(不安全)时代,您可以 telnet 到计算机以使用命令行对其进行故障排除仅(非 GUI)工具,最近更安全地使用 PuTTY 等工具通过 SSH 连接执行类似操作。

为了以非交互方式使用,我们使用 New-PSSession 建立一次远程连接,并将其分配给一个变量,然后将其传递给后续的 Invoke-Command 调用然后最后传递给Remove-Session来将其拆除。

[玩转系统] 用于故障排除的 PowerShell 远程处理

通过 New-PSSession 以非交互方式使用 PowerShell 远程会话

要以交互方式建立和使用远程会话,我们使用 Enter-PSSession,如下所示:

[玩转系统] 用于故障排除的 PowerShell 远程处理

通过 Enter-PSSession 交互使用 PowerShell 远程会话

请注意提示符如何更改为将计算机名称放在方括号中,以帮助您记住您现在位于不同的计算机上,并可能避免在错误的计算机上执行错误的操作(也许!)。

命令行历史记录存储在本地计算机上,因此即使远程计算机没有持久的用户配置文件并且您重新启动它,以前使用的命令也将在您下次远程访问它时可用(并且可以通过 ctrl r/s 进行搜索,而不必光标通过它们),并且您还记录了所做的事情(假设您在本地有持久的用户配置文件)。

如果您运行具有用户界面的命令,例如记事本,它只会挂起,不显示窗口。但是,我们可以通过使用 Start-Process 在后台有效运行进程来启动远程 SysInternals Process Monitor(无头)等操作。这样,我们可以在遇到故障时停止跟踪,例如缓慢的 Windows 10 登录已完成,或者我们可以将 /runtime 参数传递给 procmon 并指定运行它的时间(以秒为单位)。在已建立的远程会话中运行 procmon headless 的典型命令行是:

Start-Process -FilePath c:\temp\Procmon.exe -ArgumentList ‘/accepteula /backingfile c:\temp\logon.pml /nofilter /quiet’

[玩转系统] 用于故障排除的 PowerShell 远程处理

当我们捕获了我们需要的内容后,我们再次调用 procmon,仅使用 /terminate 参数来停止跟踪以及通过 /backingfile 参数生成的 .pml 文件可以在有 GUI 会话的地方进行检查。请注意,默认情况下,从远程会话中访问网络共享不起作用,尽管可以启用此功能。

结论

希望这能让您了解使用 PowerShell 在远程系统上可以实现什么,以及使用它比建立完整远程会话更快/更容易的一些场景。

如果您想了解有关使用 PowerShell 进行故障排除的更多信息,请务必查看我的另一篇文章:用于解决 Windows 问题的十大 PowerShell 命令。

相关内容

  • PowerShell 远程处理入门 |脚本运行器
  • 使用 PowerShell 和 .NET 处理事件(第 1 部分)|脚本运行器
  • 使用 PowerShell 和 WMI 处理事件(第 2 部分)|脚本运行器
  • 我用于解决 Windows 问题的 10 个最佳 PowerShell 命令 |脚本运行器
  • 进程监视器 - Windows Sysinternals |微软文档

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯