Я на самом деле очень близок к созданию чего-то подобного с помощью API сообщений Toast из UWP. Я могу создавать сообщения с тостами с кнопками и текстовыми полями (также на удаленной машине с помощью Invoke-Command), однако мне не удавалось получить результаты от ввода или кнопок (и, проходя через документацию UWP, похоже, что это невозможно с Powershell).
Пример кода, над которым я работал (просмотрите документацию сообщений Toast в UWP для получения дополнительной информации - эта версия позволяет вам запускать этот локальный или удаленный доступ. Я не включил содержимое XML для кнопки, но это легко реализовать, если вы будете следовать документации API, написанной Microsoft) - возможно, у вас будет больше удачи (отказ от ответственности: это была только моя первая рабочая концепция, код еще не оптимизирован, много дубликатов кода для «локального», и «удаленная» версия и т. д.):
Function Invoke-ToastMessage
{
[CmdletBinding()]
Param
(
[string]$Message,
[string]$Notifier = "Administrators",
[string]$ComputerName = $null
)
[scriptblock]$ToastScriptRemote = {
$Message = $args[0]
$Notifier = $args[1]
# XML Template
[xml]$XmlTemplate = @"
<toast scenario="reminder">
<visual>
<binding template="ToastGeneric">
<text>Admin Notification</text>
<text>$Message</text>
</binding>
</visual>
<actions>
</actions>
</toast>
"@
# fake load the assemblies
[void][Windows.UI.Notifications.ToastNotification,Windows.UI.Notifications,ContentType=WindowsRuntime]
[void][Windows.Data.Xml.Dom.XmlDocument,Windows.Data.Xml.Dom,ContentType=WindowsRuntime]
$FinalXML = [Windows.Data.Xml.Dom.XmlDocument]::new()
$FinalXML.LoadXml($XmlTemplate.OuterXml)
## create the toast
$Toast = [Windows.UI.Notifications.ToastNotification]::new($FinalXML)
## Show the TOAST message
[Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier($Notifier).show($Toast)
}
[scriptblock]$ToastScriptLocal = {
# XML Template
[xml]$XmlTemplate = @"
<toast scenario="reminder">
<visual>
<binding template="ToastGeneric">
<text>Admin Notification</text>
<text>$Message</text>
</binding>
</visual>
<actions>
</actions>
</toast>
"@
# fake load the assemblies
[void][Windows.UI.Notifications.ToastNotification,Windows.UI.Notifications,ContentType=WindowsRuntime]
[void][Windows.Data.Xml.Dom.XmlDocument,Windows.Data.Xml.Dom,ContentType=WindowsRuntime]
$FinalXML = [Windows.Data.Xml.Dom.XmlDocument]::new()
$FinalXML.LoadXml($XmlTemplate.OuterXml)
## create the toast
$Toast = [Windows.UI.Notifications.ToastNotification]::new($FinalXML)
## Show the TOAST message
[Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier($Notifier).show($Toast)
}
if (![string]::IsNullOrEmpty($ComputerName))
{
Invoke-Command -ComputerName $ComputerName -ScriptBlock $ToastScriptRemote -ArgumentList $Message,$Notifier
}
else {$ToastScriptLocal.Invoke()}
}
Возможно, вы попытаетесь создать запланированную задачу для запуска в качестве интерактивного пользователя и сразу же запустить его. Я не уверен, что вы можете это понять, никогда не пробовали. В противном случае получение чего-либо для выполнения в контексте зарегистрированного пользователя - это немного боль. –
@Chris Dent Интересный вариант. Посмотрите на это, спасибо. – RockYoClock