Windows 2000 內建「信使服務」,原為系統管理員發送控制台訊息至用戶端設計。透過 net send 指令,我們可輕鬆開發一個輕量級區域網路即時通訊工具,且幾乎能穿透各類防火牆限制 (因使用 SMB/RPC 標準連接埠 139/445)。本文示範使用 C++Builder 5.0 快速建構 GUI 介面,呼叫 WinExec 執行 net send 實現訊息發送與廣播。
NET SEND {name | * | /DOMAIN[:name] | /USERS} message
name:目標電腦名稱、IP 位址或使用者名稱*:廣播給同網域/工作群組所有電腦/DOMAIN:name:廣播給指定網域/USERS:傳送給所有連接至伺服器的使用者message:訊息內容 (支援多行)Edit1:輸入目標 (電腦名/IP/*/domain:xxx)Memo1:輸入訊息內容 (多行)ButtonSend:發送按鈕ButtonBroadcast:廣播按鈕 (選配)Label:提示標籤
void __fastcall TForm1::BtnSendClick(TObject *Sender)
{
AnsiString cmd = "NET SEND ";
cmd += Edit1->Text.Trim(); // 目標
cmd += " ";
cmd += Memo1->Text; // 訊息內容
// SW_HIDE 隱藏命令提示字元視窗
WinExec(cmd.c_str(), SW_HIDE);
}
void __fastcall TForm1::BtnBroadcastClick(TObject *Sender)
{
AnsiString cmd = "NET SEND * ";
cmd += Memo1->Text;
WinExec(cmd.c_str(), SW_HIDE);
}
void __fastcall TForm1::BtnDomainBroadcastClick(TObject *Sender)
{
AnsiString domain = "MYDOMAIN"; // 或從 Edit 輸入
AnsiString cmd = "NET SEND /DOMAIN:" + domain + " " + Memo1->Text;
WinExec(cmd.c_str(), SW_HIDE);
}
| 條件 | 說明 |
|---|---|
| 作業系統 | 僅支援 Windows 2000 / XP / Server 2003 (需啟用 Messenger 服務)。Vista/7/8/10/11 已移除此服務。 |
| 服務狀態 | 接收端必須啟動「Messenger」服務 (services.msc → Messenger → 自動/啟動)。 |
| 防火牆 | 需開放 TCP 139, 445 及 UDP 137, 138 (NetBIOS/SMB)。 |
| 權限 | 發送者需具備目標電腦的訊息發送權限 (通常為 Domain Users 即可)。 |
| 編碼 | 中文訊息建議確保主控台代碼頁 (chcp 950/65001) 與程式編碼一致,避免亂碼。 |
WM_COPYDATA 或掛鉤 MessageBox 自訂彈出視窗樣式。CreateProcess 取代 WinExec,可取得進程控制碼與退出碼判斷發送成敗。
bool SendNetMessage(const AnsiString& target, const AnsiString& msg)
{
AnsiString cmd = "cmd.exe /c NET SEND " + target + " " + msg;
STARTUPINFOA si = { sizeof(si) };
PROCESS_INFORMATION pi;
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
if (!CreateProcessA(NULL, cmd.c_str(), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
return false;
WaitForSingleObject(pi.hProcess, 5000); // 等待 5 秒
DWORD exitCode = 0;
GetExitCodeProcess(pi.hProcess, &exitCode);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
return exitCode == 0;
}
利用 Windows 2000 內建信使服務與 net send,我們以極少程式碼快速實作一個實用的區域網路通訊小工具。雖然現代 Windows 版本已移除此功能,但在維護舊系統、嵌入式裝置或隔離網路環境時,此技巧仍具參考價值。理解其背後的 SMB/RPC 通訊機制,也有助於掌握 Windows 網路程式設計基礎。