2

我有一个SAS 令牌,格式如下:

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

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

阅读这篇reddit 帖子,我的选择似乎是:

  1. 解析出StorageAccountName(in the example name)、Container(in the example container) 和SASToken(in the example above sv=2015-04-05&sr=b&sig=abc123&se=2017-03-07T12%3A58%3A52Z&sp=rw),然后使用New-AzStorageContext/ Set-AzStorageBlobContent。这或多或少是此 StackOverflow 帖子中的答案(仅使用 SAS 令牌连接到 Azure 存储帐户?
  2. 使用Invoke-WebRequest或其亲属基本上自己执行 REST 调用。

我想尽可能多地使用Az提供的 cmdlet,所以从选项 1 开始,似乎没有一个 API 来解析这个,我能找到的最接近的是这个 StackOverflow 帖子(使用 SAS 令牌上传 Blob 内容)谈论使用CloudBlockBlob,但目前尚不清楚我是否可以在 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. 是否有使用AzSAS URI 和 SAS 令牌来允许上传的 Cmdlet?
  2. (如果没有)是否有解析 SAS URI + SAS 令牌的 API?
4

1 回答 1

2

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

$uri = [System.Uri] $SASUri

一旦你有了它,你可以使用类似的东西来获取容器名称和 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
于 2021-09-02T13:26:26.573 回答