Yanlışlıkla silinen bir dosya paylaşımını geri yüklemek için PowerShell betiği

Bu betik, bir dosya paylaşımını yanlışlıkla sildiyseniz geri yüklemenize yardımcı olur. Geçici silme ile silinen bir dosya paylaşımını 14 gün içinde geri yükleyebilir ve içeriğini, anlık görüntülerini ve kurtarma noktalarını kurtarabilirsiniz. Geçici silme hakkında daha fazla bilgi edinin.

Dosya paylaşımını silmeye yönelik örnek betik

#Import-Module Az.Storage -MinimumVersion 1.7.0 -Scope Local
Param(
        [Parameter(Mandatory=$True)][System.String] $ResourceGroupName,
        [Parameter(Mandatory=$True)][System.String] $StorageAccountName,
        [Parameter(Mandatory=$True)][System.String] $FileShareName,
        [Parameter(Mandatory=$True)][System.String] $SubscriptionId,
        [Parameter(Mandatory=$False)][System.Boolean] $ListOption,
        [Parameter(Mandatory=$False)][System.String] $DeletedShareVersion
    )

Function Restore-DeletedFileShare
{
    Param(
        [Parameter(Mandatory=$True)][Microsoft.WindowsAzure.Commands.Common.Storage.LazyAzureStorageContext] $Context,
        [Parameter(Mandatory=$True)][System.String] $FileShareName,
        [Parameter(Mandatory=$False)][System.String] $DeletedShareVersion
        )

    if ([string]::IsNullOrWhiteSpace($FileShareName))
    {
        Write-Error "Please specify the required input parameter: FileShareName" -ErrorAction Stop
    }

    $FileShareName = $FileShareName.ToLowerInvariant()

    Write-Verbose "Restoring a file share with the name: $FileShareName" -Verbose


    Write-Information -MessageData "Started: Creating SASToken to List File Shares" -InformationAction Continue

    $listToken = New-AzStorageAccountSASToken -Context $Context -Service File -ResourceType Service -Permission "l" -Protocol HttpsOrHttp -StartTime (Get-Date).AddHours(-1) -ExpiryTime (Get-Date).AddHours(1)

    Write-Information -MessageData "Completed: Creating SASToken to List File Shares" -InformationAction Continue

    Write-Information -MessageData "Started: Listing File Shares to find the deleted file share" -InformationAction Continue

    $listSharesUrl = [string]::Concat($Context.FileEndPoint, "?include=metadata,deleted&comp=list&api-version=2019-10-10&", $listToken.Substring(1))

    $listSharesResponse = Invoke-WebRequest $listSharesUrl -Method "GET" -Verbose

    if ($listSharesResponse.StatusCode -ne 200)
    {
        Write-Error "Request to list file shares failed." -ErrorAction Stop
    }

    Write-Verbose $listSharesResponse.RawContent -Verbose

    $listSharesResponseContent = $listSharesResponse.Content.Substring(3)

    Write-Information -MessageData "Completed: Listing File Shares to find the deleted file share" -InformationAction Continue

    Write-Information -MessageData "Started: Search for a deleted file share with the specified name" -InformationAction Continue

    $deletedFileShares = Select-Xml -Content $listSharesResponseContent -XPath "/EnumerationResults/Shares/Share[Deleted=""true"" and Name=""$FileShareName""]"

    $matchedCount = 0
    $deletedShareVersions = New-Object System.Collections.Generic.List[string]

    foreach($share in $deletedFileShares)
    {
        if($matchedCount -eq 0)
        {
          Write-Verbose $share.Node.InnerXml -Verbose

          Write-Information -MessageData "Completed: Search for a deleted file share with the specified name And Found versions" -InformationAction Continue
        }

        $shareVer = $share.Node.Item("Version").InnerText
        $shareDelTime = $share.Node.Item("Properties").Item("DeletedTime").InnerText
        $retDays = $share.Node.Item("Properties").Item("RemainingRetentionDays").InnerText

        $deletedShareVersions.Add($share.Node.Item("Version").InnerText)

        Write-Information -MessageData "DeletedVersion: $shareVer, DeletedTime: $shareDelTime, RemainingRetentionDays: $retDays"  -InformationAction Continue

        $matchedCount++
    }

    if($ListOption -eq $True)
    {
       return;
    }

    if ($matchedCount -eq 0)
    {
        Write-Error "Deleted file share with the specified name was not found." -ErrorAction Stop
    }
    elseif($matchedCount -eq 1 -and ([string]::IsNullOrWhiteSpace($DeletedShareVersion) -or $deletedShareVersions.Contains($DeletedShareVersion)))
    {
      $DeletedShareVersion = $deletedShareVersions
    }
    elseif ($matchedCount -gt 1)
    {
      if ([string]::IsNullOrWhiteSpace($DeletedShareVersion) -or !$deletedShareVersions.Contains($DeletedShareVersion))
      {
        Write-Error "More than one share with the specified name was found. Please specify a valid DeletedShareVersion parameter from above possible values." -ErrorAction Stop
      }
    }

    Write-Information -MessageData "Completed: Search for a deleted file share with the specified name And Found version: $DeletedShareVersion" -InformationAction Continue

    Write-Information -MessageData "Started: Creating SASToken to Restore File Share" -InformationAction Continue

    $restoreToken = New-AzStorageAccountSASToken -Context $Context -Service File -ResourceType Container -Permission "w" -Protocol HttpsOrHttp -StartTime (Get-Date).AddHours(-1) -ExpiryTime (Get-Date).AddHours(1)

    Write-Information -MessageData "Completed: Creating SASToken to Restore File Share" -InformationAction Continue

    Write-Information -MessageData "Started: Restore File Share" -InformationAction Continue

 $restoreShareUrl = [string]::Concat($Context.FileEndPoint, $FileShareName, "?restype=share&comp=undelete&api-version=2019-10-10&", $restoreToken.Substring(1))

    $restoreHeaders = @{"x-ms-deleted-share-name" = $FileShareName; "x-ms-deleted-share-version" = $DeletedShareVersion}

    $restoreResponse = Invoke-WebRequest $restoreShareUrl -Headers $restoreHeaders -Method "PUT" -Verbose

    if ($restoreResponse.StatusCode -ne 201)
    {
        Write-Error "Request to restore a file share failed." -ErrorAction Stop
    }

    Write-Verbose $restoreResponse.RawContent -Verbose

    Write-Information -MessageData "Completed: Restore File Share" -InformationAction Continue
}

