MSG.EXE Send Message Command
- Details
- Category: KB
- Published on 09/10/2012
- Hits: 20024
คำสั่ง MSG เป็นคำสั่งที่มาแทนที่ net send บน Windows Server 2008 R2 ซึ่งเมื่อก่อนนั้นเราสามารถใช้คำสั่ง net send เพื่อส่ง Message จากเครื่องหนึ่งไปยังอีกเครื่องหนึ่งได้ หรือแม้กระทั่งส่งไปหาทุกเครื่องภายใน Network ก็สามารถทำได้ แต่บน Windows Server 2008 R2 นั้นจะไม่มีคำสั่งนี้แล้ว ดังนั้นเมื่อคำสั่ง net send ไม่สามารถใช้ได้บน Windows Server 2008 R2 ก็จะเปลี่ยนมาใช้คำสั่ง msg.exe แทน
การส่ง Message ไปยังเครื่อง Client ก็มีประโยชน์บางอย่าง เช่น เป็นคำเตือนสั้น ๆ เพื่อให้ผู้ใช้งานได้รับทราบทันที ถือว่าเป็น Tool ที่ติดมากับ Windows Server 2008 R2 ที่ใช้สำหรับส่งข้อความในแลนแบบง่าย ๆ, ก่อนการใช้คำสั่ง MSG นี้จะมีเงื่อนไขการใช้งานคือ หากเป็นการส่งจากเครื่อง Server ไปยัง Client
- บนเครื่อง Client จะต้องทำการ Allow Rule File and Printer Sharing เสียก่อนไม่เช่นนั้นจะพบกับ Error 1707 getting session names
- บนเครื่อง Client จะต้องแก้ไข Registry Key HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal\AllowRemoteRPC ให้มี Value เป็น 1 ไม่เช่นนั้นจะพบกับ Error 5 getting session names
ลองตรวจสอบคำสั่ง MSG กันก่อนว่ามี Parameter ใดบ้าง
ถ้าดูแล้วงง ไม่รู้ว่าจะใช้อย่างไร ผมยกตัวอย่างการใช้งานง่าย ๆ ให้ดังนี้ สมมติว่าจะส่ง Message บนเครื่อง Domain Controller ที่ชื่อว่า dc1 เข้าเครื่องตัวเองด้วยข้อความ "itsesa.com"
msg Administrator /server:dc1 "itsesa.com"
โดย Message ด้านบนแปลความได้ว่า ให้ส่งข้อความ itsesa.com ไปที่เครื่อง dc1 โดยมีผลกับผู้ใช้งานที่กำลัง Log on ด้วยชื่อ Administrator, ไม่ใช่ Credential Log on แต่อย่างใดนะครับ อย่าเข้าใจผิด ถ้าสมมติว่าตอนนี้ผม Log on ด้วย Administrator อยู่ แล้วผมเปลี่ยน Parameter เป็น admin เช่นคำสั่งนี้
msg admin /server:dc1 "itsesa.com"
ผลลัพธ์จะแจ้งว่า ไม่พบการใช้งานของ User admin
คราวนี้หากเราต้องการส่งข้อความ "itsesa.com" ไปยังเครื่อง com-client1 ที่กำลังมีผู้ใช้งาน user1 ทำงานอยู่ ตัวอย่างคำสั่ง
msg user1 /server:com-client1 "itsesa.com"
ซึ่งบนเครื่อง Client ที่เป็น Windows 7 จะพบกับ Dialog Message ดังนี้
คราวนี้เราจะทราบได้อย่างไร ว่าเครื่องใด กำลังมีผู้ใช้งาน User ใดอยู่ หากไม่ทราบ เราสามารถเปลี่ยน Parameter username เป็นเครื่องหมาย * ได้ ดังนี้
msg * /server:com-client1 "itsesa.com"
ก็จะทำให้มีผลกับทุก User ที่กำลังใช้งานเครื่อง com-client1 จะได้รับ Message ไปพร้อมกัน
ความต้องการต่อมาคือ เราอยากส่ง Message แบบ Broadcast ไปให้กับทุกเครื่องในเครือข่าย ซึ่งคำสั่ง msg.exe ไม่สามารถทำได้ แต่ผมจะดัดแปลงคำสั่งให้มันทำงานได้เสมือน Broadcast ซึ่งที่จริงแล้วมันคือการส่งแบบ Unicast ไปจนครบทุกเครื่องนั่นเอง ซึ่งวิธีนี้ใช้งานได้บนเครื่องที่มี Active Directory เท่านั้น เพราะเราจะใช้คำสั่งเพื่อเรียกชื่อเครื่อง Computer Object ในการส่งไป โดยคำสั่งที่ค้นหา Computer Object บน Active Directory ก็คือคำสั่ง
dsquery computer -o rdn
จะพบว่า สามารถเรียกชื่อเครื่อง Computer Object ที่มีอยู่ใน Active Directory มาได้ทั้งหมด ซึ่งผมจะใช้คำสั่ง for ในการวน loop ไปทีละเครื่องจนครบ โดยคำสั่งที่นำมารวมกันจะเป็นดังนี้
for /F %i in ('dsquery computer -o rdn') do msg * /server:%i "itsesa.com"
คำสั่งก็จะวนไปเรื่อย ๆ จนกระทั่งส่ง Message ไปครบทุกเครื่อง ซึ่งเครื่องไหนที่ไม่ได้รับ Message ก็จะมี Error Number แจ้งให้ทราบ ก็ให้กลับไปตรวจสอบเรื่องเงื่อนไขที่ผมได้กล่าวไปข้างตน แต่ในตัวอย่างนี้ เครื่อง Com-Client อื่น ๆ ผมไม่ได้เปิดไว้ จึงพบ Error Number เดียวกัน ไม่ต้องตกใจ