التحديث التلقائي لخدمة Mobility في النسخ المتماثل لـ Azure-to-Azure

يستخدم Azure Site Recovery إيقاع إصدار شهري لإصلاح أي مشكلات وتحسين الميزات الموجودة أو إضافة ميزات جديدة. للبقاء على اطلاع دائم بالخدمة، يجب أن تخطط لتوزيع التصحيح كل شهر. لتجنب النفقات الإضافية المقترنة بكل ترقية، يمكنك السماح لـ Site Recovery بإدارة تحديثات المكونات.

كما هو مذكور في بنية Azure-to-Azure للإصلاح بعد كارثة، يتم تثبيت خدمة Mobility على جميع أجهزة Azure الظاهرية (VMs) التي تم تمكين النسخ المتماثل لها من منطقة Azure إلى أخرى. عند استخدام التحديثات التلقائية، يحدّث كل إصدار جديد ملحق خدمة Mobility.

إشعار

نوصي باستخدام الوحدة النمطية Azure Az PowerShell للتفاعل مع Azure. للبدء، راجع تثبيت Azure PowerShell. لمعرفة كيفية الترحيل إلى الوحدة النمطية Az PowerShell، راجع ترحيل Azure PowerShell من AzureRM إلى Az.

كيفية عمل التحديثات التلقائية

عند استخدام Site Recovery لإدارة التحديثات، فإنه يوزع دفتر تشغيل عمومي (تستخدمه خدمات Azure) عبر حساب تشغيل تلقائي، تم إنشاؤه في نفس الاشتراك مثل المخزن. كل مخزن يستخدم حساب تشغيل تلقائي واحد. لكل جهاز ظاهري في مخزن، يتحقق دفتر التشغيل من وجود تحديثات تلقائية نشطة. إذا توفر إصدار أحدث من ملحق خدمة Mobility، فسيتم تثبيت التحديث.

يحدث جدول دفتر التشغيل الافتراضي يوميا الساعة 12:00 صباحاً في المنطقة الزمنية للموقع الجغرافي للنسخة المتماثلة للجهاز الظاهري. يمكنك أيضاً تغيير جدول دفتر التشغيل عبر حساب التشغيل التلقائي.

إشعار

بدءاً من Update Rollup 35، يمكنك اختيار حساب تشغيل تلقائي موجود لاستخدامه للحصول على التحديثات. قبل Update Rollup 35، أنشئ Site Recovery حساب التشغيل التلقائي بشكل افتراضي. يمكنك تحديد هذا الخيار فقط عند تمكين النسخ المتماثل لجهاز ظاهري. وهو غير متوفر للجهاز الظاهري التي تم تمكين النسخ المتماثل له بالفعل. ينطبق الإعداد الذي تحدده على كل أجهزة Azure الظاهرية المحمية في نفس المخزن.

لا يتطلب تشغيل التحديثات التلقائية إعادة تشغيل أجهزة Azure الظاهرية ولا يؤثر على النسخ المتماثل الحالي.

تستند فواتير المهام في حساب التشغيل التلقائي إلى عدد الدقائق لوقت تشغيل المهمة المستخدم في الشهر. يستغرق تنفيذ المهمة بضع ثوان إلى حوالي دقيقة كل يوم ويُغطى ذلك كوحدات مجانية. افتراضياً، يتم تضمين 500 دقيقة كوحدات مجانية لحساب التشغيل التلقائي، كما هو موضح في الجدول التالي:

وحدات مجانية مشمولة (كل شهر) السعر
وقت تشغيل المهمة 500 دقيقة ₹0.14/دقيقة

تمكين التحديثات التلقائية

توجد عدة طرق يمكن من خلالها لـ Site Recovery إدارة تحديثات الملحقات:

الإدارة كجزء من خطوة تمكين النسخ المتماثل

عند تمكين النسخ المتماثل لجهاز ظاهري إما بدءاً من طريقة عرض الجهاز الظاهري أو من مخزن خدمات الاسترداد، يمكنك السماح لـ Site Recovery بإدارة التحديثات لملحق Site Recovery أو إدارته يدوياً.

إعدادات تمديد

تبديل إعدادات التحديث للملحق داخل المخزن

  1. من مخزن Recovery Services، انتقل إلى Manage>Site Recovery Infrastructure.

  2. ضمن For Azure Virtual Machines>Extension Update Settings>Allow Site Recovery to manage، حدد On.

    لإدارة الملحق يدوياً، حدد Off.

    هام

    عند اختيار Allow Site Recovery to manage، يتم تطبيق الإعداد على جميع الأجهزة الظاهرية في المخزن.

  3. حدد حفظ.

