Для того, что бы через 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
Сообщение будет выглядеть так:
Отправка сообщений всем пользователям компьютеров в 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
...
Подписывайтесь на наш Telegram канал
Теги: #powershell #ad