在没有 SAS 的情况下将文件上传到存储帐户

upload files to storage account without SAS

我需要在不使用 SAS 的情况下将文件上传到存储帐户。

我创建了一个 "app registration" 并授予参与者访问存储帐户的权限。

如果我想从powershell上传文件?我该怎么做?

首次登录?然后是 azcopy?因为我试过这种方式但是问我要令牌

您可以使用服务主体或证书使用 azcopy 登录,然后将您的文件复制到存储帐户。请参考 this article 了解更多信息。

有很多方法可以做到这一点。既然你提到了 PowerShell,我将在这个例子中使用它。

# The following assumes you have already created the App registration.
# Either through the portal, PS, whatever.

$creds = Get-Credential

# Uername = Application ID
# password = The service principle secret. You need to create this.

Connect-AzAccount `
    -Credential $creds `
    -Tenant  $tenantId `
    -ServicePrincipal

# you will need to get the storage accounts context.
# There are a few ways to do this I usually just get the storage account

$context = (Get-AzStorageAccount -Name $saName -ResourceGroupName $rgName).Context

# You will need to give the App Registration permissions to upload the blob.
# If you don't assign permissions this cmdlet will fail.

Set-AzStorageBlobContent `
    -Container $containerName `
    -File $filePath `
    -Blob $blobName `
    -Context $context

Azure Powershell, Azure CLI and AzCopy是三种不同的东西,你不应该把它们混在一起。

如果您想使用 powershell 上传带有服务主体的文件,请在创建应用程序注册后,get values for signing in, then create a new application secret

在你的storage account中,Contributor角色就够了,但是你要注意,实际上Contributor没有直接访问blob的权限,它只是让你获取上下文存储帐户,然后使用上下文访问 blob,要直接访问 blob,我们需要评论中提到的 Storage Blob Data Owner/Contributor

然后使用下面的脚本(另一个回复中的Get-Credential是交互的方式,这里是非交互的方式,通常我们使用非交互方式的服务主体来实现自动化)

$azureAplicationId ="<Application-ID>"
$azureTenantId= "<Tenant-ID>"
$azurePassword = ConvertTo-SecureString "<Application-secret>" -AsPlainText -Force
$psCred = New-Object System.Management.Automation.PSCredential($azureAplicationId , $azurePassword)
Connect-AzAccount -Credential $psCred -TenantId $azureTenantId -ServicePrincipal

$context = (Get-AzStorageAccount -ResourceGroupName <group-name> -Name <storageaccount-name>).Context
Set-AzStorageBlobContent -Container <container-name> -File <localfile-path> -Blob <blob-name> -Context $context