桌面文件PsTools 入门

Wes Miller

下载这篇文章的代码: MillerTheDesktopFiles2007_03.exe (150KB)

到去年为止,我一直在 Winternals Software 公司工作。Winternals 公司于 2006 年 7 月被 Microsoft 收购,公司专门经销商业软件。但其创始人 Mark Russinovich 和 Bryce Cogswell 还拥有一家名为 Sysinternals 的独立公司,该公司以免费软件形式发行了许多工具。在这些免费软件应用程序中,有些

甚至已经发展成为 Winternals Administrator's Pak 中的组件。Mark 和 Bryce 还超出典型免费软件许可条款的范围将这些工具的许可授予那些寻求使用这些工具的公司。

在 Sysinternals 工具库中(没错,它是一整套的工具),PsTools 套件是我所喜爱的工具之一,该工具位于 microsoft.com/technet/sysinternals/utilities/pstools.mspx。Mark 将这些工具以 UNIX 进程列表实用程序 ps 命名。正如这些工具的下载网站上所述,有些内置的 Windows® 命令行实用程序与这些工具有着相同的功能。但除了重要的独特功能外,两者的主要区别在于 PsTools 套件既可本地使用,又可远程使用(当然,前提是必须正确配置远程系统)。更为可喜的是,其远程运行过程几乎与本地运行过程一样简单。

PsTools 套件包含几个单独的应用程序,如图 1 所列。如同其他 Sysinternals 实用程序一样,没有安装程序,而只有应用程序。只需将它们放在所选路径的某个文件夹中就万事大吉了!

Figure 1 PsTools 实用程序

工具 说明
PsExec 用于在任何用户环境中执行进程。
PsFile 显示系统上远程打开的文件。
PsGetSid 显示计算机或用户的 Windows 安全标识符 (SID)。
PsInfo 列出有关 Windows 系统的信息。
PsKill 按照名称或进程 ID 终止进程。
PsList 列出有关运行中进程的详细信息。
PsLoggedOn 显示所有本地登录的用户以及所有远程资源共享用户。
PsLogList 转储 Windows 事件日志记录。
PsPasswd 更改用户帐户的密码。
PsService 查看和控制 Windows 服务。
PsShutdown 关闭、重新启动、休眠或挂起计算机。
PsSuspend 挂起运行中的进程。

现在,您可能注意到,这一功能的某些环节(特别是 PsLogList)可以通过 Windows Management Instrumentation (WMI) 和一些复杂的脚本来实现。但 PsTools 套件的特点在于,每个实用程序都旨在完成某一项特定的任务,简单而又容易。

我将逐个工具加以介绍,并通过简单的示例来说明工具的用途及用法。但首先,我要简要介绍一下这些工具的工作原理以及要使这些工具能够工作必须满足哪些前提条件。

工具的工作原理

这些工具通常都以相同的方式工作。在主机系统上启动所需的 PsTool。尽管许多工具都可以在本地运行,但您会发现这些工具在针对一个远程系统运行时或在同时针对多个系统运行时最能发挥其效用。(PsExec 是我所想到的一个特例,在下面的示例中您就会看到。)实用程序使用您所提供的命令行参数,来将其自身复制到远程系统的管理共享,这一管理共享与远程系统上的 %SystemRoot%(Windows 目录)相同。

一旦复制到远程目录中,该应用程序即会自行启动并将安装 Windows 服务。该 Windows 服务会使用启动时您所提供的凭据来执行您所请求的任务。如果该特定工具需要客户端系统上的某个最终用户 UI,该服务会在用户上下文中启动附加的二进制文件。(请记住,服务不能抛出直接交互的 UI。)该服务再将任何必要的信息返回给启动它的控制台。最后,该服务会自行卸载。

您可以看到,这些工具是强大而独立的。尽管它们会涉及多个二进制文件和多个进程,但作为用户的您却不必担忧,您只需运行所需的工具,它就会完成任务。

