大多數剛入門的管理員都習慣使用 RDP 或其它類似的工具連接到遠程 Windows 中進行圖形化管理。而 PowerShell 及 PsTools 等工具可以幫助我們在命令行中執行相當多的管理任務,更主要的是可以將其寫成腳本來執行周期性重復任務或在管理大批量服務器時提高效率。
在企業環境中掌握更多的命令行工具不僅可以節省時間,以更聰明和智能的方式完成工作,更是一個系統管理員所必需掌握的關鍵技能。
作為 Sysinternals 工具包中的一個子集,PsTools 本身就有十來個命令行小工具,下面我們會逐個為大家進行介紹:
PsExec – 在遠程計算機執行命令
PsFile – 查看打開的網絡文件
PsGetSid – 獲取 Machine SID
PsInfo – 查看簡要系統信息
PsKill – 按進程名或PID殺掉進程
PsList – 列出進程信息
PsLoggedOn – 顯示已登的會話
PsLogList – 命令行獲取 event log
PsPasswd – 更改用戶密碼
PsPing – 簡單的tcp/udp連接測試工具
PsService – Windows 服務管理命令
PsShutdown – 關機、注銷命令
PsSuspend – 暫停或恢復某個進程
以上所有命令都可以直接在本地計算機上使用,不過 PsTools 設計出來就是為了方便對遠程 PC 進行管理的。
連接遠程計算機
PsTools 所有工具連接遠程計算機都可以使用同一個通用語法,例如:
psinfo \pc1,pc2,pc3
雙斜杠后面可以直接跟計算機名(可以解析netbios)、IP 地址或 FQDN,也可以在命令后跟多臺計算機以實現批量。
如果你不是以域管理員等有權限的用戶來執行命令、沒有域環境或者需要手動指定有權限的遠程用戶,可用 -u 參數指定用戶,-p 參數指定密碼。
psinfo \computername –u user –p Password
如果是域環境,需要將用戶寫為「DOMAINuser」樣式。
配置遠程管理權限
PsTools 工具在域中可以工作得非常好,管理員不必考慮過多的權限問題。但對于工作組環境中的 Windows Vista/7/8/10,需要調整遠程計算機上的用戶賬戶控制(UAC)之后 PsTools 工具才能正常運行。
即便你是遠程目標 PC 的 Local Administrators 組成員,在使用命令行進行遠程連接時還是會使用類似 net use * \remotecomputerShare$ 的方式,這不被 Windows 視為有完全管理員權限。因為連接到遠程計算機需要有權限才能執行管理任務,命令行連接方式也無法觸發 UAC,所以直接遠程連接使用 PsTools 工具遠程連接工作組計算機會報權限錯誤。
要保證 PsTools 工具能在工作組環境中正常使用,你需要更改注冊表:
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionPoliciesSystem
在上述注冊表路徑中創建一個名為 LocalAccountTokenFilterPolicy 的 32 位 DWORD 值,并將其值設置為 1 即可。
PsExec
PsExec 是 PsTools 工具系列中最為常用的一個命令行工具,它可以讓我們在本地或遠程計算機上「運行」任何東西,包括更改注冊表、執行腳本或應用程序等。參數類似:
psexec \計算機名 apptorun.exe
例如你想查看某個遠程計算機的 TCP/IP 配置,可以使用如下命令:
psexec \計算機名 -u User -p Password ipconfig
如果你將命令輸出重定向到一個文件中,可以使用常見的 command.exe > output.txt 方式,這種方式對 PsExec 命令同樣適用,例如我們可以使用類似如下命令將 netstat -an 的輸出保存到本地文本文件中:
psexec \計算機名 netstat -an > C:
etstat.txt
如果你想將命令的重定向輸出結果直接保存到遠程 PC 當中,可以使用很少有人知道的 ^?這個Windows 命令行轉義符,例如:
psexec \計算機名 cmd /c netstat -an ^> C:userssysgeek
etstat.txt
拷貝命令到遠程PC
有時我們需要執行的 CDM 外部命令并沒有存在于遠程計算機當中,此時我們可以使用 PsExec 的 -c 參數來指定一個存放于管理員本地的外部命令或應用。當我們執行命令時,PsExec 會自動將所指定的應用復制到遠程 PC 中執行,并在執行完成后自動刪除。例如:
psexec \計算機名 -c autorunsc.exe –accepteula
PsFile
psfile 命令可以顯示本地或遠程 PC 中通過網絡打開的文件,其類似于命令行中的 net file 命令,及我們之前介紹過的 NetworkOpenedFiles 圖形界面工具。
psfile \計算機名
如果你想中斷某個共享的訪問連接,可以使用 -c 參數:
psfile \計算機名 –c
PsInfo
PsInfo 主要用于顯示 Windows 操作系統版本、系統運行時長及個別硬件的簡單信息,如果你想獲取更詳盡的信息,可以使用 -d(磁盤信息)、-h(補丁信息)、-s(已知應用程序版本列表)參數,這樣一來就比較像 Windows 內置的 systeminfo 命令行了。
psinfo -d -h -s
注意:要使用 PsInfo 獲取遠程計算機信息,目標 PC 必需啟用了 Remote Registry 服務。
PsGetSid
PsGetSid 功能非常簡單,就是用于獲取 Machine SID 的。
PsKill
PsKill 看名稱就不難猜,它可按進程名或 PID 結束進程,使用 -t 參數可以殺掉整個進程樹。
pskill \計算機名
PsList
PsList 非常簡單,它可以通過列表方式看到進程的幾乎所有信息,包括線程數。
PsLoggedOn
PsLoggedOn 命令主要用于查看本地或遠程 PC 上當前登錄的用戶信息,對于系統管理員來說非常實用。
PsPing
PsPing 是一個可對指定端口進行 TCP 或 UDP 連接測試的工具,該工具可用于替代 telnet 命令進行連接測試,我個人經常用其來測試連接 Azure 各項服務的響應速度。
psping IP地址或域名:80
PsPasswd
PsPasswd 用于快速更改本地或遠程 PC 的用戶密碼,例如:
pspasswd \計算機名 -u User -p Password
該命令相較 net user 的好處在于可以一次性批量修改多臺計算機的密碼,對于域管理員批量重置某些本地賬戶密碼時非常有用。
PsShutdown
該命令主要是針對早期 Windows XP 用戶設計,現在 Windows 中內置的 Shutdown.exe 命令已經非常強大了,所以使用較少。我們還是可以使用 PsShutdown 的 -d 參數讓計算機進入睡眠模式。
PsSuspend
該命令行工具與 PsKill 比較類似但不是殺掉進程,它主要用于暫停某個進程的工作。
pssuspend \計算機名
要將已暫停的進程恢復到工作狀態,只需加上 -r 參數即可。
PsService
PsService 命令行工具可操作 Windows 中的各種服務,其語法如下:
psservice \計算機名
例如,要啟用某個服務時,命令行如下:
psservice \計算機名 start
用的操作有start(啟動)、stop(停止)、pause(暫停)、restart(重啟),要查看詳細參數可以使用 PsService /?。
該工具與 Windows 內置的 sc.exe 命令比較類似,但使用 PsService 對管理員更友好。
PsLogList
PsLogList 顧名思義是用于查看本地或遠程 PC 中的 Event Log(事件日志)的命令行工具,它內有很好用的數據篩選功能。
psloglist \計算機名
其中的 -h、-d、-m 參數可以按小時、天、月來縮小返回的事件時間范圍,-n 參數用于指定要返回的條數,-r 可以反向排序。例如我們要查看遠程計算機中近 1 小時的 3 個事件日志,可以使用:
psloglist \計算機名 -h 1 -n 3