Script des logins SQL Server avec hash de mot de passe et SID d’origine

Lors de la migration d’instances SQL Server, l’une des étapes les plus sujettes aux erreurs est le transfert des logins SQL vers la destination. Scripter simplement un login avec CREATE LOGIN ... WITH PASSWORD ne préserve pas le hash de mot de passe d’origine ni le SID d’origine — et des SIDs incompatibles entre les logins d’instance et les utilisateurs de base de données briseront la connectivité des applications même si le mot de passe est correct.

Pourquoi les SIDs sont importants

Chaque login SQL Server a un SID (Security Identifier) stocké au niveau de l’instance. Les utilisateurs de base de données sont mappés aux logins via ce SID. Si vous créez un login sur la destination avec un nouveau SID généré automatiquement, les utilisateurs de base de données dans vos bases restaurées seront orphelins — ils existeront mais ne seront liés à aucun login valide. La solution est de scripter les logins avec leur SID d’origine et leur hash de mot de passe depuis la source.

Requête rapide : SID et hash de mot de passe depuis la source

Exécutez ceci sur l’instance source en tant que membre du rôle sysadmin. Les comptes non-admin verront une sortie incomplète ou nulle. Le résultat est le SID binaire brut et le hash de mot de passe — utilisez la sortie pour construire l’instruction CREATE LOGIN sur la destination avec le mot-clé HASHED.

SELECT
    name,
    CONVERT(VARCHAR(50), 'CREATE LOGIN [' + name + '] WITH PASSWORD=') AS stmt_prefix,
    CAST(password AS VARBINARY(26))                                     AS password_hash,
    'HASHED, SID='                                                      AS sid_prefix,
    CAST(sid AS VARBINARY(26))                                          AS sid
FROM sys.syslogins
WHERE password IS NOT NULL;

Pour une procédure complète de migration de logins prête pour la production qui gère à la fois les logins Windows et SQL à travers différentes versions de SQL Server, combinez cette requête avec la procédure de migration massive de bases de données.