إعدادات تحديث الملحق

إشعار

يعلمك أي خيار من الخيارين بحساب التشغيل التلقائي المستخدم لإدارة التحديثات. إذا كنت تستخدم هذه الميزة في مخزن للمرة الأولى، فسيتم إنشاء حساب تشغيل تلقائي جديد افتراضياً. أو بدلاً من ذلك، يمكنك تخصيص الإعداد، واختيار حساب تشغيل تلقائي موجود. بمجرد تعريفها، ستستخدم كل الإجراءات اللاحقة لتمكين النسخ المتماثل في نفس المخزن حساب التشغيل التلقائي المحدد. تتضمن القائمة المنسدلة حالياً قائمة بحسابات التشغيل التلقائي الموجودة في نفس Resource Group كمخزن.

لحساب أتمتة مخصص، استخدم البرنامج النصي التالي:

هام

تشغيل البرنامج النصي التالي في سياق حساب التنفيذ التلقائي. يستفيد هذا البرنامج النصي من الهويات المدارة المعينة من قبل النظام كنوع المصادقة الخاص به.

param(
    [Parameter(Mandatory=$true)]
    [String] $VaultResourceId,
    [Parameter(Mandatory=$true)]
    [ValidateSet("Enabled",'Disabled')]
    [Alias("Enabled or Disabled")]
    [String] $AutoUpdateAction,
    [Parameter(Mandatory=$false)]
    [String] $AutomationAccountArmId
)
$SiteRecoveryRunbookName = "Modify-AutoUpdateForVaultForPatner"
$TaskId = [guid]::NewGuid().ToString()
$SubscriptionId = "00000000-0000-0000-0000-000000000000"
$AsrApiVersion = "2021-12-01"
$ArmEndPoint = "https://management.azure.com"
$AadAuthority = "https://login.windows.net/"
$AadAudience = "https://management.core.windows.net/"
$AzureEnvironment = "AzureCloud"
$Timeout = "160"
$AuthenticationType = "SystemAssignedIdentity"
function Throw-TerminatingErrorMessage
{
        Param
    (
        [Parameter(Mandatory=$true)]
        [String]
        $Message
        )
    throw ("Message: {0}, TaskId: {1}.") -f $Message, $TaskId
}
function Write-Tracing
{
        Param
    (
        [Parameter(Mandatory=$true)]
        [ValidateSet("Informational", "Warning", "ErrorLevel", "Succeeded", IgnoreCase = $true)]
                [String]
        $Level,
        [Parameter(Mandatory=$true)]
        [String]
        $Message,
            [Switch]
        $DisplayMessageToUser
        )
    Write-Output $Message
}
function Write-InformationTracing
{
        Param
    (
        [Parameter(Mandatory=$true)]
        [String]
        $Message
        )
    Write-Tracing -Message $Message -Level Informational -DisplayMessageToUser
}
function ValidateInput()
{
    try
    {
        if(!$VaultResourceId.StartsWith("/subscriptions", [System.StringComparison]::OrdinalIgnoreCase))
        {
            $ErrorMessage = "The vault resource id should start with /subscriptions."
            throw $ErrorMessage
        }
        $Tokens = $VaultResourceId.SubString(1).Split("/")
        if(!($Tokens.Count % 2 -eq 0))
        {
            $ErrorMessage = ("Odd Number of tokens: {0}." -f $Tokens.Count)
            throw $ErrorMessage
        }
        if(!($Tokens.Count/2 -eq 4))
        {
            $ErrorMessage = ("Invalid number of resource in vault ARM id expected:4, actual:{0}." -f ($Tokens.Count/2))
            throw $ErrorMessage
        }
        if($AutoUpdateAction -ieq "Enabled" -and [string]::IsNullOrEmpty($AutomationAccountArmId))
        {
            $ErrorMessage = ("The automation account ARM id should not be null or empty when AutoUpdateAction is enabled.")
            throw $ErrorMessage
        }
    }
    catch
    {
        $ErrorMessage = ("ValidateInput failed with [Exception: {0}]." -f $_.Exception)
        Write-Tracing -Level ErrorLevel -Message $ErrorMessage -DisplayMessageToUser
        Throw-TerminatingErrorMessage -Message $ErrorMessage
    }
}
function Initialize-SubscriptionId()
{
    try
    {
        $Tokens = $VaultResourceId.SubString(1).Split("/")
        $Count = 0
                $ArmResources = @{}
        while($Count -lt $Tokens.Count)
        {
            $ArmResources[$Tokens[$Count]] = $Tokens[$Count+1]
            $Count = $Count + 2
        }
                return $ArmResources["subscriptions"]
    }
    catch
    {
        Write-Tracing -Level ErrorLevel -Message ("Initialize-SubscriptionId: failed with [Exception: {0}]." -f $_.Exception) -DisplayMessageToUser
        throw
    }
}
function Invoke-InternalRestMethod($Uri, $Headers, [ref]$Result)
{
    $RetryCount = 0
    $MaxRetry = 3
    do
    {
        try
        {
            $ResultObject = Invoke-RestMethod -Uri $Uri -Headers $Headers
            ($Result.Value) += ($ResultObject)
            break
        }
        catch
        {
            Write-InformationTracing ("Retry Count: {0}, Exception: {1}." -f $RetryCount, $_.Exception)
            $RetryCount++
            if(!($RetryCount -le $MaxRetry))
            {
                throw
            }
            Start-Sleep -Milliseconds 2000
        }
    }while($true)
}
function Invoke-InternalWebRequest($Uri, $Headers, $Method, $Body, $ContentType, [ref]$Result)
{
    $RetryCount = 0
    $MaxRetry = 3
    do
    {
        try
        {
            $ResultObject = Invoke-WebRequest -Uri $UpdateUrl -Headers $Header -Method 'PATCH' `
                -Body $InputJson  -ContentType "application/json" -UseBasicParsing
            ($Result.Value) += ($ResultObject)
            break
        }
        catch
        {
            Write-InformationTracing ("Retry Count: {0}, Exception: {1}." -f $RetryCount, $_.Exception)
            $RetryCount++
            if(!($RetryCount -le $MaxRetry))
            {
                throw
            }
            Start-Sleep -Milliseconds 2000
        }
    }while($true)
}
function Get-Header([ref]$Header, $AadAudience){
    try
    {
        $Header.Value['Content-Type'] = 'application\json'
        Write-InformationTracing ("The Authentication Type is system Assigned Identity based.")
        $endpoint = $env:IDENTITY_ENDPOINT
        $endpoint  
        $Headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" 
        $Headers.Add("X-IDENTITY-HEADER", $env:IDENTITY_HEADER) 
        $Headers.Add("Metadata", "True")   
        $authenticationResult = Invoke-RestMethod -Method Get -Headers $Headers -Uri ($endpoint +'?resource=' +$AadAudience)
        $accessToken = $authenticationResult.access_token
        $Header.Value['Authorization'] = "Bearer " + $accessToken
        $Header.Value["x-ms-client-request-id"] = $TaskId + "/" + (New-Guid).ToString() + "-" + (Get-Date).ToString("u")
    }
    catch
    {
        $ErrorMessage = ("Get-BearerToken: failed with [Exception: {0}]." -f $_.Exception)
        Write-Tracing -Level ErrorLevel -Message $ErrorMessage -DisplayMessageToUser
        Throw-TerminatingErrorMessage -Message $ErrorMessage
    }
}
function Get-ProtectionContainerToBeModified([ref] $ContainerMappingList)
{
    try
    {
        Write-InformationTracing ("Get protection container mappings : {0}." -f $VaultResourceId)
        $ContainerMappingListUrl = $ArmEndPoint + $VaultResourceId + "/replicationProtectionContainerMappings" + "?api-version=" + $AsrApiVersion
        Write-InformationTracing ("Getting the bearer token and the header.")
        Get-Header ([ref]$Header) $AadAudience
        $Result = @()
        Invoke-InternalRestMethod -Uri $ContainerMappingListUrl -Headers $header -Result ([ref]$Result)
        $ContainerMappings = $Result[0]
        Write-InformationTracing ("Total retrieved container mappings: {0}." -f $ContainerMappings.Value.Count)
        foreach($Mapping in $ContainerMappings.Value)
        {
            if(($Mapping.properties.providerSpecificDetails -eq $null) -or ($Mapping.properties.providerSpecificDetails.instanceType -ine "A2A"))
            {
                Write-InformationTracing ("Mapping properties: {0}." -f ($Mapping.properties))
                Write-InformationTracing ("Ignoring container mapping: {0} as the provider does not match." -f ($Mapping.Id))
                continue;
            }
            if($Mapping.Properties.State -ine "Paired")
            {
                Write-InformationTracing ("Ignoring container mapping: {0} as the state is not paired." -f ($Mapping.Id))
                continue;
            }
            Write-InformationTracing ("Provider specific details {0}." -f ($Mapping.properties.providerSpecificDetails))
            $MappingAutoUpdateStatus = $Mapping.properties.providerSpecificDetails.agentAutoUpdateStatus
            $MappingAutomationAccountArmId = $Mapping.properties.providerSpecificDetails.automationAccountArmId
            $MappingHealthErrorCount = $Mapping.properties.HealthErrorDetails.Count
            if($AutoUpdateAction -ieq "Enabled" -and
                ($MappingAutoUpdateStatus -ieq "Enabled") -and
                ($MappingAutomationAccountArmId -ieq $AutomationAccountArmId) -and
                ($MappingHealthErrorCount -eq 0))
            {
                Write-InformationTracing ("Provider specific details {0}." -f ($Mapping.properties))
                Write-InformationTracing ("Ignoring container mapping: {0} as the auto update is already enabled and is healthy." -f ($Mapping.Id))
                continue;
            }
            ($ContainerMappingList.Value).Add($Mapping.id)
        }
    }
    catch
    {
        $ErrorMessage = ("Get-ProtectionContainerToBeModified: failed with [Exception: {0}]." -f $_.Exception)
        Write-Tracing -Level ErrorLevel -Message $ErrorMessage -DisplayMessageToUser
        Throw-TerminatingErrorMessage -Message $ErrorMessage
    }
}
$OperationStartTime = Get-Date
$ContainerMappingList = New-Object System.Collections.Generic.List[System.String]
$JobsInProgressList = @()
$JobsCompletedSuccessList = @()
$JobsCompletedFailedList = @()
$JobsFailedToStart = 0
$JobsTimedOut = 0
$Header = @{}
$AzureRMProfile = Get-Module -ListAvailable -Name AzureRM.Profile | Select Name, Version, Path
$AzureRmProfileModulePath = Split-Path -Parent $AzureRMProfile.Path
Add-Type -Path (Join-Path $AzureRmProfileModulePath "Microsoft.IdentityModel.Clients.ActiveDirectory.dll")
$Inputs = ("Tracing inputs VaultResourceId: {0}, Timeout: {1}, AutoUpdateAction: {2}, AutomationAccountArmId: {3}." -f $VaultResourceId, $Timeout, $AutoUpdateAction, $AutomationAccountArmId)
Write-Tracing -Message $Inputs -Level Informational -DisplayMessageToUser
$CloudConfig = ("Tracing cloud configuration ArmEndPoint: {0}, AadAuthority: {1}, AadAudience: {2}." -f $ArmEndPoint, $AadAuthority, $AadAudience)
Write-Tracing -Message $CloudConfig -Level Informational -DisplayMessageToUser
ValidateInput
$SubscriptionId = Initialize-SubscriptionId
Get-ProtectionContainerToBeModified ([ref]$ContainerMappingList)
$Input = @{
  "properties"= @{
    "providerSpecificInput"= @{
        "instanceType" = "A2A"
        "agentAutoUpdateStatus" = $AutoUpdateAction
        "automationAccountArmId" = $AutomationAccountArmId
        "automationAccountAuthenticationType" = $AuthenticationType
    }
  }
}
$InputJson = $Input |  ConvertTo-Json
if ($ContainerMappingList.Count -eq 0)
{
    Write-Tracing -Level Succeeded -Message ("Exiting as there are no container mappings to be modified.") -DisplayMessageToUser
    exit
}
Write-InformationTracing ("Container mappings to be updated has been retrieved with count: {0}." -f $ContainerMappingList.Count)
try
{
    Write-InformationTracing ("Start the modify container mapping jobs.")
    ForEach($Mapping in $ContainerMappingList)
    {
    try {
            $UpdateUrl = $ArmEndPoint + $Mapping + "?api-version=" + $AsrApiVersion
            Get-Header ([ref]$Header) $AadAudience
            $Result = @()
            Invoke-InternalWebRequest -Uri $UpdateUrl -Headers $Header -Method 'PATCH' `
                -Body $InputJson  -ContentType "application/json" -Result ([ref]$Result)
            $Result = $Result[0]
            $JobAsyncUrl = $Result.Headers['Azure-AsyncOperation']
            Write-InformationTracing ("The modify container mapping job invoked with async url: {0}." -f $JobAsyncUrl)
            $JobsInProgressList += $JobAsyncUrl;
            # Rate controlling the set calls to maximum 60 calls per minute.
            # ASR throttling for set calls is 200 in 1 minute.
            Start-Sleep -Milliseconds 1000
        }
        catch{
            Write-InformationTracing ("The modify container mappings job creation failed for: {0}." -f $Ru)
            Write-InformationTracing $_
            $JobsFailedToStart++
        }
    }
    Write-InformationTracing ("Total modify container mappings has been initiated: {0}." -f $JobsInProgressList.Count)
}
catch
{
    $ErrorMessage = ("Modify container mapping jobs failed with [Exception: {0}]." -f $_.Exception)
    Write-Tracing -Level ErrorLevel -Message $ErrorMessage -DisplayMessageToUser
    Throw-TerminatingErrorMessage -Message $ErrorMessage
}
try
{
    while($JobsInProgressList.Count -ne 0)
    {
        Sleep -Seconds 30
        $JobsInProgressListInternal = @()
        ForEach($JobAsyncUrl in $JobsInProgressList)
        {
            try
            {
                Get-Header ([ref]$Header) $AadAudience
                $Result = Invoke-RestMethod -Uri $JobAsyncUrl -Headers $header
                $JobState = $Result.Status
                if($JobState -ieq "InProgress")
                {
                    $JobsInProgressListInternal += $JobAsyncUrl
                }
                elseif($JobState -ieq "Succeeded" -or `
                    $JobState -ieq "PartiallySucceeded" -or `
                    $JobState -ieq "CompletedWithInformation")
                {
                    Write-InformationTracing ("Jobs succeeded with state: {0}." -f $JobState)
                    $JobsCompletedSuccessList += $JobAsyncUrl
                }
                else
                {
                    Write-InformationTracing ("Jobs failed with state: {0}." -f $JobState)
                    $JobsCompletedFailedList += $JobAsyncUrl
                }
            }
            catch
            {
                Write-InformationTracing ("The get job failed with: {0}. Ignoring the exception and retrying the next job." -f $_.Exception)
                # The job on which the tracking failed, will be considered in progress and tried again later.
                $JobsInProgressListInternal += $JobAsyncUrl
            }
            # Rate controlling the get calls to maximum 120 calls each minute.
            # ASR throttling for get calls is 10000 in 60 minutes.
            Start-Sleep -Milliseconds 500
        }
        Write-InformationTracing ("Jobs remaining {0}." -f $JobsInProgressListInternal.Count)
        $CurrentTime = Get-Date
        if($CurrentTime -gt $OperationStartTime.AddMinutes($Timeout))
        {
            Write-InformationTracing ("Tracing modify cloud pairing jobs has timed out.")
            $JobsTimedOut = $JobsInProgressListInternal.Count
            $JobsInProgressListInternal = @()
        }
        $JobsInProgressList = $JobsInProgressListInternal
    }
}
catch
{
    $ErrorMessage = ("Tracking modify cloud pairing jobs failed with [Exception: {0}]." -f $_.Exception)
    Write-Tracing -Level ErrorLevel -Message $ErrorMessage  -DisplayMessageToUser
    Throw-TerminatingErrorMessage -Message $ErrorMessage
}
Write-InformationTracing ("Tracking modify cloud pairing jobs completed.")
Write-InformationTracing ("Modify cloud pairing jobs success: {0}." -f $JobsCompletedSuccessList.Count)
Write-InformationTracing ("Modify cloud pairing jobs failed: {0}." -f $JobsCompletedFailedList.Count)
Write-InformationTracing ("Modify cloud pairing jobs failed to start: {0}." -f $JobsFailedToStart)
Write-InformationTracing ("Modify cloud pairing jobs timedout: {0}." -f $JobsTimedOut)
if($JobsTimedOut -gt  0)
{
    $ErrorMessage = "One or more modify cloud pairing jobs has timedout."
    Write-Tracing -Level ErrorLevel -Message ($ErrorMessage)
    Throw-TerminatingErrorMessage -Message $ErrorMessage
}
elseif($JobsCompletedSuccessList.Count -ne $ContainerMappingList.Count)
{
    $ErrorMessage = "One or more modify cloud pairing jobs failed."
    Write-Tracing -Level ErrorLevel -Message ($ErrorMessage)
    Throw-TerminatingErrorMessage -Message $ErrorMessage
}
Write-Tracing -Level Succeeded -Message ("Modify cloud pairing completed.") -DisplayMessageToUser

