Решил я тут на днях немного упростить жизнь и заодно вспомнить что такое написание скриптов. Не буду хвалиться, скажу сразу, что за образец взял готовую статью с habr.com. Мне понадобилось с помощью телеграмм и его бота управлять правилом встроенного в windows server брандмауэра. На нём настроено ограничение на вход по RDP с конкретных подсетей (сами знаете что будет, если RDP сервис выставить в интернет без какой-либо защиты). Вот готовый скрипт, осталось только в нем вставить идентификатор бота, аккаунта с которого можно будет отправлять ему сообщения и возможно поменять название правил файервола (у меня они со стандартными именами в русской локализации). После этого добавляйте его в планировщик задач.
$token = "вставьте тут свое значение"
$URL_get = «https://api.telegram.org/bot$token/getUpdates»
$URL_set = «https://api.telegram.org/bot$token/sendMessage»
$ipv4 = ‘^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$’
$ipv4CIDR = ‘^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/(3[0-2]|[1-2][0-9]|[0-9]))$’
#список пользователей, от кого бот будет принимать сообщения
$users = ‘2793180’
$timeout = 1
function getUpdates($URL)
{
$json = Invoke-RestMethod -Uri $URL
$data = $json.result | Select-Object -Last 1
$chat_id = $data.message.chat.id
$text = $data.message.text
$f_name = $data.message.chat.first_name
$l_name = $data.message.chat.last_name
$type = $data.message.chat.type
$username = $data.message.chat.username
if($text)
{
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Invoke-RestMethod «$($URL)?offset=$($($data.update_id)+1)» -Method Get | Out-Null
$ht = @{}
$ht[«chat_id»] = $chat_id
$ht[«text»] = $text
$ht[«f_name»] = $f_name
$ht[«l_name»] = $l_name
$ht[«username»] = $username
return $ht
}
}
function sendMessage($URL, $chat_id, $text)
{
$ht = @{
text = $text
parse_mode = «Markdown»
chat_id = $chat_id
}
$json = $ht | ConvertTo-Json
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Invoke-RestMethod $URL -Method Post -ContentType ‘application/json; charset=utf-8’ -Body $json | Out-Null
}
while($true)
{
$return = getUpdates $URL_get
if($users -contains $return.chat_id)
{
if ($return)
{
if(($return.text -match $ipv4) -or ($return.text -match $ipv4CIDR))
{
$ip=$return.text
$all_ips1 = (Get-NetFirewallRule -DisplayName ‘Удаленный рабочий стол — пользовательский режим (входящий трафик UDP)’ | Get-NetFirewallAddressFilter).RemoteAddress
$all_ips1 += $ip
Set-NetFirewallRule -DisplayName ‘Удаленный рабочий стол — пользовательский режим (входящий трафик UDP)’ -RemoteAddress $all_ips1
$all_ips2 = (Get-NetFirewallRule -DisplayName ‘Удаленный рабочий стол — пользовательский режим (входящий трафик TCP)’ | Get-NetFirewallAddressFilter).RemoteAddress
$all_ips2 += $ip
Set-NetFirewallRule -DisplayName ‘Удаленный рабочий стол — пользовательский режим (входящий трафик TCP)’ -RemoteAddress $all_ips2
sendMessage $URL_set $return.chat_id ‘IP added to whitelist’
}
else
{
sendMessage $URL_set $return.chat_id ‘Error! Incorrect IP’
}
}
Start-Sleep -s $timeout
}
}