远程用户输入

时间:2016-08-08 09:24:30

标签: powershell user-input remoting

是否可以在需要(远程)用户输入的远程计算机上生成弹出窗口?假设我使用Powershell在远程计算机上执行脚本,并希望该计算机后面的活动用户接受运行脚本。如果默认情况下这是不可能的,是否有任何简单的第三方解决方案(在远程用户计算机上不需要安装)我可以用来实现相同的目标?

开箱即用我可以使用powershell发送邮件然后扫描收到的回复,但这感觉效率低下。

1 个答案:

答案 0 :(得分:0)

我实际上非常接近使用来自UWP的Toast消息API来制作类似的东西。 我可以使用按钮和文本框创建Toast消息(也可以通过使用Invoke-Command在远程计算机上创建),但是我已经无法通过输入或按钮获取结果(并且通过UWP文档看起来这不是可能与Powershell一起。)

示例代码我一直在努力(查看UWP中Toast消息的文档以获取更多信息 - 此版本允许您运行本地或远程。我没有包含XML内容一个按钮,但如果你按照微软写的API文档那么容易实现 - 也许你会有更多的运气(免责声明:这只是我的第一个工作概念,代码还没有优化) ,"本地"和#34;远程"版本等的许多重复代码:)

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()}
}