إدارة التحديثات يدوياً

  1. إذا كانت هناك تحديثات جديدة لخدمة Mobility المثبّتة على الأجهزة الظاهرية لديك، فسيظهر لك الإعلام التالي: يتوفر تحديث لعامل النسخ المتماثل الجديد Site Recovery الجديد. انقر للتثبيت.

    نافذة العناصر المنسوخة نسخًا متماثلاً

  2. حدد الإعلام لفتح صفحة تحديد الجهاز الظاهري.

  3. اختر الأجهزة الظاهرية التي تريد ترقيتها، ثم حدد موافق. سيتم بدء تشغيل خدمة Update Mobility لكل جهاز ظاهري محدد.

    قائمة عناصر الجهاز الظاهري المنسوخة نسخًا متماثلاً

المشكلات الشائعة واستكشاف الأخطاء وإصلاحها

إذا كانت هناك مشكلة في التحديثات التلقائية، فسيظهر لك إعلام بالخطأ أسفل Configuration issues في لوحة معلومات المخزن.

إذا لم تتمكن من تمكين التحديثات التلقائية، فراجع الأخطاء الشائعة التالية والإجراءات الموصى بها:

  • خطأ: ليس لديك أذونات لإنشاء حساب Azure Run As (كيان الخدمة) ومنح الدور Contributor إلى كيان الخدمة.

    الإجراء الموصى به: تأكد من تعيين الحساب الذي سجّلت الدخول إليه بدور Contributor وحاول مرة أخرى. لمزيد من المعلومات حول تعيين الأذونات، راجع قسم الأذونات المطلوبة في كيفية: استخدام المدخل لإنشاء تطبيق Microsoft Entra ومدير الخدمة الذي يمكنه الوصول إلى الموارد.

    لإصلاح معظم المشكلات بعد تمكين التحديثات التلقائية، حدد Repair. إذا لم يكن زر الإصلاح متوفراً، فشاهد رسالة الخطأ المعروضة في جزء إعدادات تحديث الملحق.

    زر إصلاح خدمة استرداد الموقع في إعدادات تحديث الملحق

  • خطأ: لا يمتلك حساب Run As الإذن للوصول إلى مورد خدمات الاسترداد.

    الإجراء الموصى به: حذف ثم إعادة إنشاء حساب Run As. أو تأكد من أن تطبيق Microsoft Entra لحساب Automation Run As يمكنه الوصول إلى مورد خدمات الاسترداد.

  • خطأ: لم يتم العثور على حساب Run As. تم حذف أي منهما أو لم يتم إنشاؤه - تطبيق Microsoft Entra أو كيان الخدمة أو الدور أو أصل شهادة التنفيذ التلقائي أو أصل الاتصال الأتمتة - أو أن بصمة الإبهام غير متطابقة بين الشهادة الاتصال.

    الإجراء الموصى به: حذف ثم إعادة إنشاء حساب Run As.

  • خطأ: شهادة Azure Run as المستخدمة من قبل حساب التشغيل التلقائي على وشك الانتهاء.

    تنتهي صلاحية الشهادة الموقَّعة ذاتياً التي تم إنشاؤها لحساب Run As بعد مرور سنة واحدة على تاريخ الإنشاء. يمكنك تجديدها في أي وقت قبل انتهاء صلاحيتها. إذا كنت قد اشتركت في إعلامات البريد الإلكتروني، فسوف تتلقى أيضاً رسائل بريد إلكتروني عندما يلزم اتخاذ إجراء من جانبك. سيتم عرض هذا الخطأ شهرين قبل تاريخ انتهاء الصلاحية، وسوف يتم تغييره إلى خطأ فادح إذا انتهت صلاحية الشهادة. بمجرد انتهاء صلاحية الشهادة، لن يعمل التحديث التلقائي حتى تقوم بتجديد نفس التحديث.

    الإجراء الموصى به: لحل هذه المشكلة، حدد Repair ثم Renew Certificate.

    تجديد الشهادة

    إشعار

    بعد تجديد الشهادة، حدّث الصفحة لعرض الحالة الحالية.

الخطوات التالية

تعرف على المزيد حول كيفية ترحيل نوع المصادقة لحسابات التنفيذ التلقائي إلى الهويات المدارة.