Dela via


BitLocker-startfel på en virtuell Azure-dator

Gäller för: ✔️ Virtuella Windows-datorer

Den här artikeln beskriver BitLocker-fel som kan uppstå när du startar en virtuell Windows-dator (VM) i Microsoft Azure.

Symptom

En virtuell Windows-dator startar inte. När du kontrollerar skärmbilderna i startdiagnostikfönstret visas något av följande felmeddelanden:

  • Anslut USB-drivrutinen som har BitLocker-nyckeln

  • Du är utelåst! Ange återställningsnyckeln för att komma igång igen (tangentbordslayout: USA) Fel inloggningsinformation har angetts för många gånger, så datorn låstes för att skydda din integritet. Om du vill hämta återställningsnyckeln går du till https://windows.microsoft.com/recoverykeyfaq från en annan dator eller mobil enhet. Om du behöver det är nyckel-ID:t XXXXXXX. Eller så kan du återställa datorn.

  • Ange lösenordet för att låsa upp den här enheten [ ] Tryck på Infoga för att se lösenordet när du skriver.

  • Ange återställningsnyckeln Läs in återställningsnyckeln från en USB-enhet.

Orsak

Det här problemet kan inträffa om den virtuella datorn inte kan hitta BITLocker Recovery Key-filen (BEK) för att dekryptera den krypterade disken.

Dekryptera den krypterade OS-disken

Dricks

Om du nyligen har säkerhetskopierat den virtuella datorn kan du försöka återställa den virtuella datorn från säkerhetskopian för att åtgärda startproblemet.

Lös problemet genom att stoppa och frigöra den virtuella datorn och sedan starta den. Den här åtgärden tvingar den virtuella datorn att hämta BEK-filen från Azure Key Vault och sedan placera den på den krypterade disken.

