เริ่มต้นใช้งาน PowerShell Remoteting
PowerShell Remoting มีมาตั้งแต่ยุคแรกๆ ของภาษา PowerShell และอนุญาตให้เรียกใช้คำสั่งและรับเอาต์พุตระหว่างระบบระยะไกล ตามเนื้อผ้า PowerShell Remoting ถูกสร้างขึ้นบน WinRM แต่ด้วย PowerShell เวอร์ชันใหม่กว่า ขณะนี้โปรโตคอล SSH ก็พร้อมใช้งานเพื่ออำนวยความสะดวกในการรีโมทระหว่างระบบ Linux เช่นกัน ในบทความนี้ คุณจะได้เรียนรู้วิธีเริ่มต้นใช้งานระยะไกลของ PowerShell โดยเน้นที่ PowerShell เวอร์ชัน 5.1 และสูงกว่า
ข้อกำหนดและการตั้งค่า
PowerShell สมัยใหม่มีสามรูปแบบที่ยังคงใช้อย่างแพร่หลาย ขอแนะนำเป็นอย่างยิ่งให้ย้ายไปที่ PowerShell 7 เนื่องจากเป็นเวอร์ชันระยะยาว (LTS) และอัปเดตล่าสุด ที่ถูกกล่าวว่ามีสถานการณ์ที่ยังไม่สามารถทำได้
พาวเวอร์เชลล์ 5.1
นี่เป็น Windows PowerShell เวอร์ชันล่าสุดที่มาพร้อมกับระบบปฏิบัติการ Windows บริษัทจำนวนมากยังคงใช้งานอยู่ มีข้อกำหนดง่ายๆ บางประการในการทำงานจากระยะไกล
- .NET 4.6.2 ติดตั้งมาล่วงหน้าบน Windows Server 2016
- จัดส่งในกล่องสำหรับ Windows Server 2016 และใหม่กว่า
ในบทความนี้ เราจะมุ่งเน้นไปที่ Windows Server 2016 เนื่องจาก Microsoft ถือว่าเวอร์ชันก่อนหน้านี้หมดอายุการใช้งานแล้ว
โปรดทราบว่าตามค่าเริ่มต้น Windows PowerShell จะสร้างจุดสิ้นสุดเซสชัน microsoft.powershell Enter-PSSession และ New-PSSession จะใช้ตำแหน่งข้อมูลนี้เมื่อไม่ได้ระบุตำแหน่งข้อมูลเซสชันอื่น เนื่องจาก PowerShell เวอร์ชันใหม่กว่าไม่ได้สร้างหรือแทนที่ตำแหน่งข้อมูลนี้ จึงต้องระบุชื่อตำแหน่งข้อมูลเพื่อเชื่อมต่อกับอินสแตนซ์ระยะไกลที่ถูกต้อง หากไม่ได้เชื่อมต่อกับ Windows PowerShell ตัวอย่างของการกำหนดค่า Windows PowerShell เริ่มต้นอยู่ด้านล่าง (รูปที่ 1)
รูปที่ 1: การกำหนดค่าเริ่มต้นของ Windows PowerShell
PowerShell คอร์ (6.x)
PowerShell Core มาพร้อมกับไฟล์ .NET Core ที่จำเป็นซึ่งรวมอยู่ในกล่อง มีขั้นตอนบางอย่างที่จำเป็นในการทำให้ WinRM PowerShell Remoting ทำงานได้ PowerShell Core เวอร์ชันก่อนหน้าไม่มีการรองรับ Enable-PSRemoting ที่เหมาะสม และดังนั้นจึงจำเป็นต้องมี สคริปต์การติดตั้งเพื่อย้ายไฟล์ pwrshplugin.dll ไปที่ System32 และลงทะเบียนจุดสิ้นสุด ใน PowerShell Core รุ่นล่าสุด Enable-PSRemoting ทำงานได้อย่างถูกต้อง ลงทะเบียน DLL และจุดสิ้นสุดเฉพาะเวอร์ชัน (ดังแสดงในรูปที่ 2)
หลังจากรัน Enable-PSRemoting แล้ว จะมีการลงทะเบียนตำแหน่งข้อมูลเฉพาะเวอร์ชันที่ถูกต้อง ในกรณีนี้คือ 6.2.5 (รูปที่ 3)
รูปที่ 2: การเปิดใช้งาน WinRM PowerShell Remoting ใน PowerShell Core
รูปที่ 3: จุดสิ้นสุดเฉพาะเวอร์ชันสำหรับ PowerShell Core
เหตุผลที่ระบุพารามิเตอร์ -SkipNetworkProfileCheck ก็คือเครือข่าย สาธารณะ ใดๆ จะสิ้นสุดคำสั่ง Enable-PSRemoting ก่อนกำหนด ตราบใดที่คุณทราบถึงผลที่ตามมาและการควบคุมอย่างเหมาะสม คุณสามารถรันคำสั่งนี้ได้อย่างปลอดภัย
พาวเวอร์เชลล์ 7
ในทำนองเดียวกัน PowerShell เวอร์ชันล่าสุดไม่จำเป็นต้องใช้ Install-PowerShellRemoting.ps1 script อีกต่อไป เนื่องจาก Enable-PSRemoting ลงทะเบียนทุกสิ่งที่จำเป็น ดังรูปด้านล่าง 4 โดยเรียกใช้ Enable-PSRemoting
รูปที่ 4: ผลลัพธ์ของ cmdlet Enable-PSRemoting ใน PowerShell 7
ชื่อตำแหน่งข้อมูลที่ได้รับการลงทะเบียนเพื่ออนุญาตสำหรับระยะไกลนั้นเฉพาะกับ PowerShell เวอร์ชันล่าสุด ในกรณีนี้คือ 7.0.1 (ดูรูปที่ 5)
รูปที่ 5: รายการชื่อปลายทางที่ลงทะเบียนสำหรับการควบคุมระยะไกลด้วย PowerShell 7
ข้อกำหนดระยะไกล SSH
ใน PowerShell Core และ PowerShell 7 ความสามารถในการใช้ SSH เป็นจุดสิ้นสุดพร้อมใช้งานแล้ว มีข้อกำหนดและขั้นตอนบางประการที่จำเป็นในการทำให้การทำงานระยะไกลของ SSH
- PowerShell Core 6.x หรือ PowerShell 7.x
- ssh.exe (ไคลเอนต์) และ sshd.exe (เซิร์ฟเวอร์)
- Windows 10 build 1809 และ Windows Server 2019 สำหรับ SSH ในตัว (ไคลเอนต์)
ตั้งค่าปลายทาง SSH
การตั้งค่า PowerShell เพื่อใช้ SSH ต้องมีขั้นตอนและการกำหนดค่าต่อไปนี้
- OpenSSH สำหรับ Windows มีให้บริการโดยตรงใน Windows 10 (1809 หรือสูงกว่า) และ Windows Server 2019 เป็นคุณสมบัติเสริม (ไปที่บล็อกของ Thomas Maurer เพื่อดูคำแนะนำเกี่ยวกับวิธีการติดตั้งบน Windows 10 และบน Windows Server)
- บน Linux คุณสามารถติดตั้ง OpenSSH ได้ขึ้นอยู่กับแพลตฟอร์มของคุณ
เรียกใช้คำสั่งต่อไปนี้เพื่อติดตั้งความสามารถที่จำเป็น (OpenSSH.Client อาจติดตั้งไว้แล้ว) การกำหนดค่าบริการ และกฎไฟร์วอลล์
# Install the OpenSSH Client and Server
Add-WindowsCapability -Online -Name 'OpenSSH.Client~~~~0.0.1.0'
Add-WindowsCapability -Online -Name 'OpenSSH.Server~~~~0.0.1.0'
# Initial Configuration of SSH Server
Start-Service -Name 'sshd'
Set-Service -Name 'sshd' -StartupType 'Automatic'
# Confirm the Firewall rule is configured. It should be created automatically by setup.
Get-NetFirewallRule -Name '*ssh*' | Format-Table -AutoSize
# There should be a firewall rule named "OpenSSH-Server-In-TCP", which should be enabled
New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22สุดท้ายนี้ เพื่อให้เซิร์ฟเวอร์ SSH ทำงานกับการทำงานระยะไกลของ PowerShell ได้ ระบบย่อยจะต้องได้รับการตั้งค่าอย่างถูกต้อง
notepad $Env:ProgramData\ssh\sshd_config# Make sure that the subsystem line goes after the existing SFTP subsystem line
Subsystem powershell c:/progra~1/powershell/7/pwsh.exe -sshs -NoLogo -NoProfile
# Change c:/progra~1/powershell/7/pwsh.exe to c:/progra~1/powershell/6/pwsh.exe for PowerShell Core
PasswordAuthentication yes
# Below is optional but recommended to allow use of public/private keys
PubkeyAuthentication yesสุดท้ายรีสตาร์ทเซิร์ฟเวอร์ SSH:
Restart-Service -Name 'sshd'มีข้อบกพร่องในเวอร์ชันเซิร์ฟเวอร์ OpenSSH ที่มาพร้อมกับ Windows กำหนดให้ใช้ชื่อย่อ 8.3 สำหรับเส้นทางไฟล์ใดๆ ดังนั้น c:/progra~1 เพื่อตรวจสอบว่าคุณกำลังใช้ชื่อย่อ 8.3 ที่ถูกต้อง คุณสามารถใช้คำสั่งต่อไปนี้เพื่อดึงข้อมูลนี้สำหรับไฟล์โปรแกรม (โดยที่ติดตั้ง PowerShell 6 หรือ 7):
Get-CimInstance Win32_Directory -Filter 'Name="C:\\Program Files"' | Select-Object EightDotThreeFileNameตัวอย่างคำสั่งสำหรับ PowerShell Remoting
คุณสามารถทำอะไรกับ PowerShell Remoting ได้บ้าง และมีประโยชน์อย่างไร? หลายครั้งที่ผู้ดูแลระบบจำเป็นต้องรวบรวมข้อมูลจากระบบต่างๆ หรือรันคำสั่งหลายคำสั่งพร้อมกันเพื่อแก้ไขปัญหาหรือปรับใช้แพ็คเกจใหม่ ด้วย PowerShell Remoting สิ่งนี้ทำได้อย่างง่ายดาย
รวบรวมข้อมูล
ในสถานการณ์ด้านล่าง มาเชื่อมต่อระยะไกลกับปลายทางระยะไกลของ PowerShell 7 และรับบริการที่ทำงานอยู่
$Params = @{
"ComputerName" = 'Host1'
"ConfigurationName" = 'PowerShell.7'
"ScriptBlock" = {
Get-Service | Where-Object Status -EQ 'Running' | Format-Table -AutoSize
}
}
Invoke-Command @Paramsเรียกใช้คำสั่ง
บางทีเราจำเป็นต้องเริ่มบริการใหม่ ในกรณีนี้คือ Print Spooler
$Params = @{
"ComputerName" = 'Host1'
"ConfigurationName" = 'PowerShell.7'
"ScriptBlock" = {
Get-Service -Name 'Spooler' | Restart-Service
}
}
Invoke-Command @Paramsบทสรุป
PowerShell Remoting เป็นเครื่องมือที่ทรงพลัง และด้วยการเพิ่มความสามารถข้ามแพลตฟอร์มและการใช้การเชื่อมต่อ SSH เสริม ทำให้กลายเป็นเครื่องมือที่ยืดหยุ่นและสำคัญยิ่งขึ้นสำหรับผู้ดูแลระบบ





