是否可以在远程计算机上生成需要(远程(用户输入的弹出窗口?假设我使用Powershell在远程计算机上执行脚本,并希望该计算机后面的活动用户接受运行该脚本。如果默认情况下这是不可能的,我会用任何简单的第三方解决方案(不需要在远程用户计算机上安装(来实现同样的目标吗?
我可以打破常规地使用powershell发送邮件,然后扫描收到的回复,但这感觉效率很低。
实际上,我非常接近于使用UWP的Toast消息API来制作这样的东西。我可以用按钮和文本框创建toast消息(也可以在远程机器上使用Invoke命令(,但我无法成功地从输入或按钮中返回结果(通过UWP文档,Powershell似乎无法做到这一点(。
我一直在处理的示例代码(查看UWP中Toast消息的文档以了解更多信息-此版本允许您运行此本地或远程。我没有包含按钮的XML内容,但如果您遵循Microsoft编写的API文档,这很容易实现(-也许您会更幸运(免责声明:这只是我的第一个工作概念,代码还没有优化,"本地"one_answers"远程"版本有很多重复的代码等(:
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()}
}