Om den här metoden inte löser problemet följer du dessa steg för att återställa BEK-filen manuellt:

  1. Ta en ögonblicksbild av OS-disken på den berörda virtuella datorn som en säkerhetskopia. Mer information finns i Ögonblicksbild av en disk.

  2. Koppla OS-disken till en virtuell återställningsdator. När du ansluter en hanterad disk kan du få felmeddelandet "innehåller krypteringsinställningar och kan därför inte användas som en datadisk". I det här fallet kör du följande skript för att försöka ansluta disken igen:

    $rgName = "myResourceGroup"
    $osDiskName = "ProblemOsDisk"
    # Set the EncryptionSettingsEnabled property to false, so you can attach the disk to the recovery VM.
    New-AzDiskUpdateConfig -EncryptionSettingsEnabled $false |Update-AzDisk -diskName $osDiskName -ResourceGroupName $rgName
    
    $recoveryVMName = "myRecoveryVM" 
    $recoveryVMRG = "RecoveryVMRG" 
    $OSDisk = Get-AzDisk -ResourceGroupName $rgName -DiskName $osDiskName;
    
    $vm = get-AzVM -ResourceGroupName $recoveryVMRG -Name $recoveryVMName 
    
    Add-AzVMDataDisk -VM $vm -Name $osDiskName -ManagedDiskId $osDisk.Id -Caching None -Lun 3 -CreateOption Attach 
    
    Update-AzVM -VM $vm -ResourceGroupName $recoveryVMRG
    

    Du kan inte ansluta en hanterad disk till en virtuell dator som har återställts från en blobavbildning.

  3. När disken har anslutits skapar du en fjärrskrivbordsanslutning till den virtuella återställningsdatorn.

  4. Installera Az PowerShell-modulen och Az.Account 1.9.4 på den virtuella återställningsdatorn.

  5. Öppna en upphöjd Azure PowerShell-session (Kör som administratör). Kör följande kommandon för att logga in på Azure-prenumerationen:

    Add-AzAccount -SubscriptionID [SubscriptionID]
    
  6. Kör följande skript för att kontrollera namnet på BEK-filen (hemligt namn):

    $vmName = "myVM"
    $vault = "myKeyVault"
    Get-AzKeyVaultSecret -VaultName $vault | where {($_.Tags.MachineName -eq $vmName) -and ($_.ContentType -match 'BEK')} `
            | Sort-Object -Property Created `
            | ft  Created, `
                @{Label="Content Type";Expression={$_.ContentType}}, `
                @{Label ="MachineName"; Expression = {$_.Tags.MachineName}}, `
                @{Label ="Volume"; Expression = {$_.Tags.VolumeLetter}}, `
                @{Label ="DiskEncryptionKeyFileName"; Expression = {$_.Tags.DiskEncryptionKeyFileName}}
    

    Följande är ett exempel på utdata. I det här fallet förutsätter vi att filnamnet är EF7B2F5A-50C6-4637-0001-7F599C12F85C. BEK.

    Created               Content Type Volume MachineName DiskEncryptionKeyFileName
    -------               ------------ ------ ----------- -------------------------
    11/20/2020 7:41:56 AM BEK          C:\    myVM   EF7B2F5A-50C6-4637-0001-7F599C12F85C.BEK
    

    Om du ser två duplicerade volymer är volymen som har den nyare tidsstämpeln den aktuella BEK-filen som används av den virtuella återställningsdatorn.

    Om värdet för Innehållstyp är Omsluten BEK går du till KEK-scenarierna (Key Encryption Key).

    Nu när du har namnet på BEK-filen för enheten måste du skapa det hemliga filnamnet. BEK-fil för att låsa upp enheten.

  7. Ladda ned BEK-filen till återställningsdisken. Följande exempel sparar BEK-filen i mappen C:\BEK. Kontrollera att C:\BEK\ sökvägen finns innan du kör skripten.

    $vault = "myKeyVault"
    $bek = "EF7B2F5A-50C6-4637-0001-7F599C12F85C"
    $keyVaultSecret = Get-AzKeyVaultSecret -VaultName $vault -Name $bek
    $bstr = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($keyVaultSecret.SecretValue)
    $bekSecretBase64 = [Runtime.InteropServices.Marshal]::PtrToStringAuto($bstr)
    $bekFileBytes = [Convert]::FromBase64String($bekSecretbase64)
    $path = "C:\BEK\DiskEncryptionKeyFileName.BEK"
    [System.IO.File]::WriteAllBytes($path,$bekFileBytes)
    
  8. Om du vill låsa upp den anslutna disken med hjälp av BEK-filen kör du följande kommando.

    manage-bde -unlock F: -RecoveryKey "C:\BEK\EF7B2F5A-50C6-4637-0001-7F599C12F85C.BEK"
    

    I det här exemplet är den anslutna OS-disken enhet F. Kontrollera att du använder rätt enhetsbeteckning.

  9. När disken har låsts upp med hjälp av BEK-nyckeln kopplar du från disken från den virtuella återställningsdatorn och återskapar sedan den virtuella datorn med hjälp av den nya OS-disken.

    Kommentar

    Byte av OS-disk är tillgängligt för alla virtuella datorer som krypteras med ADE-version med enkel passering, men stöds inte för dubbla pass.

  10. Om den nya virtuella datorn fortfarande inte kan starta normalt kan du prova något av följande steg när du har låst upp enheten:

    • Pausa skyddet för att tillfälligt stänga av BitLocker genom att köra följande:
    manage-bde -protectors -disable F: -rc 0
    
    • Dekryptera enheten helt. Gör detta genom att köra följande kommando:
    manage-bde -off F:
    

Scenario med nyckelkrypteringsnyckel (omsluten BEK)

