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

[玩转系统] 用于故障排除的 10 个最佳 PowerShell 命令

作者:精品下载站 日期:2024-12-14 08:09:48 浏览:16 分类:玩电脑

用于故障排除的 10 个最佳 PowerShell 命令


[玩转系统] 用于故障排除的 10 个最佳 PowerShell 命令

让我首先介绍一下我自己的背景,因为我希望这将有助于为这篇文章提供背景和合法性。我有软件开发人员的背景,在 1980 年编写了我的第一个代码,但在 1995 年,我开始接触 Citrix 公司的产品,并且我一直在解决这些产品的问题,或者更准确地说,主要是解决在从那时起,他们就一直是最重要的。

这曾经是一项繁琐、无聊且容易出错的手动操作,因此作为一个天生懒惰的人,我一直在尝试通过使用 PowerShell 在可能且实用的情况下简化、加速和自动化故障排除。

本文分享了我在该领域的一些成功经验,希望能鼓励您成为更高效的故障排除者,以便您有更多时间用于有趣的事情(尽管对我个人而言,这通常是更多的故障排除或 PowerShell 开发) !

下面,我列出了我认为最有用且最常用的用于故障排除的 PowerShell 命令列表。

获取 CimInstance

WMI 或 CIM(发音为“See Eye Em”)作为 PowerShell cmdlet 在版本 3.0 中的演变,是一种很棒但简单且通用的方法,用于从一台或多台计算机获取有关各种事物的信息。

例如,您可以获得有关进程、服务、磁盘、网络、内存、处理器、电池等的详细信息。此外,一些公司(例如 Citrix)添加了自己的 WMI 提供程序,以允许访问否则无法访问的信息。需要专有 API 或可执行文件来检索。

例如,此命令将获取操作系统详细信息以及安装和上次启动时间(图 1):

Get-CimInstance -ClassName win32_operatingsystem -ComputerName grl-dc03,grl-sql01,grl-sql03 | select PSComputerName,caption,version,installdate,LastBootUpTime | Format-Table -AutoSize

[玩转系统] 用于故障排除的 10 个最佳 PowerShell 命令

图。 1:Get-CimInstance 命令提供有关操作系统的输出信息,这些信息以表格形式显示

我的许多咨询工作包括对各种组件进行健康检查。我收集有关我正在检查的桌面和服务器的大量信息(当我不在现场或无法访问客户系统时可以使用这些信息)的方法是使用我编写的脚本,该脚本可查询近 50 个 CIM 类在命令行或通过文本文件指定的计算机列表。您可以从我的 GitHub 存储库免费下载该脚本。

该脚本将结果写入 csv 文件,以便轻松比较不同机器的结果,例如检查一致性并帮助发现异常情况。

赢奖活动

在排除登录缓慢等问题时,Windows 事件日志中可能包含非常有用的信息。

但知道在哪里查找可能会出现问题,因为在最新的操作系统上,有超过 300 个不同的活动事件日志,其中可能隐藏着关键信息,而不仅仅是像过去那样隐藏在系统或应用程序事件日志中。

使用PowerShell,我们可以轻松搜索特定事件

  • 通过 ID
  • 在一定的时间范围内
  • 包含特定文本或
  • 上述的组合

这比手动运行事件查看器和搜索大量事件更容易、更快速且可扩展。

例如,下面是使用哈希表参数(也称为字典)从远程域控制器(包括导致锁定的计算机)检索过去 12 小时内的帐户锁定事件的示例(图2和图3):

Get-WinEvent -ComputerName grl-dc03 -FilterHashtable @{LogName = 'Security';Id = 4740;StartTime = (Get-Date).AddHours( -12) } -ErrorAction SilentlyContinue | Select TimeCreated,@{n='User';e={$_.Properties[0].value}},@{n='From';e={$_.Properties[1].Value}}

[玩转系统] 用于故障排除的 10 个最佳 PowerShell 命令

图。 2:Get-WinEvent 命令从远程域控制器提供有关过去 12 小时内帐户锁定事件的输出信息,这些信息以表格形式显示

[玩转系统] 用于故障排除的 10 个最佳 PowerShell 命令

图。 3:Windows 事件属性的屏幕截图

请注意在命令中我们如何使用 Get-WinEvent 返回的“Properties”数组来提取特定字段,这样我们就不必解析事件日志条目的全文(图 4)。

[玩转系统] 用于故障排除的 10 个最佳 PowerShell 命令

图 4:文中描述的 Get-WinEvent 命令仅选择 EventData 集的第一个 [0] 和第二个 [1] 字段

同样,我几乎每天都会使用一个脚本来检索给定时间段内所有启用的事件日志中的所有事件(例如用户登录),以查找错误或性能缓慢的线索/原因。您可以从我的 GitHub 存储库下载它。

输入-PSSession

考虑这样一种情况:特定计算机上的用户抱怨性能不佳,但当您尝试使用 mstsc 或类似工具远程连接到该计算机时,您的登录会挂起。

