Remote desktop run command on Windows servers with Python(ลองรีโมตหลายเซิฟเวอร์พร้อมกันรันคำสั่ง)
บางครั้งเราอาจได้รับโจทย์ว่า ลองเข้าไปเช็ค servers ทั้งหมดในบริษัทให้หน่อยสิ ว่าติดตั้ง patch สำเร็จแล้วรึยัง หรือเข้าไป add user ในทุกเครื่องชั่วคราวเพื่อจะทำการ test บนเครื่องนั้นๆภายในเวลาเร่งด่วน ถ้าลิสต์ servers ที่เราต้องทำการ implement มีเป็นหมื่นเครื่อง ให้เวลาเรา 1 อาทิตย์ โดยมีคนในทีมแค่ 3 คน คิดว่าจะนั่ง remote เข้าไปทีละเครื่องๆทั้งวัน จะเสร็จทันไหมนะ ??
เรามารู้จักตัวช่วยตัวหนึ่งของ windows module ที่ชื่อว่า wmi กัน …
wmi หรือชื่อเต็มคือ WINDOWS MANAGEMENT INSTRUMENTATION เป็น framework ที่ใช้ในการจัดการ windows ในการรันคำสั่งโดยใช้สิทธิ์ admin หรือดึงรายละเอียดต่างๆบนวินโดว์ ส่วนใหญ่นำมาใช้ในงาน monitor และ remote configuration on windows platform
สำหรับตัวอย่างนี้เราจะใช้ python ติดตั้งมอดูล wmi บนเครื่องเรา ก่อนอื่นเราต้องมีการติดตั้ง package manager ของ python ที่ชื่อว่า pip ก่อน ซึ่งวิธีการติดตั้งสามารถดูได้จาก https://pip.pypa.io/en/stable/installing/
หลังจากติดตั้ง pip เรียบร้อย เราก็มาดู prerequisite กันว่าเราควรลงอะไรบ้างก่อนจะใช้มอดูล wmi ได้
จากในรูปจะเห็นว่ามีเครื่อง Windows มี python แล้วก็มี library pywin32 เพื่อให้ wmi เรียกใช้ด้วย สองอันแรก ทุกคนน่าจะมีแล้วล่ะ ส่วน pywin32 จะแนะนำให้ใช้เป็น pip install pypiwin32 แทน จากนั้นทำการติดตั้งมอดูล wmi ด้วยคำสั่ง
pip install wmi
ตัวอย่างการใช้งาน wmi ด้วยภาษา python
เริ่มแรกเราจะสร้างการเชื่อมต่อกับเซิฟเวอร์ขึ้นมาก่อน สามารถทำได้สองกรณี
กรณี 1 เป็นการเชื่อมต่อภายใน local machine จะใช้คำสั่งว่า
# connecting to local machine
conn = wmi.WMI()
กรณี 2 เป็นการเชื่อมต่อแบบ remote machine ต้องใส่ IP, username, password
# connecting to remote machines
import wmi
conn = wmi.WMI("10.10.10.1", user="ploy", password="P@ssw0rd")
แต่โจทย์ของเราคือต้องการรีโมตเข้าไปหลายเครื่องเพื่อสร้าง user test เรามาลองดูคำสั่ง windows command คร่าวๆสำหรับการสร้าง user ก่อน
กรณีที่ 1 การสร้าง user ด้วยให้สิทธิ์ธรรมดากับ user นั้น จะใช้คำสั่ง
net user username password /add
ยกตัวอย่าง net user ploy P@ssw0rd /add แต่ถ้าเกิดไม่ต้องการ password สำหรับ user นี้ เราสามารถใช้แค่ net user username /add
กรณีที่ 2 การสร้าง user ด้วยโดยให้สิทธิ์ administrator user นั้น จะใช้คำสั่ง
net localgroup administrators username /add
ยกตัวอย่าง net localgroup administrators ploy /add
แต่ทีนี้ คำสั่งพวกนี้จะรันได้ต่อเมื่ออยู่บนหน้า command cmd หรือ powershell การจะเรียกใช้ cmd เพื่อรันคำสั่งสามารถใช้
cmd.exe /c แล้วตามด้วยคำสั่งที่ต้องการรัน
จะได้ว่า cmd.exe /c net localgroup administrators ploy /add
ทีนี้ เราลองมาดูตัวอย่างจากหน้า doc ของ wmi ว่าเราจะใส่ command windows เข้าไปในการเรียกใช้ wmi remote server ตรงนี้ยังไงดี
ในรูปตัวอย่าง import module wmi เข้ามาแล้วก็สร้าง connection บน local โดย c = wmi.WMI() แต่ถ้าจะใช้ remote desktop ก็ต้องใส่ IP, username, password wmi.WMI(“10.10.10.1”, user=”ploy”, password=”P@ssw0rd”) แบบที่ยกตัวอย่างไปข้างต้น
บรรทัดต่อมาที่สามารถไปสั่งให้ใช้ command บน windows ได้คือ
pid, result = c.Win32_Process.Create(CommandLine= ‘cmd.exe /c net localgroup administrators ploy /add’)
ทีนี้ ปลายทางของเราอาจจะเน็ตเวิร์คล่มบ้าง ปิด port remote desktop ไว้ หรือปัญหาต่างๆที่ทำให้เชื่อมต่อไปไม่ได้ ดังนั้น result ที่ออกมาหลังรันคำสั่งสร้าง user จะเป็น 0 กับ 1
0 = result is pass
1 = result is fail
เราอาจจะเขียน python ไป read file ดึง list IP servers ทั้งหมดที่ต้องการรีโมตไปได้ว่า แล้วก็ทำการวนลูปแต่ละ IP ส่งเข้าไปให้ wmi เพื่อรันคำสั่ง connect
import wmi
f = open(‘./serverlist.txt’,’r’)
serverlist = f.read().split(‘\n’)for server in serverlist:
username_list = [‘userA’, ‘userB’]
password_list = [‘password’, ‘p@ssw0rd’]for i in range(len(password_list)):
c=wmi.WMI(server,user=username_list[i],password=password_list[i])
pid, result = c.Win32_Process.Create(CommandLine=‘cmd.exe /c net localgroup administrators ploy /add’)
สำหรับบทความอื่นๆที่น่าสนใจที่มีพูดถึง wmi จะทิ้งท้ายไว้ตามนี้ ยังไงก็ไปลองเล่นดู