Скомпилированный исполняемый файл python заблокирован для доступа к базе данных Oracle

#python #python-3.x #oracle #oracle11g #cx-oracle

#python #python-3.x #Oracle #оракул11g #cx-oracle #oracle11g

Вопрос:

У меня есть скрипт (my_script.py ), который обращается к базе данных Oracle с помощью обычного процесса входа в систему через cx_Oracle.

 def make_connect(**creds):
    dsn_str = cx_Oracle.makedsn(host, port, sid)
    return cx_Oracle.connect(un, pw, dsn_str)
  

При запуске скрипта из IDE проблем с доступом к базе данных с помощью этого метода нет, но как только я упаковываю его в исполняемый файл (с помощью PyInstaller, хотя я не думаю, что это имеет значение), я получаю следующую ошибку:

ORA-20045: LOGON BLOCKED

Я полагаю, это связано с тем, что исполняемый файл, который обращается к базе данных, не python.exe это запуск кода, а скорее my_script.exe. Код работает должным образом, если я изменю my_script.exe к python.exe это означает, что я считаю python.exe база данных занесена в белый список для доступа.

Я недостаточно знаю о том, какая конкретная системная переменная или переменная среды объявляет себя базе данных Oracle для доступа, но я попытался изменить sys.executable на python.exe или sys.argv[0] для python.exe , но я думаю, что есть что-то более глубокое, что мне, возможно, потребуется изменить (если я вообще могу что-либо изменить, чтобы получить доступ).

Любые предложения были бы более чем полезны. Исполняемый файл будет находиться в системах с доменным доступом к базе данных, но поскольку это всего лишь python.exe если они занесены в белый список, их доступ будет запрещен.

Комментарии:

1. Исключения Oracle в диапазоне от ORA-20000 до ORA-21299 являются общими, определяемыми пользователем исключениями, возникающими при вызове raise_application_error . Возможно, у вас триггер ВХОДА в СИСТЕМУ или что-то подобное, что мешает вам подключиться. Попробуйте выполнить этот запрос, чтобы найти код, который генерирует эту ошибку: select * from all_source where text like '%-20045%'

2. Попросите администраторов баз данных изменить триггер для проверки имени драйвера, который инициировал соединение, вместо имени программы. Это будет (очень) незначительно более безопасным, но гораздо менее раздражающим для пользователей: SELECT UNIQUE sid, client_driver FROM v$session_connect_info ORDER BY sid; Стандартом де-факто для столбца CLIENT_DRIVER является ‘name : version’. Обратите внимание, что более старые версии базы данных будут отображать только первые 9 или около того символов, которые фактически задает драйвер, поэтому вы можете не видеть версию при использовании Oracle DB 11.

3. И под «незначительно более безопасным» я подразумеваю «незначительно менее небезопасный», поскольку любой может подделать двоичное имя (как это делали вы) или имя драйвера.