Я пытался найти файл в общей папке Azure. Я знаю, как получить файл, подключив общий файловый ресурс Azure к компьютеру программным путем. Есть ли другой способ, кроме монтирования файлового ресурса? Обнаружена функция REST API общего доступа к файлам Azure, которую мы можем использовать для этого. Но как использовать REST API с помощью PowerShell
Когда я попытался использовать приведенную ниже команду, я получаю сообщение об ошибке, как указано.
Invoke-RestMethod -Method Get -Uri "https://test.file.core.windows.net/testartifacts/testdb/version?restype=share&comp=metadata"
Invoke-RestMethod: InvalidQueryParameterValueValue for one of the query parameters specified in
the request URI is
invalid.
И как авторизовать этот запрос?
Ниже указаны способы получения файла из файлового ресурса Azure.
1. Используйте Azure CLI. Смотрите здесь.
az login #Log in interactively
az storage file download \
--account-name $storageAccountName \
--account-key $storageAccountKey \
--share-name $shareName \
--path "myDirectory/SampleUpload.txt" \
--dest "SampleDownload.txt" \
--output none
Если вы хотите войти в систему, используя субъект-службу. Сначала необходимо создать субъект-службу. См. ниже документ, чтобы создать субъект-службу.
Используйте портал для создания приложения Azure AD и субъекта-службы.
Создайте субъект-службу Azure с помощью Azure CLI
И вам нужно добавить разрешение на чтение для субъекта-службы в назначении роли вашей учетной записи Azure Story.
Затем вы можете войти в систему, используя субъект-службу:
az login --service-principal --username APP_ID --password PASSWORD --tenant TENANT_ID
az storage file download --account-name ...
2. Используйте Azure powershell: см. здесь.
Connect-AzAccount #Log in interactively
$ctx=(Get-AzStorageAccount -ResourceGroupName $resourceGroupName -Name $storageAccName).Context
$file=Get-AZStorageFile -Context $ctx -ShareName $fileShareName -Directory directiry -Path filepath
Вы также можете войти, используя субъект-службу.
$pscredential = New-Object -TypeName System.Management.Automation.PSCredential($sp.ApplicationId, $sp.Secret)
Connect-AzAccount -ServicePrincipal -Credential $pscredential -Tenant $tenantId
3. Использование Azure Rest API. Смотрите здесь.
Вы можете проверить приведенный ниже пример для аутентификации остального вызова API:
# Variables
$TenantId = "" # Enter Tenant Id.
$ClientId = "" # Enter Service Principal Client Id.
$ClientSecret = "" # Enter Service Principal Client Secret.
$Resource = "https://management.core.windows.net/"
$SubscriptionId = "" # Enter Subscription Id.
$RequestAccessTokenUri = "https://login.microsoftonline.com/$TenantId/oauth2/token"
$body = "grant_type=client_credentials&client_id=$ClientId&client_secret=$ClientSecret&resource=$Resource"
$Token = Invoke-RestMethod -Method Post -Uri $RequestAccessTokenUri -Body $body -ContentType 'application/x-www-form-urlencoded'
Write-Host "Print Token" -ForegroundColor Green
Write-Output $Token
# Get file
$fileUrl = "https://myaccount.file.core.windows.net/myshare/mydirectorypath/myfile"
$Headers = @{}
$Headers.Add("Authorization","$($Token.token_type) "+ " " + "$($Token.access_token)")
$file= Invoke-RestMethod -Method Get -Uri $fileUrl -Headers $Headers
Write-Host "Print File" -ForegroundColor Green
Write-Output $file
Подробный пример смотрите здесь.
Если вы хотите проверить, существует ли файл в общей папке Azure, вы можете использовать Azure File Rest API Получить свойства файла . Что касается того, как выполнить аутентификацию для вызова API, мы можем использовать авторизацию с общим ключом. Для получения более подробной информации, пожалуйста, обратитесь к здесь
Например
$accesskey = "<storage account key>"
$storageAccount = "andyprivate"
$shareName = "share2"
$filePath = "test1.xml"
$date = (Get-Date).ToUniversalTime().AddYears(1).toString('R')
$version = "2020-04-08"
$stringToSign = "HEAD`n`n`n`n`n`n`n`n`n`n`n`nx-ms-date:$date`nx-ms-version:$version`n/$storageAccount/$shareName/$filePath"
$hmacsha = New-Object System.Security.Cryptography.HMACSHA256
$hmacsha.key = [Convert]::FromBase64String($accesskey)
$signature = $hmacsha.ComputeHash([Text.Encoding]::UTF8.GetBytes($stringToSign))
$signature = [Convert]::ToBase64String($signature)
$headers=@{"x-ms-date"=$date;
"x-ms-version"= $version;
"Authorization"= "SharedKey $($storageAccount):$signature"}
$url = "https://$storageAccount.file.core.windows.net/$shareName/$filePath"
try{
$res=Invoke-WebRequest -Uri $url -Method Head -Headers $headers -UseBasicParsing
}catch{
if ($_.Exception.Response.StatusCode.value__ -eq 404){
write-host "The file does not exist" -ForegroundColor Red
}
}