Один из вариантов - использовать API служб терминалов для отправки сообщения на консоль. К сожалению, это нативный API, поэтому вам нужно использовать .NET interop для его вызова, но в этом случае это не так сложно:
$typeDefinition = @"
using System;
using System.Runtime.InteropServices;
public class WTSMessage {
[DllImport("wtsapi32.dll", SetLastError = true)]
public static extern bool WTSSendMessage(
IntPtr hServer,
[MarshalAs(UnmanagedType.I4)] int SessionId,
String pTitle,
[MarshalAs(UnmanagedType.U4)] int TitleLength,
String pMessage,
[MarshalAs(UnmanagedType.U4)] int MessageLength,
[MarshalAs(UnmanagedType.U4)] int Style,
[MarshalAs(UnmanagedType.U4)] int Timeout,
[MarshalAs(UnmanagedType.U4)] out int pResponse,
bool bWait
);
static int response = 0;
public static int SendMessage(int SessionID, String Title, String Message, int Timeout, int MessageBoxType) {
WTSSendMessage(IntPtr.Zero, SessionID, Title, Title.Length, Message, Message.Length, MessageBoxType, Timeout, out response, true);
return response;
}
}
"@
Add-Type -TypeDefinition $typeDefinition
[WTSMessage]::SendMessage(1, "Message Title", "Message body", 30, 36)
По сути, это тонкая оболочка для функции WTSSendMessage .
Вам нужно будет получить SessionID
с помощью какого-либо инструмента, например query
. Этот скрипт может помочь с этим: Get-UserSession .
Значение TimeOut
здесь равно 30, что означает, что всплывающее окно будет ждать 30 секунд, прежде чем вернуться со значением «32000». Установите «0», чтобы ждать вечно.
MessageBoxType
представляет собой комбинацию значений для uType
здесь: Функция MessageBox . Таким образом, «36» в примере представляет собой комбинацию значений для «MB_YESNO» и «MB_ICONQUESTION», поэтому будет отображаться сообщение со значком вопросительного знака и кнопками «да» / «нет». Обратите внимание, что в документации приведены значения в шестнадцатеричном формате, поэтому вам необходимо преобразовать их.
Я проверил это как запланированное задание, выполняемое от имени администратора, и он смог показать сообщение на рабочем столе другого вошедшего в систему пользователя. надеюсь, это поможет.