You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Azure Function的Python读取本地认证共享网络文件方案咨询

Azure Function Python 访问带用户认证的本地SMB共享

推荐的Python包

优先用smbprotocol——它支持SMB 2/3协议,适配现代Python环境,比老的pysmb更贴合云场景。别用os包挂载网络驱动器,Azure Function是无服务器环境,没法像本地那样挂载共享,这条路走不通。

凭据安全处理(重中之重)

千万别硬编码用户名密码,Azure环境里按以下方式存储:

  • Azure Key Vault:把每个区域对应的SMB用户名、密码存在Key Vault里,给Azure Function的系统身份分配Secret Reader权限,用azure-keyvault-secrets和azure-identity包读取。这是最安全的方案,尤其适合多用户多权限的场景。
  • Function应用配置:如果场景简单,也可以把凭据存在Function的「配置」里(应用设置),代码里用os.environ读取,但Key Vault更稳妥,能避免凭据泄露风险。

具体实现(smbprotocol示例)

1. 依赖配置

在requirements.txt里添加:

smbprotocol>=1.10.0
azure-keyvault-secrets>=4.7.0
azure-identity>=1.12.0

2. 核心代码

import os
from smbprotocol.connection import Connection
from smbprotocol.session import Session
from smbprotocol.tree import TreeConnect
from azure.identity import DefaultAzureCredential
from azure.keyvault.secrets import SecretClient

def main(req):
    # 从环境变量获取基础配置
    vault_url = os.environ["KEY_VAULT_URL"]
    smb_server = os.environ["SMB_SERVER"]  # 格式:\\192.168.1.100 或域名
    smb_share = os.environ["SMB_SHARE"]    # 共享名,比如:RegionalFiles
    
    # 根据请求参数确定目标区域(示例:从URL参数获取)
    target_region = req.params.get("region", "RegionA")
    secret_user_key = f"smb-user-{target_region}"
    secret_pass_key = f"smb-pass-{target_region}"
    
    # 从Key Vault读取对应区域的凭据
    credential = DefaultAzureCredential()
    secret_client = SecretClient(vault_url=vault_url, credential=credential)
    smb_username = secret_client.get_secret(secret_user_key).value
    smb_password = secret_client.get_secret(secret_pass_key).value

    # 建立SMB连接
    conn = Connection(smb_server, 445)
    conn.connect()

    try:
        # 认证会话(域用户需带DOMAIN\\前缀,比如:CORP\\user01)
        session = Session(conn)
        session.authenticate(smb_username, smb_password)

        # 连接目标共享目录
        tree = TreeConnect(session, f"\\\\{smb_server}\\{smb_share}")
        tree.connect()

        # 读取区域对应文件(共享内的相对路径)
        file_path = f"{target_region}/daily_data.csv"
        with tree.open_file(file_path, "r") as f:
            content = f.read().decode("utf-8")
            # 这里可根据需求处理内容,比如返回给请求方或写入Azure存储

        return f"成功读取{target_region}的文件"

    except Exception as e:
        return f"访问失败:{str(e)}"

    finally:
        # 清理资源
        tree.disconnect()
        session.logoff()
        conn.disconnect()

3. 多用户权限适配

  • 给每个区域的访问用户单独创建SMB账号,在本地共享上配置对应区域文件夹的NTFS权限(比如RegionA的用户只能访问RegionA文件夹)
  • 在Key Vault里为每个用户存储对应的凭据,命名规则统一(比如smb-user-regionA、smb-pass-regionA)
  • 函数根据请求里的区域标识,动态读取对应凭据,实现权限隔离

常见坑点排查

  • 认证失败:检查用户名格式,域用户必须带DOMAIN\\前缀;确认SMB服务器启用了SMB 2/3(禁用SMB 1),且允许加密认证
  • 连接超时:核对Express Route的路由是否打通,本地防火墙和Azure NSG是否开放445端口
  • 权限不足:本地共享的「共享权限」和「NTFS权限」都要设置,两者取最严格的权限生效

内容的提问来源于stack exchange,提问作者Mike Tauber

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 09:40:28