Powershell使用SAS代替密钥连接到Azure blob

时间:2018-10-25 20:46:02

标签: azure powershell azure-storage-blobs

我有一个脚本正在根据存储帐户名和密钥(我意识到这不是一个好的解决方案)从Blob获取文件到临时存储。我试图移动做相同的事情(获取相同的文件),但改用SAS令牌。 在存储帐户中,有一个名为“ automationparams”的容器,然后在该容器中有一个名为“ nsgscript.ps1”的文件。

我为该容器生成了一个SAS令牌,但无法找到一种为整个存储帐户生成令牌的方法。必须位于以下容器级别(单个文件)。

原来的脚本(工作原理)是:

$StorageAccountName = "storagename"
$StorageAccountKey = "abcdefghijkstorageaccountkeyhere"
$ContainerName = "automationparams"
$Blob1Name = "nsgscript.ps1"
$TargetFolderPath = ($env:TEMP)

$context = New-AzureStorageContext `
-StorageAccountName $StorageAccountName `
-StorageAccountKey $StorageAccountKey

$result = Get-AzureStorageBlobContent `
-Blob $Blob1Name `
-Container $ContainerName `
-Context $context `
-Destination $TargetFolderPath

这会将nsgscript.ps1下载到storageName存储帐户的automationparams容器中。

这是我正在尝试使用SAS令牌获取存储上下文的脚本:

$StorageAccountName = "storagename"
$Blob1Name = "nsgscript.ps1"
$TargetFolderPath = ($env:TEMP)

$context = New-AzureStorageContext -StorageAccountName $StorageAccountName -SASToken "https://storagelocation.blob.core.windows.net/automationparams?st=2018-10-25T19%3A57%3A00Z&se=2020-10-26T19%3A57%3A00Z&sp=rl&sv=2018-03-28&sr=c&sig=abcdefghijklmnorestofkey"

$result = Get-AzureStorageBlobContent `
-Blob $Blob1Name `
-Container $ContainerName `
-Context $context `
-Destination $TargetFolderPath

运行该命令时,出现以下错误消息:     Get-AzureStorageBlobContent:远程服务器返回错误:     (403)禁止。 HTTP状态码:403-HTTP错误消息:     服务器无法验证请求。确保值     授权标头的格式正确,包括签名。     在第1行:char:11

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我相信问题是因为您要在SAS令牌中指定URL

$context = New-AzureStorageContext -StorageAccountName $StorageAccountName -SASToken "https://storagelocation.blob.core.windows.net/automationparams?st=2018-10-25T19%3A57%3A00Z&se=2020-10-26T19%3A57%3A00Z&sp=rl&sv=2018-03-28&sr=c&sig=abcdefghijklmnorestofkey"

尝试将以下代码替换为以下代码:

$context = New-AzureStorageContext -StorageAccountName $StorageAccountName -SASToken "st=2018-10-25T19%3A57%3A00Z&se=2020-10-26T19%3A57%3A00Z&sp=rl&sv=2018-03-28&sr=c&sig=abcdefghijklmnorestofkey"

答案 1 :(得分:0)

我可以正确地把你的纸条放在我这边。您可以一边检查以下内容。

  • 确保使用存储帐户级别的SAS令牌,您可以从存储帐户页面中找到它,单击“生成SAS和连接字符串”。然后在您的脚本中复制SAS令牌。 enter image description here
  • 将AzureRM模块更新为最新版本。 Powershell cmdlet可在5.5.0及更高版本上使用。
  • 添加 -debug 参数以从调试日志中查找一些线索。

有关更多参考,您可以看到此question