Följ dessa steg för ett scenario med nyckelkrypteringsnyckel:

  1. Kontrollera att det inloggade användarkontot kräver behörigheten "unwrapped" i Key Vault Access-principerna i USER|Nyckelbehörigheter|Kryptografiska åtgärder|Packa upp nyckel.

  2. Spara följande skript i en .PS1-fil:

    Kommentar

    De ADAL-sammansättningar (dll-filer) som används i det här skriptet är endast tillgängliga i Az.Account 1.9.4 och tidigare versioner. Information om hur du installerar Az.Account-modulen finns i Installera Az PowerShell-modulen.

    #Set the Parameters for the script. If you have question about the Parameters, see the "KEK script parameters" section.
    param (
            [Parameter(Mandatory=$true)]
            [string] 
            $keyVaultName,
            [Parameter(Mandatory=$true)]
            [string] 
            $kekName,
            [Parameter(Mandatory=$true)]
            [string]
            $secretName,
            [Parameter(Mandatory=$true)]
            [string]
            $bekFilePath,
            [Parameter(Mandatory=$true)]
            [string] 
            $adTenant
            )
    # Load ADAL Assemblies. If the ADAL Assemblies cannot be found, please see the "Install Az PowerShell module" section. 
    
    $adal = "${env:ProgramFiles}\WindowsPowerShell\Modules\Az.Accounts\1.9.4\PreloadAssemblies\Microsoft.IdentityModel.Clients.ActiveDirectory.dll"
    $adalforms = "${env:ProgramFiles}\WindowsPowerShell\Modules\Az.Accounts\1.9.4\PreloadAssemblies\Microsoft.IdentityModel.Clients.ActiveDirectory.Platform.dll"  
    
    If ((Test-Path -Path $adal) -and (Test-Path -Path $adalforms)) { 
    
    [System.Reflection.Assembly]::LoadFrom($adal)
    [System.Reflection.Assembly]::LoadFrom($adalforms)
     }
     else
     {
      Write-output "ADAL Assemblies files cannot be found. Please set the correct path for `$adal` and `$adalforms`, then run the script again." 
      exit    
     }  
    
    # Set well-known client ID for AzurePowerShell
    $clientId = "1950a258-227b-4e31-a9cf-717495945fc2" 
    # Set redirect URI for Azure PowerShell
    $redirectUri = "urn:ietf:wg:oauth:2.0:oob"
    # Set Resource URI to Azure Service Management API
    $resourceAppIdURI = "https://vault.azure.net"
    # Set Authority to Azure AD Tenant
    $authority = "https://login.windows.net/$adtenant"
    # Create Authentication Context tied to Azure AD Tenant
    $authContext = New-Object "Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext" -ArgumentList $authority
    # Acquire token
    $platformParameters = New-Object "Microsoft.IdentityModel.Clients.ActiveDirectory.PlatformParameters" -ArgumentList "Auto"
    $authResult = $authContext.AcquireTokenAsync($resourceAppIdURI, $clientId, $redirectUri, $platformParameters).result
    # Generate auth header 
    $authHeader = $authResult.CreateAuthorizationHeader()
    # Set HTTP request headers to include Authorization header
    $headers = @{'x-ms-version'='2014-08-01';"Authorization" = $authHeader}
    
    ########################################################################################################################
    # 1. Retrieve wrapped BEK
    # 2. Make KeyVault REST API call to unwrap the BEK
    # 3. Convert the Base64Url string returned by KeyVault unwrap to Base64 string 
    # 4. Convert Base64 string to bytes and write to the BEK file
    ########################################################################################################################
    
    #Get wrapped BEK and place it in JSON object to send to KeyVault REST API
    $keyVaultSecret = Get-AzKeyVaultSecret -VaultName $keyVaultName -Name $secretName
    $bstr = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($keyVaultSecret.SecretValue)
    $wrappedBekSecretBase64 = [Runtime.InteropServices.Marshal]::PtrToStringAuto($bstr)
    $jsonObject = @"
    {
    "alg": "RSA-OAEP",
    "value" : "$wrappedBekSecretBase64"
    }
    "@
    
    #Get KEK Url
    $kekUrl = (Get-AzKeyVaultKey -VaultName $keyVaultName -Name $kekName).Key.Kid;
    $unwrapKeyRequestUrl = $kekUrl+ "/unwrapkey?api-version=2015-06-01";
    
    #Call KeyVault REST API to Unwrap 
    $result = Invoke-RestMethod -Method POST -Uri $unwrapKeyRequestUrl -Headers $headers -Body $jsonObject -ContentType "application/json" -Debug
    
    #Convert Base64Url string returned by KeyVault unwrap to Base64 string
    $base64UrlBek = $result.value;
    $base64Bek = $base64UrlBek.Replace('-', '+');
    $base64Bek = $base64Bek.Replace('_', '/');
    if($base64Bek.Length %4 -eq 2)
    {
        $base64Bek+= '==';
    }
    elseif($base64Bek.Length %4 -eq 3)
    {
        $base64Bek+= '=';
    }
    
    #Convert base64 string to bytes and write to BEK file
    $bekFileBytes = [System.Convert]::FromBase64String($base64Bek);
    [System.IO.File]::WriteAllBytes($bekFilePath,$bekFileBytes)
    
    #Delete the key from the memory
    [Runtime.InteropServices.Marshal]::ZeroFreeBSTR($bstr)
    clear-variable -name wrappedBekSecretBase64
    
  3. Ange parametrarna. Skriptet bearbetar KEK-hemligheten för att skapa BEK-nyckeln och sparar den sedan i en lokal mapp på den virtuella återställningsdatorn. Om du får fel när du kör skriptet kan du läsa felsökningsavsnittet för skript .

  4. Du ser följande utdata när skriptet börjar:

    GAC-versionsplats


    False v4.0.30319 C:\Program Files\WindowsPowerShell\Modules\Az.Accounts... False v4.0.30319 C:\Program Files\WindowsPowerShell\Modules\Az.Accounts...

    När skriptet är klart visas följande utdata:

    VERBOSE: POST https://myvault.vault.azure.net/keys/rondomkey/<KEY-ID>/unwrapkey?api-
    version=2015-06-01 with -1-byte payload
    VERBOSE: received 360-byte response of content type application/json; charset=utf-8
    
  5. Om du vill låsa upp den anslutna disken med hjälp av BEK-filen kör du följande kommando:

    manage-bde -unlock F: -RecoveryKey "C:\BEK\EF7B2F5A-50C6-4637-9F13-7F599C12F85C.BEK
    

    I det här exemplet är den anslutna OS-disken enhet F. Kontrollera att du använder rätt enhetsbeteckning.

  6. När disken har låsts upp med hjälp av BEK-nyckeln kopplar du bort disken från den virtuella återställningsdatorn och använder sedan funktionen Växla OS-disk för att ersätta OS-disken för den ursprungliga virtuella datorn med den reparerade disken.

  7. Om den nya virtuella datorn fortfarande inte kan starta normalt kan du prova något av följande steg när du har låst upp enheten:

    • Pausa skyddet för att tillfälligt stänga av BitLocker genom att köra följande kommando:
    manage-bde -protectors -disable F: -rc 0
    
    • Dekryptera enheten helt. Gör detta genom att köra följande kommando:
    manage-bde -off F:
    