要使用这些工具,必须满足以下前提条件:具有 Windows NT®、Windows 2000、Windows XP 或 Windows Server® 2003(支持 Windows 的 x86 或 x64 版本,但不支持 Itanium 版本);在运行这些工具的远程系统上启用默认的管理网络共享 (admin$);在远程系统上打开用于文件和打印机共享的端口(无论使用的是 Windows 防火墙、Internet 连接防火墙,还是其他防火墙产品)。

PsExec

PsExec 是这些工具中我个人所偏爱的工具,个中原因或许并不是您想象的那样。在两年中,我有大半的时间一直以“非管理员用户”的身份运行我的系统,也就是说,我以“用户”身份而非“管理员”身份运行。而我有一个用来以本地管理员身份运行应用程序的简短脚本,称为 run.vbs(以用户身份也可以同样轻松地运行这些应用程序)。图 2 显示了该脚本的内容(也可在 TechNet 杂志网站的 technetmagazine.com/code07.aspx 获得该脚本)。该脚本假定 PsTools 在 Path 系统变量中。

Figure 2 Run.vbs

SET WshShell = WScript.CreateObject("WScript.Shell")
SET WshSysEnv = WshShell.Environment("SYSTEM")
SET FSO = CreateObject("Scripting.FileSystemObject")
IF WScript.Arguments.Count <> 0 Then
    FOR EACH arg IN WScript.Arguments
        iArgCount = iArgCount + 1
        strCmdArg = (arg)
        strCmdArray = Split(strCmdArg, " ", 2, 1)
        IF iArgCount = 1 THEN
        strExe = strCmdArray(0)
        ELSEIF iArgCount = 2 THEN
        strRun = strCmdArray(0)
        ELSE
        strParams = strParams&" "&strCmdArray(0)
        END IF
    NEXT
END IF
'/t:0A && title ***** Admin ***** 
        strExt = LCase(Right(strExe, 3))

IF strExt <> "exe" AND strExt <> "bat" AND strExt <> "cmd" THEN
WshShell.Run "psexec.exe -d -i -e -u COMPUTERNAME\USER -p PASSWORD  cmd /c start "&strExe&"
    "&strRun&" "&strParams, 0, FALSE
ELSE
WshShell.Run "psexec.exe -d -i -e -u COMPUTERNAME\USER -p PASSWORD "&strExe&" "&strRun&"
    "&strParams, 0, FALSE
END IF

    SET WshShell = NOTHING
    SET WshSysEnv = NOTHING
    SET FSO = NOTHING

当我们在 Winternals 开发 Protection Manager 产品时,Mark 添加了一个功能:即允许受限用户提供更高权限的凭据来在本地启动 PsExec。这个简单的脚本就是将 PsExec 用于这一功能的一个示例。当然,PsExec 更常用来远程运行,例如用来运行一个不提供自身远程、脚本或自动处理框架的实用程序。PsExec 的两个主要功能包括将所要执行的二进制文件复制到远程系统以及规定处理器关联。PsExec 的另一个有用功能是可以通过提供脚本文件来针对许多计算机同时进行脚本处理。

以下是简化的 PsExec 用法:

PsExec \\computer -u username -p password command

通过图 3 所示的开关可以扩展这一用法。

Figure 3 PsExec 开关

开关 说明
-a 指定处理器关联。
-c 指示是否应将应用程序复制到远程系统。
-d 指定在退出前不等待进程结束(不等待成功或失败的消息)。
-e 使用指定帐户的配置文件加载。
-f 即使远程系统上存在该应用程序也进行复制。确保运行当前(或特定)版本。
-i 在远程系统上以交互方式运行应用程序(如果想要某位最终用户看到该应用程序的任何用户界面,则必须采用这种模式)。
-l 以受限用户身份运行应用程序。删除管理员组令牌并且将进程权限降至用户组成员的权限级别。便于以最低权限运行高风险、面向 Internet 的应用程序。
-n 指定在与远程计算机连接失败之前等待的超时时间。
-priority 按指定的优先级运行进程。即,指定 Windows 应为给定任务所设的进程优先级(-low、-belownormal、-abovenormal、-high 或 –realtime)。
-s 使用系统帐户运行进程(便于运行 Regedit 来访问权限内的注册表项)。
-v 只在所复制应用程序为更高版本时才复制该应用程序。
-x 在 Winlogon 安全桌面上显示 UI(仅适用于本地系统)。
@file 针对文本文件中所指定的所有计算机运行该命令。

