ใน ตอนที่ 1 ได้ทำความรู้จักว่า Nano Server นอกจากไม่มีหน้าจอ GUI และไม่มี Command Windows หรือ PowerShell ให้เราเข้าไปทำงาน จากนี้ไปเราจะได้รู้ว่า Windows มี Remote Access ที่เป็น Command-Line Console ที่ช่วยให้การทำงานแบบ Remote เป็นเรื่องง่ายๆ เราจะศึกษาการสั่งงาน Windows และ Nano Server ด้วย Windows Remote Management และ PowerShell Remoting ขอใช้ตัวอย่างทั้งหมดเป็น PowerShell
WS-Management
เมื่อก่อนเวลาที่ Administrator ของ Windows Server ต้องทำงานกับ Server ผ่าน Network หากไม่นับ Remote Desktop ยังมีวิธีเรียกผ่าน WMI ที่ใช้ Protocol Remote Procedure Call (RPC) ที่ต้องเปิด Firewall Port TCP/135 และอีกเปิดอีกหลาย Port ในเวลาต่อมา เมื่อ Microsoft ได้เข้าร่วมกับ Distributed Management Task Force (DMTF) ในยุคที่ Web ได้รับความนิยม ได้เกิด Web Service – Management (WS-Management) ที่เป็น Open standard โดยใช้ Protocol HTTP SOAP ใน Version ของ Microsoft เรียกชื่อว่า Windows Remote Management (WinRM) การใช้งานต้องมี Tool ที่ใช้บ่อยๆ มี 2 ตัวคือ WinRS และ PowerShell Remote ในภาพด้านล่างแสดงให้เห็นการเรียกใช้งาน WS-Management ทำงานเป็นด้าน Client และ Server ที่จะทดลองทำกัน
WinRM จะมีฝั่ง Client ในภาพด้านซ้ายจะเป็น Windows version Desktop หรือ Server ก็ได้ WinRM จะมี Configuration ของมันเอง ในส่วนของ Server ก็เหมือนกัน Configuration นี้ แบ่งเป็น Client, Service (หรือ Server), Listener และอื่นๆ ด้าน Server ยังมี End Point ที่สามารถเขียน Application ไปเกาะไว้กับ WinRM ในที่นี้จะเป็นตัว PowerShell Remote
ใช้งาน PowerShell Remoting ครั้งแรก
ในขั้นตอนและ Script ตัวอย่างใช้ Server IP 192.168.1.113 เมื่อนำไปทดลองต้องเปลี่ยนเป็น IP ของ Server ที่ใช้งานได้จริงด้วย
- ขั้นตอนแรก เป็นการ Enable ให้ Windows Server เปิดการใช้งาน PowerShell Remote ได้ เริ่มจาก Logon ไปที่ Server เพื่อ Configure WinRM โดยให้เปิด PowerShell ด้วย runas administrator แล้ว run Enable-PSRemoting –force
คำสั่งด้านบน Windows ได้ทำงานไป 4 ขั้นตอนคือ
- กำหนดให้ Service – Windows Remote Management เป็น auto start
- Register ให้ PowerShell เป็น endpoint ไว้กับ WinRM Listener เมื่อมี Client connect เข้ามา WinRMจะได้ส่ง Request ไปได้ถูกตัว เช่น เมื่อ Client ที่เป็น PowerShell เรียกเข้ามาก็จะส่งต่อให้ PowerShell Remote รับงานไปทำ เป็นต้น
- สร้าง policy ใน Windows Firewall ให้ allow port tcp 5985 และ tcp 5986 สำหรับ HTTP และ HTTPS ตามลำดับ
- กำหนด Permission การใช้งาน Remote
2. การ Configure เครื่อง Client ที่เราใช้ Remote ไปทำงานบน Server ในนี้เป็นการทดสอบกับ Workgroup ขั้นตอนดังนี้คือ
- ด้าน Client จะต้องดูว่า Service – Windows Remote Management (WS-Management) อยู่ใน Status Running จึงจะใช้งานได้
- ลงทะเบียน Server ที่เราต้องการ Remote ไปทำงานไว้ในค่า TrustedHosts ด้วยคำสั่ง set-Item WSMan:\localhost\Client\TrustedHosts -value ถ้ามีหลาย Server ใช้เครื่องหมาย “,” คั่นไว้ (ส่วนนี้ Server 1 เครื่อง ก็ add ครั้งเดียวพอ)ถ้าต้องการอ่านค่ามาดูใช้คำสั่ง get-Item WSMan:\localhost\Client\TrustedHosts
3. เปิด Remote ไปทำงาน
- เตรียม User ID และ Password สำหรับ Logon เข้า Server ด้วยคำสั่ง get-Credential
- สร้าง Remote Session ด้วยคำสั่ง new-PSSession โดยเราเก็บค่า Session ไว้ในตัวแปร
- เข้า Remote Session ด้วยคำสั่ง enter-PSSession สังเกตุว่า Prompt ในภาพด้านล่างเปลี่ยนไป มันแสดงเป็น IP Address ของเครื่อง Remote แทน
- เมื่ออยากจะกลับมาที่เครื่อง Client ก็ใช้คำสั่ง exit
4. เราสามารถ Remote ไปเป็น Command Prompt ก็ได้ ตัวอย่างคำสั่ง Remote ไปใช้คำสั่ง cmd.exe บน remote server
c:\winrs -r:192.168.1.113 -u:administrator -p:Passw0rd cmd.exe
เมื่อได้ทำตามตัวอย่างคงพอเห็นภาพว่าการ Remote ไม่ยาก ใช้ได้กับ Windows Server และ Nano Server ในครั้งต่อไปจะกลับไปสร้าง Nano Server มาใช้งานต่อไป
รวมภาพตัวอย่างการทำงานและ PowerShell Script
ด้านล่างเป็น Script ที่ได้ทดสอบฝั่ง Client ตอนทำต้อง runas Administrator ด้วย
Start-Service WinRM | |
$myTrustWinRM = get-Item WSMan:\localhost\Client\TrustedHosts | |
if($myTrustWinRM.Value.Length -eq 0) | |
{ | |
$myNewTrust = "192.168.1.113" | |
Write-Host "new trustedhosts" | |
} | |
else | |
{ | |
$myTargetServerIP = "192.168.1.113" | |
$myNewTrust = ($myTrustWinRM).Value + ", $myTargetServerIP" | |
Write-Host "append trustedhosts" | |
} | |
Set-Item WSMan:\localhost\Client\TrustedHosts -Value $myNewTrust | |
$MyCred = Get-Credential "administrator" | |
$nanoPSHost = New-PSSession -ComputerName $myNewTrust -Credential $MyCred | |
Enter-PSSession -Id ($nanoPSHost).id |