rdp:доступ-к-windows-rdp-по-e-mail

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
rdp:доступ-к-windows-rdp-по-e-mail [2020/12/20 01:24]
admin
rdp:доступ-к-windows-rdp-по-e-mail [2020/12/20 14:38] (текущий)
admin
Строка 3: Строка 3:
 Сразу оговоримся: с программированием не знаком и не считаю себя скриптером или кодером. То, что будет описано в данной заметке успешно работает на моем сервере 1С уже в течении 2х месяцев. Проблем в работе не наблюдалось. Сразу оговоримся: с программированием не знаком и не считаю себя скриптером или кодером. То, что будет описано в данной заметке успешно работает на моем сервере 1С уже в течении 2х месяцев. Проблем в работе не наблюдалось.
  
-Из-за самоизоляции большей части бухгалтеров пришлось работать удаленно. Самым быстрым решением был проброс RDP наружу. Что бы в тот же час сервер не начали ломать, был изменен внешний порт, установлены правила на маршрутизаторе от подбора портов и зафильтрован порт RDP на самом сервере. После нескольких часов работы стало понятно, что вручную вносить IP адреса в брандмауэр не выход. Самым подходящим способом оказалась корпоративная почта. Логика должна заключаться в том, что бы пользователь отправлял свой внешний IP адрес (который предварительно посмотрит на 2ip.ru) в теме письма на определенный адрес, после чего скрипт будет его смотреть и обрабатывать.+Из-за самоизоляции большей части бухгалтеров пришлось работать удаленно. Самым быстрым решением был проброс RDP наружу. Что бы в тот же час сервер не начали ломать, был изменен внешний порт, установлены правила на маршрутизаторе от подбора портов и зафильтрован порт RDP на самом сервере. После нескольких часов работы стало понятно, что вручную вносить IP адреса в брандмауэр не выход. Самым подходящим способом оказалась корпоративная почта. Логика должна заключаться в том, что бы пользователь отправлял свой внешний IP адрес (который предварительно посмотрит на [[https://2ip.ru/ | 2ip.ru]]) в теме письма на определенный адрес, после чего скрипт будет его смотреть и обрабатывать.
  
 Корпоративная почта располагается на сервисе ЯндексКоннект. Для начала создал ящик 1с@example.com и в нем папку access. Правилами обработки входящей почты указал, что бы письма от сотрудников которым разрешен доступ перемещались в папку access. Не лишним будет сделать автоответ: «Ваш IP адрес добавлен в белый список. Подождите 5 минут до применения правил». Для всех остальных письма будут приходить в папку входящие, которую скрипт обрабатывать не будет. Корпоративная почта располагается на сервисе ЯндексКоннект. Для начала создал ящик 1с@example.com и в нем папку access. Правилами обработки входящей почты указал, что бы письма от сотрудников которым разрешен доступ перемещались в папку access. Не лишним будет сделать автоответ: «Ваш IP адрес добавлен в белый список. Подождите 5 минут до применения правил». Для всех остальных письма будут приходить в папку входящие, которую скрипт обрабатывать не будет.
Строка 11: Строка 11:
 Теперь создаем папку scripts, и в нее кладем файл mail.py с данным содержанием (используется Pyhon 3.7×64): Теперь создаем папку scripts, и в нее кладем файл mail.py с данным содержанием (используется Pyhon 3.7×64):
  
-<code python>+<file python mail.py>
 import imaplib import imaplib
 import email import email
Строка 20: Строка 20:
 import ipaddress import ipaddress
 import os import os
- +
 #подключение к серверу #подключение к серверу
 imap = imaplib.IMAP4_SSL('imap.yandex.ru') imap = imaplib.IMAP4_SSL('imap.yandex.ru')
-imap.login('1с@example.com', 'PASSWORD'+imap.login('[EMAIL]', '[PASSWORD]') 
- +
 #выбор каталога #выбор каталога
 imap.select('access') imap.select('access')
- +
 #просмотр непрочитанных (u-unread) #просмотр непрочитанных (u-unread)
 r, d = imap.search(None, '(UNSEEN)') r, d = imap.search(None, '(UNSEEN)')
Строка 35: Строка 35:
 matches = re.finditer(regex, c, re.MULTILINE) matches = re.finditer(regex, c, re.MULTILINE)
 for matchNum, match in enumerate(matches, start=1): for matchNum, match in enumerate(matches, start=1):
-    carray.extend ("{match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))+   carray.extend ("{match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))
 i = len(carray) i = len(carray)
 ii=0 ii=0
- +
 def check_ip(ip): def check_ip(ip):
     try:     try:
Строка 46: Строка 46:
     else:     else:
         return 1         return 1
-  + 
-    while ii < i: +while ii < i: 
-        result, data = imap.search(None, '(UNSEEN)'+    result, data = imap.search(None, '(UNSEEN)'
-        ids = data[0] # Получаем сроку номеров писем +    ids = data[0] # Получаем сроку номеров писем 
-        id_list = ids.split() # Разделяем ID писем +    id_list = ids.split() # Разделяем ID писем 
-        latest_email_id = id_list[-1] # Берем последний ID +    latest_email_id = id_list[-1] # Берем последний ID 
-        result, data = imap.fetch(latest_email_id, "(RFC822)") # Получаем тело письма (RFC822) для данного ID +    result, data = imap.fetch(latest_email_id, "(RFC822)") # Получаем тело письма (RFC822) для данного ID 
-        raw_email = data[0][1] # Тело письма в необработанном виде +    raw_email = data[0][1] # Тело письма в необработанном виде 
-        email_message = email.message_from_bytes(raw_email) +    email_message = email.message_from_bytes(raw_email) 
-        efrom = make_header(decode_header(email_message['From'])) +    efrom = make_header(decode_header(email_message['From'])) 
-        esubject = make_header(decode_header(email_message['Subject'])) +    esubject = make_header(decode_header(email_message['Subject'])) 
-        sesubject = str(esubject) +    sesubject = str(esubject) 
-        edate = email_message['Date'+    edate = email_message['Date'
-        ipv = check_ip(str(esubject)) +    ipv = check_ip(str(esubject)) 
-        f = open('log.txt', 'a'+    f = open('log.txt', 'a'
-        f.write(edate) +    f.write(edate) 
-        f.write(' ') +    f.write('  ') 
-        f.write(str(efrom)) +    f.write(str(efrom)) 
-        f.write(' IP:'+    f.write('  IP:'
-        f.write(str(esubject)) +    f.write(str(esubject)) 
-        f.write(' '+    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()     f.close()
-    ips = (','.join(ipslist)) +    print('Log1 updated'
-    ips = str(ips) +    if ipv == 1: 
-    os.system('netsh advfirewall firewall set rule name="Дистанционное управление рабочим столом (TCP - входящий)" new remoteip='+str(ips)) +          f = open('access.txt', 'a'
-</code>+          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)) 
 +</file>
  
 Для корректного работы скрипта требуется: Для корректного работы скрипта требуется:
Строка 105: Строка 105:
   - Наконец создать файл start.cmd с содержанием:   - Наконец создать файл start.cmd с содержанием:
  
-<code bash>+<file dos start.cmd>
 cd C:\scripts\ cd C:\scripts\
 mail.py mail.py
-<code>+</file>
  
 После чего дергайте скрипт через планировщик каждые 5 минут. После чего дергайте скрипт через планировщик каждые 5 минут.
  • rdp/доступ-к-windows-rdp-по-e-mail.1608402286.txt.gz
  • Последнее изменение: 2020/12/20 01:24
  • admin