如果有一种低开销的方法远程连接到该设备以进行交互式或自动故障排除,就像使用 telnet 或 ssh 到 *nix 机器一样(例如使用出色的免费工具 PuTTY),这不是很好吗?

输入 PowerShell 命令 Enter-PSSession 会在远程计算机上提供一个命令行界面,也就是说,如果通过 GPO 启用 PowerShell 远程处理或通过“winrm Quickconfig”或“Enable-PSRemoting -Force”手动启用Enable-PSRemoting -Force.

这允许进行故障排除和补救,例如通过Get-Process(别名ps)查找CPU或内存的最高消耗者,并在适当的情况下通过Stop-Process终止它们(别名杀死)。

测试网连接

如何测试特定的 Web 服务器是否已启动并正在运行?平?不! Ping 仅测试是否启用了 ICMP 回复,如果不使用 IP 地址则间接测试名称解析 - 它不会确认是否有进程正在侦听远程计算机上的特定端口并且防火墙是否允许连接。

在 PowerShell 出现之前,我会使用 telnet.exe 进行此端口测试,但现在 PowerShell 提供了 Test-NetConnection 命令(别名 tnc),该命令允许检查计算机上的特定端口(以及路由跟踪) ),如图5所示:

Test-NetConnection -ComputerName grl-dc03 -Port 443 -InformationLevel Quiet

[玩转系统] 用于故障排除的 10 个最佳 PowerShell 命令

图。 5:Test-NetConnection可用于查询机器上特定端口的信息

此外,因为它返回一个 PowerShell 对象或一个布尔值,所以很容易合并到脚本中,而无需解析 ping.exe 之类的命令输出,而在过去的糟糕日子里,我们必须这样做。

获取 ADUser

这是此列表中比较奇怪的一个,因为默认情况下它不可用:必须安装 ActiveDirectory PowerShell 模块,尽管通过“Add-WindowsFeature RSAT-AD-PowerShell”非常简单命令(提升运行)。

许多供应商都有 PowerShell 模块,允许您连接和自动化他们的技术 - 例如,我每天都使用 VMware 和 Citrix 的模块。

Get-ADUser 和相关的 cmdlet,例如Get-ADGroupMember,允许我们检查和更改 AD 信息,对于查询大量对象并生成报告(请参阅稍后的导出 CSV)。

下面是一个计算有多少帐户的主驱动器设置为“H:”的示例,如果我们执行一些维护,我们可能需要它 - 我们可以同样轻松地更改主驱动器(图 6):

Get-ADUser -Filter "HomeDrive -eq 'H:'" | Measure-Object

[玩转系统] 用于故障排除的 10 个最佳 PowerShell 命令

图。 6:Get-ADUser 可用于轻松检索 Active Directory 中的用户信息

我还发现它在客户系统上非常有用,他们没有授予我访问 AD 用户和计算机的权限,但我需要检查用户的属性,例如组成员资格。

获取进程

我们经常需要检查关键进程是否正在运行或调查我们无法识别的进程。虽然任务管理器和 SysInternals Process Explorer 都是有用的工具,但我们可以使用 Get-Process(别名 ps)cmdlet 检查并修复许多问题。

下面是一个示例,显示了从名称中包含“Citrix”的文件夹运行的所有进程,按该进程的启动时间升序排序,这使我们能够确定该进程是否在启动、用户登录等时启动。(图7):

Get-process | Where Path -match 'Citrix' | Select Name,Id,StartTime,Path | Sort StartTime | Format-Table -AutoSize

[玩转系统] 用于故障排除的 10 个最佳 PowerShell 命令

图。 7:Get-Process 可用于过滤名称中包含“Citrix”的进程并显示有关它们的特定信息

下面是一个类似的命令,它在所有正在运行的进程的 .exe 文件的版本资源中查找公司名称中的“VMware”(图 8 和 9):

Get-Process | Get-itemProperty -EA Silent | Select -ExpandProperty VersionInfo | Where CompanyName -match 'VMware' | Select FileVersion,ProductName,FileName

[玩转系统] 用于故障排除的 10 个最佳 PowerShell 命令

图。 8:Get-Process 可用于过滤公司名称中包含“VMware”的进程并显示有关它们的特定信息

[玩转系统] 用于故障排除的 10 个最佳 PowerShell 命令

图。 9:公司名称通常可以在.exe文件的属性详细信息中的“版权”条目中找到

获取子项目

很可能您实际上已经在没有意识到的情况下使用了此命令,特别是如果您来自命令提示符,如果您一直在 PowerShell 提示符中使用“dir ”,因为这是 Get-ChildItem 的别名.

顾名思义,如果我们指定父项的 -recurseGet-ChildItem 会为我们提供有关子项及其子项的信息,其中父项可能是本地或远程文件系统文件夹、注册表项、证书存储等(提示:运行Get-PSDrive以查看哪些 PowerShell 驱动器可用)。

下面的示例显示了给定文件夹和子文件夹中的详细信息,包括 -force 启用的任何隐藏文件夹和子文件夹,对于大小超过 100MB 的任何文件,按大小降序排序。

