Msgbox в скрипте PowerShell запускается из планировщика задач не работает - PullRequest
0 голосов
/ 25 января 2019

У меня есть сценарий PowerShell, который создает задачу расписания для запуска сценария. Идея в том, что в скрипте есть какая-то задача, требующая перезагрузки. В конце PowerShell появляется окно сообщения, в котором пользователю предлагается сообщить, что все задачи выполнены. Что я делаю неправильно?

Add-Type -AssemblyName PresentationFramework

TaskName = "Run Agents Install Script"
$TaskDescription = "Run Agents Install Script at logon"
$Action = New-ScheduledTaskAction -Execute 'Powershell.exe' `
  -Argument "-executionpolicy remotesigned -File $PSScriptRoot\AgentInstall.ps1"
$Trigger =  New-ScheduledTaskTrigger -AtLogOn

Register-ScheduledTask -Action $Action -Trigger $Trigger -TaskName $TaskName -Description $TaskDescription -User "System"


$MsgBoxInput =  [System.Windows.MessageBox]::Show('Installation completed successfully.','Agent Install','OK')
Switch  ($MsgBoxInput) {
    'OK' 
   {

$MsgBoxInput =  [System.Windows.MessageBox]::Show('WARNING! Please install Imprivata agent manually if applicable.','Agent Install','OK')
   }
}

1 Ответ

0 голосов
/ 25 января 2019

Один из вариантов - использовать 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», поэтому будет отображаться сообщение со значком вопросительного знака и кнопками «да» / «нет». Обратите внимание, что в документации приведены значения в шестнадцатеричном формате, поэтому вам необходимо преобразовать их.

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

...