■ 河南 郭建偉
編者按:對于網絡管理員來說,經常需要配置各種服務器,在其中安裝不同的角色和功能,來保障其可以為客戶端提供服務。在很多情況下,需要使用遠程管理的方式,來完成這些配置操作。
除了使用遠程桌面等常規遠控方式外,還可以使用PowerShell來實現。對于PowerShell來說,可以使用多種協議和方式,來執行遠程管理操作。
PowerShell可以使用RPC或者DCOM方式,來連接遠程主機。
例如執行“Get-Process”命令,可以顯示當前主機的進程信息。
執 行“Get-Process-ComputerName server1.xxx.com”命令,可以顯示遠程主機的進程信息,這里的“server1.xxx.com”為假設的目標主機。
注意:如果權限不足的話,是無法正常執行的。
為此可以在Windows PowerShell快捷菜單的右鍵菜單上的點擊“以其他用戶身份運行”項,輸入合適的賬戶名和密碼,即可順利執行以上命令。
對于該賬戶來說,必須擁有目標主機本地管理員的身份。但是,當連接某些服務器時,使用RPC方式可能會失敗。因為PRC協議使用的TCP 135/445等端口,如果遠程主機開啟了Windows防火墻,并且沒有啟用RPC例外的話,這種連接方式是無法實現的。
為此可以執行“Enter-PSSession server1.xxx.com”命令,打開和目標主機的遠程會話界面,執行“Get-NetFirewallRule | where{$_.name -like "*FPS*"}”命令,來查看和該機防火墻上和文件與打印共享相關的規則。
執 行“Get-NetFirewallRule | where{$_.name -like "*FPS*"}| Enable- NetFirewall Rule”命令,來開啟RPC協議的例外規則。執行“exit”命令,退出遠程會話界面。再 次 執 行“Get-Process-ComputerName srv.xxx.com”命令,就可以順利執行了。當然,具體的管理命令還有很多,例如執行“Get-EventLog -ComputerName server1.xxx.com -LogName Application -Newest 100”命令,可以查看目標主機日志中和應用程序有關的前100條日志信息。執行“Get-Service -ComputerName server1.xxx.com | where{$_.Status -eq "stopped"}”命令,可以查看目標主機上處于停止狀態服務。使用WMI方式實現遠程連接
除了使用RPC/DOM方 式 外,PowerShell還 可 以 使 用 WMI(即Windos Management I n s t r u m e n t a t i o n,Windows管理規范)方式進行遠程管理。
例 如,執 行“Get-WmiObject -Class Win32_OperatingSYstem | ft name”命令,可以顯示當前主機的描述信息。
執 行“Get-W m i O b j e c t -C l a s s Win32_OperatingSYstem-ComputerName xxx”命令,可以獲取目標主機的信息,其中的“xxx”為目標主機名稱。
如 果 出 現“Get-WmiObject :PRC 服務器不可用”的錯誤信息,當使用上述方法排除了RPC相關的問題外,還說明了要想使用WMI方式進行遠程管理,必須在目標主機的防火墻開啟和WMI相關的例外。