Felsökning av skript

Fel: Det gick inte att läsa in filen eller sammansättningen

Det här felet beror på att sökvägarna för ADAL-sammansättningarna är felaktiga. Du kan söka efter mappen för Az.Accounts att hitta rätt sökväg.

Fel: Get-AzKeyVaultSecret eller Get-AzKeyVaultSecret identifieras inte som namnet på en cmdlet

Om du använder den gamla Az PowerShell-modulen måste du ändra de två kommandona till Get-AzureKeyVaultSecret och Get-AzureKeyVaultSecret.

KEK-skriptparametrar

Parametrar Exempel Så här kontrollerar du
$keyVaultName myKeyVault2707 Kör Get-AzVM -ResourceGroupName $rgName -Name $vmName -DisplayHint Expandoch kontrollera Inställningar och KeyEncryptionKeyURL i utdata. Här är ett exempel:
"KeyEncryptionKeyURL":https://myKeyVault2707.vault.azure.net/keys/mykey/000072b987145a3b79b0ed415f0000
$kekName mykey Kör Get-AzVM -ResourceGroupName $rgName -Name $vmName -DisplayHint expand och kontrollera Inställningar och KeyEncryptionKeyURL i utdata. Här är ett exempel:
"KeyEncryptionKeyURL":https://myKeyVault2707.vault.azure.net/keys/mykey/000072b987145a3b79b0ed415f0000
$secretName 7EB4F531-5FBA-4970-8E2D-C11FD6B0C69D Namnet på hemligheten för den virtuella datornyckeln.
Om du vill hitta rätt hemligt namn kontrollerar du steg 6 i avsnittet Dekryptera den krypterade OS-disken .
$bekFilePath c:\bek\7EB4F531-5FBA-4970-8E2D-C11FD6B0C69D. BEK En lokal sökväg där du vill spara BEK-filen. I exemplet måste du skapa mappen "bek" innan du kör skriptet, annars kommer det att gå fel.
$adTenant contoso.onmicrosoft.com FQDN eller GUID för ditt Microsoft Entra-ID som är värd för nyckelvalvet

Installera Az PowerShell-modulen

Följ dessa steg för att installera Az PowerShell-modulen för den virtuella återställningsdatorn:

  1. Öppna en PowerShell-session som administratör och ange http-API:ernas säkerhetsprotokoll till TLS 1.2 för den aktuella sessionen. Säkerhetsprotokollet återställs till standardvärdet när du har stängt den aktuella sessionen.

    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
    
  2. Ladda ned den senaste versionen av Nuget-paketet:

     Install-PackageProvider -Name "Nuget" -Force
    
    
  3. Installera den senaste versionen av PowerShellGet-paketet och starta sedan om PowerShell.

    Install-Module -Name PowerShellGet -Force
    
  4. Kör följande kommando för att installera den senaste versionen av Azure Az-modulen:

    Install-Module -Name Az -Scope AllUsers -Repository PSGallery -Force
    
  5. Installera paketet Az.Account 1.9.4:

    Install-Module -Name Az.Accounts -Scope AllUsers -RequiredVersion "1.9.4" -Repository PSGallery -Force
    

Kontakta oss för att få hjälp

Om du har frågor eller behöver hjälp skapar du en supportförfrågan eller frågar Azure community support. Du kan också skicka produktfeedback till Azure-feedbackcommunityn.