@@ -247,19 +247,40 @@ function Remove-WormStorageAccounts() {
247
247
if (! $hasContainers ) { continue }
248
248
249
249
$ctx = New-AzStorageContext - StorageAccountName $account.StorageAccountName
250
+ $containers = $ctx | Get-AzStorageContainer
251
+ $blobs = $containers | Get-AzStorageBlob
250
252
251
- $immutableBlobs = $ctx `
252
- | Get-AzStorageContainer `
253
+ $immutableBlobs = $containers `
253
254
| Where-Object { $_.BlobContainerProperties.HasImmutableStorageWithVersioning } `
254
255
| Get-AzStorageBlob
255
256
try {
256
257
foreach ($blob in $immutableBlobs ) {
257
- Write-Host " Removing legal hold - blob: $ ( $blob.Name ) , account: $ ( $account.StorageAccountName ) , group: $ ( $group.ResourceGroupName ) "
258
- $blob | Set-AzStorageBlobLegalHold - DisableLegalHold | Out-Null
258
+ # We can't edit blobs with customer encryption without using that key
259
+ # so just try to delete them fully instead. It is unlikely they
260
+ # will also have a legal hold enabled.
261
+ if (($blob | Get-Member ' ListBlobProperties' ) `
262
+ -and $blob.ListBlobProperties.Properties.CustomerProvidedKeySha256 ) {
263
+ Write-Host " Removing customer encrypted blob: $ ( $blob.Name ) , account: $ ( $account.StorageAccountName ) , group: $ ( $group.ResourceGroupName ) "
264
+ $blob | Remove-AzStorageBlob - Force
265
+ continue
266
+ }
267
+
268
+ if (! ($blob | Get-Member ' BlobProperties' )) {
269
+ continue
270
+ }
271
+
272
+ if ($blob.BlobProperties.LeaseState -eq ' Leased' ) {
273
+ Write-Host " Breaking blob lease: $ ( $blob.Name ) , account: $ ( $account.StorageAccountName ) , group: $ ( $group.ResourceGroupName ) "
274
+ $blob.ICloudBlob.BreakLease ()
275
+ }
276
+
277
+ if ($blob.BlobProperties.HasLegalHold ) {
278
+ Write-Host " Removing legal hold - blob: $ ( $blob.Name ) , account: $ ( $account.StorageAccountName ) , group: $ ( $group.ResourceGroupName ) "
279
+ $blob | Set-AzStorageBlobLegalHold - DisableLegalHold | Out-Null
280
+ }
259
281
}
260
- }
261
- catch {
262
- Write-Warning " User must have 'Storage Blob Data Owner' RBAC permission on subscription or resource group"
282
+ } catch {
283
+ Write-Warning " Ensure user has 'Storage Blob Data Owner' RBAC permission on subscription or resource group"
263
284
Write-Error $_
264
285
throw
265
286
}
@@ -273,13 +294,19 @@ function Remove-WormStorageAccounts() {
273
294
}
274
295
275
296
try {
276
- Write-Host " Removing immutability policies - account: $ ( $ctx.StorageAccountName ) , group: $ ( $group.ResourceGroupName ) "
277
- $null = $ctx | Get-AzStorageContainer | Get-AzStorageBlob | Remove-AzStorageBlobImmutabilityPolicy
297
+ foreach ($blob in $blobs ) {
298
+ if ($blob.BlobProperties.ImmutabilityPolicy.PolicyMode ) {
299
+ Write-Host " Removing immutability policy - blob: $ ( $blob.Name ) , account: $ ( $ctx.StorageAccountName ) , group: $ ( $group.ResourceGroupName ) "
300
+ $null = $blob | Remove-AzStorageBlobImmutabilityPolicy
301
+ }
302
+ }
278
303
}
279
304
catch {}
280
305
281
306
try {
282
- $ctx | Get-AzStorageContainer | Get-AzStorageBlob | Remove-AzStorageBlob - Force
307
+ foreach ($blob in $blobs ) {
308
+ $blob | Remove-AzStorageBlob - Force
309
+ }
283
310
$succeeded = $true
284
311
}
285
312
catch {
@@ -290,9 +317,8 @@ function Remove-WormStorageAccounts() {
290
317
291
318
try {
292
319
# Use AzRm cmdlet as deletion will only work through ARM with the immutability policies defined on the blobs
293
- $ctx | Get-AzStorageContainer | ForEach-Object { Remove-AzRmStorageContainer - Name $_.Name - StorageAccountName $ctx.StorageAccountName - ResourceGroupName $group.ResourceGroupName - Force }
294
- }
295
- catch {
320
+ $containers | ForEach-Object { Remove-AzRmStorageContainer - Name $_.Name - StorageAccountName $ctx.StorageAccountName - ResourceGroupName $group.ResourceGroupName - Force }
321
+ } catch {
296
322
Write-Warning " Container removal failed. Ignoring the error and trying to delete the storage account."
297
323
Write-Warning $_
298
324
}
0 commit comments