2 * WTSSendMessage() command line tool
4 * Home page of code is: http://www.smartmontools.org
6 * Copyright (C) 2012 Christian Franke
8 * SPDX-License-Identifier: GPL-2.0-or-later
12 #define _WIN32_WINNT WINVER
14 char svnid
[] = "$Id: wtssendmsg.c 4760 2018-08-19 18:45:53Z chrfranke $";
19 #define WIN32_LEAN_AND_MEAN
26 printf("wtssendmsg $Revision: 4760 $ - Display a message box on client desktops\n"
27 "Copyright (C) 2012 Christian Franke, smartmontools.org\n\n"
28 "Usage: wtssendmsg [-cas] [-v] [\"Caption\"] \"Message\"|-\n"
30 " -c Console session [default]\n"
31 " -a Active sessions\n"
32 " -s Connected sessions\n"
38 int main(int argc
, const char **argv
)
40 int mode
= 0, verbose
= 0, status
= 0, i
;
41 const char * message
= 0, * caption
= "";
43 WTS_SESSION_INFOA
* sessions
; DWORD count
;
45 for (i
= 1; i
< argc
&& argv
[i
][0] == '-' && argv
[i
][1]; i
++) {
47 for (j
= 1; argv
[i
][j
]; j
++)
49 case 'c': mode
= 0; break;
50 case 'a': mode
= 1; break;
51 case 's': mode
= 2; break;
52 case 'v': verbose
= 1; break;
53 default: return usage();
65 if (!strcmp(message
, "-")) {
66 // Read message from stdin
67 i
= fread(msgbuf
, 1, sizeof(msgbuf
)-1, stdin
);
82 if (!WTSEnumerateSessionsA(WTS_CURRENT_SERVER_HANDLE
, 0, 1, &sessions
, &count
)) {
83 fprintf(stderr
, "WTSEnumerateSessions() failed\n");
87 for (i
= 0; i
< (int)count
; i
++) {
90 printf("Session %d (\"%s\", State=%d)%s",
91 i
, sessions
[i
].pWinStationName
, sessions
[i
].State
,
92 (!message
? "\n" : ": "));
94 continue; // List sessions only
98 if ( !strcmpi(sessions
[i
].pWinStationName
, "Console")
99 || (mode
>= 1 && sessions
[i
].State
== WTSActive
)
100 || (mode
>= 2 && sessions
[i
].State
== WTSConnected
)) {
102 // Send Message, don't wait for OK button
104 if (WTSSendMessageA(WTS_CURRENT_SERVER_HANDLE
, sessions
[i
].SessionId
,
105 (char *)caption
, strlen(caption
),
106 (char *)message
, strlen(message
),
107 MB_OK
|MB_ICONEXCLAMATION
, 0 /*Timeout*/,
108 &result
, FALSE
/*!Wait*/)) {
110 printf("message sent\n");
115 printf("WTSSendMessage() failed with error=%d\n", (int)GetLastError());
117 fprintf(stderr
, "Session %d (\"%s\", State=%d): WTSSendMessage() failed with error=%d\n",
118 i
, sessions
[i
].pWinStationName
, sessions
[i
].State
, (int)GetLastError());
127 WTSFreeMemory(sessions
);