从任务计划程序运行的PowerShell脚本中的Msgbox无法正常工作

时间:2019-01-25 00:50:00

标签: powershell scheduled-tasks msgbox

我有一个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 :(得分:0)

一种选择是使用终端服务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是此处MessageBox FunctionuType值的组合。因此,示例中的“ 36”是“ MB_YESNO”和“ MB_ICONQUESTION”的值的组合,因此将显示带有问号图标和“是” /“否”按钮的消息。请注意,文档以十六进制形式提供值,因此您需要对其进行转换。

我将此测试作为以管理员身份运行的计划任务进行了测试,它能够在其他登录用户的桌面上显示一条消息。希望对您有帮助。

相关问题