仅使用 SAS 令牌在 PowerShell 中上传

Using Only a SAS Token To Upload in PowerShell

我有一个 SAS Token 的形式:

https://name.blob.core.windows.net/container?sv=2015-04-05&sr=b&sig=abc123&se=2017-03-07T12%3A58%3A52Z&sp=rw

我正尝试在 Powershell 中使用 Az 提供的 Cmdlet 将内容上传到此 blob。我无法找到仅使用上述 SAS 令牌和要上传的文件的 API。

阅读这篇文章 reddit post 我的选择似乎是:

  1. 解析出StorageAccountName(在name的例子中),Container(在container的例子中)和SASToken(在上面的例子中sv=2015-04-05&sr=b&sig=abc123&se=2017-03-07T12%3A58%3A52Z&sp=rw) 然后使用 New-AzStorageContext/Set-AzStorageBlobContent。这或多或少是这个 Whosebug Post ()
  2. 中的答案
  3. 我自己使用 Invoke-WebRequest 或其亲属基本上执行 REST 调用。

我想尽可能多地使用 Az 提供的 cmdlet,所以从选项 1 开始,似乎没有 API 来解析它,我能找到的最接近的是这个Whosebug Post() talking about using CloudBlockBlob,但是我不清楚这个 class 在 PowerShell 中是否可用。

为此,我创建了一个看似有效但很可能很脆弱的正则表达式,有更好的方法吗?

$SASUri = https://name.blob.core.windows.net/container?sv=2015-04-05&sr=b&sig=abc123&se=2017-03-07T12%3A58%3A52Z&sp=rw
$fileToUpload = 'Test.json'

$regex = [System.Text.RegularExpressions.Regex]::Match($SASUri, '(?i)\/+(?<StorageAccountName>.*?)\..*\/(?<Container>.*)\?(?<SASToken>.*)')
$storageAccountName = $regex.Groups['StorageAccountName'].Value
$container = $regex.Groups['Container'].Value
$sasToken = $regex.Groups['SASToken'].Value

$storageContext = New-AzStorageContext -StorageAccountName $storageAccountName -SasToken $sasToken
Set-AzStorageBlobContent -File $fileToUpload -Container $container -Context $storageContext -Force

重述问题

  1. 是否有 Az Cmdlet 接受 SAS URI 和 SAS 令牌以允许上传?
  2. (如果没有)有没有API解析SAS URI + SAS Token?

考虑到 $SASUri 是一个 URI,您可以使用类似以下内容的方式获取 System.Uri 对象:

$uri = [System.Uri] $SASUri

获得容器名称和 SAS 令牌后,您可以使用以下方式获取容器名称和 SAS 令牌:

$storageAccountName = $uri.DnsSafeHost.Split(".")[0]
$container = $uri.LocalPath.Substring(1)
$sasToken = $uri.Query

之后您的代码应该可以正常工作了:

$storageContext = New-AzStorageContext -StorageAccountName $storageAccountName -SasToken $sasToken
Set-AzStorageBlobContent -File $fileToUpload -Container $container -Context $storageContext -Force