-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathtelegram_bot.ps1
140 lines (127 loc) · 5.94 KB
/
telegram_bot.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# Пароль разблокированных пользователей AD
$new_password = 'Zx12345'
# Токен и url для запросов к Telegram
$token = "12345"
$url = "https://api.telegram.org/bot$token/"
# Выполняем первый запрос для получения
# последнего сообщения
$result = Invoke-RestMethod -Uri ($url+'getUpdates') -Body @{offset='-1';}
$MessageId = $result.result.message.message_id
$ChatId = $result.result.message.chat.id
# Списпок разрешенных пользователей
$AllowedChatId = @($ChatID)
$users = @()
# Командлет получения сообщений
function Get-TelegramMessage(){
[CmdletBinding()]
$result = Invoke-RestMethod -Uri ($url+'getUpdates') -Body @{offset='-1';}
# Проверяем, что это сообщение новее того
# что мы получили при запуске скрипта
# и что пользователь в списке разрешенных
if (($result.result.message.message_id -gt $MessageId) -and ($result.result.message.chat.id -in $AllowedChatId)){
return $result.result.message
}
}
# Получение списка заблокированных пользователей
function Get-LockedUsers(){
[CmdletBinding()]
# Массив для наполнения пользователями
$locked_users = New-Object System.Collections.Generic.List[System.Object]
$users = Get-ADUser -Filter * -Properties LockedOut | where LockedOut -eq True
# Если у нас нет заблокированных пользователей
# функция вернет 0 и остановится
if ($users.Length -eq 0){
return 0
}
# Добавляем пользователей
foreach ($user in $users){
$name = $user.Name
$sid = $user.SID
# Пользователь состоит из хэш таблицы
# с именем и SID. Они добавляются в массив
$locked_users.Add(@(@{name=$name; SID=$sid}))
}
return $locked_users
}
# Командлет для отправки сообщений
function Send-TelegramMessage($Message, $ChatId){
[CmdletBinding()]
# Определяем кому отправляем и что
$form = @{
chat_id = $ChatId;
text = $Message;
}
$result = Invoke-RestMethod -Uri $($url+'sendMessage') -Body $form
return $result
}
# Определяем тип сообщения (какая команда)
function Get-TelegramMessageType($Message){
# Проверяем что сообщение существует (не пустое)
if ($Message){
# Команда должна начинаться на /
# если это не так - функция остановится
if ($Message.text[0] -notmatch '/'){
return $Message.message_id, 0
}
# убираем знак / из сообщения
$text = $Message.text -replace '/',''
# Если это команда на получение пользователей возвращаем
# и идентификатор сообщения и его тип
if ("get_user" -eq $text){
return $Message.message_id, 1
}
# если строка состоит из числа (например /123)
# возвращаем идентификатор сообщения, тип сообщения и индекс пользователя
elseif ($text -match "^\d+$"){
return $Message.message_id, 2, $text
}
}
# если сообщение пустое
return 0, 0
}
# вечный цикл с таймаутов в 2 секунды
while ($True){
# Проверяем есть ли новые сообщения
# Если их нет, то ответ будет пустым
$response = Get-TelegramMessage
# Проверяем тип сообщения
$message_type = Get-TelegramMessageType -Message $response
# Т.к. мы поличили новое сообщение - мы должны заменить идентификатор
if ($message_type[0] -ne 0){
$MessageId = $message_type[0]
}
# Проверяем тип сообщения
if ($message_type[1] -eq 1){
# Получаем заблокированных пользователей
$users = Get-LockedUsers
if ($users -ne 0){
# Формируем текст для отправки в Telegram
$full_text = ''
foreach ($user in $users){
$name = $user.Name
$index = $users.indexOf($user)
$full_text += "Unlock user $name /$index`n"
}
Send-TelegramMessage -Message $full_text -ChatId $ChatID
}
else {
Send-TelegramMessage -Message 'Нет заблокированных пользователей' -ChatId $ChatID
}
}
elseif ($message_type[1] -eq 2){
# получаем нужного пользователя по индексу
$user = $users[$message_type[2]]
# если значение user существует - значит индекс верный
# если этого индекса нет - какая-то ошибка или нас
# пытаются обмануть
if ($user){
# Разблокируем пользователя
$SID = $user.SID
Unlock-AdAccount -Identity $SID
Set-ADAccountPassword -Identity $SID -Reset -NewPassword (ConvertTo-SecureString -AsPlainText $new_password -Force)
# отправляем сообщение о разблокировке
Send-TelegramMessage -Message "Пользователь $($user.Name) разблокирован" -ChatId $ChatID
}
}
sleep 2
}