Как отослать сообщение через Powershell


06 июля 2019


Отсылаем сообщение пользователю через Powershell

Для того, что бы через powershell отправить сообщение пользователю нужно иметь работающий PSRemoting. Если вы не знаете что это, то коротко говоря это возможность удаленного выполнения команд. Эта возможность рассматривалась тут. Коротко говоря если все получатели пользователи домена, а вы являетесь администратором на их компьютере, то единственная настройка, которая вам понадобится это включить WinRM:

Enable-PSRemoting

Если собираетесь использовать IP, или не в домене, то вы будете использовать не Kerberos, а NTLM и нужно сделать следующее:

Enable-PSRemoting
Set-Item wsman:\localhost\Client\TrustedHosts -value *

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

 

Отправление сообщение пользователю компьютера через WinRM

Для отправки сообщения есть старая утилита msg. Сообщение, которое получит пользователь, будет popup (всплывающее на главном экране). Мы можем проверить его так:

msg * "Ожидается перезагрузка сервера 1С"

Для того что бы отправить такое сообщение одному или нескольким пользователям через powershell нужно использовать:

Invoke-Command -ComputerName AD,AD2 -ScriptBlock {msg * "1C Restart in 10 minutes"}

Где:
ComputerName - имена одного или нескольких компьютеров, на которые будут отправлены сообщения. Можно и IP, но с оговорками выше...
Scriptblock - скрипт, который мы отсылаем на компьютеры. В нашем случае это msg

Сообщение будет выглядеть так:

Powershell отправка сообщения пользователю

 

Отправка сообщений всем пользователям компьютеров в AD

Сначала получим все имена всех компьютеров в домене и присвоим переменную. Если мой домен называется domain.local, то командлет будет выглядеть так:

$computers = (Get-ADComputer -SearchBase "DC=domain,DC=local" -Filter *).Name

Мы можем добавить OU, если у нас нужные компьютеры находятся в отдельной организационной единице:

$computers = (Get-ADComputer -SearchBase "OU=AllComputers,DC=domain,DC=local" -Filter *).Name

Далее, для каждого компьютера в переменной используем такую команду powershell:

$computers | ForEach {Invoke-Command -ComputerName $_ {msg * "1C Restart in 2 minutes"}}

Сообщения получат все пользователи, которые залогинены.

 

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

Для отправки сообщения терминальным пользователям сначала нужно получить список их сессий:

$session = Get-RDUserSession -ConnectionBroker "rdcb.fixmypc.ru"

Затем мы можем отправить сообщения:

$message = "Ожидается перезагрузка сервера в течении 10 минут"
$session | Send-RDUserMessage -HostServer "rdsh.domain.local" -MessageBody $message

 

...

Теги: #powershell #ad


Популярные тэги
О блоге
Этот блог представляет собой конспекты выученного материала, преобретенного опыта и лучшие практики в системном администрировании и программировании.