D365 for Operations : System.Security.Cryptography.CryptographicException: Key not valid for use in specified state.

Lors du déploiement de mises à jour binaires d'un environnement de développement, LCS m'indique que le déploiement a échoué à l'étape 52: updates script for service: RetailServer on machine DEV2

Microsoft ne donne pas beaucoup d'informations au sujet des problèmes de déploiement. La seule information que j'ai trouvée est sur cet article: Apply a deployable package on a Microsoft Dynamics 365 for Operations environment. En fait, la seule recommandation est de cliquer sur Resume, ce que j'ai bien fait sans résultat positif. 

Voici comment j'ai diagnostiqué et corrigé le problème.

Tout d'abord, j'ai téléchargé le Runbook afin d'avoir plus d'informations sur l'étape 52.


Une recherche sur le tag 52 m'a permis de trouver l'information suivante:



Ensuite, j'ai téléchargé les fichiers de logs.


Dans le dossier qui contient les logs, vous allez y trouver un dossier par étapes. Dans mon cas, l'erreur se produit à l'étape 52. Dans le dossier, vous allez y trouver un fichier OUTPUT, c'est dans ce fichier que vous allez y trouver plus d'informations au sujet du problème.



Message d'erreur: System.Security.Cryptography.CryptographicException: Key not valid for use in specified state.

On peut y voir que le script qui cause une erreur est le suivant:

J:\DeployablePackages\996e3705-b27f-44f6-a3d5-c6eae47564eb\RetailServer\scripts\Upgrade\Core\UpdateRetailServer.ps1


En toute logique, vous pouvez voir que le DeployablePackage ID correspond aux ID de l'activité de déploiement dans LCS.



J'ai finalement trouvé le fichier en question:


Ensuite, il suffit d'essayer de comprendre ce que le code effectue et de trouver l'opération en erreur. Le processus d'isolation du problème peut être laborieux puisque le script UpdateRetailServer.ps1 appelle d'autres scripts PowerShell. Dans mon cas, la ligne qui posait problème était située dans le fichier Common-Upgrade.ps1 dans la fonction Get-ChannelDbServicingDataFromRegistry(). 


Il se trouve que Microsoft a utilisé ConvertFrom-SecureString pour encrypter la connexion string puisque celle-ci contient un mot de passe. Vous pouvez y trouver l'information encrypter à cet endroit:

HKLM\SOFTWARE\Microsoft\Dynamics\7.0\RetailChannelDatabase\Servicing


J'ai fait mon propre test et reçu la même erreur:


À ce moment, je ne sais toujours pas ce qui est encrypté. Je fais donc le même test sur une autre machine et ça me retourne l'information:

$servicingDataAsSecureString = ConvertTo-SecureString ENCRYPTEDVALUE
$servicingDataAsPlainText = [System.Runtime.InteropServices.marshal]::PtrToStringAuto([System.Runtime.InteropServices.marshal]::SecureStringToBSTR($servicingDataAsSecureString))
write-host $servicingDataAsPlainText


Il me suffit de retourner sur la machine qui pose problème et de modifier le script Common-Upgrade.ps1. J'ai remplacé la valeur encryptée par du texte clair.




Ensuite, j'ai cliqué sur Resume et le déploiement à fonctionner.


Prenez note que j'ai effectué d'un workaround pour corriger le problème. Le vrai problème est que le compte axlocaladmin n'est pas capable décrypter l'information locale et je ne sais pas pourquoi.

Previous
« Prev Post