====== Доступ к Windows RDP по E-mail ====== Сразу оговоримся: с программированием не знаком и не считаю себя скриптером или кодером. То, что будет описано в данной заметке успешно работает на моем сервере 1С уже в течении 2х месяцев. Проблем в работе не наблюдалось. Из-за самоизоляции большей части бухгалтеров пришлось работать удаленно. Самым быстрым решением был проброс RDP наружу. Что бы в тот же час сервер не начали ломать, был изменен внешний порт, установлены правила на маршрутизаторе от подбора портов и зафильтрован порт RDP на самом сервере. После нескольких часов работы стало понятно, что вручную вносить IP адреса в брандмауэр не выход. Самым подходящим способом оказалась корпоративная почта. Логика должна заключаться в том, что бы пользователь отправлял свой внешний IP адрес (который предварительно посмотрит на [[https://2ip.ru/ | 2ip.ru]]) в теме письма на определенный адрес, после чего скрипт будет его смотреть и обрабатывать. Корпоративная почта располагается на сервисе ЯндексКоннект. Для начала создал ящик 1с@example.com и в нем папку access. Правилами обработки входящей почты указал, что бы письма от сотрудников которым разрешен доступ перемещались в папку access. Не лишним будет сделать автоответ: «Ваш IP адрес добавлен в белый список. Подождите 5 минут до применения правил». Для всех остальных письма будут приходить в папку входящие, которую скрипт обрабатывать не будет. {{ :txt:0002:аннотация-2020-05-05-021411.png |}} Теперь создаем папку scripts, и в нее кладем файл mail.py с данным содержанием (используется Pyhon 3.7×64): import imaplib import email from email.header import Header, decode_header, make_header from email.message import EmailMessage from email.utils import parsedate import re import ipaddress import os #подключение к серверу imap = imaplib.IMAP4_SSL('imap.yandex.ru') imap.login('[EMAIL]', '[PASSWORD]') #выбор каталога imap.select('access') #просмотр непрочитанных (u-unread) r, d = imap.search(None, '(UNSEEN)') c = str(d) carray = [] regex = r"\d{1,4}|10000$" matches = re.finditer(regex, c, re.MULTILINE) for matchNum, match in enumerate(matches, start=1): carray.extend ("{match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group())) i = len(carray) ii=0 def check_ip(ip): try: ipaddress.ip_address(ip) except ValueError: return 0 else: return 1 while ii < i: result, data = imap.search(None, '(UNSEEN)') ids = data[0] # Получаем сроку номеров писем id_list = ids.split() # Разделяем ID писем latest_email_id = id_list[-1] # Берем последний ID result, data = imap.fetch(latest_email_id, "(RFC822)") # Получаем тело письма (RFC822) для данного ID raw_email = data[0][1] # Тело письма в необработанном виде email_message = email.message_from_bytes(raw_email) efrom = make_header(decode_header(email_message['From'])) esubject = make_header(decode_header(email_message['Subject'])) sesubject = str(esubject) edate = email_message['Date'] ipv = check_ip(str(esubject)) f = open('log.txt', 'a') f.write(edate) f.write(' ') f.write(str(efrom)) f.write(' IP:') f.write(str(esubject)) f.write(' ') f.close() print('Log1 updated') if ipv == 1: f = open('access.txt', 'a') f.write(sesubject) f.write(',') f.close() print('Access list updated') else: f = open('log.txt', 'a') f.write('WARNONG INVALID IP:') f.write(sesubject) f.close() print('Log2 updated') f = open('log.txt', 'a') f.write('\n') f.close() ii = ii+1 if ii == i: break f = open('access.txt', 'r') ipslist = f.read().split(",") f.close() ips = (','.join(ipslist)) ips = str(ips) os.system('netsh advfirewall firewall set rule name="Дистанционное управление рабочим столом (TCP - входящий)" new remoteip='+str(ips)) Для корректного работы скрипта требуется: - Заменить имя почтового ящика (1с@example.com) и пароль (PASSWORD) на ваши. - Заменить имя RDP доступа на ваше. У меня указано для Windows 7 ( Дистанционное управление рабочим столом (TCP — входящий) ) - Создать файл access.txt и log.txt - В access.txt заранее через запятую внести IP адреса с которых должен быть доступ (как правило это внутренние подсети и ip администратора) - Наконец создать файл start.cmd с содержанием: cd C:\scripts\ mail.py После чего дергайте скрипт через планировщик каждые 5 минут.