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

วิธีใช้ 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 เดียวกันเพื่อสร้างกฎขาเข้าได้เช่นกัน

  1. ไปที่ การกำหนดค่าคอมพิวเตอร์ > การตั้งค่า Windows > การตั้งค่าความปลอดภัย > ไฟร์วอลล์ Windows Defender พร้อมความปลอดภัยขั้นสูง
  2. คลิกขวาที่ กฎขาเข้า และเลือก กฎใหม่
  3. เลือก ที่กำหนดไว้ล่วงหน้า และเลือก Windows Remote Management
  4. เลือกกฎที่มีโปรไฟล์ โดเมน ส่วนตัว
  5. เลือก อนุญาตการเชื่อมต่อ และคลิก เสร็จสิ้น

ตรวจสอบให้แน่ใจว่านโยบายใหม่ได้รับการอัปเดตบนเซิร์ฟเวอร์/ไคลเอนต์โดยใช้คำสั่ง 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 ด้วย นี่เป็นตัวเลือกที่ดีกว่าจริงๆ เมื่อคุณต้องการดำเนินการหลายคำสั่งบนคอมพิวเตอร์ระยะไกล

ฉันหวังว่าบทความนี้จะเป็นประโยชน์ หากคุณมีคำถามใด ๆ เพียงแสดงความคิดเห็นด้านล่าง

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