Я хочу использовать код Python, развернутый в облаке Azure (например, в функции Azure), для чтения местоположения файлов с общего/локального сетевого диска (локально). Сетевой диск требует аутентификации на основе пользователя (т. е. разные пользователи имеют доступ/разрешения к разным областям).
С локальной сетью установлено соединение по экспресс-маршруту, и я также подтвердил, посмотрев на брандмауэр, что ничто не блокирует облачный доступ к общим дискам.
Мой вопрос: как лучше всего прочитать эти файлы из локальной сети (локальной) в функцию Azure с помощью Python? Например. какие пакеты следует использовать и как также вводить учетные данные пользователя.
Я не могу получить доступ с помощью smbprotocol и не вижу файлов (например, с помощью пакета os) и считаю, что это связано с аутентификацией.
Да: 1) протокол smb 2) поиск папок по всему, что видит функция.
Как вы упомянули, протокол smbprotocol не работает должным образом, можете ли вы попробовать использовать библиотеку pyodbc
для аутентификации пользователей. @Майк Таубер
Кажется, это проблема XY. Почему вы хотите вывести список onprem-файлов из функции Azure?
Я не уверен, что это вообще возможно. Но реальный вопрос заключается в том, действительно ли вы хотите открыть доступ ко всей локальной корпоративной общей папке? Даже используя экспресс-маршрут?
Функции Azure — это бессерверное развертывание Cloud Natif, которое позволяет безопасно и естественным образом подключаться к хранилищу BLOB-объектов Azure.
Мои предложения:
Некоторый связанный ответ:
Вы можете выполнить эту задачу с помощью Python, и теперь, когда мы знаем, что соединение требует аутентификации, возможно, нам нужно узнать больше о соединении по экспресс-маршруту, функция Azure (python) может потребовать соединителей на стороне сервера и клиента, однако, если нам нужно Чтобы сохранить текущую безопасность, всегда полезно сохранить одну и ту же облачную инфраструктуру, мы можем реализовать тип сетевого подключения клиентского оборудования (CPE) (2 месяца назад эта функция все еще была в предварительной версии):
Клиент или локальный питон:
pip install smbprotocol #windows or #python3 -m pip install smbprotocol
Linux потребует поддержки Kerberos: pip install smbprotocol[kerberos]
После того, как клиент или локальный Python уже подтвердил доступ к сетевому диску, вы можете управлять им как обычным локальным файлом для чтения, а затем мы должны перейти на сторону сервера (функция Azure), вам необходимо создать функцию Azure, которая будет разрешено разместить файл:
Это будет комбинация: Создание функции Azure для получения ФАЙЛА с функцией POST и сохранение его в Azure Blob или аналогичном устройстве или обработка его желаемым способом (https://learn.microsoft.com/en- us/azure/azure-functions/functions-reference-python?tabs=asgi%2Capplication-level&pivots=python-mode-decorators#sdk-type-bindings-examples)
Функция, которую я бы использовал для больших двоичных объектов на стороне клиента:
def s_on_db(self,container_db,folder_db,file_db_local_complete_path,file_to_file_to_db):
try:
connection_string = "BlobEndpoint=https://mystorageaccount2024.blob.core.windows.net/;QueueEndpoint=h..."
blob_service_client = BlobServiceClient.from_connection_string(connection_string)
container_client = blob_service_client.get_container_client(container_db)
blob_client = container_client.get_blob_client(folder_db+"/"+file_to_file_to_db)
start=time.time()
#upload data
block_list=[]
chunk_size=4*1024*1024
with open(file_db_local_complete_path,'rb') as f:
while True:
read_data = f.read(chunk_size)
if not read_data:
break # done
blk_id = str(uuid.uuid4())
blob_client.stage_block(block_id=blk_id,data=read_data)
block_list.append(BlobBlock(block_id=blk_id))
blob_client.commit_block_list(block_list)
end=time.time()
except Exception as e:
print(e)
pass
Функция загружает файл по частям, в зависимости от пропускной способности и скорости загрузки в Интернет вы можете изменить его:
Полный код (проверю позже, потому что мне нужно настроить всю среду в Azure и локально):
from smbprotocol.open import Open, CreateDisposition, FilePipePrinterAccessMask, FileAttributes, ShareAccess, ImpersonationLevel
from smbprotocol.session import Session
from smbprotocol.connection import Connection
import psutil
the_current_user=psutil.Process().username()
driveinnetwork = 'NetCOmpanyDrive'
username = the_current_user #this can be the_current_user, this may be a vulnerability, recommended to be used for IT Admin only
password = 'password' #if each user is managed with EntraID, we will need MSAL instead of the actual password, so we do not expose the real one, or the IT Admin can enable the script as a hidden service
shared_folder = 'shared_folder_drive'
file_path = '/path/to/localfile.pdf'
#or os.system(f"net use {driveinnetwork} /user:{username} {password}") #but this may be a security issue
#client side connector
connection = Connection(uuid.uuid4(), driveinnetwork, 445)
connection.connect()
session = Session(connection, username, password)
session.connect()
allids = session.tree_connect(shared_folder)
# Access a file
with Open(allids, file_path, desired_access=FilePipePrinterAccessMask.GENERIC_READ, create_disposition=CreateDisposition.FILE_OPEN, file_attributes=FileAttributes.FILE_ATTRIBUTE_NORMAL, share_access=ShareAccess.FILE_SHARE_READ, impersonation_level=ImpersonationLevel.Impersonation, oplock_level=0) as file:
#read
data=file.read() #can read all or by chunks for memory usage
#Add Azure POST file to Azure Function, more mechanisms may be needed here to know when remote tries to read local and vice-versa
def s_on_db(container_db,folder_db,file_db_local_complete_path,file_to_file_to_db):
try:
connection_string = "BlobEndpoint=https://mystorageaccount2024.blob.core.windows.net/;QueueEndpoint=h..."
blob_service_client = BlobServiceClient.from_connection_string(connection_string)
container_client = blob_service_client.get_container_client(container_db)
blob_client = container_client.get_blob_client(folder_db+"/"+file_to_file_to_db)
start=time.time()
#upload data
block_list=[]
chunk_size=4*1024*1024
with open(file_db_local_complete_path,'rb') as f:
while True:
read_data = f.read(chunk_size)
if not read_data:
break # done
blk_id = str(uuid.uuid4())
blob_client.stage_block(block_id=blk_id,data=read_data)
block_list.append(BlobBlock(block_id=blk_id))
blob_client.commit_block_list(block_list)
end=time.time()
except Exception as e:
print(e)
pass
#data will be sent to the cloud using the function s_on_db(container_db,folder_db,file_db_local_complete_path,file_to_file_to_db)
#close connection
session.tree_disconnect(tree_id)
session.logoff()
connection.disconnect()
Вариант CPE может быть проще и сохраняет схему аутентификации Microsoft EntraID, требует рабочей или учебной учетной записи и некоторых лицензий O365 (EntraID P1 или P2).
Пробовали ли вы какой-либо подход? @Майк Таубер