Connect-AzAccount
Select-AzSubscription -Subscription $SubscriptionId
$sa = Get-AzStorageAccount -ResourceGroupName $ResourceGroupName -Name $StorageAccountName


Restore-DeletedFileShare $sa.Context $FileShareName $DeletedShareVersion

Önkoşullar

Betiği çalıştırmadan önce aşağıdaki önkoşulların karşılandığından emin olun:

  • Betiği çalıştırmadan önce bu bağlantıdan en son Azure PowerShell Az modüllerini yükleyin.

  • Aşağıdaki ayrıntıları, betiğin farklı parametreleri için değer olarak geçirmeniz gerektiğinden elinizde bulundurun:

    • -SubscriptionId - Dosya paylaşımının bulunduğu aboneliğin kimliği.
    • -ResourceGroupName - Dosya paylaşımını barındıran Depolama Hesabının Kaynak Grubu.
    • -StorageAccountName - Dosya paylaşımını barındıran depolama hesabının adı.
    • -FileShareName - Silinecek dosya paylaşımının adı

Dosya paylaşımını geri yüklemek için betiği yürütün

Betiği aşağıdaki senaryolarda yürütebilirsiniz:

  • Geri almaya çalıştığınız dosya paylaşımıyla aynı ada sahip birden çok silinmiş sürüm yok.
  • Geri yüklemeye çalıştığınız paylaşılan dosya ile aynı ada sahip çok sayıda silinmiş sürüm mevcut.

Dosya paylaşımının kullanımdan kaldırılma betiğini yürütmek için şu adımları izleyin:

  1. Önceki betiği makinenize kendi seçtiğiniz bir adla kaydedin. Bu örnekte, Undelete.ps1 olarak kaydettik
  2. Betiği gereksinimlerinize uygun senaryoya göre çalıştırın.

Senaryo 1: Birden çok silinmiş sürüm yok

Geri almaya çalıştığınız dosya paylaşımıyla aynı ada sahip birden çok silinmiş sürüm yok.

Aşağıdaki örnek, afsshare depolama hesabında bulunan share1 dosya paylaşımını geri yükler.

   .\UnDelete.ps1 -ResourceGroupName afsshare -StorageAccountName afsshare -SubscriptionId aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e -FileShareName share1

Çıktıda ileti gösterilmelidir Completed:Restore File Share

Senaryo 2: Birden çok silinmiş sürüm

Geri almaya çalıştığınız dosya paylaşımıyla aynı ada sahip birden çok silinmiş sürüm var.

Betiği kaydettikten sonra, aşağıdaki adımları izleyerek dosya paylaşımı share1 sürümünü geri getirin.

  1. Dosya paylaşımı adını sağlayarak betiği aşağıdaki gibi yürütebilirsiniz.

    .\UnDelete.ps1 -ResourceGroupName afsshare -StorageAccountName afsshare -SubscriptionId aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e -FileShareName share1
    
    Completed: Search for a deleted file share with the specified name and Found versions
    DeletedVersion: 01D5D7F77ACC7864, DeletedTime: Fri, 31 Jan 2020 05:30:33 GMT, RemainingRetentionDays: 14
    DeletedVersion: 01D5D7F7A76CAF42, DeletedTime: Fri, 31 Jan 2020 05:31:25 GMT, RemainingRetentionDays: 14
    Restore-DeletedFileShare : More than one share with the specified name was found. Please specify a valid DeletedShareVersion parameter from above possible values.
    
  2. 1. adımın çıktısından geri almak istediğiniz sürümü seçin ve -DeletedShareVersion parametresi için bir değer olarak geçirin.

    Aşağıdaki örnek, share1 dosya paylaşımının 01D5D7F77ACC7864 sürümünü geri yükler.

    .\UnDelete.ps1 -ResourceGroupName afsshare-StorageAccountName afsshare -SubscriptionId aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e -FileShareName share1 -DeletedShareVersion 01D5D7F77ACC7864
    

Sonraki Adımlar