PsFile

与 PsExec 相比,PsFile 是更加有所侧重的工具。具体来说,它用于检查谁在远程系统上打开了哪些文件。如果要在重新引导服务器前跟踪哪些文件处于打开状态,此工具会很有用。如果需要查明哪位用户锁定了该文件(或许是为防止进行编辑或删除),可以手动进行通知,或者通过 PsFile 将文件关闭。PsFile 的用法如下:

PsFile \\computer -u username -p password 

此命令只会返回远程系统上所打开的文件句柄的列表。除了标准用法之外,还可以向语句中添加 Id 参数,以指定要查找相关信息或者要关闭的文件的名称。其中还可以包括 -c 开关,表示将关闭 Id 参数所标识的文件。

PsGetSid

PsGetSid 也是一个很有侧重的工具。它会告诉您计算机、用户或组的安全标识符 (SID)。如果要确保域中的系统不存在重复的 SID 或者只想在某个系统上验证所有用户或组的 SID,此工具会很有用。PsGetSid 的用法如下:

PsGetSid \\computer -u username -p password account

请注意,account 可以指定用户、计算机或组。尽管 PSGetSid 的语法非常简单,但它仍提供了一些附加的参数。SID 参数用于指定具有指定 SID 的帐户(组或计算机),@file 用于针对指定文本文件中所列的所有计算机运行该命令。

PsInfo

PsInfo 用于提供详细的系统信息。显然,这在针对多个远程系统编制脚本时最为有用,其输出内容会发送到某个文件(例如 Excel® 和数据库可以识别的 CSV 文件)。请注意,此实用程序的运行依据一个不同于大多数其他工具的重要概念:在默认情况下,如果不提供计算机名称,PsInfo 会尝试查询域中的所有计算机。PsInfo 的用法如下:

PsInfo  \\computer -u username -p password 

虽然其语法简单,但也提供了几个附加的开关和参数,如图 4 所示

Figure 4 PsInfo 开关

开关 说明
-h 显示所有 Windows 更新。
-s 显示系统上安装的所有应用程序。
-d 显示系统的磁盘/卷信息。
-c 以 CSV 格式输出结果。
-t 为 CSV 文件指定不同于默认值 \t 的分隔符。
Filter 仅显示与给定筛选器匹配的数据。
@file 针对指定文本文件中所列的所有计算机运行该命令。

PsKill

PsKill 是用于在本地或远程系统上终止进程的有效实用程序。其用法非常简单,并且可以快速终止某个进程及其所有子进程。PsKill 的用法与上面介绍的其他工具非常类似:

PsKill -t \\computer -u username -p password process id | process name

请注意,您可以指定要终止的进程 id 或进程名。

PsList

我是一个 Process Explorer 迷,所以不大使用 PsList(有关详细信息,请参阅 microsoft.com/technet/sysinternals/ProcessesAndThreads/ProcessExplorer.mspx。)但由于 Process Explorer 没有远程版本,所以 PsList 理所当然成为 Process Explorer 一些主要功能的替代品。实际上,PsList 是在远程系统上运行的一个或多个进程的列表。

PsList 的用法相当简单:

PsList \\computer -u username -p password account

与其他工具一样,account 参数可以指定用户、计算机或组。其他参数如图 5 所示。

Figure 5 PsList 开关

开关 说明
-t 显示线程级别的信息。
-m 提供每个进程的详细内存信息。
-x 显示进程、内存和线程信息。
-t 按进程树显示信息(考虑 Process Explorer 树视图)。
-s [n] 在指定的秒数内,以任务管理器模式运行。这样可以相对实时地显示远程进程信息。
-r [n] 指定在以任务管理器模式运行时的刷新频率(以秒计)。
name 显示以指定名称开始的进程的相关信息。
-e 与进程名称完全匹配。
pid 显示特定进程的相关信息。

