PowerShell基础教程(18)——使用 Windows PowerShell 执行管理任务 <o:p></o:p>
Windows PowerShell 的基本目标是使您能够以交互方式或通过脚本更好、更容易地对系统进行管理控制。本章综述了在用 Windows PowerShell 管理 Windows 系统时出现的很多特定问题的解决方案。尽管我们尚未在“Windows PowerShell 入门”中介绍脚本或函数,但随后可以在脚本中或作为函数使用这些解决方案。在提供的示例中,函数将作为解决问题的解决方案的一部分。
在整个解决方案说明中,您将看到使用特定 cmdlet 的解决方案、常规 Get-WmiObject cmdlet、甚至还有作为 Windows 和 .NET 基础结构组成部分的外部工具等诸多方案的混合体。使用外部工具是 Windows PowerShell 的长期设计意图的一部分。甚至随着系统不断发展,用户将继续遇到可用工具集无法完成所有任务的情况。Windows PowerShell 不鼓励仅仅依赖 cmdlet 实现,而是尝试支持将来自所有可能的替代方案的解决方案集成在一起。
核心进程 cmdlet 只有两个:Get-Process 和 Stop-Process。由于有可能使用参数或对象 cmdlet 来检查和筛选进程,因此可以只使用这两个 cmdlet 来执行一些复杂的任务。
列出进程 (Get-Process)<o:p></o:p>
通过无参数运行 Get-Process,可以获得正在本地系统中运行的所有进程的列表。
通过使用 ID 参数指定 ProcessId,还可以返回单个进程。以下示例将返回系统空闲进程:
PS> Get-Process -Id 0<o:p></o:p>
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName<o:p></o:p>
------- ------ ----- ----- ----- ------ -- -----------<o:p></o:p>
0 0 0 16 0 0 Idle<o:p></o:p>
|
<o:p> </o:p>
尽管在某些情况下 cmdlet 不返回任何数据是正常的,但按其 ProcessId 指定进程时,如果 Get-Process 找不到匹配项,它将生成错误,因为它的常见用途是检索已知的正在运行的进程。如果不存在具有该 ID 的进程,则很可能是 ID 不正确,或者感兴趣的进程已经退出:
PS> Get-Process -Id 99<o:p></o:p>
Get-Process :找不到 ID 为 99 的进程。<o:p></o:p>
所在行:1 字符:12 <o:p></o:p>
+ Get-Process <<<< -Id 99<o:p></o:p>
|
<o:p> </o:p>
Name 参数可以用来基于进程名称指定进程的子集。因为进程可以有相同名称,所以输出可能包括多个进程。如果不存在具有该名称的进程,则 Get-Process 将像指定 ProcessId 时一样返回错误。例如,如果指定进程名称 explore 而不是 explorer:
PS> Get-Process -Name explore<o:p></o:p>
Get-Process :找不到名称为“explore”的进程。<o:p></o:p>
所在行:1 字符:12 <o:p></o:p>
+ Get-Process <<<< -Name explore<o:p></o:p>
|
<o:p> </o:p>
Name 参数支持使用通配符,因此可以键入名称的前几个字符并且后跟星号来获得列表:
PS> Get-Process -Name ex*<o:p></o:p>
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName<o:p></o:p>
------- ------ ----- ----- ----- ------ -- -----------<o:p></o:p>
234 7 5572 12484 134 2.98 1684 EXCEL<o:p></o:p>
555 15 34500 12384 134 105.25 728 explorer<o:p></o:p>
|
<o:p> </o:p>
<!----><!----><!---->请注意: <o:p></o:p>
因为 .NET System.Diagnostics.Process 类是 Windows PowerShell 进程的基础,因此它遵从 System.Diagnostics.Process 所使用的某些约定。这些约定之一是,可执行文件的进程名称永远不包括可执行文件名末尾的“.exe”。<o:p></o:p>
<o:p> </o:p>
Get-Process 还将接受 Name 参数的多个值。像指定单个名称一样,如果无法匹配名称,则尽管仍会获得匹配进程的正常输出,但将显示错误:
PS> Get-Process -Name exp*,power*,NotAProcess<o:p></o:p>
Get-Process :找不到名称为“NotAProcess”的进程。<o:p></o:p>
所在行:1 字符:12 <o:p></o:p>
+ Get-Process <<<< -Name exp*,power*,svchost,NotAProcess<o:p></o:p>
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName<o:p></o:p>
------- ------ ----- ----- ----- ------ -- -----------<o:p></o:p>
540 15 35172 48148 141 88.44 408 explorer<o:p></o:p>
605 9 30668 29800 155 7.11 3052 powershell<o:p></o:p>
|
<o:p> </o:p>
停止进程 (Stop-Process)<o:p></o:p>
Windows PowerShell 可让您灵活地列出进程,但如何停止进程呢?
Stop-Process cmdlet 采用 Name 或 ID 来指定希望停止的进程。是否能够停止进程取决于您的权限。某些进程不能停止。例如,如果试图停止空闲进程,则将获得错误:
PS> Stop-Process -Name Idle<o:p></o:p>
Stop-Process :由于以下错误无法停止进程“Idle (0)”:<o:p></o:p>
访问被拒绝<o:p></o:p>
所在行:1 字符:13 <o:p></o:p>
+ Stop-Process <<<< -Name Idle<o:p></o:p>
|
<o:p> </o:p>
还可以用 Confirm 参数强制进行提示。如果指定进程名称时使用通配符,则此参数特别有用,因为您可能意外匹配一些不想停止的进程:
PS> Stop-Process -Name t*,e* -Confirm<o:p></o:p>
确认<o:p></o:p>
是否确实要执行此操作?<o:p></o:p>
对目标“explorer (408)”执行操作“Stop-Process”。<o:p></o:p>
[Y] 是 [A] 全是 [N] 否 [L] 全否 [S] 挂起 [?] 帮助<o:p></o:p>
(默认值为“Y”):n<o:p></o:p>
确认<o:p></o:p>
是否确实要执行此操作?<o:p></o:p>
对目标“taskmgr (4072)”执行操作“Stop-Process”。<o:p></o:p>
[Y] 是 [A] 全是 [N] 否 [L] 全否 [S] 挂起 [?] 帮助<o:p></o:p>
(默认值为“Y”):n<o:p></o:p>
|
<o:p> </o:p>
通过使用某些对象筛选 cmdlet,可以进行复杂的进程操作。由于进程对象有 Responding 属性,当进程不再响应时该属性将为 True,因此可以用以下命令停止所有无响应的应用程序:
Get-Process | Where-Object -FilterScript {$_.Responding -eq $false} | Stop-Process<o:p></o:p>
|
<o:p> </o:p>
您可以在其他情况下使用相同的方法。例如,假设用户启动一个应用程序时另一个辅助的系统任务栏应用程序自动运行。您可能发现这在终端服务会话中无法正确工作,但仍然需要使它在物理计算机控制台上的会话中持续运行。连接到物理计算机桌面的会话的会话 ID 始终是 0,因此通过使用 Where-Object 和进程的 SessionId,可以停止在其他会话中的所有进程实例:
Get-Process -Name BadApp | Where-Object -FilterScript {$_.SessionId -neq 0} | Stop-Process<o:p></o:p>
|
<o:p> </o:p>
停止所有其他 Windows PowerShell 会话<o:p></o:p>
可能偶尔需要能够停止除了当前会话以外所有正在运行的 Windows PowerShell 会话。如果会话正在使用太多资源,或者不可访问(它可能正在远程运行,或者在另一个桌面会话中),则可能无法直接停止它。但是,如果试图停止所有正在运行的会话,则可能终止当前会话。
每个 Windows PowerShell 会话都有环境变量 PID,其中包含 Windows PowerShell 进程的 ID。可以对照每个会话的 ID 检查该 $PID,并只终止有不同 ID 的 Windows PowerShell 会话。以下管道命令执行此操作,并返回被终止会话的列表(由于使用了 PassThru 参数):
PS> Get-Process -Name powershell | Where-Object -FilterScript {$_.Id -ne $PID} | Stop-Process -<o:p></o:p>
PassThru<o:p></o:p>
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName<o:p></o:p>
------- ------ ----- ----- ----- ------ -- -----------<o:p></o:p>
334 9 23348 29136 143 1.03 388 powershell<o:p></o:p>
304 9 23152 29040 143 1.03 632 powershell<o:p></o:p>
302 9 20916 26804 143 1.03 1116 powershell<o:p></o:p>
335 9 25656 31412 143 1.09 3452 powershell<o:p></o:p>
303 9 23156 29044 143 1.05 3608 powershell<o:p></o:p>
287 9 21044 26928 143 1.02 3672 powershell<o:p></o:p>
|
<o:p> </o:p>
共有八个核心服务 cmdlet,它们是为众多的服务任务设计的。我们将只介绍如何列出和更改服务的运行状态,但您可以使用 Get-Help *-Service 获得服务 cmdlet 的列表,还可以使用 Get-Help<Cmdlet 名称>(例如,Get-Help New-Service)查找有关每个服务 cmdlet 的信息。
列出服务<o:p></o:p>
通过使用 Get-Service,可以枚举计算机上的本地服务。与 Get-Process 一样,无参数使用 Get-Service 命令将返回所有服务。可以按名称筛选,甚至使用星号通配符:
PS> Get-Service -Name se*<o:p></o:p>
Status Name DisplayName<o:p></o:p>
------ ---- -----------<o:p></o:p>
Running seclogon Secondary Logon<o:p></o:p>
Running SENS System Event Notification<o:p></o:p>
Stopped ServiceLayer ServiceLayer<o:p></o:p>
|
<o:p> </o:p>
由于服务的真实名称是什么并非始终是很明显的,因此您可能发现需要按显示名查找服务。可以按具体名称、使用通配符或使用显示名列表来执行该操作:
PS> Get-Service -DisplayName se*<o:p></o:p>
Status Name DisplayName<o:p></o:p>
------ ---- -----------<o:p></o:p>
Running lanmanserver Server<o:p></o:p>
Running SamSs Security Accounts Manager<o:p></o:p>
Running seclogon Secondary Logon<o:p></o:p>
Stopped ServiceLayer ServiceLayer<o:p></o:p>
Running wscsvc <st1:place w:st="on"><st1:placename w:st="on">Security</st1:placename> <st1:placetype w:st="on">Center</st1:placetype></st1:place><o:p></o:p>
PS> Get-Service -DisplayName ServiceLayer,Server<o:p></o:p>
Status Name DisplayName<o:p></o:p>
------ ---- -----------<o:p></o:p>
Running lanmanserver Server<o:p></o:p>
Stopped ServiceLayer ServiceLayer<o:p></o:p>
|
<o:p> </o:p>
所有服务 cmdlet 都有相同的常规形式。可以按公用名或显示名指定服务,并且可以用列表和通配符作为值。若要停止后台打印程序,请使用:
Stop-Service -Name spooler<o:p></o:p>
|
<o:p> </o:p>
若要在后台打印程序停止之后启动它,请使用:
Start-Service -Name spooler<o:p></o:p>
|
<o:p> </o:p>
若要挂起后台打印程序,请使用:
Suspend-Service -Name spooler<o:p></o:p>
|
<o:p> </o:p>
Restart-Service cmdlet 的工作方式与其他服务 cmdlet 相同,但我们将介绍它的一些更复杂的示例。在最简单的使用中,可以指定服务的名称:
PS> Restart-Service -Name spooler<o:p></o:p>
警告:正在等待服务“Print Spooler (Spooler)”完成启动...<o:p></o:p>
警告:正在等待服务“Print Spooler (Spooler)”完成启动...<o:p></o:p>
PS><o:p></o:p>
|
<o:p> </o:p>
您将注意到,系统会显示有关后台打印程序正在启动的重复警告消息。在执行需要占用一定时间的服务操作时,Windows PowerShell 将通知您它仍在尝试执行该任务。
如果要重新启动多个服务,可以先获得服务列表,并对它们进行筛选,然后执行重新启动:
PS> Get-Service | Where-Object -FilterScript {$_.CanStop} | Restart-Service<o:p></o:p>
警告:正在等待服务“Computer Browser (Browser)”完成停止...<o:p></o:p>
警告:正在等待服务“Computer Browser (Browser)”完成停止...<o:p></o:p>
Restart-Service :无法停止服务“Logical Disk Manager (dmserver)”,因为具有依赖它的服务。只有在设置了 Force 标志时才能停止该服务。<o:p></o:p>
所在行:1 字符:57 <o:p></o:p>
+ Get-Service | Where-Object -FilterScript {$_.CanStop} | Restart-Service <<<<<o:p></o:p>
警告:正在等待服务“Print Spooler (Spooler)”完成启动...<o:p></o:p>
警告:正在等待服务“Print Spooler (Spooler)”完成启动...<o:p></o:p>
|
<o:p> </o:p>
Get-WmiObject 是用于执行常规系统管理任务的最重要 cmdlet。所有关键的子系统设置都是通过 WMI 公开的。此外,WMI 将数据视为有一个或多个项目的集合中的对象。由于 Windows PowerShell 还能处理对象,并且它的管道允许您以相同方式对待单个或多个对象,因此,通用 WMI 访问可让您用非常少的工作量执行一些高级任务。
以下示例演示如何通过对任意计算机使用 Get-WmiObject 来收集特定信息。我们用表示本地计算机的点值 (.) 指定 ComputerName 参数。您可以指定与可以通过 WMI 访问的任何计算机关联的名称或 IP 地址。若要检索有关本地计算机的信息,可以省略 -ComputerName .
我们首先介绍用于收集本地计算机的桌面相关信息的命令。
Get-WmiObject -Class Win32_Desktop -ComputerName .<o:p></o:p>
|
<o:p> </o:p>
此命令将返回所有桌面的信息,无论它们是否正在使用。
<!----><!----><!---->请注意: <o:p></o:p>
某些 WMI 类返回的信息可能非常详细,并且通常包含有关 WMI 类的元数据。由于这些元数据属性的名称大
分享到:
相关推荐
它支持命令行操作,同时拥有一个强大的脚本语言——PowerShell Scripting Language(PSL)。 2. **网络请求与HTTP协议**: HTTP(超文本传输协议)是互联网上应用最广泛的数据交换协议。POST和GET是HTTP请求的两种...
执行批处理文件的平台主要是DOS系统,尽管现在多数用户使用的是Windows操作系统,但Windows仍然支持DOS命令和批处理脚本。 在批处理中,一些常用的命令包括: 1. `>` 和 `>>`:这两个符号用于重定向输出。`>` 会...
最新超全的渗透测试学习基础教程集合,新手、大佬都可以阅读: 01.入门笔记之看雪Web安全学习及异或解密示例; 02.Chrome浏览器保留密码功能渗透解析及登录加密入门笔记; 03.Burp Suite工具安装配置、Proxy基础用法...
本教程旨在为初学者提供全面、深入的Windows操作系统的理解和应用知识,帮助大家掌握日常使用及问题解决的基本技能。 1. **Windows操作系统概述** Windows操作系统自1985年首次发布以来,经历了多个版本的迭代,如...
- WS-Man(Windows Management Instrumentation):使用PowerShell进行远程系统管理的基础。 - Enter-PSSession:开启远程PowerShell会话,执行远程操作。 7. **自动化任务**: - 计划任务:配置PowerShell脚本...
在Windows部分,可能会涉及系统安全、注册表编辑、故障排除以及使用PowerShell进行自动化管理的知识。 学习操作系统不仅有助于提升日常的计算机使用效率,更是进入系统管理员、软件开发者、网络安全等领域的基础。...
1. **云服务模型**:Azure支持三种主要的云服务模型——基础设施即服务(IaaS)、平台即服务(PaaS)和软件即服务(SaaS)。IaaS允许用户租用计算资源,如虚拟机;PaaS提供了一个平台来构建、运行和管理应用程序;...
通过WMI,管理员和开发人员可以编写脚本来获取系统信息、执行操作及监控事件等。 #### 二、CIM储存库及其重要性 CIM(Common Information Model,通用信息模型)储存库是WMI架构的核心组件之一,它存储了所有WMI...
《Active Directory 循序渐进系列指南》是一个深入学习和理解Windows操作系统中核心组件——Active Directory(活动目录)的综合教程。本指南旨在帮助IT专业人员逐步掌握如何规划、部署、管理和维护Active Directory...
总的来说,DOS虽然在现代计算机环境中已不再主流,但它的核心思想——命令行操作和脚本自动化,依然在各种高级操作系统(如Linux和Windows PowerShell)中得到延续和发展。因此,学习DOS不仅可以了解计算机历史,还...
这篇教程将指导你如何在两种主要的操作系统——Windows和Linux上快速开始使用.NET Core进行开发。 首先,我们来了解.NET Core的基础知识。.NET Core包含了运行时环境、框架和编译器,使得开发者可以使用C#、F#或VB...
**DOS概述** DOS(Disk Operating System,磁盘操作系统)是个人计算机上最早期...虽然现在DOS的使用已经大大减少,但其精髓——命令行操作和高效的工作方式,仍然在现代的命令提示符(CMD)和PowerShell中得以延续。
在Windows操作系统中,可以使用W32Time服务进行配置和管理。该服务默认情况下会周期性地与选定的NTP服务器进行同步。用户可以通过命令行工具(如cmd或PowerShell)运行`w32tm /config /manualpeerlist:服务器地址 /...
标题中的“记事本_自动化”表明我们讨论的主题是关于使用自动化技术来操作或扩展Windows系统内置的简单文本编辑器——记事本。记事本虽然功能基础,但通过自动化工具,我们可以实现一些高效和复杂的任务,比如批量...
例如,你可以在这里找到如何使用grep命令在大量文本中快速查找信息,或者如何使用Powershell在Windows环境中实现高级任务自动化。 接着,我们讨论一下LOLBAS的概念。LOLBAS的理论基础是,攻击者往往不依赖外部工具...
首先,我们需要了解Java开发环境的基础——Java Development Kit (JDK)。JDK是Java程序员必备的工具,它包含了Java编译器、Java虚拟机(JVM)和其他开发工具。确保下载并安装最新版本的JDK到你的计算机上。 接下来...
然后,打开命令行工具,这可以是Windows系统中的命令提示符(cmd)或PowerShell,也可以是Unix/Linux系统中的终端。 在命令行输入: ``` python -m django --version ``` 这条命令利用了Python的模块执行功能,它...