MessageBox в PowerShell работает не так, как я надеялся - PullRequest
0 голосов
/ 03 декабря 2018

Мне нужна возможность отправлять «Стилизованное сообщение оповещения» на определенный компьютер в домене.

Проблема 1:

В настоящее время у меня есть следующие оповещения и еслиЯ запускаю его из Powershell, я получаю всплывающее окно именно так, как я хочу.Если я запускаю его вне POwershell), щелкните правой кнопкой мыши, запустите с POwershell ISE), он ничего не делает.

Вот код, который у меня есть для этой части:

$ALERT = {Please contact the I.T. Help Desk @EXT 777.  
Reference ERROR CODE: 910978
}

$MYALERT = [System.Windows.Forms.MessageBox]::Show("$ALERT ","I.T. 
DEPARTMENT ALERT !", "ok","Warning”)
$MYALERT

Проблема 2:

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

Вот код, который у меня есть для этой части:

cls
echo ""
echo ""
$name = read-host "Enter computer name "
$ALERT = {Please contact the I.T. Help Desk @EXT 777.  
Reference ERROR CODE: 910978
}
$MYALERT = {
[System.Windows.Forms.MessageBox]::Show("$ALERT ","I.T. DEPARTMENT ALERT !", 
"ok","Warning”)
}

Invoke-WmiMethod -Path Win32_Process -Name Create -ArgumentList $MYALERT - 
ComputerName $name
pause
cls
echo ""
echo "  Message Sent.  Returning to Main Menu"
cls
EXIT

Да, но я получаю следующий вывод в окне консоли:

__GENUS          : 2
__CLASS          : __PARAMETERS
__SUPERCLASS     : 
__DYNASTY        : __PARAMETERS
__RELPATH        : 
__PROPERTY_COUNT : 2
__DERIVATION     : {}
__SERVER         : 
__NAMESPACE      : 
__PATH           : 
ProcessId        : 
ReturnValue      : 9
PSComputerName   : 

ПРИМЕЧАНИЕ. На самом деле я не хочу отправлять коды ошибок таким образом, просто набираю что-то в качестве примера.Я хочу использовать это для отправки сообщения на определенный компьютер в домене, чтобы оно отображалось поверх любых открытых окон и отображалось как предупреждение, а не как сообщение от пользователя.

ТакжеПохоже, что для ПРОБЛЕМЫ # 1 добавление «Add-Type -AssemblyName System.Windows.Forms» вверху позволяет это работать за пределами Powershell.Однако после добавления того же самого для ПРОБЛЕМЫ №2 это все равно не работает.

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

Есть идеи, что я делаю не так?

Заранее спасибо!

1 Ответ

0 голосов
/ 04 декабря 2018

Проблема 1:

Сборка, которая предоставляет класс MessageBox, не загружается вашим сценарием автоматически.Это необходимо сделать, добавив в начале оператор

Add-Type -Assembly 'System.Windows.Forms'

.

Проблема 2:

Невозможно создать блок сценариев PowerShell какпроцесс Windows.Это просто не сработает.Кроме того, не так просто запустить процесс удаленно в контексте другого пользователя (который вам нужен, если вы хотите отобразить сообщение на своем рабочем столе).Это было бы огромной дырой в безопасности.

Использование утилиты командной строки msg работает, потому что она использует инфраструктуру обмена сообщениями, уже встроенную в Windows.Если этого недостаточно для ваших нужд, вам нужно либо использовать что-то, что предоставит вам эту инфраструктуру (например, IRC, службы мгновенных сообщений, Slack и т. Д.), Либо создать эту инфраструктуру самостоятельно (что я обычно не рекомендую из-засоображения безопасности).

...