PsList 功能强大且简单易用,您无需使用远程桌面即可相当详细地查看远程进程。在需要(例如您有必须进行控制的进程)时,可以利用此信息移到 PsKill 或 PsSuspend。

PsLoggedOn

PsLoggedOn 背后的前提假定是不言自明的。它用于显示登录到系统中的用户。这可以是本地(交互式)登录或网络共享登录。与 PsFile 相似,此功能对于确定谁在使用您所需要维护的服务器是很有用的。其用法很简单:

PsLoggedOn \\computer

PsLoggedOn 只有两个可选参数:-l 只显示本地登录(而不包括网络登录),-x 不包括登录时间。

PsLoggedOn 尽管是一个基础性的工具,但它允许您轻松地查看到通常必须要通过搜索几个 Windows 位置才能获得的信息。

PsLogList

作为最常用的实用程序之一,PsLogList 工具用于将 Windows 事件日志转储为文本格式,这些转储的日志进而再用于日志读取器、数据库或其他任何需要的地方。其主要的优点是将事件日志项从二进制格式转换为易于转换或自动处理的格式。(当然,在 Windows Vista™ 中,事件日志原本就有 XML 格式,但那不是我们今天要谈的话题。)

PsLogList 的用法:

PsLogList \\computer -u username -p password

此实用程序还提供了许多附加的开关和参数,如图 6 所示。

Figure 6 PsLogList 开关

开关 说明
-a 仅转储所指定日期之后的事件。
-b 仅转储所指定日期之前的事件。
-c 在转储所需输出后永久清除事件日志。
-d 仅显示指定天数内的信息。
-e 排除具有指定事件 ID 的事件(最多可指定 10 个事件 ID)。
-f 筛选事件类型(警告、错误等)。
-g 将事件日志导出为 EVT 文件,需要指定 -c 开关。
-h 仅显示指定小时数内的信息。
-l 从指定的 EVT 文件转储。
-m 仅显示指定分钟数内的信息。
-n 仅显示最近的 n 个事件。
-o 仅显示来自给定源的事件(例如,-o SRService 表示显示 Windows System Restore Service 的事件)。
-q 排除来自给定源的事件(与 -o 相反)。
-r 颠倒转储顺序,即按从最早到最近的顺序转储日志事件。
-s 以分隔的字段在每行列出记录。
-t 为 -s 输出内容指定除逗号之外的分隔符。
-w 等待新事件,以实时地填充并转储。这仅适用于本地系统。
-x 从事件日志转储扩展数据。
eventlog 指定要转储的事件日志。System 为默认值。
@file 针对文本文件中所指定的所有计算机运行该命令。

Windows 事件日志可以是一个强大得惊人的诊断工具,但其奥妙在于使数据变得可以操作或合并。PsLogList 就是这神奇的力量。

PsPasswd

PsPasswd 是一个简单而又强大的实用程序,其功能在某种程度上与 Net.exe 相同,但它还考虑到了远程可用性和自动化。

PsPasswd  \\computer -u username -p password Username Newpassword

您可以指定计算机,也可以不指定计算机(针对本地系统运行),如果将计算机指定为 \\*,则实用程序将针对当前域中的所有计算机运行。PsPasswd 只提供了一个附加参数:@file 用于针对文本文件中所指定的所有计算机运行该命令。同样,它也是一个非常基础性的实用程序,却能提供极强大的多系统功能。

PsService

通过 PsService,您可以在网络的一个或多个系统上查看和编辑“服务控制管理器”(SCM) 信息,甚至可以在网络的各系统上搜索给定的服务名。

PsService \\computer -u username -p password command options

运行 PsService 时,command 代表图 7 中所列的任一命令,options 用于指定应用于给定命令的属性。如果不提供附加命令开关,PsService 会完整地转储 SCM 信息。

Figure 7 PsService 命令

