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

如何通过SAS访问、读取或下载Azure文件共享中的文件

问题根因

你持有的SAS是对象范围的服务SAS,从参数srt=o就能确认授权范围仅为单个特定文件/目录对象,不具备账号级、共享级访问权限,之前的报错都是这个原因导致的:

  • 存储资源管理器连接存储账号需要至少服务级范围的SAS(对应参数srt=s),你手动修改srt参数会直接破坏签名校验——SAS的签名是将所有参数(包括srt、sp、有效期等)做哈希计算生成的,任意参数修改都会导致签名失效,自然无法通过认证。
  • AzCopy返回403是因为执行命令时加了--recursive参数,递归遍历目录需要目录枚举权限,对象级SAS默认不授予该权限,因此请求被拒绝。
可行操作方案

当SAS指向单个文件时

不需要额外工具,三种方式都可以直接下载:

  • 直接把完整SAS URI复制到浏览器地址栏,回车即可触发文件下载。
  • 用AzCopy下载时去掉递归、SMB属性保留类参数,执行命令:
azcopy copy "你的完整SAS URI" "本地保存路径\自定义文件名"
  • 用PowerShellGet-AzStorageFileContent下载时不需要手动拆分参数,参考以下脚本即可:
# 替换为你的完整SAS URI
$sasUri = "https://<storage-account-name>.file.windows.net/<file-path>?sv=<Date>&ss=f&srt=o&sp=rwl&se=<Date>T<Time>Z&st=<Date>T<Time>Z&spr=http&sig=<token>"
$uriSplit = $sasUri -split '\?',2
$baseUri = [Uri]$uriSplit[0]
$sasToken = $uriSplit[1]
$storageAccountName = $baseUri.Host.Split('.')[0]
$pathSegs = $baseUri.AbsolutePath.Trim('/') -split '/'
$shareName = $pathSegs[0]
$targetPath = $pathSegs[1..($pathSegs.Length-1)] -join '/'
$ctx = New-AzStorageContext -StorageAccountName $storageAccountName -SasToken $sasToken
Get-AzStorageFileContent -ShareName $shareName -Path $targetPath -Destination "C:\Users\<User>\Desktop\保存文件名" -Context $ctx

当SAS指向文件夹时

你当前持有的srt=o级SAS不支持枚举目录下的文件列表,无法直接递归下载整个文件夹,可选择以下两种方案:

  • 如果你明确知道文件夹内所有文件的完整路径,可将SAS的查询字符串(即?开头的所有内容)直接拼接到每个文件的完整URL后,逐个下载单个文件即可,对象级SAS对路径匹配的单个文件是生效的,不需要枚举权限。
  • 联系SAS颁发方重新生成对应权限范围的SAS:
    • 若需要用存储资源管理器浏览整个文件共享,需生成账号级SAS,设置srt=s(服务级范围)并授予读、列表权限
    • 若需要递归下载目标文件夹,需生成针对该目录的目录级SAS,授予读、列表权限,不要使用srt=o的对象级SAS

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 06:06:31