วิธีใช้ PowerShell เรียกใช้-คำสั่ง
คุณต้องการเรียกใช้คำสั่ง PowerShell บนคอมพิวเตอร์ระยะไกลหรือเซิร์ฟเวอร์หรือไม่ จากนั้น คุณไม่จำเป็นต้องเปิดการเชื่อมต่อเดสก์ท็อประยะไกล เนื่องจากคุณสามารถใช้ PowerShell Inrigg-Command ได้
Invoke-Command ช่วยให้คุณสามารถเรียกใช้คำสั่งและสคริปต์ PowerShell บนคอมพิวเตอร์ระยะไกลตั้งแต่หนึ่งเครื่องขึ้นไป ในขณะที่เปลี่ยนเส้นทางผลลัพธ์ไปยังคอนโซลของคุณเอง ทำให้เป็น cmdlet ที่ยอดเยี่ยมในการจัดการอุปกรณ์ระยะไกลได้อย่างรวดเร็ว
ในบทความนี้ เราจะมาดูสิ่งที่จำเป็นในการใช้ Invivo-Command และวิธีใช้ cmdlet
ข้อกำหนดเบื้องต้น เรียกใช้คำสั่ง
ก่อนที่เราจะสามารถใช้ Invoke-Command บนเซิร์ฟเวอร์ระยะไกลหรือคอมพิวเตอร์ได้ เราจะต้องตรวจสอบให้แน่ใจว่าบริการ Windows Remote Management กำลังทำงานอยู่ นอกจากนี้ หากคุณเปิดใช้งานไฟร์วอลล์ Windows ในเครือข่ายของคุณ เราจำเป็นต้องตรวจสอบว่าไฟร์วอลล์ไม่ได้บล็อกการเชื่อมต่อหรือไม่
หากต้องการตรวจสอบว่าคอมพิวเตอร์ระยะไกลยอมรับการจัดการระยะไกลหรือไม่ เราสามารถใช้คำสั่ง PowerShell ง่ายๆ Test-WSMan
Test-WSMan -Computername la-srv-dc01
หากคุณได้รับข้อผิดพลาดว่าคุณไม่สามารถเชื่อมต่อกับปลายทางได้ แสดงว่าบริการ Windows Remote Management ไม่ได้ทำงานอยู่ หากต้องการเปิดใช้งาน เราสามารถใช้ PowerShell cmdlet Enable-PSRemoting บนคอมพิวเตอร์ระยะไกล:
Enable-PSRemotingข้อดีของคำสั่งนี้คือ ไม่เพียงแต่เริ่มบริการการจัดการระยะไกลเท่านั้น แต่ยังตั้งค่าให้เริ่มโดยอัตโนมัติและสร้างกฎข้อยกเว้นที่จำเป็นในไฟร์วอลล์อีกด้วย
แต่ตัวเลือกที่ดีกว่าคือการสร้าง Group Policy Object (GPO) ใหม่ วิธีนี้ทำให้คุณสามารถเปิดใช้บริการการจัดการระยะไกลบนคอมพิวเตอร์หรือเซิร์ฟเวอร์หลายเครื่องได้อย่างง่ายดาย
คุณสามารถดูการตั้งค่านโยบายได้ใน การกำหนดค่าคอมพิวเตอร์ > การตั้งค่า Windows > การตั้งค่าความปลอดภัย > บริการระบบ
กฎไฟร์วอลล์
ไฟร์วอลล์ Windows จะบล็อกการเชื่อมต่อขาเข้าทั้งหมด รวมถึงการเชื่อมต่อ Windows Remote Management ดังนั้นก่อนที่เราจะใช้ Invoke-Command ได้ เราจะต้องอนุญาตการเชื่อมต่อขาเข้าเสียก่อน
เราสามารถใช้ GPO เดียวกันเพื่อสร้างกฎขาเข้าได้เช่นกัน
- ไปที่ การกำหนดค่าคอมพิวเตอร์ > การตั้งค่า Windows > การตั้งค่าความปลอดภัย > ไฟร์วอลล์ Windows Defender พร้อมความปลอดภัยขั้นสูง
- คลิกขวาที่ กฎขาเข้า และเลือก กฎใหม่
- เลือก ที่กำหนดไว้ล่วงหน้า และเลือก Windows Remote Management
- เลือกกฎที่มีโปรไฟล์ โดเมน ส่วนตัว
- เลือก อนุญาตการเชื่อมต่อ และคลิก เสร็จสิ้น
ตรวจสอบให้แน่ใจว่านโยบายใหม่ได้รับการอัปเดตบนเซิร์ฟเวอร์/ไคลเอนต์โดยใช้คำสั่ง GPUpdate
การใช้คำสั่งเรียก
เรียกใช้คำสั่งใน PowerShell ช่วยให้คุณสามารถเรียกใช้คำสั่งหรือสคริปต์บนคอมพิวเตอร์ระยะไกลได้ เมื่อคุณต้องการเรียกใช้หลายคำสั่งบนคอมพิวเตอร์ระยะไกล ควรใช้ New-PSSession cmdlet
โครงสร้างของ Invivo-Command ค่อนข้างตรงไปตรงมา แต่ก็ยังมีตัวเลือก (พารามิเตอร์) สองสามตัวที่เราสามารถใช้ได้:
- ComputerName
ชื่อคอมพิวเตอร์หรือที่อยู่ IP เพื่อรันคำสั่ง สำหรับคอมพิวเตอร์หลายเครื่อง ให้คั่นชื่อด้วยเครื่องหมายจุลภาค
,- Credential
ข้อมูลรับรองเพื่อเชื่อมต่อกับคอมพิวเตอร์ระยะไกล
- FilePath
ระบุเส้นทางไปยังสคริปต์ท้องถิ่นเพื่อทำงานบนคอมพิวเตอร์ระยะไกล
- AsJob
เรียกใช้คำสั่งระยะไกลเป็นงานพื้นหลังบนเครื่องคอมพิวเตอร์
- InDisconnectedSession
ใช้เพื่อรันคำสั่งในเซสชันที่ไม่ได้เชื่อมต่อบนคอมพิวเตอร์ระยะไกล
- ScriptBlock
สคริปต์หรือคำสั่งที่จะเรียกใช้
- ArgumentList
ใช้เพื่อส่งผ่านข้อโต้แย้งไปยัง cmdlet ใน scriptblock
ดังนั้น เพื่อเรียกใช้คำสั่ง PowerShell บนคอมพิวเตอร์ระยะไกล เราเพียงแต่ต้องระบุชื่อของคอมพิวเตอร์ระยะไกลและคำสั่งที่เราต้องการเรียกใช้ภายใน scriptblock ตัวอย่างเช่น หากต้องการดึงข้อมูลคอมพิวเตอร์จากตัวควบคุมโดเมน เราสามารถทำได้:
Invoke-Command -ComputerName la-srv-dc01 {Get-ComputerInfo}
ซึ่งจะเรียกใช้คำสั่ง Get-ComputerInfo บนตัวควบคุมโดเมน (la-srv-dc01) และส่งคืนผลลัพธ์ไปยังคอนโซล
การเรียกใช้สคริปต์
ในตัวอย่างข้างต้น เราเรียกใช้ PowerShell cmdlet แบบธรรมดาเท่านั้น แต่เรายังสามารถเรียกใช้สคริปต์ที่สมบูรณ์บนคอมพิวเตอร์ระยะไกลได้ คุณสามารถเขียนสคริปต์ภายในพารามิเตอร์ scriptblock ได้ แต่จะง่ายกว่าในการจัดเก็บสคริปต์ในตัวแปรหรือใช้ไฟล์
ตัวอย่างด้านล่างใช้งานได้ดี แต่จะอ่านยากขึ้นเล็กน้อย:
Invoke-Command -ComputerName la-srv-dc01 -ScriptBlock {Get-CimInstance Win32_LogicalDisk | Select-Object DeviceID, MediaType, @{Name="FreeSpace (GB)"; Expression={"{0:N2}" -f ($_.FreeSpace / 1GB)}}}ตัวเลือกที่ดีกว่าคือเก็บสคริปต์ไว้ในตัวแปรก่อน จากนั้นเราก็สามารถส่งตัวแปรไปที่ scriptblock:
$script = {
Get-CimInstance Win32_LogicalDisk |
Select-Object DeviceID, MediaType, @{Name="FreeSpace (GB)"; Expression={"{0:N2}" -f ($_.FreeSpace / 1GB)}}
}
Invoke-Command -ComputerName la-srv-dc01 -ScriptBlock $scriptตัวเลือกที่สามคือการจัดเก็บสคริปต์ไว้ในเครื่องคอมพิวเตอร์ของคุณและอ้างอิงถึงสคริปต์โดยใช้พารามิเตอร์ -FilePath:
Invoke-Command -ComputerName la-srv-dc01 -FilePath c:\test\diskInfo.ps1ทำงานบนคอมพิวเตอร์หลายเครื่อง
ข้อดีอย่างหนึ่งที่สำคัญของ Invoke-Command cmdlet ใน PowerShell ก็คือ คุณสามารถเรียกใช้บนคอมพิวเตอร์หลายเครื่องพร้อมกันได้ มีสองตัวเลือกในการทำเช่นนี้ เราสามารถระบุชื่อคอมพิวเตอร์โดยคั่นด้วยเครื่องหมายจุลภาค:
Invoke-Command -ComputerName la-srv-dc01, la-srv-app01, la-srv-file01 -FilePath c:\test\diskInfo.ps1อีกทางเลือกหนึ่งในการเขียนสิ่งนี้คือการใช้ hashtable และ splatting การแบ่งพารามิเตอร์จะทำให้สคริปต์ของคุณอ่านง่ายขึ้นเมื่อคุณต้องการเพิ่มคุณสมบัติจำนวนมาก
$parameters = @{
ComputerName = 'la-srv-dc01', 'la-srv-app01', 'la-srv-file01', 'la-win11-lab03'
ScriptBlock = { Get-ComputerInfo }
}
Invoke-Command @parameters
เมื่อคุณต้องการเรียกใช้คำสั่งบนคอมพิวเตอร์หลายเครื่อง เช่น หนึ่งร้อยคำสั่งขึ้นไป คุณจึงต้องการลดภาระในคอมพิวเตอร์ในระบบของคุณให้เหลือน้อยที่สุด สำหรับสิ่งนี้ เราสามารถใช้พารามิเตอร์ InDisconnectedSession
หากคุณเรียกใช้ Invoke-Command cmdlet ตามปกติ เครื่องคอมพิวเตอร์ของคุณจะเชื่อมต่อกับคอมพิวเตอร์ระยะไกล เริ่มสคริปต์ รอผลลัพธ์ และยกเลิกการเชื่อมต่อ ส่วนที่รอจะใช้เวลาและทรัพยากรมากที่สุดจากเครื่องคอมพิวเตอร์ของคุณ โดยเฉพาะเมื่อเชื่อมต่อกับคอมพิวเตอร์ 100 เครื่องขึ้นไป
ด้วยพารามิเตอร์ InDisconnectedSession cmdlet จะเชื่อมต่อกับคอมพิวเตอร์ระยะไกลเท่านั้น เริ่มการทำงานของสคริปต์ แล้วยกเลิกการเชื่อมต่อ ซึ่งจะช่วยลดเวลากระบวนการทั้งหมดลงอย่างมาก
$parameters = @{
ComputerName = (Get-Content -Path C:\Test\Servers.txt)
InDisconnectedSession = $true
FilePath = '\\lazyadmin\scripts\InstallWinUpdates.ps1'
}
Invoke-Command @parametersการใช้ข้อมูลรับรอง
คุณจะต้องได้รับอนุญาตบนคอมพิวเตอร์ระยะไกลเพื่อเรียกใช้คำสั่ง PowerShell เมื่อรันคำสั่งบนเซิร์ฟเวอร์ คุณอาจไม่ได้รับอนุญาตที่ถูกต้องจากเวิร์กสเตชันในเครื่องของคุณ
เพื่อแก้ปัญหานี้ เราสามารถใช้พารามิเตอร์ -Credentials ที่นี่คุณสามารถป้อนบัญชีผู้ใช้ที่คุณต้องการใช้เพื่อรันคำสั่ง PowerShell จะแจ้งให้คุณใส่รหัสผ่านเมื่อคุณดำเนินการ cmdlet Invoke-Command ด้วยพารามิเตอร์ -Credential:
Invoke-Command -ComputerName la-srv-dc01 -Credential lazyadmin\administrator -Scriptblock {Get-ComputerInfo}เช่นเดียวกับ PowerShell cmdlet ส่วนใหญ่ คุณสามารถส่งออบเจ็กต์ข้อมูลรับรองไปยัง cmdlet -Credential ได้ วิธีนี้มีประโยชน์อย่างยิ่งเมื่อคุณต้องการเรียกใช้หลายคำสั่งหรือต้องการเรียกใช้คำสั่งที่แตกต่างกันบนคอมพิวเตอร์ระยะไกลเครื่องอื่น:
$cred = Get-Credential
Invoke-Command -ComputerName la-srv-dc01 -Credential $cred -Scriptblock {Get-ComputerInfo}รวมตัวแปรท้องถิ่น
การใช้ตัวแปรภายใน scriptblock แตกต่างไปจากที่คุณคาดไว้เล็กน้อย ลองใช้ตัวอย่างง่ายๆ ต่อไปนี้ เราต้องการรับไฟล์ทั้งหมดจากเส้นทางที่กำหนดบนคอมพิวเตอร์ระยะไกล ในกรณีนี้ เราได้เก็บเส้นทางไว้ภายในตัวแปร:
$path = "c:\test"
Invoke-Command -ComputerName la-srv-dc01 -Scriptblock {Get-Childitem -Path $path}ตัวอย่างข้างต้นจะไม่ทำงาน คอมพิวเตอร์ระยะไกล ในกรณีนี้คือ la-srv-dc01 ไม่ทราบว่าตัวแปร $path คืออะไร ดังนั้นจะไม่ส่งคืนผลลัพธ์ใดๆ
หากต้องการส่งผ่านเส้นทางตัวแปรไปยัง scriptblock เราจะต้องใช้ตัวแก้ไขขอบเขต Using ขอบเขตการใช้บ่งชี้ว่าตัวแปรถูกสร้างขึ้นในเซสชันภายในเครื่อง ไม่ใช่ในเซสชันระยะไกล ดังนั้นในการส่งตัวแปร $path ไปยังเซสชันระยะไกล เราจำเป็นต้องทำ:
$path = "c:\test"
Invoke-Command -ComputerName la-srv-dc01 -Scriptblock {Get-Chiditem -Path $Using:path}ห่อขึ้น
คำสั่งเรียกใช้ PowerShell เป็นเครื่องมือที่ยอดเยี่ยมในการจัดการคอมพิวเตอร์ระยะไกล ช่วยให้คุณสามารถรันคำสั่งได้อย่างรวดเร็วโดยไม่จำเป็นต้องเปิดเดสก์ท็อประยะไกล โดยเฉพาะอย่างยิ่งเมื่อคุณต้องการรันคำสั่งบนคอมพิวเตอร์หลายเครื่องพร้อมกัน
ตรวจสอบให้แน่ใจว่าคุณดู New-PSSession cmdlet ด้วย นี่เป็นตัวเลือกที่ดีกว่าจริงๆ เมื่อคุณต้องการดำเนินการหลายคำสั่งบนคอมพิวเตอร์ระยะไกล
ฉันหวังว่าบทความนี้จะเป็นประโยชน์ หากคุณมีคำถามใด ๆ เพียงแสดงความคิดเห็นด้านล่าง


