Как организовать массовую рассылку сообщений пользователям на удалённых компьютерах?

Добрый день! Мне нужно написать скрипт для отправки сообщений пользователям на их компьютеры. Я нашел команду 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>
  • 15 октября 2024 г. 9:53
Ответы на вопрос 3
Чтобы отправить сообщения пользователю на удаленном компьютере с помощью 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**, если вы работаете с приложениями.
Если кратко - для  простой  отправки  отправки сообщений пользователям надо использовать msg ( тут я согласен с комментарием, который MaxKozlov оставил под вопросом ). Не усложняйте себе жизнь 

Однако если хотите усложнять - надо отправлять сообщение в пользовательскую сессию, из вашей (которую вы создали подключившись удаленно) или из системной сессии
Есть два способа: используя psexec (или другой инструмент позволяющий переключаться на сессию) или используя запланированную задачу, запускаемую от имени залогиненного пользователя
Решая подобную задачу, я доставлял сообщение в специальный файл на пк, который раз в 5 минут проверялся простенькой таской (созданной автоматически на всех ПК моего домена) и, если файл был не пустой - сообщение из текстового файла выводилось и файл очищался.
Для использования psexec и прочих ухищрений с переключением сессий - изучите вот этот ответ stackoverflow
https://stackoverflow.com/questions/61971517/power...
Используйте msg правильно :) 

Ограничение в 256 символов существует только для отправки сообщения из командной строки.

А сообщение можно отправлять и из файла

пример: send.cmd
type d:\long_message.txt | msg username

при этом long_message.txt должен быть в 1251 кодировке для русских буковок
Похожие вопросы