圖1 設置合適的憑據信息
執 行 上 述“Enter-PSSesion”命令連接到遠 程 主 機,執 行“Get-NetFirewallRule | where{$_.name -like "*WMI*"}”命令,會顯示和WMI相關的防火墻規則。執行“Get-NetFirewallRule | Enable-NetFirewallRule”命令,開啟和WMI相關的例外。執行“exit”命令退出。
執 行“Get-W m i O b j e c t -C l a s s Win32_OperatingSystem-ComputerName server1.xxx.com | ft caption”命令,就可以顯示目標主機的版本信息。
如果依然失敗,并顯示“Get-WmiObject :拒絕訪問”的信息,說明當前使用的賬戶權限不足。
為此可以執行“Get-WmiObject Win32_Operating System-Credentialxxxa d m i n i s t r a t o r-ComputerName server1.xxx.com”命令,使用指定的賬戶(這里為域賬戶)進行訪問即可,這里的“xxx”為具體的域名。
如果在執行“Enter-PSSesion”命令時,出現“連接遠程服務器失敗,拒絕訪問”的提示,說明依然是當前賬戶權限不足所致。為此可以執行“$cred =Get-Credential”命令,定義一個變量,用來獲取用戶信息。
在自動打開的Windows PowerShell憑據請求窗口(如圖1)中輸入合適的賬戶名(例如域管理員等)和密碼。之后執行“Enter-PSSession xxx -Credential$cred”命令,使用設定的賬戶進行連接即可。
對于WMI來說,還可以使用“Get-CimInstance”命令加以操作。例如,執行“Get-CimInstance -Classname Win32_OperatingSystem-ComputerName server1.xxx.com”命令,來查詢目標主機的版本信息。
對于以上方式來說,都必須開啟文件和打印功能功能,對應的需要在防火墻上為其開啟例外。這必然需要開啟TCP 135/139/445等端口,在內網環境中比較容易解決,但是目標主機位于Internet上,操作起來就比較困難了。
例如,在Azure公有云上,可能會運行很多服務器,如果希望通過PowerShell方式對其進行遠程管理,想在這些云端主機上開啟防火墻例外的話,就顯得很不方便了。使用WSMangemnt方式,可以很好地解決上述的問題。
相對于RPC/WMI方式來說,使用WSMan方式可以很容易地在防火墻開啟例外。WSMan默認使用TCP 5985/5986端口,使用后一個端口進行連接的話,需要和證書進行綁定。
實際上,即使使用前一個端口進行連接,依然可以進行加密處理。在Windows中使用名為WinRM的服務,來管理和配置WSMan協議。
從Windows Server 2012開始,WSMan協議默認處于自動開啟狀態。
可以使用兩種方式,來發揮WSMan的功能,一種是利用“Enter-PSSession”命令,來直接進入到遠程主機中,執行各種指令。
注 意:當 使 用“Enter-PSSession”命令連接Windows Server 2008 R2主機時,可能會出現“連接到遠程服務器失敗,WinRM無法完成該操作”的提示,這是因為在默認情況下,在Windows Server 2008 R2中并沒有啟用PowerShell遠程管理功能。
在Windows Server 2008 R2主機上打開PowerShell窗 口, 執 行“Enable-PSRemoting”命令,來啟動WinRM服務,并將其設置為自動啟動狀態,創建一個偵聽器以接收任意IP地址的連接請求,對WS-Management流量啟用防火墻例外。
執 行“Get-PSSessionConfiguration”命令,查看相關的配置信息。這樣,就可以順利進行連接了。
當連接成功后,如果在目標主機上執行“netstat-an”命令,會查看到端口為TCP 5985的偵聽項目。另一種是使用“Invoke-Command”命令,將相關指令發送到目標主機上運行。
例 如,執 行“Invoke-Command -ComputerName s e r v e r 1.x x x.c o m-ScriptBlock {Get-Process}”命令,可以連接到目標主機,并在其上執行“Get-Process”命令,來查看其進程信息。
在其中的“-ScriptBloc k”參數中可以包含具體的指令,例如包含“{Get-WmiObject Win32_OperatingSystem | ft caption}”命令,則顯示該主機的版本信息。
如 果 執 行“Invoke-Command”命令時,出現拒絕訪問的提示,那么就說明當前的賬戶權限不足。
執 行“Invoke-Command-ComputerName server1.xxx.com -ScriptBlock {Get-Process} –Credential$cred”命令,使用指定的賬戶進行連接即可。
利用“Invoke-Command”指令,可以進行批量查詢操作。
例 如, 執 行Invoke-Command -ComputerName server1.xxx.com,server2.xxx.com -ScriptBlock {Get-Process}命令,可以同時查詢多臺主機的信息。