PowerShell使用SAS令牌列出Azure Blob容器文件报错排查咨询
问题1:操作是否存在错误?
你的操作逻辑没有原则性错误,报错是两个非操作逻辑的原因导致:
- 从调试日志可看到错误响应的服务器是
squid/4.10,返回状态码为503 Service Unavailable,响应内容是HTML格式的代理错误页面,不是Azure存储服务返回的标准XML格式响应,所以PowerShell解析响应时触发了XML标签不匹配的报错,本质是虚拟机的出站请求被企业内网代理拦截了。你之前能跑通Azcopy是因为Azcopy默认会读取系统代理配置,而Az.Storage模块的PowerShell命令默认未配置代理就会被拦截。 - 你代码中填写的存储账户名是
storageacont01,但调试日志显示实际发起请求的账户为storagecont1,拼写不一致也会导致请求异常。
问题2:连接字符串是否限制了PowerShell访问权限?
不存在权限限制问题。你已经用同一套连接字符串跑通了Azcopy的文件复制操作,说明SAS令牌的权限是足够的;如果是权限问题,Azure存储服务会返回403状态码,不会返回503代理错误,所以该问题和连接字符串的权限配置无关。
修复方案
方案1:用已验证可用的Azcopy实现需求(推荐,操作成本最低)
直接调用Azcopy列取目标路径的文件即可判断是否存在文件,命令示例:
azcopy list "https://storagecont01.blob.core.windows.net/mycontainer/in/data/documents/?sv=2019-06-00&ss=bxqt&srt=sco&sp=xwlacux&se=2019-06-00T00:00:05Z&st=2019-06-00T01:30:00Z&spr=https&sig=Sz%2zxdadzca1e137zzdzdq131D%21366bpafOrAAdac%3D"
命令返回结果有文件条目则说明路径下存在文件,返回空则说明路径下无文件。
方案2:修复PowerShell命令执行异常
先给PowerShell配置和系统一致的代理,再调用存储命令即可:
# 配置企业内网代理,替换为实际的代理地址和端口 $proxyUri = [System.Uri]"http://你的代理地址:端口" [System.Net.WebRequest]::DefaultWebProxy = New-Object System.Net.WebProxy($proxyUri,$true) # 如果代理需要身份验证,额外加一行配置:[System.Net.WebRequest]::DefaultWebProxy.Credentials = [System.Net.CredentialCache]::DefaultCredentials # 直接用完整连接字符串创建上下文,避免手动拆分账户名、SAS时的拼写错误 $connString = "BlobEndpoint=https://storagecont01.blob.core.windows.net/;QueueEndpoint=https://storageacont01.queue.core.windows.net/;FileEndpoint=https://storageacont01.file.core.windows.net/;TableEndpoint=https://storageacont01.table.core.windows.net/;SharedAccessSignature=sv=2019-06-00&ss=bxqt&srt=sco&sp=xwlacux&se=2019-06-00T00:00:05Z&st=2019-06-00T01:30:00Z&spr=https&sig=Sz%2zxdadzca1e137zzdzdq131D%21366bpafOrAAdac%3D" $ctx = New-AzStorageContext -ConnectionString $connString # 列取目标路径下的所有Blob Get-AzStorageBlob -Container "mycontainer" -Prefix "in/data/documents/" -Context $ctx
内容的提问来源于stack exchange,提问作者Sergii
相关产品推荐
相关产品推荐

