2016-08-08 4 views
0

Можно ли создать всплывающее окно на удаленном компьютере, для которого требуется (удаленный) ввод пользователя? Предположим, я использую Powershell для выполнения сценария на удаленном компьютере и хочу, чтобы активный пользователь за этим компьютером принял запуск сценария. Если это невозможно по умолчанию, будут ли какие-либо простые сторонние решения (которые не требуют установки на удаленном компьютере пользователей), я мог бы использовать для достижения той же цели?Удаленный пользовательский ввод

Мышление из коробки я могу использовать powershell для отправки почты, а затем для поиска входящих ответов, но это просто неэффективно.

+0

Возможно, вы попытаетесь создать запланированную задачу для запуска в качестве интерактивного пользователя и сразу же запустить его. Я не уверен, что вы можете это понять, никогда не пробовали. В противном случае получение чего-либо для выполнения в контексте зарегистрированного пользователя - это немного боль. –

+0

@Chris Dent Интересный вариант. Посмотрите на это, спасибо. – RockYoClock

ответ

0

Я на самом деле очень близок к созданию чего-то подобного с помощью 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()} 
} 
+0

Это хорошая идея с использованием UWP. Слишком плохо, что удаленный вход пользователя невозможен. в случае, если вы уже не сталкивались с этим сообщением, я нашел несколько примеров, используя ваш метод: https://msdn.microsoft.com/en-us/windows/uwp/controls-and-patterns/tiles-and-notifications- адаптивно-интерактивные-тосты – RockYoClock

Смежные вопросы