ค้นหาเว็บไซต์

เริ่มต้นใช้งาน 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 ได้ขึ้นอยู่กับแพลตฟอร์มของคุณ
  • กำหนดค่าระบบย่อย SSH เพื่อโฮสต์กระบวนการ PowerShell บนเครื่องระยะไกล

เรียกใช้คำสั่งต่อไปนี้เพื่อติดตั้งความสามารถที่จำเป็น (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 เสริม ทำให้กลายเป็นเครื่องมือที่ยืดหยุ่นและสำคัญยิ่งขึ้นสำหรับผู้ดูแลระบบ

บทความที่เกี่ยวข้อง