powershell脚本下载 脚本怎么检测用户强制退出脚本

2409人阅读
sharepoint(182)

参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:168195次
积分:2469
积分:2469
排名:第10217名
原创:44篇
转载:244篇
评论:15条
(2)(1)(13)(2)(21)(12)(3)(6)(3)(1)(7)(7)(5)(2)(6)(4)(8)(12)(9)(5)(6)(10)(16)(5)(2)(1)(3)(11)(5)(6)(13)(9)(3)(16)(18)(5)(12)(19)(2)后使用快捷导航没有帐号?
查看: 4695|回复: 6
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)
通过无参数运行 Get-Process,可以获得正在本地系统中运行的所有进程的列表。
通过使用 ID 参数指定 ProcessId,还可以返回单个进程。以下示例将返回系统空闲进程:
PS& Get-Process -Id 0
Handles&&NPM(K)& & PM(K)& && &WS(K) VM(M)& &CPU(s)& &&&Id ProcessName
-------&&------& & -----& && &----- -----& &------& &&&-- -----------
0& && & 0& && &&&0& && && &16& &&&0& && && && && &0 Idle
尽管在某些情况下 cmdlet 不返回任何数据是正常的,但按其 ProcessId 指定进程时,如果 Get-Process 找不到匹配项,它将生成错误,因为它的常见用途是检索已知的正在运行的进程。如果不存在具有该 ID 的进程,则很可能是 ID 不正确,或者感兴趣的进程已经退出:
PS& Get-Process -Id 99
Get-Process :找不到 ID 为 99 的进程。
所在行:1 字符:12
+ Get-Process&&&&&& -Id 99
Name 参数可以用来基于进程名称指定进程的子集。因为进程可以有相同名称,所以输出可能包括多个进程。如果不存在具有该名称的进程,则 Get-Process 将像指定 ProcessId 时一样返回错误。例如,如果指定进程名称 explore 而不是 explorer:
PS& Get-Process -Name explore
Get-Process :找不到名称为“explore”的进程。
所在行:1 字符:12
+ Get-Process&&&&&& -Name explore
Name 参数支持使用通配符,因此可以键入名称的前几个字符并且后跟星号来获得列表:
PS& Get-Process -Name ex*
Handles&&NPM(K)& & PM(K)& && &WS(K) VM(M)& &CPU(s)& &&&Id ProcessName
-------&&------& & -----& && &----- -----& &------& &&&-- -----------
234& && & 7& &&&5572& && &12484& &134& &&&2.98& &1684 EXCEL
555& && &15& & 34500& && &12384& &134& &105.25& & 728 explorer
因为 .NET System.Diagnostics.Process 类是 Windows PowerShell 进程的基础,因此它遵从 System.Diagnostics.Process 所使用的某些约定。这些约定之一是,可执行文件的进程名称永远不包括可执行文件名末尾的“.exe”。
Get-Process 还将接受 Name 参数的多个值。像指定单个名称一样,如果无法匹配名称,则尽管仍会获得匹配进程的正常输出,但将显示错误:
PS& Get-Process -Name exp*,power*,NotAProcess
Get-Process :找不到名称为“NotAProcess”的进程。
所在行:1 字符:12
+ Get-Process&&&&&& -Name exp*,power*,svchost,NotAProcess
Handles&&NPM(K)& & PM(K)& && &WS(K) VM(M)& &CPU(s)& &&&Id ProcessName
-------&&------& & -----& && &----- -----& &------& &&&-- -----------
540& && &15& & 35172& && &48148& &141& & 88.44& & 408 explorer
605& && & 9& & 30668& && &29800& &155& &&&7.11& &3052 powershell
停止进程 (Stop-Process)
Windows PowerShell 可让您灵活地列出进程,但如何停止进程呢?
Stop-Process cmdlet 采用 Name 或 ID 来指定希望停止的进程。是否能够停止进程取决于您的权限。某些进程不能停止。例如,如果试图停止空闲进程,则将获得错误:
PS& Stop-Process -Name Idle
Stop-Process :由于以下错误无法停止进程“Idle (0)”:
访问被拒绝
所在行:1 字符:13
+ Stop-Process&&&&&& -Name Idle
还可以用 Confirm 参数强制进行提示。如果指定进程名称时使用通配符,则此参数特别有用,因为您可能意外匹配一些不想停止的进程:
PS& Stop-Process -Name t*,e* -Confirm
是否确实要执行此操作?
对目标“explorer (408)”执行操作“Stop-Process”。
[Y] 是&&[A] 全是&&[N] 否&&[L] 全否&&[S] 挂起&&[?] 帮助
(默认值为“Y”):n
是否确实要执行此操作?
对目标“taskmgr (4072)”执行操作“Stop-Process”。
[Y] 是&&[A] 全是&&[N] 否&&[L] 全否&&[S] 挂起&&[?] 帮助
(默认值为“Y”):n
通过使用某些对象筛选 cmdlet,可以进行复杂的进程操作。由于进程对象有 Responding 属性,当进程不再响应时该属性将为 True,因此可以用以下命令停止所有无响应的应用程序:
Get-Process | Where-Object -FilterScript {$_.Responding -eq $false} | Stop-Process
您可以在其他情况下使用相同的方法。例如,假设用户启动一个应用程序时另一个辅助的系统任务栏应用程序自动运行。您可能发现这在终端服务会话中无法正确工作,但仍然需要使它在物理计算机控制台上的会话中持续运行。连接到物理计算机桌面的会话的会话 ID 始终是 0,因此通过使用 Where-Object 和进程的 SessionId,可以停止在其他会话中的所有进程实例:
Get-Process -Name BadApp | Where-Object -FilterScript {$_.SessionId -neq 0} | Stop-Process
停止所有其他 Windows PowerShell 会话
可能偶尔需要能够停止除了当前会话以外所有正在运行的 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 -
Handles&&NPM(K)& & PM(K)& && &WS(K) VM(M)& &CPU(s)& &&&Id ProcessName
-------&&------& & -----& && &----- -----& &------& &&&-- -----------
334& && & 9& & 23348& && &29136& &143& &&&1.03& & 388 powershell
304& && & 9& & 23152& && &29040& &143& &&&1.03& & 632 powershell
302& && & 9& & 20916& && &26804& &143& &&&1.03& &1116 powershell
335& && & 9& & 25656& && &31412& &143& &&&1.09& &3452 powershell
303& && & 9& & 23156& && &29044& &143& &&&1.05& &3608 powershell
287& && & 9& & 21044& && &26928& &143& &&&1.02& &3672 powershell
管理本地服务& &
共有八个核心服务 cmdlet,它们是为众多的服务任务设计的。我们将只介绍如何列出和更改服务的运行状态,但您可以使用 Get-Help *-Service 获得服务 cmdlet 的列表,还可以使用 Get-Help&Cmdlet 名称&(例如,Get-Help New-Service)查找有关每个服务 cmdlet 的信息。
通过使用 Get-Service,可以枚举计算机上的本地服务。与 Get-Process 一样,无参数使用 Get-Service 命令将返回所有服务。可以按名称筛选,甚至使用星号通配符:
PS& Get-Service -Name se*
Status& &Name& && && && && &DisplayName
------& &----& && && && && &-----------
Running&&seclogon& && && &&&Secondary Logon
Running&&SENS& && && && && &System Event Notification
Stopped&&ServiceLayer& && & ServiceLayer
由于服务的真实名称是什么并非始终是很明显的,因此您可能发现需要按显示名查找服务。可以按具体名称、使用通配符或使用显示名列表来执行该操作:
PS& Get-Service -DisplayName se*
Status& &Name& && && && && &DisplayName
------& &----& && && && && &-----------
Running&&lanmanserver& && & Server
Running&&SamSs& && && && &&&Security Accounts Manager
Running&&seclogon& && && &&&Secondary Logon
Stopped&&ServiceLayer& && & ServiceLayer
Running&&wscsvc& && && && & Security Center
PS& Get-Service -DisplayName ServiceLayer,Server
Status& &Name& && && && && &DisplayName
------& &----& && && && && &-----------
Running&&lanmanserver& && & Server
Stopped&&ServiceLayer& && & ServiceLayer
停止、启动、挂起和重新启动服务
所有服务 cmdlet 都有相同的常规形式。可以按公用名或显示名指定服务,并且可以用列表和通配符作为值。若要停止后台打印程序,请使用:
Stop-Service -Name spooler
若要在后台打印程序停止之后启动它,请使用:
Start-Service -Name spooler
若要挂起后台打印程序,请使用:
Suspend-Service -Name spooler
Restart-Service cmdlet 的工作方式与其他服务 cmdlet 相同,但我们将介绍它的一些更复杂的示例。在最简单的使用中,可以指定服务的名称:
PS& Restart-Service -Name spooler
警告:正在等待服务“Print Spooler (Spooler)”完成启动...
警告:正在等待服务“Print Spooler (Spooler)”完成启动...
您将注意到,系统会显示有关后台打印程序正在启动的重复警告消息。在执行需要占用一定时间的服务操作时,Windows PowerShell 将通知您它仍在尝试执行该任务。
如果要重新启动多个服务,可以先获得服务列表,并对它们进行筛选,然后执行重新启动:
PS& Get-Service | Where-Object -FilterScript {$_.CanStop} | Restart-Service
警告:正在等待服务“Computer Browser (Browser)”完成停止...
警告:正在等待服务“Computer Browser (Browser)”完成停止...
Restart-Service :无法停止服务“Logical Disk Manager (dmserver)”,因为具有依赖它的服务。只有在设置了 Force 标志时才能停止该服务。
所在行:1 字符:57
+ Get-Service | Where-Object -FilterScript {$_.CanStop} | Restart-Service &&&&
警告:正在等待服务“Print Spooler (Spooler)”完成启动...
警告:正在等待服务“Print Spooler (Spooler)”完成启动...
收集有关计算机的信息
Get-WmiObject 是用于执行常规系统管理任务的最重要 cmdlet。所有关键的子系统设置都是通过 WMI 公开的。此外,WMI 将数据视为有一个或多个项目的集合中的对象。由于 Windows PowerShell 还能处理对象,并且它的管道允许您以相同方式对待单个或多个对象,因此,通用 WMI 访问可让您用非常少的工作量执行一些高级任务。
以下示例演示如何通过对任意计算机使用 Get-WmiObject 来收集特定信息。我们用表示本地计算机的点值 (.) 指定 ComputerName 参数。您可以指定与可以通过 WMI 访问的任何计算机关联的名称或 IP 地址。若要检索有关本地计算机的信息,可以省略 -ComputerName .
列出桌面设置
我们首先介绍用于收集本地计算机的桌面相关信息的命令。&&
Get-WmiObject -Class Win32_Desktop -ComputerName .
此命令将返回所有桌面的信息,无论它们是否正在使用。
某些 WMI 类返回的信息可能非常详细,并且通常包含有关 WMI 类的元数据。由于这些元数据属性的名称大多数以双下划线开头,因此可以使用 Select-Object 筛选这些属性。请使用 [a-z]* 作为 Property 值来仅指定以字母字符开头的属性。例如:
Get-WmiObject -Class Win32_Desktop -ComputerName .| Select-Object -Property [a-z]*
若要筛选元数据,请使用管道运算符 (|) 将 Get-WmiObject 命令的结果发送到 Select-Object -Property [a-z]*。
列出 BIOS 信息
WMI Win32_BIOS 类可以返回有关本地计算机系统 BIOS 的相当精简和完整的信息:
Get-WmiObject -Class Win32_BIOS -ComputerName .
列出处理器信息
可以使用 WMI 的 Win32_Processor 类检索常规处理器信息,但还可能需要筛选这些信息:
Get-WmiObject -Class Win32_Processor -ComputerName .| Select-Object -Property [a-z]*
若要得到处理器系列的一般说明字符串,只需返回 Win32_ComputerSystemSystemType 属性:
PS& Get-WmiObject -Class Win32_ComputerSystem -ComputerName .| Select-Object -Property SystemType
SystemType
----------
X86-based PC
列出计算机制造商和型号
还可以从 Win32_ComputerSystem 获得计算机型号信息。标准的显示输出不需要进行任何筛选,即可提供 OEM 数据:
PS& Get-WmiObject -Class Win32_ComputerSystem
Domain& && && && &&&:WORKGROUP
Manufacturer& && &&&:Compaq Presario 06
Model& && && && && &:DA243A-ABA 6415cl NA910
Name& && && && && & :MyPC
PrimaryOwnerName& & :Jane Doe
TotalPhysicalMemory :
像这样的命令输出(直接从某些硬件返回信息)实际上只是您拥有的数据。某些信息未被硬件制造商正确配置,因此可能不可用。
列出已安装的修补程序
通过使用 Win32_QuickFixEngineering 可以列出所有已安装的修补程序:
Get-WmiObject -Class Win32_QuickFixEngineering -ComputerName .
该类返回修补程序的列表,如下所示:
Description& && & :Update for Windows XP (KB910437)
FixComments& && && &:Update
HotFixID& && && && &:KB910437
Install Date& && &&&:
InstalledBy& && && &:Administrator
InstalledOn& && && &: 12/16/2005
Name& && && && && & :
ServicePackInEffect :SP3
Status& && && && &&&:
若要得到更简洁的输出,可能需要排除某些属性。尽管可以使用 Get-WmiObject Property 参数只选择 HotFixID,但这样做实际上将返回更多信息,因为默认情况下将显示所有元数据:
PS& Get-WmiObject -Class Win32_QuickFixEngineering -ComputerName .-Property HotFixId
HotFixID& && && &:KB910437
__GENUS& && && & : 2
__CLASS& && && & :Win32_QuickFixEngineering
__SUPERCLASS& &&&:
__DYNASTY& && &&&:
__RELPATH& && &&&:
__PROPERTY_COUNT : 1
__DERIVATION& &&&: {}
__SERVER& && && &:
__NAMESPACE& && &:
__PATH& && && &&&:
还会返回其他数据,因为 Get-WmiObject 中的 Property 参数限制从 WMI 类实例返回的属性,而不限制返回到 Windows PowerShell 的对象。若要减少输出,请使用 Select-Object:
PS& Get-WmiObject -Class Win32_QuickFixEngineering -ComputerName .-Property Hot
FixId | Select-Object -Property HotFixId
列出操作系统版本信息
Win32_OperatingSystem 类属性包括版本和 Service Pack 信息。可以只显式选择这些属性,以便从 Win32_OperatingSystem 获得版本信息摘要:&&
Get-WmiObject -Class Win32_OperatingSystem -ComputerName .| Select-Object -Property BuildNumber,BuildType,OSType,ServicePackMajorVersion,ServicePackMinorVersion
还可以在 Select-Object Property 参数中使用通配符。因为所有以 Build 或 ServicePack 开头的属性在这里都是重要的,因此可以将该命令缩短为以下形式:
PS& Get-WmiObject -Class Win32_OperatingSystem -ComputerName .| Select-Object -Property Build*,OSType,ServicePack*
BuildNumber& && && && & : 2600
BuildType& && && && && &:Uniprocessor Free
OSType& && && && && && &: 18
ServicePackMajorVersion : 2
ServicePackMinorVersion : 0
列出本地用户和所有者
通过选择 Win32_OperatingSystem 属性可以查找本地常规用户信息(许可用户数、当前用户数和所有者名称)。可以显式选择要显示的属性,如下所示:
Get-WmiObject -Class Win32_OperatingSystem -ComputerName .| Select-Object -Property NumberOfLicensedUsers,NumberOfUsers,RegisteredUser
使用通配符的更简洁版本是:&&
Get-WmiObject -Class Win32_OperatingSystem -ComputerName .| Select-Object -Property *user*
获得可用磁盘空间
若要查看本地驱动器的磁盘空间和可用空间,可以使用 WMI Win32_LogicalDisk 类。这需要只显示 DriveType 为 3(这是 WMI 为固定硬盘分配的值)的实例。
Get-WmiObject -Class Win32_LogicalDisk -Filter &DriveType=3& -ComputerName .
DeviceID& &&&:C:
DriveType& & : 3
ProviderName :
FreeSpace& & :
Size& && && &:
VolumeName& &:Local Disk
DeviceID& &&&:Q:
DriveType& & : 3
ProviderName :
FreeSpace& & :
Size& && && &:
VolumeName& &:New Volume
PS& Get-WmiObject -Class Win32_LogicalDisk -Filter &DriveType=3& -ComputerName .| Measure-Object -Property FreeSpace,Size -Sum
Get-WmiObject -Class Win32_LogicalDisk -Filter &DriveType=3& -ComputerName .| Measure-Object -Property FreeSpace,Size -Sum | Select-Object -Property Property,Sum
获得登录会话信息
通过 WMI Win32_LogonSession 类可以获得与用户关联的登录会话的常规信息:&&
Get-WmiObject -Class Win32_LogonSession -ComputerName .
获得登录到计算机的用户
使用 Win32_ComputerSystem 可以显示登录到特定计算机系统的用户。此命令只返回登录到系统桌面的用户:
Get-WmiObject -Class Win32_ComputerSystem -Property UserName -ComputerName .
从计算机获得本地时间
使用 WMI Win32_LocalTime 类可以在特定计算机上检索当前本地时间。因为默认情况下该类显示所有元数据,所以可能需要使用 Select-Object 对这些数据进行筛选:
PS& Get-WmiObject -Class Win32_LocalTime -ComputerName .| Select-Object -Property [a-z]*
Day& && && & : 15
DayOfWeek& & : 4
Hour& && && &: 12
Milliseconds :
Minute& && & : 11
Month& && &&&: 6
Quarter& && &: 2
Second& && & : 52
WeekInMonth&&: 3
Year& && && &: 2006
显示服务状态
若要查看特定计算机上所有服务的状态,可以像前面提到的那样在本地使用 Get-Service cmdlet。对于远程系统,可以使用 WMI Win32_Service 类。如果还使用 Select-Object 来筛选 Status、Name 和 DisplayName 的结果,则输出格式将与 Get-Service 几乎相同:
Get-WmiObject -Class Win32_Service -ComputerName .| Select-Object -Property Status,Name,DisplayName
若要允许完整显示名称非常长的服务的名称,可能需要使用 Format-Table 及其 AutoSize 和 Wrap 参数,以优化列宽并允许长名称换行而不被截断:
Get-WmiObject -Class Win32_Service -ComputerName .| Format-Table -Property Status,Name,DisplayName -AutoSize -Wrap
处理软件安装
通过 WMI 的 Win32_Product 类可以访问正确设计以使用 Windows Installer 的应用程序,但是并非目前使用的所有应用程序都使用 Windows Installer。由于 Windows Installer 为处理可安装的应用程序提供了范围最广的各种标准技术,因此我们将集中讨论这些应用程序。使用备用安装例程的应用程序通常不受 Windows Installer 管理。处理这些应用程序的具体技术将取决于安装程序软件和应用程序开发人员的决定。
对于通过将应用程序文件复制到计算机的方式进行安装的应用程序来说,通常无法使用此处讨论的技术对它们进行管理。可以使用在“处理文件和文件夹”一节中讨论的技术,将这些应用程序作为文件和文件夹进行管理。
列出 Windows Installer 应用程序
使用简单的 WMI 查询,可以很容易地枚举在本地或远程系统上用 Windows Installer 安装的应用程序:
PS& Get-WmiObject -Class Win32_Product -ComputerName .
IdentifyingNumber :{7131646D-CD3C-40F4-97B9-CD9E4E6262EF}
Name& && && && &&&:Microsoft .NET Framework 2.0
Vendor& && && && &:Microsoft Corporation
Version& && && &&&: 2.0.50727
Caption& && && &&&:Microsoft .NET Framework 2.0
由于需要使用默认情况下不显示的其他信息,因此您可能仍然需要使用 Select-Object。如果尝试查找 Microsoft .NET Framework 2.0 的软件包缓存位置,则可以使用以下命令:
PS& Get-WmiObject -Class Win32_Product -ComputerName .| Where-Object -FilterScript {$_.Name -eq &Microsoft .NET Framework 2.0&} | Select-Object -Property [a-z]*
Name& && && && &&&:Microsoft .NET Framework 2.0
Version& && && &&&: 2.0.50727
InstallState& && &: 5
Caption& && && &&&:Microsoft .NET Framework 2.0
Description& && & :Microsoft .NET Framework 2.0
IdentifyingNumber :{7131646D-CD3C-40F4-97B9-CD9E4E6262EF}
InstallDate& && & :
InstallDate2& && &: 00.
InstallLocation& &:
PackageCache& && &:C:\WINDOWS\Installer\619ab2.msi
SKUNumber& && && &:
Vendor& && && && &:Microsoft Corporation
另外,可以使用 Get-WmiObject Filter 参数以便只选择 Microsoft .NET Framework 2.0。在此命令中使用的筛选器是 WMI 筛选器,因此它不使用 Windows PowerShell 筛选语法,而是使用 WMI 查询语言 (WQL):
Get-WmiObject -Class Win32_Product -ComputerName .-Filter &Name='Microsoft .NET Framework 2.0'&| Select-Object -Property [a-z]*
WQL 查询常用的字符(例如,空格或等于号)在 Windows PowerShell 中有特殊含义。因此,谨慎的做法是始终将 Filter 参数的值放在一对引号内。还可以使用 Windows PowerShell 转义字符,即倒引号 (`),但它可能不会提高可读性。以下命令相当于前面的命令,并返回相同结果,但是使用倒引号“`”会将特殊字符转义,而不是将整个筛选器字符串放在引号内:
Get-WmiObject -Class Win32_Product -ComputerName .-Filter Name`=`'Microsoft` .NET` Framework` 2.0`' | Select-Object -Property [a-z]*
生成精简列表的另一种方式是显式地选择显示格式。若要标识已安装的特定软件包,则以下输出中显示的属性最有用:
Get-WmiObject -Class Win32_Product -ComputerName .| Format-List Name,InstallDate,InstallLocation,PackageCache,Vendor,Version,IdentifyingNumber
Name& && && && &&&:HighMAT Extension to Microsoft Windows XP CD Writing Wizard
InstallDate& && & :
InstallLocation& &:C:\Program Files\HighMAT CD Writing Wizard\
PackageCache& && &:C:\WINDOWS\Installer\113b54.msi
Vendor& && && && &:Microsoft Corporation
Version& && && &&&: 1.1.1905.1
IdentifyingNumber :{FCE65C4E-B0E8-4FBD-AD16-EDCBE6CD591F}
最后,若要仅查找已安装的应用程序的名称,一个简单的 Format-Wide 语句即可完成减少输出的工作:
Get-WmiObject -Class Win32_Product -ComputerName .| Format-Wide -Column 1
尽管现在已有几种方式来查看使用 Windows Installer 完成安装的应用程序,但我们尚未考虑其他应用程序。由于大多数标准应用程序会向 Windows 注册它们的卸载程序,因此可以在 Windows 注册表中查找这些程序,以便在本地处理它们。
列出所有可卸载的应用程序
尽管不能保证找到系统中的所有应用程序,但可以找到在“添加或删除程序”对话框中列出的所有程序。“添加或删除程序”将从注册表项 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall 下面的列表中查找这些应用程序,并且我们还可以自己检查此项,以查找应用程序。若要使查看 Uninstall 项更容易,可以将 Windows PowerShell 驱动器映射到此注册表位置:
PS& New-PSDrive -Name Uninstall -PSProvider Registry -Root HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
Name& && & Provider& && &Root& && && && && && && && && && && &&&CurrentLocation
----& && & --------& && &----& && && && && && && && && && && &&&---------------
Uninstall&&Registry& && &HKEY_LOCAL_MACHINE\SOFTWARE\Micr...
HKLM: 驱动器映射到 HKEY_LOCAL_MACHINE 的根,因此我们在 Uninstall 项的路径中使用该驱动器。如果不使用 HKLM:,则可能使用 HKLM 或 HKEY_LOCAL_MACHINE 指定注册表路径。使用现有注册表驱动器的优点是我们可以使用 Tab 补齐功能来填充项名称,所以不需要键入它们。
现在,我们有了一个名为“Uninstall”的驱动器,可以用它来快速和方便地查找应用程序的安装信息。通过统计 Uninstall: Windows PowerShell 驱动器中的注册表项数,可以查找已安装的应用程序个数:
PS& (Get-ChildItem -Path Uninstall:).Length
可以从 Get-ChildItem 开始,使用多种技术进一步搜索此应用程序列表。若要将应用程序列表放到 $UninstallableApplications 变量中,可以执行以下命令:
$UninstallableApplications = Get-ChildItem -Path Uninstall:
在此处使用长变量名称是为了清晰起见。在实际使用中,不必使用长名称。可以使用 Tab 补齐功能自动填写变量名称,另外还可以使用 1–2 个字符的名称加快速度。如果正在开发希望重用的代码,则较长的说明性名称最有用。
通过使用以下命令可以在 Uninstall 项中找到应用程序的显示名:
PS& Get-ChildItem -Path Uninstall:| ForEach-Object -Process { $_.GetValue(&DisplayName&) }
无法保证这些值是唯一的。在以下示例中,两个已安装项都显示为“Windows Media Encoder 9 Series”:
PS& Get-ChildItem -Path Uninstall:| Where-Object -FilterScript { $_.GetValue(&DisplayName&) -eq &Windows Media Encoder 9 Series&}
Hive:Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Micros
oft\Windows\CurrentVersion\Uninstall
SKC&&VC Name& && && && && && && && && &Property
---&&-- ----& && && && && && && && && &--------
0& &3 Windows Media Encoder 9& && &&&{DisplayName, DisplayIcon, UninstallS...
0&&24 {E38C00D0-A68B--F7...{AuthorizedCDFPrefix, Comments, Conta...
安装应用程序
可以使用 Win32_Product 类在远程或本地安装 Windows Installer 软件包。远程安装时,应当以经典的通用命名约定 (UNC) 网络路径的格式指定要安装的 .msi 软件包的路径,这是因为 WMI 子系统不理解 Windows PowerShell 路径。例如,若要将位于网络共享 \\AppServ\dsp 上的 MSI 软件包 NewPackage.msi 安装到远程计算机 PC01 上,可以在 Windows PowerShell 提示符下输入以下命令:
(Get-WMIObject -ComputerName PC01 -List | Where-Object -FilterScript {$_.Name -eq &Win32_Product&}).InvokeMethod(&Install&,&\\AppSrv\dsp\NewPackage.msi&)
不使用 Windows Installer 技术的应用程序可能有特定于应用程序的方法来进行自动部署。若要查找是否有自动部署的方法,可能需要查看应用程序的文档,或咨询应用程序供应商的支持系统。在某些情况下,即使应用程序供应商没有专门将应用程序设计为自动安装,该安装程序软件制造商仍然可能有某些自动化的技术。
删除应用程序
使用 Windows PowerShell 删除 Windows Installer 软件包与使用 InvokeMethod 安装软件包的工作方式大体相同。下面是基于名称属性选择要卸载的软件包的示例;在某些情况下,用 IdentifyingNumber 进行筛选可能更容易:
(Get-WmiObject -Class Win32_Product -Filter &Name='ILMerge'& -ComputerName .).InvokeMethod(&Uninstall&,$null)
删除其他应用程序并不那么简单,甚至在本地这样做时也如此。我们可以通过提取 UninstallString 属性来找到这些应用程序的命令行卸载字符串。此方法对 Windows Installer 应用程序和出现在 Uninstall 项下面的旧程序有效:
Get-ChildItem -Path Uninstall:| ForEach-Object -Process { $_.GetValue(&UninstallString&) }
如果需要,可以按显示名筛选输出:
Get-ChildItem -Path Uninstall:| Where-Object -FilterScript { $_.GetValue(&DisplayName&) -like &Win*&} | ForEach-Object -Process { $_.GetValue(&UninstallString&) }
但是,如果不进行某些修改,这些字符串可能无法在 Windows PowerShell 提示符下直接使用。
升级 Windows Installer 应用程序
执行应用程序升级涉及两条信息。您需要知道要升级的已安装应用程序的名称,以及应用程序升级软件包的路径。有了该信息,就可以使用单个命令行从 Windows PowerShell 执行升级:
(Get-WmiObject -Class Win32_Product -ComputerName .-Filter &Name='OldAppName'&).InvokeMethod(&Upgrade&,&\\AppSrv\dsp\OldAppUpgrade.msi&)
更改计算机状态:锁定、注销、关闭和重新启动& && && && &
您可以从 Windows PowerShell 以几种不同方法重置计算机,但是在最初的发行版中必须使用标准命令行工具或 WMI。虽然仅使用 Windows PowerShell 来调用特定工具,但是完成更改计算机电源状态的步骤可说明使用外部工具的一些重要详细信息。
锁定计算机
使用标准可用工具直接锁定计算机的唯一方法是,直接调用 user32.dll 中的 LockWorkstation() 函数:
rundll32.exe user32.dll,LockWorkStation
此命令将立即锁定工作站。在诸如 Windows XP 之类的操作系统上,由于快速用户切换处于活动状态,计算机将返回到用户登录屏幕,而不是启动当前用户的屏幕保护程序。在可能希望断开特定会话的终端服务器上,也可以使用 tsshutdn.exe 命令行工具。
注销当前会话
可以使用几种不同方法在本地系统上注销会话。最简单的方法是,使用远程桌面/终端服务命令行工具 logoff.exe(在 Windows PowerShell 或命令外壳程序提示符下键入 logoff /? 可查看使用详细信息)。若要注销当前的活动会话,请键入不带参数的 logoff。
另一种方法是使用 shutdown.exe 工具及其注销选项:
shutdown.exe -l
第三种方法是使用 WMI。Win32_OperatingSystem 类具有 Win32Shutdown 方法;用参数 0 调用该方法可启动注销:
(Get-WmiObject -Class Win32_OperatingSystem -ComputerName .).InvokeMethod(&Win32Shutdown&,0)
关闭或重新启动计算机
关闭和重新启动计算机通常是相同类型的任务。用于关闭计算机的工具通常也可以重新启动它,反之亦然。有两种简单的方法可以从 Windows PowerShell 重新启动计算机。使用带适当参数的 tsshutdn.exe 或 shutdown.exe。使用 tsshutdn.exe /? 或 shutdown.exe /? 可以获取详细的用法信息。
直接从 Windows PowerShell 使用 Win32_OperatingSystem 执行关闭和重新启动操作也是可能的。
处理打印机
在 Windows PowerShell 中,可以使用 WMI 和来自 WSH 的 WScript.Network COM 对象执行打印机管理任务。我们将同时使用这两种工具演示特定的任务。
列出打印机连接
列出安装在计算机上的打印机的最简单方法是,使用 WMI Win32_Printer 类:
Get-WmiObject -Class Win32_Printer -ComputerName .
也可以使用 WScript.Network COM 对象(通常在 WSH 脚本中使用)列出打印机:
(New-Object -ComObject WScript.Network).EnumPrinterConnections()
此命令返回端口名称和打印机设备名称的简单字符串集合,不含可区别标签,因此对于轻松检查不太有用。
添加网络打印机
使用 WScript.Network 可以非常轻松地添加新的网络打印机:
(New-Object -ComObject WScript.Network).AddWindowsPrinterConnection(&\\Printserver01\Xerox5&)
设置默认打印机
若要使用 WMI 设置默认打印机,需要向下筛选 Win32_Printer 集合找到所需的打印机,然后调用 SetDefaultPrinter 方法:
(Get-WmiObject -ComputerName .-Class Win32_Printer -Filter &Name='HP LaserJet 5Si'&).InvokeMethod(&SetDefaultPrinter&,$null)
WScript.Network 使用起来更简单一点;它也具有 SetDefaultPrinter 方法,您只需将打印机名称指定为参数即可:
(New-Object -ComObject WScript.Network).SetDefaultPrinter('HP LaserJet 5Si')
删除打印机连接
可以使用 WScript.Network RemovePrinterConnection 方法删除打印机连接:
(New-Object -ComObject WScript.Network).RemovePrinterConnection(&\\Printserver01\Xerox5&)
执行网络任务
大多数低级网络协议管理任务都涉及 TCP/IP,因为 TCP/IP 是最常用的网络协议。我们将看一看如何使用 WMI 从 Windows PowerShell 完成其中的一些任务。
列出计算机的 IP 地址
使用以下命令可以返回计算机正使用的所有 IP 地址:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE -ComputerName .| Select-Object -Property IPAddress
此命令的输出与大多数属性列表不同,因为值将括在方括号中:
{192.168.1.80}
{192.168.148.1}
{192.168.171.1}
若要了解为什么将它们括在方括号中,可以使用 Get-Member 仔细地查看 IPAddress 属性:
PS& Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE -ComputerName .| Get-Member -Name IPAddress
TypeName:System.Management.ManagementObject#root\cimv2\Win32_NetworkAdapter
Configuration
Name& && &MemberType Definition
----& && &---------- ----------
IPAddress Property& &System.String[] IPAddress {}
每个网络适配器的 IPAddress 属性实际上是一个数组。定义中的大括号指示 IPAddress 不是 System.String 值,而是 System.String 值的数组。
可以使用 Select-Object ExpandProperty 参数扩展这些值:
PS& Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE -ComputerName .| Select-Object -ExpandProperty IPAddress
192.168.1.80
192.168.148.1
192.168.171.1
列出 IP 配置数据
若要为每个网络适配器显示详细的 IP 配置数据,可以使用以下命令:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE -ComputerName .
网络适配器配置的默认显示是非常精简的一组可用信息。有关深入检查和疑难解答,请使用 Select-Object 强制显示更多属性。如果对 IPX 或 WINS 属性不感兴趣(很可能是在使用现代 TCP/IP 网络的情况下),也可以排除以 WINS 或 IPX 开头的所有属性:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE -ComputerName .| Select-Object -Property [a-z]* -ExcludeProperty IPX*,WINS*
此命令将返回有关 DHCP、DNS、路由和其他次要 IP 配置属性的详细信息。
对计算机执行 Ping 操作
可以使用 Win32_PingStatus 对计算机执行简单的 Ping 操作。以下命令将执行 Ping 操作,但是返回冗长的输出:
Get-WmiObject -Class Win32_PingStatus -Filter &Address='127.0.0.1'& -ComputerName .
摘要信息的更有用形式是仅显示 Address、ResponseTime 和 StatusCode 属性:
PS& Get-WmiObject -Class Win32_PingStatus -Filter &Address='127.0.0.1'& -ComputerName .| Select-Object -Property Address,ResponseTime,StatusCode
Address& && && && && && && && && && && & ResponseTime& && && && && & StatusCode
-------& && && && && && && && && && && & ------------& && && && && & ----------
127.0.0.1& && && && && && && && && && && && && && & 0& && && && && && && && & 0
状态代码 0 指示 Ping 操作成功。
可以使用数组对整个系列的计算机执行 Ping 操作。因为此处使用多个地址,所以需要使用 ForEach-Object 分别对每个地址执行 Ping 操作:
&127.0.0.1&,&localhost&,&& | ForEach-Object -Process {Get-WmiObject -Class Win32_PingStatus -Filter (&Address='& + $_ + &'&) -ComputerName .}| Select-Object -Property Address,ResponseTime,StatusCode
可以使用相同的过程对整个子网执行 Ping 操作。例如,若要检查使用网络号 192.168.1.0 的专用网络,并使用标准的 C 类子网掩码 (255.255.255.0),则只有 192.168.1.1 到 192.168.1.254 的范围内的地址才是合法的本地地址(0 始终是为网络号保留的,255 是子网广播地址)。
可以在 Windows PowerShell 中使用语句 1..254 获取从 1 到 254 的数字的数组,因此通过生成该数组并将值添加到 Ping 语句中的部分地址,可以对完整子网执行 Ping 操作:
1..254| ForEach-Object -Process {Get-WmiObject -Class Win32_PingStatus -Filter (&Address='192.168.1.&+ $_ + &'&) -ComputerName .}| Select-Object -Property Address,ResponseTime,StatusCode
该生成地址范围的方法也可以在别处使用。可以使用此方法生成一组完整地址:
$ips = 1..254 | ForEach-Object -Process {&192.168.1.& + $_}
检索网络适配器属性
本入门中前面已经提到,可以使用 Win32_NetworkAdapterConfiguration 检索常规配置属性。虽然不是严格的 TCP/IP 信息,但是诸如 MAC 地址和适配器类型的网络适配器信息对于了解计算机的当前状况是很有用的。可以使用以下命令获取此信息的摘要:
Get-WmiObject -Class Win32_NetworkAdapter -ComputerName .
为网络适配器指定 DNS 域
可以使用 Win32_NetworkAdapterConfiguration SetDNSDomain 方法自动完成要在自动名称解析中使用的 DNS 域的指定。因为独立地为每个网络适配器配置指定 DNS 域,所以需要使用 ForEach-Object 语句来确保逐个选择适配器:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=true -ComputerName .| ForEach-Object -Process { $_.InvokeMethod(&SetDNSDomain&, &&)}
在此处使用了筛选语句 IPEnabled=true,因为甚至在仅使用 TCP/IP 的网络上,计算机上的几个网络适配器配置也不是真正的 TCP/IP 适配器;它们是支持用于所有适配器的 RAS、PPTP、QoS 和其他服务的常规软件元素,因此没有它们自己的地址。
可以使用 Where-Object 而不是 Get-WmiObject Filter 筛选该命令:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -ComputerName .| Where-Object -FilterScript {$_.IPEnabled} | ForEach-Object -Process {$_.InvokeMethod(&SetDNSDomain&, &&)}
执行 DHCP 配置任务
修改 DHCP 详细信息涉及使用一组适配器,就像 DNS 配置一样。有数个可以使用 WMI 执行的不同操作,我们将介绍其中的几个常见任务。
确定启用 DHCP 的适配器
使用以下命令,可以在计算机上查找启用 DHCP 的适配器:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter &DHCPEnabled=true& -ComputerName .
如果不查找有 IP 配置问题的适配器,则可以进一步将此限制为仅查找启用 IP 的适配器:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter &IPEnabled=true and DHCPEnabled=true& -ComputerName .
检索 DHCP 属性
适配器的 DHCP 相关属性通常以 DHCP 开头,因此可以添加管道元素 Select-Object -Property DHCP* 以查看适配器的摘要 DHCP 信息:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter &DHCPEnabled=true& -ComputerName .| Select-Object -Property DHCP*
在每个适配器上启用 DHCP
若要在所有适配器上全局启用 DHCP,请使用
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=true -ComputerName .| ForEach-Object -Process {$_.InvokeMethod(&EnableDHCP&, $null)}
可以改用 Filter 语句“IPEnabled=true and DHCPEnabled=false”,以免在已经启用 DHCP 处启用它,但是省略此步骤不会导致任何错误。
对特定适配器解除和续订 DHCP 租约
Win32_NetworkAdapterConfiguration 具有 ReleaseDHCPLease 和 RenewDHCPLease 方法。它们的使用方式是相同的。通常,如果仅需要为特定子网上的某个适配器解除或续订地址,则需要使用这些方法。筛选子网上适配器的最简单方法是,仅选择使用该子网网关的适配器配置。例如,以下命令将对本地计算机上正从 192.168.1.254 获取 DHCP 租约的适配器解除所有 DHCP 租约:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter &IPEnabled=true and DHCPEnabled=true& -ComputerName .| Where-Object -FilterScript {$_.DHCPServer -contains &192.168.1.254&} | ForEach-Object -Process {$_.InvokeMethod(&ReleaseDHCPLease&,$null)}
续订 DHCP 租约时的唯一更改是,调用 RenewDHCPLease 而不是 ReleaseDHCPLease:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter &IPEnabled=true and DHCPEnabled=true& -ComputerName .| Where-Object -FilterScript {$_.DHCPServer -contains &192.168.1.254&} | ForEach-Object -Process {$_.InvokeMethod(&ReleaseDHCPLease&,$null)}
对远程计算机使用这些方法时,如果是通过解除或续订租约的适配器连接到远程计算机的,则可能失去对远程计算机的访问。
对所有适配器解除和续订 DHCP 租约
使用 Win32_NetworkAdapterConfiguration 的 ReleaseDHCPLeaseAll 和 RenewDHCPLeaseAll 方法,可以对所有适配器执行全局 DHCP 地址解除或续订。但是,该命令必须适用于 WMI 类,而不是特定的适配器,因为全局解除和续订租约是对类执行的,而不是对特定适配器执行的。
通过列出所有 WMI 类,然后按名称仅选择所需类,可以获取对 WMI 类而不是类实例的引用。例如,以下命令返回 Win32_NetworkAdapterConfiguration 类:
Get-WmiObject -List | Where-Object -FilterScript {$_.Name -eq &Win32_NetworkAdapterConfiguration&}
可以将整个命令视为类,然后对它调用 ReleaseDHCPAdapterLease 方法。在以下命令中,Get-WmiObject 和 Where-Object 管道元素括在圆括号中;这将强制首先计算它们:
( Get-WmiObject -List | Where-Object -FilterScript {$_.Name -eq &Win32_NetworkAdapterConfiguration&} ) .InvokeMethod(&ReleaseDHCPLeaseAll&, $null)
可以使用相同的命令格式调用 RenewDHCPLeaseAll 方法:
( Get-WmiObject -List | Where-Object -FilterScript {$_.Name -eq &Win32_NetworkAdapterConfiguration&} ) .InvokeMethod(&RenewDHCPLeaseAll&, $null)
创建网络共享
可以使用 Win32_Share Create 方法创建网络共享:
(Get-WmiObject -List -ComputerName .| Where-Object -FilterScript {$_.Name -eq &Win32_Share&}).InvokeMethod(&Create&,(&C:\temp&,&TempShare&,0,25,&test share of the temp folder&))
也可以在 Windows PowerShell 中使用 net share 创建共享
net share tempshare=c:\temp /users:25 /remark:&test share of the temp folder&
删除网络共享
可以使用 Win32_Share 删除网络共享,但是该过程与创建共享稍有不同,因为需要检索要删除的特定共享,而不是 Win32_Share 类。以下语句将删除共享“TempShare”:
(Get-WmiObject -Class Win32_Share -ComputerName .-Filter &Name='TempShare'&).InvokeMethod(&Delete&,$null)
也可以使用 Net share 删除它:
PS& net share tempshare /delete
tempshare 已成功删除。
连接 Windows 可访问的网络驱动器
使用 New-PSDrive 可以创建 Windows PowerShell 驱动器,但是这样创建的驱动器仅对 Windows PowerShell 可用。若要创建新的网络驱动器,可以使用 WScript.Network COM 对象。以下命令将共享 \\FPS01\users 映射到本地驱动器 B:
(New-Object -ComObject WScript.Network).MapNetworkDrive(&B:&, &\\FPS01\users&)
也可以使用 net use 命令做到这一点:
net use B:\\FPS01\users
使用 WScript.Network 或 net use 映射的驱动器立即对 Windows PowerShell 可用。
Powered by Discuz!
& Comsenz Inc.}

我要回帖

更多关于 powershell 运行脚本 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信