PowerShell ระยะไกล
PowerShell มีหลายวิธีในการรันคำสั่งกับคอมพิวเตอร์ระยะไกล ในบทที่แล้ว คุณได้เห็นวิธีการสืบค้น WMI จากระยะไกลโดยใช้ CIM cmdlets PowerShell ยังมี cmdlets หลายตัวที่มีพารามิเตอร์ ComputerName ในตัว
ดังที่แสดงในตัวอย่างต่อไปนี้ Get-Command สามารถใช้กับพารามิเตอร์ ParameterName เพื่อกำหนดว่าคำสั่งใดมีพารามิเตอร์ ComputerName
Get-Command -ParameterName ComputerName
CommandType Name Version Source
----------- ---- ------- ------
Cmdlet Add-Computer 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Clear-EventLog 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Connect-PSSession 3.0.0.0 Microsoft.PowerShell.Core
Cmdlet Enter-PSSession 3.0.0.0 Microsoft.PowerShell.Core
Cmdlet Get-EventLog 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Get-HotFix 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Get-Process 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Get-PSSession 3.0.0.0 Microsoft.PowerShell.Core
Cmdlet Get-Service 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Get-WmiObject 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Invoke-Command 3.0.0.0 Microsoft.PowerShell.Core
Cmdlet Invoke-WmiMethod 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Limit-EventLog 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet New-EventLog 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet New-PSSession 3.0.0.0 Microsoft.PowerShell.Core
Cmdlet Receive-Job 3.0.0.0 Microsoft.PowerShell.Core
Cmdlet Receive-PSSession 3.0.0.0 Microsoft.PowerShell.Core
Cmdlet Register-WmiEvent 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Remove-Computer 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Remove-EventLog 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Remove-PSSession 3.0.0.0 Microsoft.PowerShell.Core
Cmdlet Remove-WmiObject 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Rename-Computer 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Restart-Computer 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Send-MailMessage 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Set-Service 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Set-WmiInstance 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Show-EventLog 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Stop-Computer 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Test-Connection 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Write-EventLog 3.1.0.0 Microsoft.PowerShell.Management
คำสั่งเช่น Get-Process และ Get-Hotfix มีพารามิเตอร์ ComputerName นี่ไม่ใช่ทิศทางระยะยาวที่ Microsoft กำลังมุ่งหน้าสู่การรันคำสั่งกับคอมพิวเตอร์ระยะไกล แม้ว่าคุณจะพบคำสั่งที่มีพารามิเตอร์ ComputerName ก็มีโอกาสที่คุณจะต้องระบุข้อมูลรับรองอื่น และคำสั่งนั้นจะไม่มีพารามิเตอร์ ข้อมูลรับรอง และหากคุณตัดสินใจเรียกใช้ PowerShell จากบัญชีที่ยกระดับ ไฟร์วอลล์ระหว่างคุณกับคอมพิวเตอร์ระยะไกลสามารถบล็อกคำขอได้
เมื่อต้องการใช้คำสั่งระยะไกลของ PowerShell ที่แสดงในบทนี้ จะต้องเปิดใช้งานการควบคุมระยะไกลของ PowerShell บนคอมพิวเตอร์ระยะไกล ใช้ cmdlet Enable-PSRemoting เพื่อเปิดใช้งาน PowerShell จากระยะไกล
Enable-PSRemoting
WinRM has been updated to receive requests.
WinRM service type changed successfully.
WinRM service started.
WinRM has been updated for remote management.
WinRM firewall exception enabled.
ระยะไกลแบบตัวต่อตัว
หากคุณต้องการให้เซสชันระยะไกลของคุณเป็นแบบโต้ตอบ การควบคุมระยะไกลแบบหนึ่งต่อหนึ่งคือสิ่งที่คุณต้องการ การควบคุมระยะไกลประเภทนี้มีให้ผ่านทาง cmdlet Enter-PSSession
ในบทที่แล้ว ฉันจัดเก็บข้อมูลประจำตัวผู้ดูแลระบบโดเมนของฉันไว้ในตัวแปรชื่อ $Cred หากคุณยังไม่ได้ดำเนินการ ให้จัดเก็บข้อมูลประจำตัวผู้ดูแลระบบโดเมนของคุณในตัวแปร $Cred
ซึ่งจะทำให้คุณสามารถป้อนข้อมูลประจำตัวได้เพียงครั้งเดียวและใช้งานได้ตามคำสั่งตราบใดที่เซสชัน PowerShell ปัจจุบันของคุณยังทำงานอยู่
$Cred = Get-Credential
สร้างเซสชันระยะไกล PowerShell แบบหนึ่งต่อหนึ่งไปยังตัวควบคุมโดเมนชื่อ dc01
Enter-PSSession -ComputerName dc01 -Credential $Cred
[dc01]: PS C:\Users\Administrator\Documents>
โปรดสังเกตว่าในตัวอย่างก่อนหน้านี้ที่พรอมต์ PowerShell นำหน้าด้วย [dc01] ซึ่งหมายความว่าคุณอยู่ในเซสชัน PowerShell แบบโต้ตอบกับคอมพิวเตอร์ระยะไกลชื่อ dc01 คำสั่งใดๆ ที่คุณดำเนินการจะทำงานบน dc01 ไม่ใช่บนเครื่องคอมพิวเตอร์ของคุณ นอกจากนี้ โปรดทราบว่าคุณมีสิทธิ์เข้าถึงเฉพาะคำสั่ง PowerShell ที่มีอยู่ในคอมพิวเตอร์ระยะไกลเท่านั้น ไม่ใช่คำสั่งบนคอมพิวเตอร์ของคุณ กล่าวอีกนัยหนึ่ง หากคุณได้ติดตั้งโมดูลเพิ่มเติมบนคอมพิวเตอร์ของคุณ จะไม่สามารถเข้าถึงได้บนคอมพิวเตอร์ระยะไกล
เมื่อคุณเชื่อมต่อกับคอมพิวเตอร์ระยะไกลผ่านเซสชันระยะไกล PowerShell แบบโต้ตอบแบบตัวต่อตัว คุณจะนั่งอยู่ที่คอมพิวเตอร์ระยะไกลอย่างมีประสิทธิภาพ วัตถุนั้นเป็นวัตถุปกติเหมือนกับวัตถุที่คุณใช้งานตลอดทั้งเล่มนี้
[dc01]: Get-Process | Get-Member
TypeName: System.Diagnostics.Process
Name MemberType Definition
---- ---------- ----------
Handles AliasProperty Handles = Handlecount
Name AliasProperty Name = ProcessName
NPM AliasProperty NPM = NonpagedSystemMemorySize64
PM AliasProperty PM = PagedMemorySize64
SI AliasProperty SI = SessionId
VM AliasProperty VM = VirtualMemorySize64
WS AliasProperty WS = WorkingSet64
Disposed Event System.EventHandler Disposed(System.Object, ...
ErrorDataReceived Event System.Diagnostics.DataReceivedEventHandler ...
Exited Event System.EventHandler Exited(System.Object, Sy...
OutputDataReceived Event System.Diagnostics.DataReceivedEventHandler ...
BeginErrorReadLine Method void BeginErrorReadLine()
BeginOutputReadLine Method void BeginOutputReadLine()
CancelErrorRead Method void CancelErrorRead()
CancelOutputRead Method void CancelOutputRead()
Close Method void Close()
CloseMainWindow Method bool CloseMainWindow()
CreateObjRef Method System.Runtime.Remoting.ObjRef CreateObjRef(...
Dispose Method void Dispose(), void IDisposable.Dispose()
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetLifetimeService Method System.Object GetLifetimeService()
GetType Method type GetType()
InitializeLifetimeService Method System.Object InitializeLifetimeService()
Kill Method void Kill()
Refresh Method void Refresh()
Start Method bool Start()
ToString Method string ToString()
WaitForExit Method bool WaitForExit(int milliseconds), void Wai...
WaitForInputIdle Method bool WaitForInputIdle(int milliseconds), boo...
__NounName NoteProperty string __NounName=Process
BasePriority Property int BasePriority {get;}
Container Property System.ComponentModel.IContainer Container {...
EnableRaisingEvents Property bool EnableRaisingEvents {get;set;}
ExitCode Property int ExitCode {get;}
ExitTime Property datetime ExitTime {get;}
Handle Property System.IntPtr Handle {get;}
HandleCount Property int HandleCount {get;}
HasExited Property bool HasExited {get;}
Id Property int Id {get;}
MachineName Property string MachineName {get;}
MainModule Property System.Diagnostics.ProcessModule MainModule ...
MainWindowHandle Property System.IntPtr MainWindowHandle {get;}
MainWindowTitle Property string MainWindowTitle {get;}
MaxWorkingSet Property System.IntPtr MaxWorkingSet {get;set;}
MinWorkingSet Property System.IntPtr MinWorkingSet {get;set;}
Modules Property System.Diagnostics.ProcessModuleCollection M...
NonpagedSystemMemorySize Property int NonpagedSystemMemorySize {get;}
NonpagedSystemMemorySize64 Property long NonpagedSystemMemorySize64 {get;}
PagedMemorySize Property int PagedMemorySize {get;}
PagedMemorySize64 Property long PagedMemorySize64 {get;}
PagedSystemMemorySize Property int PagedSystemMemorySize {get;}
PagedSystemMemorySize64 Property long PagedSystemMemorySize64 {get;}
PeakPagedMemorySize Property int PeakPagedMemorySize {get;}
PeakPagedMemorySize64 Property long PeakPagedMemorySize64 {get;}
PeakVirtualMemorySize Property int PeakVirtualMemorySize {get;}
PeakVirtualMemorySize64 Property long PeakVirtualMemorySize64 {get;}
PeakWorkingSet Property int PeakWorkingSet {get;}
PeakWorkingSet64 Property long PeakWorkingSet64 {get;}
PriorityBoostEnabled Property bool PriorityBoostEnabled {get;set;}
PriorityClass Property System.Diagnostics.ProcessPriorityClass Prio...
PrivateMemorySize Property int PrivateMemorySize {get;}
PrivateMemorySize64 Property long PrivateMemorySize64 {get;}
PrivilegedProcessorTime Property timespan PrivilegedProcessorTime {get;}
ProcessName Property string ProcessName {get;}
ProcessorAffinity Property System.IntPtr ProcessorAffinity {get;set;}
Responding Property bool Responding {get;}
SafeHandle Property Microsoft.Win32.SafeHandles.SafeProcessHandl...
SessionId Property int SessionId {get;}
Site Property System.ComponentModel.ISite Site {get;set;}
StandardError Property System.IO.StreamReader StandardError {get;}
StandardInput Property System.IO.StreamWriter StandardInput {get;}
StandardOutput Property System.IO.StreamReader StandardOutput {get;}
StartInfo Property System.Diagnostics.ProcessStartInfo StartInf...
StartTime Property datetime StartTime {get;}
SynchronizingObject Property System.ComponentModel.ISynchronizeInvoke Syn...
Threads Property System.Diagnostics.ProcessThreadCollection T...
TotalProcessorTime Property timespan TotalProcessorTime {get;}
UserProcessorTime Property timespan UserProcessorTime {get;}
VirtualMemorySize Property int VirtualMemorySize {get;}
VirtualMemorySize64 Property long VirtualMemorySize64 {get;}
WorkingSet Property int WorkingSet {get;}
WorkingSet64 Property long WorkingSet64 {get;}
PSConfiguration PropertySet PSConfiguration {Name, Id, PriorityClass, Fi...
PSResources PropertySet PSResources {Name, Id, Handlecount, WorkingS...
Company ScriptProperty System.Object Company {get=$this.Mainmodule....
CPU ScriptProperty System.Object CPU {get=$this.TotalProcessorT...
Description ScriptProperty System.Object Description {get=$this.Mainmod...
FileVersion ScriptProperty System.Object FileVersion {get=$this.Mainmod...
Path ScriptProperty System.Object Path {get=$this.Mainmodule.Fil...
Product ScriptProperty System.Object Product {get=$this.Mainmodule....
ProductVersion ScriptProperty System.Object ProductVersion {get=$this.Main...
[dc01]:
เมื่อคุณทำงานกับคอมพิวเตอร์ระยะไกลเสร็จแล้ว ให้ออกจากเซสชันระยะไกลแบบหนึ่งต่อหนึ่งโดยใช้ cmdlet Exit-PSSession
[dc01]: Exit-PSSession
ระยะไกลแบบหนึ่งต่อหลาย
บางครั้งคุณอาจต้องทำงานแบบโต้ตอบบนคอมพิวเตอร์ระยะไกล แต่การทำงานระยะไกลจะมีประสิทธิภาพมากกว่ามากเมื่อทำงานบนคอมพิวเตอร์ระยะไกลหลายเครื่องพร้อมกัน ใช้ Inrigger-Command cmdlet เพื่อเรียกใช้คำสั่งกับคอมพิวเตอร์ระยะไกลอย่างน้อยหนึ่งเครื่องในเวลาเดียวกัน
Invoke-Command -ComputerName dc01, sql02, web01 {Get-Service -Name W32time} -Credential $Cred
Status Name DisplayName PSComputerName
------ ---- ----------- --------------
Running W32time Windows Time web01
Start... W32time Windows Time dc01
Running W32time Windows Time sql02
ในตัวอย่างก่อนหน้านี้ มีการสอบถามเซิร์ฟเวอร์สามเครื่องสำหรับสถานะของบริการ Windows Time Get-Service cmdlet ถูกวางไว้ภายในบล็อกสคริปต์ของ Inrigger-Command Get-Service ทำงานบนคอมพิวเตอร์ระยะไกลจริง ๆ และผลลัพธ์จะถูกส่งกลับไปยังเครื่องคอมพิวเตอร์ของคุณเป็นวัตถุดีซีเรียลไลซ์
การไพพ์คำสั่งก่อนหน้าเพื่อ Get-Member แสดงว่าผลลัพธ์เป็นอ็อบเจ็กต์ดีซีเรียลไลซ์จริงๆ
Invoke-Command -ComputerName dc01, sql02, web01 {Get-Service -Name W32time} -Credential $Cred | Get-Member
TypeName: Deserialized.System.ServiceProcess.ServiceController
Name MemberType Definition
---- ---------- ----------
GetType Method type GetType()
ToString Method string ToString(), string ToString(string format, Sys...
Name NoteProperty string Name=W32time
PSComputerName NoteProperty string PSComputerName=sql02
PSShowComputerName NoteProperty bool PSShowComputerName=True
RequiredServices NoteProperty Deserialized.System.ServiceProcess.ServiceController[...
RunspaceId NoteProperty guid RunspaceId=570313c4-ac84-4109-bf67-c6b33236af0a
CanPauseAndContinue Property System.Boolean {get;set;}
CanShutdown Property System.Boolean {get;set;}
CanStop Property System.Boolean {get;set;}
Container Property {get;set;}
DependentServices Property Deserialized.System.ServiceProcess.ServiceController[...
DisplayName Property System.String {get;set;}
MachineName Property System.String {get;set;}
ServiceHandle Property System.String {get;set;}
ServiceName Property System.String {get;set;}
ServicesDependedOn Property Deserialized.System.ServiceProcess.ServiceController[...
ServiceType Property System.String {get;set;}
Site Property {get;set;}
StartType Property System.String {get;set;}
Status Property System.String {get;set;}
ขอให้สังเกตว่าวิธีการส่วนใหญ่หายไปบนวัตถุดีซีเรียลไลซ์ ซึ่งหมายความว่าพวกมันไม่ใช่วัตถุที่มีชีวิต พวกมันเฉื่อย คุณไม่สามารถเริ่มหรือหยุดบริการโดยใช้วัตถุดีซีเรียลไลซ์ได้ เนื่องจากเป็นสแนปช็อตของสถานะของวัตถุนั้น ณ จุดที่คำสั่งรันบนคอมพิวเตอร์ระยะไกล
นั่นไม่ได้หมายความว่าคุณไม่สามารถเริ่มหรือหยุดบริการโดยใช้วิธีการที่มี Invoke-Command ได้ หมายความว่าจะต้องเรียกใช้เมธอดนี้ในเซสชันระยะไกล
ฉันจะหยุดบริการ Windows Time บนเซิร์ฟเวอร์ระยะไกลทั้งสามเครื่องโดยใช้วิธี Stop() เพื่อพิสูจน์จุดนี้
Invoke-Command -ComputerName dc01, sql02, web01 {(Get-Service -Name W32time).Stop()} -Credential $Cred
Invoke-Command -ComputerName dc01, sql02, web01 {Get-Service -Name W32time} -Credential $Cred
Status Name DisplayName PSComputerName
------ ---- ----------- --------------
Stopped W32time Windows Time web01
Stopped W32time Windows Time dc01
Stopped W32time Windows Time sql02
ตามที่กล่าวไว้ในบทที่แล้ว หากมี cmdlet ในการทำงานให้สำเร็จ ฉันขอแนะนำให้ใช้แทนการใช้เมธอด ในสถานการณ์ก่อนหน้านี้ ฉันแนะนำให้ใช้ cmdlet Stop-Service แทนวิธีการหยุด ฉันเลือกใช้เมธอด Stop() เพื่อพิสูจน์ประเด็นหนึ่ง เนื่องจากมีคนจำนวนมากอยู่ภายใต้ความเข้าใจผิดว่าไม่สามารถเรียกใช้เมธอดได้เมื่อใช้ระยะไกลของ PowerShell ไม่สามารถเรียกวัตถุเหล่านั้นบนออบเจ็กต์ที่ส่งคืนได้เนื่องจากมีการดีซีเรียลไลซ์ แต่สามารถเรียกได้ในเซสชันระยะไกลเอง
เซสชัน PowerShell
ในตัวอย่างสุดท้ายในส่วนก่อนหน้า ฉันรันสองคำสั่งโดยใช้ Inrigger-Command cmdlet นั่นหมายความว่าต้องตั้งค่าและแยกเซสชันสองเซสชันแยกกันเพื่อรันสองคำสั่งนั้น
เช่นเดียวกับเซสชัน CIM ที่กล่าวถึงในบทที่ 7 เซสชัน PowerShell ไปยังคอมพิวเตอร์ระยะไกลสามารถใช้เพื่อเรียกใช้หลายคำสั่งกับคอมพิวเตอร์ระยะไกลโดยไม่มีค่าใช้จ่ายในเซสชันใหม่สำหรับแต่ละคำสั่ง
สร้างเซสชัน PowerShell ให้กับคอมพิวเตอร์แต่ละเครื่องจากสามเครื่องที่เราร่วมงานด้วยในบทนี้ ได้แก่ DC01, SQL02 และ WEB01
$Session = New-PSSession -ComputerName dc01, sql02, web01 -Credential $Cred
ตอนนี้ใช้ตัวแปรชื่อ $Session เพื่อเริ่มบริการ Windows Time โดยใช้วิธีการและตรวจสอบสถานะของบริการ
Invoke-Command -Session $Session {(Get-Service -Name W32time).Start()}
Invoke-Command -Session $Session {Get-Service -Name W32time}
Status Name DisplayName PSComputerName
------ ---- ----------- --------------
Running W32time Windows Time web01
Start... W32time Windows Time dc01
Running W32time Windows Time sql02
เมื่อเซสชั่นถูกสร้างขึ้นโดยใช้ข้อมูลรับรองอื่น ไม่จำเป็นต้องระบุข้อมูลรับรองทุกครั้งที่รันคำสั่งอีกต่อไป
เมื่อคุณใช้เซสชันเสร็จแล้ว อย่าลืมลบออก
Get-PSSession | Remove-PSSession
สรุป
ในบทนี้ คุณได้เรียนรู้เกี่ยวกับการทำงานระยะไกลของ PowerShell วิธีเรียกใช้คำสั่งในเซสชันแบบโต้ตอบกับคอมพิวเตอร์ระยะไกลเครื่องเดียว และวิธีการเรียกใช้คำสั่งกับคอมพิวเตอร์หลายเครื่องโดยใช้การควบคุมระยะไกลแบบหนึ่งต่อหลายเครื่อง คุณยังได้เรียนรู้ถึงประโยชน์ของการใช้เซสชัน PowerShell เมื่อเรียกใช้หลายคำสั่งกับคอมพิวเตอร์ระยะไกลเครื่องเดียวกัน
ทบทวน
- คุณจะเปิดใช้งานระยะไกล PowerShell ได้อย่างไร
- คำสั่ง PowerShell สำหรับเริ่มเซสชันแบบโต้ตอบกับคอมพิวเตอร์ระยะไกลคืออะไร
- ประโยชน์ของการใช้เซสชันระยะไกลของ PowerShell เทียบกับเพียงการระบุชื่อคอมพิวเตอร์ด้วยแต่ละคำสั่งคืออะไร
- สามารถใช้เซสชันระยะไกลของ PowerShell กับเซสชันระยะไกลแบบตัวต่อตัวได้หรือไม่
- อะไรคือความแตกต่างในประเภทของออบเจ็กต์ที่ส่งคืนโดย cmdlets เทียบกับที่ส่งคืนเมื่อเรียกใช้ cmdlets เดียวกันเหล่านั้นกับคอมพิวเตอร์ระยะไกลด้วย
Invive-Command
แนะนำให้อ่าน
- เกี่ยวกับ_รีโมท
- เกี่ยวกับ_Remote_Output
- เกี่ยวกับ_Remote_ข้อกำหนด
- เกี่ยวกับ_Remote_การแก้ไขปัญหา
- เกี่ยวกับ_Remote_Variables
- คำถามที่พบบ่อยเกี่ยวกับระยะไกลของ PowerShell