[Azure Storage] How to call Storage API’s from Powershell (without SDK)

Recently I had this ask from a partner who wanted sample code for making REST API call to storage without our SDK’s route. Though we have array of SDK’s supporting many languages, still he wanted to make clean REST calls without SDK’s. It some time to understand and create this proof of concept. So sharing here to easy reference. Hope this helps in some way..

$accountname="your_storage_accname"

$key = "acc_key"

$container="container_name"

#file to create

$blkblob="samplefile.log"

$f = "C:\\temp\\samplefile.log"

$BlobOperation = "PUT"

$body = (Get-Content -Path $f -Raw)

$filelen = $body.Length

#added this per comments in the below blog post.

$filelen = (Get-ChildItem -File $f).Length

$RESTAPI_URL = "https://$accountname.blob.core.windows.net/$container/$blkblob";

$date=(Get-Date).ToUniversalTime()

$datestr=$date.ToString("R");

$datestr2=$date.ToString("s")+"Z";

$strtosign = "$BlobOperation`n`n`n$filelen`n`n`n`n`n`n`n`n`nx-ms-blob-type:BlockBlob`nx-ms-date:$datestr`nx-ms-version:2015-04-05`n/"

$strtosign = $strtosign + $accountname + "/"

$strtosign = $strtosign + $container

$strtosign = $strtosign + "/" +$blkblob

 

write-host $strtosign

 

[byte[]]$dataBytes = ([System.Text.Encoding]::UTF8).GetBytes($strtosign)

$hmacsha256 = New-Object System.Security.Cryptography.HMACSHA256

$hmacsha256.Key = [Convert]::FromBase64String($key)

$sig = [Convert]::ToBase64String($hmacsha256.ComputeHash($dataBytes))

$authhdr = "SharedKey $accountname`:$sig"

 

write-host $authhdr

 

$RequestHeader = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"

 

$RequestHeader.Add("Authorization", $authhdr)

$RequestHeader.Add("x-ms-date", $datestr)

$RequestHeader.Add("x-ms-version", "2015-04-05")

$RequestHeader.Add("x-ms-blob-type","BlockBlob")

 

#create a new PS object to hold the response JSON

$RESTResponse = New-Object PSObject;

$RESTResponse = (Invoke-RestMethod -Uri $RESTAPI_URL -Method put -Headers $RequestHeader -InFile $f);

 

write-host $RESTResponse

write-host "# Success !!! uploaded the file >>" $RESTAPI_URL

-------------------------------------------------------------------------------------------------------------------------------------------------------------

$accountname="your_storage_accname"

$key = "acc_key"

$container="container_name"

$blkblob="file_for_deletion"

$BlobOperation = "DELETE"

 

$RESTAPI_URL = "https://$accountname.blob.core.windows.net/$container/$blkblob";

$date=(Get-Date).ToUniversalTime()

$datestr=$date.ToString("R");

$datestr2=$date.ToString("s")+"Z";

 

$strtosign = "$BlobOperation`n`n`n`n`n`n`n`n`n`n`n`nx-ms-blob-type:BlockBlob`nx-ms-date:$datestr`nx-ms-version:2015-04-05`n/"

 

$strtosign = $strtosign + $accountname + "/"

$strtosign = $strtosign + $container

$strtosign = $strtosign + "/" +$blkblob

write-host $strtosign

 

[byte[]]$dataBytes = ([System.Text.Encoding]::UTF8).GetBytes($strtosign)

$hmacsha256 = New-Object System.Security.Cryptography.HMACSHA256

$hmacsha256.Key = [Convert]::FromBase64String($key)

$sig = [Convert]::ToBase64String($hmacsha256.ComputeHash($dataBytes))

$authhdr = "SharedKey $accountname`:$sig"

write-host $authhdr

 

$RequestHeader = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"

$RequestHeader.Add("Authorization", $authhdr)

$RequestHeader.Add("x-ms-date", $datestr)

$RequestHeader.Add("x-ms-version", "2015-04-05")

$RequestHeader.Add("x-ms-blob-type","BlockBlob")

$RESTResponse = New-Object PSObject;

write-host $RESTAPI_URL

 

$RESTResponse = (Invoke-RestMethod -Uri $RESTAPI_URL -Method Delete -Headers $RequestHeader);

 

write-host "# Success !!! deleted the input file >>" $RESTAPI_URL

reference:-

https://dzone.com/articles/examples-windows-azure-storage

/en-us/azure/storage/storage-introduction#storage-apis-libraries-and-tools

Comments

  • Anonymous
    November 13, 2017
    $body = (Get-Content -Path $f -Raw)$filelen = $body.Length returns the number of rows in the filechange to $filelen = (Get-ChildItem -File $f).Lengthfor size of file
    • Anonymous
      November 13, 2017
      Thanks Ilan.
      • Anonymous
        November 13, 2017
        Thank you, you saved me 3 hours of understanding how the authentication hashing works =)