命令 说明
query 查询给定的服务。
config 查询给定服务的配置信息。
setconfig 设置给定服务的配置信息。
start 启动服务。
stop 停止服务。
restart 重新启动(停止并启动)服务。
pause 暂停服务。
cont 恢复暂停的服务。
depend 显示哪些服务依赖于给定的服务。
find 在网络中查找服务的给定实例。
security 为给定服务提供安全信息。

因此,您可以将 PsService 视为 Services.msc 功能强大的远程命令行版本,只是它还允许您跨网络查找服务(可能具有潜在的危险)以及设置配置信息。

PsShutdown

PsShutdown 是我所喜爱的另一个工具。尽管有人会说 Microsoft 中包含一个用于处理此任务的工具 (shutdown.exe),但它们的确是不同的。两者的主要区别在于 PsShutdown 具有以下功能:它可以关闭或重新启动远程系统。此外,它还可以将系统置为待机或休眠模式(而不仅仅是关闭或重新启动)、锁定系统以及在通过消息提示用户一段给定的时间后重新启动系统。

PsShutdown \\computer -u username -p password

PsShutdown 也提供了许多附加参数,如图 8 所示。

Figure 8 PsShutdown 开关

开关 说明
-a 中止 PsShutdown 所启动的、已在进行的关机进程。
-c 允许交互式用户中止关机进程。
-d 挂起计算机(待机)。
-e 关机原因代码。建议到 Microsoft 网站查找相关帮助,因为同时使用 PsShutdown 和内置的 shutdown.exe 时可能会发生问题。有关详细信息,请参阅 msdn2.microsoft.com/en-us/library/aa376885.aspx。
-f 强制终止所有运行中的应用程序。
-h 使计算机休眠。
-k 关闭计算机的电源(如果不支持关闭电源,则重新启动计算机)。
-l 锁定计算机。
-m 指定要向任何交互式用户显示的消息。
-n 指定在与远程计算机连接失败之前等待的超时时间。
-o 注销控制台用户。
-r 重新启动计算机。
-s 关机,但不关闭电源。
-t 运行关机命令之前的倒计时时间,或者距关机的具体时间。
-v 在关机前为用户显示消息。
@file 针对文本文件中所指定的所有计算机运行该命令。

您会发现,PsShutdown 是一个非常强大、可配置性强的系统电源控制实用程序,而且使用起来相对比较简单。

PsSuspend

如果要暂时控制一个恶意进程,或者只是要在不丢失任何数据或应用程序上下文的情况下暂时中止对 CPU 占用率高的进程,PsSuspend 将不失为一个便利的实用程序。

PsSuspend \\computer -u username -p password process ID

可以通过 PsList 获得进程 ID。挂起某个进程后,可使用 -r 开关进行恢复。请注意,Process Explorer 也会实现挂起和恢复某个进程的概念,但只是在本地。而 PsSuspend 可以通过远程及本地方式挂起和恢复进程,这显然比 Process Explorer 中内置的实现方式更具优势。

结束语

我发现 PsTools 套件是一个价值不可估量的实用程序集。连同其余的 Sysinternals 实用程序(即,Regmon、Filemon、Process Explorer 以及现在的 Process Monitor)一起,PsTools 是我在所有系统上重新安装 Windows 时第一批放入路径变量中的程序。如果您以前不了解 PsTools,我希望本专栏能让您对它有所熟悉;如果您以前就知道 PsTools,我也希望本专栏能让您对这些工具有进一步的了解。当然,我要多谢 Mark Russinovich 这些年来一直免费提供这些工具,并帮我完成本专栏的内容。

Wes Miller 是德克萨斯州奥斯汀市 Pluck 公司 (www.pluck.com) 的一位开发经理。在这之前,Wes 在位于奥斯汀市的 Winternals Software 公司任职,并曾在微软担任 Windows 程序经理和产品经理。Wes 的联系方式如下:technet@getwired.com

© 2008 Microsoft Corporation 与 CMP Media, LLC.保留所有权利;不得对全文或部分内容进行复制.