桌面檔案PsTools 入門

Wes Miller

下載本文程式碼: MillerTheDesktopFiles2007_03.exe (150KB)

截至去年為止,我都在 Winternals Software 工作,而這家公司於 2006 年 7 月被 Microsoft 收購。Winternals 販售的是商用軟體,但這家公司的創始人 Mark Russinovich 與 Bryce Cogswell 還擁有另一家名為 Sysinternals 的公司,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 根據名稱或處理序識別碼刪除處理序。
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 防火牆、網際網路連線防火牆或其他防火牆產品)。

PsExec

在這些工具中,我個人最愛用 PsExec,而且原因可能出乎您的意料之外。兩年來我有大半時間都是以非系統管理員身分在執行系統,也就是說以使用者而非系統管理員的身分。需要時,我會使用稱為 run.vbs 的簡短指令碼,讓我能夠以本機系統管理員的身分執行應用程式 (其實也能夠以任何使用者的身分執行)。[圖 2] 顯示此指令碼的內容 (您可以從 TechNet Magazine 網站取得這個指令碼,網址是:technetmagazine.com/code07.aspx)。此指令碼假設 Path 系統變數中已經包含 PsTools。

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

這個簡單指令碼是一個例子,其中結合了 PsExec 與我們在 Winternals 研發 Protection Manager 產品時 Mark 加入的功能:讓權限受限的使用者提供權限較高的認證,以便從本機啟動 PsExec。當然,PsExec 比較常見的用法是遠端執行,例如,執行本身不提供遠端、指令碼或自動化架構的公用程式。PsExec 的幾個主要功能包括可將二進位碼檔案複製到要執行的遠端系統上,以及指定處理器相關性設定。PsExec 還有一項很方便的功能,就是能夠藉由提供指令檔來同時針對很多電腦撰寫指令碼。

以下是 PsExec 的簡化使用方式:

PsExec \\computer -u username -p password command

您可以使用 [圖 3] 顯示的參數來延伸功能。

Figure 3 PsExec 參數

參數 描述
-a 指定處理器相關性設定。
-c 指示是否要複製應用程式到遠端系統。
-d 指定無須先等待處理序完成再結束 (不會等待成功或失敗訊息)。
-e 使用指定的帳戶設定檔載入。
-f 即使遠端系統上已有應用程式也要複製該應用程式。確認您執行的是最新 (或特定) 版本。
-i 以互動方式在遠端系統上執行應用程式 (若要讓使用者檢視應用程式的使用者介面,就必須這麼做)。
-l 以權限受限的使用者身分執行應用程式。移除 Administrators 群組語彙基元,同時將其處理序權限縮減為 Users 群組成員的層級。便於以最低權限來執行高風險的網際網路面向應用程式。
-n 指定要等候的逾時時間,超過此時間則無法連線到遠端電腦。
-priority 依照指定的優先順序來執行處理序。也就是說,指定 Windows 該如何設定特定工作的處理序優先順序 (-low、-belownormal、-abovenormal、-high 或 -realtime )。
-s 使用系統 (System) 帳戶執行處理序 (便於執行 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

請注意,帳戶可以用來指定使用者、電腦或群組。PSGetSid 的語法很簡單,不過還提供幾個額外參數。SID 參數可指定已經有指定 SID 的帳戶 (群組或電腦),而 @file 則會根據指定的文字檔案清單,在清單所列的所有電腦上執行命令。

PsInfo

PsInfo 可用來提供詳細的系統資訊。顯然這個工具在撰寫多個遠端系統的指令碼時最好用,它的輸出會傳送到檔案 (例如 Excel® 及適用於資料庫的 CSV 檔案)。請注意,這個公用程式運作的重要概念與其他大部分的工具不同:如果您並未提供電腦名稱,則 PsInfo 預設會嘗試查詢網域中的所有電腦。PsInfo 的使用方式如下:

PsInfo  \\computer -u username -p password 

語法很簡單,不過也提供如 [圖 4] 所示的額外參數 (Switch/Parameter)

Figure 4 PsInfo 參數

參數 描述
-h 顯示所有 Windows 更新。
-s 顯示系統上安裝的所有應用程式。
-d 顯示有關系統的磁碟/磁碟區資訊。
-c 以 CSV 格式輸出結果。
-t 指定 \t 預設值以外的另一種 CSV 檔案分隔符號。
Filter 只顯示符合指定篩選條件的資料。
@file 在指定的文字檔案所列的所有電腦上執行命令。

PsKill

PsKill 是適用於在本機或遠端系統上終止處理序的公用程式。用法很簡單,它可讓您迅速刪除處理序以及其所有子處理序。PsKill 的使用方式與我先前討論的其他工具很類似:

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

請注意,您可以指定所要刪除的處理器識別碼或處理器名稱。

PsList

我不常使用 PsList,因為我是 Process Explorer 的愛用者 (詳細資訊請參閱 microsoft.com/technet/sysinternals/ProcessesAndThreads/ProcessExplorer.mspx)。不過由於 Process Explorer 沒有可遠端處理的版本,因此 PsList 理所當然成為 Process Explorer 提供的某些關鍵功能的代用品。實際上,PsList 是一份可遠端處理清單,其中包含在遠端系統上執行的一個或多個處理序。

PsList 的使用方式很簡單:

PsList \\computer -u username -p password 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 排除包含指定事件識別碼的事件 (最多可指定 10 個)。
-f 篩選事件類型 (警告、錯誤...等等)。
-g 將事件記錄檔匯出成 EVT 檔案 (需要使用 -c 參數)。
-h 只顯示指定小時數的資訊。
-l 從指定的 EVT 檔案傾印。
-m 只顯示指定分鐘數的資訊。
-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 時,命令是指 [圖 7] 所列的其中一個命令,而選項則會指定要套用到特定命令的屬性。若未提供額外的命令參數,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 來取得處理序識別碼。將處理序暫止之後,可以使用 -r 參數來繼續執行該處理序。請注意,Process Explorer 也實作了暫止及繼續執行處理序的概念,但只適用於本機。顯然 PsSuspend 能夠在遠端與本機上暫止和繼續執行處理序,在這點上它比 Process Explorer 的內建實作更有優勢。

結論

我發覺 PsTools 組合是很寶貴的公用程式集。當我在系統中重新安裝 Windows 時,相較於其他 Sysinternals 公用程式 (即 Regmon、Filemon、Process Explorer 以及現在的 Process Monitor),PsTools 是第一個放入我的路徑中的程式。如果您之前不熟悉 PsTools,我希望本專欄能夠帶領您認識這套工具,如果您已經知道 PsTools,那麼我希望您在此能獲得有關此工具的一些額外知識。當然我要特別感謝 Mark Russinovich 這麼多年來免費提供這些工具,並且在我撰寫這篇專欄時提供內容上的協助。

Wes Miller 是 Pluck 公司 (www.pluck.com) 的開發經理,該公司位於美國德州的奧斯丁。Wes 之前任職於同樣位在奧斯丁的 Winternals Software,並且曾在 Microsoft 擔任 Windows 的專案經理與產品經理。Wes 的聯絡方式為 technet@getwired.com

© 2008 Microsoft Corporation and CMP Media, LLC. 保留所有權利;未經允許,嚴禁部分或全部複製.