如何通过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" "本地保存路径\自定义文件名"
- 用PowerShell
Get-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
- 若需要用存储资源管理器浏览整个文件共享,需生成账号级SAS,设置
内容的提问来源于stack exchange,提问作者Zenk
相关产品推荐
相关产品推荐