Get-ChildItem -Force -Recurse -File | Where Length -gt 100MB | Sort Length -Descending | Select fullname, CreationTime, @{n='Size (MB)'; e={[math]::Round($_.Length / 1MB , 2)}}}

[玩转系统] 用于故障排除的 10 个最佳 PowerShell 命令

图。 10:检索给定文件夹中的详细信息以及大小超过 100MB 的任何文件的子文件,并使用 Get-ChildItem 命令按大小降序排序

得到帮助

这个与我迄今为止介绍的其他模块略有不同,因为它并不直接帮助进行故障排除,但它为我们提供的是详细的帮助,例如 cmdlet 的用法、参数和示例,涵盖内置模块和您随后使用的模块安装。

再结合 Get-Command 查看特定模块提供的命令或与网络、驱动器等相关的命令,可以快速使用不熟悉的命令,而无需求助于自己喜欢的网络搜索引擎。

我通常将它与 -ShowWindow 一起使用,以在单独的文本窗口中显示帮助,而 -Online 对于转到包含最新信息的网页很有用,该网页有时还包含额外的信息信息和相关项目的链接。

请记住,您可以通过 Tab 键浏览可用参数或使用 ctrl 空格键来显示所有参数,并且像我这样的脚本作者会将所需的注释添加到我们的脚本中,以便 Get-Help 也可以使用它们。

网格视图

Windows PowerShell 中的此 cmdlet 允许 PowerShell cmdlet、函数或脚本输出的对象数据轻松呈现在屏幕网格视图中,然后可以对网格视图进行排序和筛选,无需安装除 PowerShell(和 .NET)之外的任何软件。

它甚至可以返回选定的项目以在脚本中进一步使用,例如从列表中选择一个项目,或者只是发送到剪贴板(通过 -passthru 参数)。

这是我经常使用的一行代码,用于将今天的 IIS 日志文件放入网格视图中,以便我可以查找错误、响应时间缓慢等情况:

Get-Content -Path "C:\inetpub\logs\logfiles\w3svc3$(Get-Date -Format 'u_exyyMMdd.lo\g')"|Where-Object { $_ -match '^(\d|#Fields)' } | ForEach-Object { $_ -replace '^#Fields: ' } |ConvertFrom-Csv -Delimiter ' '|Where-Object cs-uri-stem -NotMatch 'monitor.aspx$' |Select-Object -Property *,@{name='Duration';expression={([int]$_.'time-taken')}} |Out-GridView

[玩转系统] 用于故障排除的 10 个最佳 PowerShell 命令

图。 11:Out-GridView 命令可让您在清晰的网格中格式化使用 PowerShell 查询的数据

图 12 显示了当我单击网格视图中的“确定”按钮时我选择的一行,该行已通过 Set-Clipboard(别名 scb)放入剪贴板中,因此可以将其粘贴到我的故障排除/运行状况检查注释中(做什么)你的意思是,你仍然使用笔和纸!)。

[玩转系统] 用于故障排除的 10 个最佳 PowerShell 命令

图。 12:前面提到的命令的输出。

导出-CSV

最后但并非最不重要的一点是,Export-CSV 是一个内置 cmdlet,允许我们编写任何 PowerShell 对象,例如之前提供的 cmdlet(如 Get-Process)的输出,转换为格式正确的 CSV 文件,以便可以在 Microsoft Excel、Google Sheets 中对其进行检查、过滤、排序等,甚至可以通过 Import-CSV 返回 PowerShell 进行进一步处理。

\tsclient\c\temp\allprocesses.$env:COMPUTERNAME.csv

[玩转系统] 用于故障排除的 10 个最佳 PowerShell 命令

图。 13:将使用 PowerShell 检索到的数据导出到 .csv 文件中

请注意 -NoTypeInformation 的使用,它可以防止将一行属性类型输出到 csv,这会使 Excel 感到困惑,尽管很容易删除。您还可以使用 -Append 将新对象附加到现有 csv 文件,尽管新旧列之间应匹配。

我经常使用 Export-Csv 来进行“穷人的报告”,其中通过定期计划任务运行的 PowerShell 脚本会整理来自各种来源的数据,生成 CSV 文件并通过 Send-MailMessage 将它们通过电子邮件发送给“感兴趣的”各方(这需要访问 SMTP 邮件服务器)。

最后,如果您使用荷兰语语言环境,您可能需要使用 -delimiter ';',因为他们在逗号分隔值文件中使用分号 - 这一事实让我着迷在一家荷兰公司工作时要花一段时间来弄清楚!

结论

好吧,伙计们,这就是现在的全部内容。请注意:这没有顺序 - 非常随意 - 以同样的方式列出,你的工人的工具箱中的工具不会有顺序 - 如果你需要松开螺丝,那么你不太可能拿出锤子,因为你的第一选择(当然,除非你是杰里米·克拉克森)。

快乐排除故障!

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

取消回复欢迎 发表评论:

关灯