Добрый день! Мне нужно написать скрипт для отправки сообщений пользователям на их компьютеры. Я нашел команду msg, но она имеет ограничения по количеству символов. В поисках альтернативы я обнаружил другой вариант, однако не могу заставить его работать на удаленном компьютере. Ниже приведен код, с которым я столкнулся. Возможно, кто-то из вас уже имел подобный опыт? <br/> <pre><code>$Computer = "PC01"
$text = "Тест"
$title = "Admin"
Invoke-Command -ComputerName $Computer -ScriptBlock {
param($text, $title)
[System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") | Out-Null
Add-Type -Assembly 'System.Windows.Forms'
[System.Windows.Forms.MessageBox]::Show($text, $title, [Windows.Forms.MessageBoxButtons]::OK, [System.Windows.Forms.MessageBoxIcon]::Stop, [System.Windows.Forms.MessageBoxDefaultButton]::Button1, [System.Windows.Forms.MessageBoxOptions]::DefaultDesktopOnly)
} -ArgumentList $title, $text</code></pre>
Чтобы отправить сообщения пользователю на удаленном компьютере с помощью PowerShell, вы можете использовать подход с функциями Windows Forms для отображения сообщений на экране. Однако необходимо учесть, что для выполнения этого скрипта нужно соответствующее разрешение и правильная настройка удаленного доступа.
Вот несколько шагов, которые могут помочь вам:
1. **Убедитесь, что у вас есть разрешения**: Вы должны иметь административные права на удаленных машинах и разрешить выполнение PowerShell скриптов.
2. **Настройте WinRM**: Убедитесь, что Windows Remote Management (WinRM) настроен и работает на целевых компьютерах.
3. **Проверьте группы безопасности**: Убедитесь, что учетная запись, с которой вы запускаете скрипт, входит в группу, которая имеет доступ к удаленным компьютерам.
4. **Измените ваш скрипт, чтобы избежать проблем с UI**: В некоторых случаях использование `MessageBox` может вызвать проблемы, так как он пытается взаимодействовать с пользовательским интерфейсом. Вместо этого вы можете использовать другие методы уведомления, такие как `Write-Host` в контексте удаленной сессии. Вот альтернативный подход:
```powershell
$computers = @("PC01", "PC02", "PC03") # Список компьютеров
$text = "Тестовое сообщение"
$title = "Admin"
foreach ($computer in $computers) {
Invoke-Command -ComputerName $computer -ScriptBlock {
param($text, $title)
# Создаем и показываем сообщение
$wshell = New-Object -ComObject wscript.shell
$wshell.Popup($text, 0, $title, 0x1)
} -ArgumentList $text, $title
}
```
Этот код использует `WScript.Shell.Popup`, который работает более стабильно и не требует графического интерфейса в терминале.
### Замечания:
- По умолчанию всплывающее окно будет отображаться в течение 0 секунд, а вы можете изменить это значение, если хотите, чтобы сообщение оставалось открытым определенное время.
- Убедитесь, что настройки групповой политики на удаленных компьютерах не блокируют выполнение скриптов или удаленных команд.
- Обратите внимание, что для некоторых версий Windows сообщение может отображаться только в случае, если текущий сеанс пользователя на удаленном компьютере активен.
### Альтернативы:
Если вам необходимо отправлять более сложные сообщения или уведомления, рассмотрите использование таких инструментов, как:
- **SCCM (System Center Configuration Manager)**
- **Microsoft Teams** или **Slack** для командных уведомлений.
- **Push Notification Services**, если вы работаете с приложениями.
Если кратко - для <b> простой </b> отправки отправки сообщений пользователям надо использовать msg ( тут я согласен с комментарием, который <a href="https://qna.habr.com/user/MaxKozlov" rel="nofollow">MaxKozlov</a> оставил под вопросом ). Не усложняйте себе жизнь <br/> <br/> Однако если хотите усложнять - надо отправлять сообщение в пользовательскую сессию, из вашей (которую вы создали подключившись удаленно) или из системной сессии <br/> Есть два способа: используя psexec (или другой инструмент позволяющий переключаться на сессию) или используя запланированную задачу, запускаемую от имени залогиненного пользователя <br/> Решая подобную задачу, я доставлял сообщение в специальный файл на пк, который раз в 5 минут проверялся простенькой таской (созданной автоматически на всех ПК моего домена) и, если файл был не пустой - сообщение из текстового файла выводилось и файл очищался. <br/> Для использования psexec и прочих ухищрений с переключением сессий - изучите вот этот ответ stackoverflow <br/> <a href="https://stackoverflow.com/questions/61971517/powershell-send-a-toast-notification-to-logged-user-when-running-as-local-syste" rel="nofollow">https://stackoverflow.com/questions/61971517/power...</a>
Используйте <b>msg</b> правильно :) <br/> <br/> Ограничение в 256 символов существует только для отправки сообщения из командной строки. <br/> <br/> А сообщение можно отправлять и из файла <br/> <br/> пример: <i><b>send.cmd</b></i> <br/> <code>type d:\long_message.txt | msg username</code> <br/> <br/> при этом <i>long_message.txt</i> должен быть в 1251 кодировке для русских буковок