Excel/VBA : corriger l’erreur « sign‑in method may be unsecure » (QueryTables, Basic Auth, basichostallowlist)

Depuis janvier 2024, Excel peut bloquer des connexions web lancées par VBA/QueryTables avec l’alerte « Microsoft Office has blocked access… sign‑in method may be unsecure ». Voici comment diagnostiquer, corriger durablement et proposer des alternatives sûres.

Sommaire

Contexte et symptômes

Vous exécutez une macro Excel (VBA) qui récupère des données depuis un site protégé par identifiants (par exemple un portail gouvernemental). Depuis le 1er janvier 2024, la requête échoue systématiquement côté Excel avec ce message :

« Microsoft Office has blocked access to « https://…  » because the source uses a sign‑in method that may be unsecure. »

  • La connexion manuelle au même site via le navigateur fonctionne.
  • La même macro fonctionne encore sur une machine où Office n’a pas été récemment mis à jour.
  • Le contournement consistant à autoriser l’hôte via le Registre (basichostallowlist) aide certains postes mais pas d’autres, et des comportements intermittents ont été observés.

Cause probable

Début 2024, Microsoft a renforcé les contrôles autour des méthodes d’authentification considérées « héritées » (ex. Basic, WebDAV ou assimilées). Les appels web déclenchés depuis Office (comme QueryTables ou certaines connexions Power Query) passent par le pipeline d’identité d’Office : si la cible utilise une méthode jugée non moderne, Office bloque la tentative pour réduire les risques (vol d’identifiants, interception, etc.). C’est pourquoi un simple navigateur (Chromium/Edge) peut réussir, alors que la même URL appelée par Excel est stoppée.

Ce qu’il faut faire en priorité

La stratégie ci‑dessous est classée du plus rapide au plus robuste.

Autoriser explicitement l’hôte (allow‑list Office)

Si vous devez continuer à appeler la ressource telle quelle, vous pouvez déclarer l’hôte (sans https://) dans la liste d’autorisation Office. Choisissez la portée utilisateur (HKCU) ou machine (HKLM) selon vos besoins :

REM — Ajout pour l’utilisateur courant
REG ADD "HKCU\Software\Policies\Microsoft\Office\16.0\Common\Identity" ^
  /v basichostallowlist /t REG_EXPAND_SZ /d "dmr.nd.gov" /f

REM — Ajout pour tous les utilisateurs de la machine
REG ADD "HKLM\Software\Policies\Microsoft\Office\16.0\Common\Identity" ^
  /v basichostallowlist /t REG_EXPAND_SZ /d "dmr.nd.gov" /f

Bonnes pratiques :

  • Redémarrez toutes les applis Office (Excel, Word, Outlook…) après le changement. Si le résultat est incertain, redémarrez Windows.
  • Si l’authentification redirige vers un autre domaine (portail SSO, IdP, etc.), ajoutez aussi ces hôtes dans la valeur. Le plus sûr est d’écrire toute la liste en une fois, par exemple : REG ADD "HKCU\Software\Policies\Microsoft\Office\16.0\Common\Identity" ^ /v basichostallowlist /t REG_EXPAND_SZ ^ /d "dmr.nd.gov;login.monportail.gov;idp.monportail.gov" /f Astuce : si vous devez ajouter un hôte plus tard, relancez la commande en reprenant la valeur actuelle et en y ajoutant le nouvel hôte (car REG ADD remplace la valeur).
  • Vérifiez le chemin de version :16.0 pour Office 2016/2019/Microsoft 365.
  • En environnement géré, déployez via GPO/Intune puis forcez l’application des stratégies.

Limitez l’allow‑list au strict nécessaire. Cette clé contourne un garde‑fou de sécurité : réduisez la surface d’attaque en ne listant que les hôtes indispensables et en surveillant leur usage.

Éviter le moteur web d’Office dans la macro

QueryTables s’appuie sur les mécanismes d’identité d’Office et hérite du blocage. Une solution robuste consiste à faire l’appel HTTP vous‑même depuis VBA, puis à insérer le résultat dans la feuille. Deux approches éprouvées :

Option A — WinHTTP en VBA (recommandé si le site accepte Basic/NTLM)

' Référence : late binding (pas besoin d’ajouter une référence COM)
Dim http As Object, url As String
url = "https://www.dmr.nd.gov/oilgas/feeservices/getscoutticket.asp?filenumber=" & WellNo

Set http = CreateObject("WinHttp.WinHttpRequest.5.1")
http.Open "GET", url, False
' 0 = Serveur ; 1 = Proxy. Laissez les champs vides si anonyme.
http.SetCredentials "UTILISATEUR", "MOTDEPASSE", 0

' Facultatif : temps d’attente (ms)
http.SetTimeouts 5000, 5000, 15000, 15000

' Facultatif : suivre les redirections
' 6 = WinHttpRequestOption\_EnableRedirects
http.Option(6) = True

http.Send

If http.Status = 200 Then
' Déposer la réponse brute (HTML/JSON) en feuille, puis parser
Worksheets("ScratchSheet").Range("A1").Value = http.ResponseText
Else
MsgBox "Erreur HTTP : " & http.Status & " - " & http.StatusText, vbExclamation
End If 

Notes utiles : Si le serveur exige un en‑tête Basic sans défi préalable, ajoutez :

http.SetRequestHeader "Authorization", "Basic " & Base64Encode("UTILISATEUR:MOTDEPASSE")

Base64Encode est une petite fonction utilitaire VBA (voir plus bas). Pour les proxys d’entreprise, laissez WinHTTP utiliser la configuration système ou ajustez via http.SetProxy.

Option B — Power Query (Données > Depuis le Web)

Créez la requête Power Query avec identifiants enregistrés, puis rafraîchissez‑la depuis VBA. Selon la politique de votre tenant/poste, cela peut aussi être bloqué. Testez et, si nécessaire, revenez à WinHTTP.

' Rafraîchir une requête liée à un tableau (ListObject)
Worksheets("Données").ListObjects("tblSource").QueryTable.Refresh BackgroundQuery:=False

' ou via la connexion
ThisWorkbook.Connections("Query - Source").Refresh 

Si l’allow‑list ne suffit pas

  • Confirmez tous les hôtes réellement utilisés pendant la connexion (URL cible et éventuelles redirections/SSO). Listez et autorisez chacun.
  • Essayez côté HKLM si HKCU ne change rien (et vice‑versa).
  • Assurez‑vous que la clé Identity existe et que la valeur est de type REG_EXPAND_SZ.
  • Mettez à jour Office. En dernier recours côté IT, passez temporairement sur un canal/build antérieur pour confirmer le lien avec une mise à jour récente.

Solutions structurelles (recommandé moyen/long terme)

  • API + authentification moderne (OAuth2/OpenID Connect) exposée par le fournisseur du site.
  • Proxy interne (service intermédiaire authentifié au site distant, qui expose une URL interne sécurisée à Excel). Cette architecture isole les secrets et centralise l’audit.

Procédure pas à pas (diagnostic → remédiation)

  1. Reproduire l’erreur : lancez la macro, capturez le message exact et, si possible, le code HTTP attendu (200/401/403).
  2. Identifier les hôtes : notez l’URL initiale et toute redirection (portail de connexion, sous‑domaine d’API, etc.).
  3. Tester l’allow‑list : ajoutez les hôtes à basichostallowlist (utilisateur ou machine), puis redémarrez Office.
  4. Retenter la macro QueryTables. Si le blocage persiste, passez à l’approche WinHTTP.
  5. Basculer sur WinHTTP : implémentez un appel direct (GET/POST). Si la réponse est HTML, parsez selon un sélecteur simple (ex. balises, attributs, motif).
  6. Sécuriser : externalisez les secrets (Windows Credential Manager, fichier chiffré, compte applicatif) et minimisez l’allow‑list.
  7. Stabiliser : ajoutez journalisation, gestion d’erreurs, timeouts, et tests unitaires simples sur l’URL.

Tableau comparatif des options

TechniqueBloquée par Office ?Cas d’usage idéalPoints fortsLimites / Risques
QueryTables + allow‑listSouvent non (si hôte autorisé)Requêtes historiques faciles à conserverPeu de code à changerDépend d’une exception de sécurité ; fragile en cas de redirection
WinHTTP (VBA)NonContrôle complet de la requête/réponsePrévisible, journalisable, testableNécessite du code (erreurs, proxys, parsing)
Power Query (Depuis le Web)Parfois ouiTransformations de données & rafraîchissementsInterface graphique, M puissantPeut hériter des politiques d’Office ; gestion des identités
API moderne (OAuth2/OIDC)NonSolution durable et sécuriséeMoins d’exceptions, audit, rotation des secretsDépend du fournisseur, délai de mise en place

Exemples de code prêts à l’emploi

Encodage Base64 en VBA (pour l’en‑tête Basic)

Private Function Base64Encode(ByVal plain As String) As String
    Dim arr() As Byte
    arr = StrConv(plain, vbFromUnicode)
    ' Utilise l’objet XML pour encoder en Base64 sans référence externe
    With CreateObject("MSXML2.DOMDocument").createElement("b64")
        .DataType = "bin.base64"
        .nodeTypedValue = arr
        Base64Encode = .Text
    End With
End Function

HTTP GET minimal robuste (WinHTTP)

Public Function HttpGet(ByVal url As String, _
                        Optional ByVal user As String = "", _
                        Optional ByVal pass As String = "") As String
    Dim http As Object
    Set http = CreateObject("WinHttp.WinHttpRequest.5.1")
    http.Open "GET", url, False
    If Len(user) > 0 Then
        http.SetCredentials user, pass, 0
        http.SetRequestHeader "Authorization", "Basic " & Base64Encode(user & ":" & pass)
    End If
    http.SetTimeouts 5000, 5000, 15000, 15000
    http.Option(6) = True ' redirections
    http.Send
    If http.Status = 200 Then
        HttpGet = http.ResponseText
    Else
        Err.Raise vbObjectError + 513, "HttpGet", "HTTP " & http.Status & " : " & http.StatusText
    End If
End Function

Insérer la réponse dans Excel et parser rapidement

Sub ImporterTicket()
    Dim raw As String, id As String
    id = Range("B2").Value  ' n° dossier ou puits
    raw = HttpGet("https://www.dmr.nd.gov/oilgas/feeservices/getscoutticket.asp?filenumber=" & id, _
                  "UTILISATEUR", "MOTDEPASSE")
    Sheets("ScratchSheet").Range("A1").Value = raw

```
' Exemple de parsing ultra-simple : extraire un champ entre balises
Dim v As String
v = ExtraireEntre(raw, "<td class=""wellname"">", "</td>")
If Len(v) > 0 Then Range("D5").Value = v
```

End Sub

Private Function ExtraireEntre(ByVal s As String, ByVal a As String, ByVal b As String) As String
Dim p1 As Long, p2 As Long
p1 = InStr(1, s, a, vbTextCompare)
If p1 = 0 Then Exit Function
p1 = p1 + Len(a)
p2 = InStr(p1, s, b, vbTextCompare)
If p2 = 0 Then Exit Function
ExtraireEntre = Mid\$(s, p1, p2 - p1)
End Function 

Dépannage ciblé

  • Comportement intermittent ? Il peut dépendre d’un jeton/cookie en cache, d’une redirection d’authentification ou d’une session Office déjà ouverte. Une fois sur deux, Office « crochette » un contexte valide puis échoue au cycle suivant. D’où l’importance de sortir du pipeline d’identité d’Office (WinHTTP).
  • Plusieurs domaines SSO ? Autorisez chaque hôte intervenant (portail, IdP, API). S’il manque un maillon, le blocage réapparaît.
  • HKCU vs HKLM : en environnement verrouillé, une stratégie machine (HKLM) prévaut parfois. Inversement, des profils itinérants peuvent ignorer HKLM si des politiques utilisateur le supplantent. Testez les deux.
  • Type de valeur : la valeur doit être une REG_EXPAND_SZ. Une REG_SZ peut ne pas être interprétée selon le build.
  • Proxy d’entreprise : vérifiez netsh winhttp show proxy. Le cas échéant, adaptez http.SetProxy ou configurez WinHTTP pour utiliser le proxy système.

Sécurité et conformité

  • Réduisez la liste d’exception au strict nécessaire et documentez‑la (qui, pourquoi, combien de temps).
  • Protégez les identifiants : préférez le Gestionnaire d’identifiants Windows, l’authen via compte applicatif à privilèges limités, et évitez les constantes « en dur » dans le code.
  • Journalisez (statut HTTP, durée, hôte ciblé) et alertez en cas d’échecs répétés.
  • Plan de sortie : exigez à terme une API moderne (OAuth2/OIDC) du fournisseur. L’allow‑list est une rustine.

Déploiement via GPO / Intune

GPO (Active Directory)

  1. Créer ou éditer un objet GPO ciblant les machines/utilisateurs concernés.
  2. Naviguer jusqu’à Configuration ordinateur ou Configuration utilisateurParamètresParamètres du Registre.
  3. Créer une valeur REG_EXPAND_SZ nommée basichostallowlist sous Software\Policies\Microsoft\Office\16.0\Common\Identity avec la liste d’hôtes.
  4. Forcer l’application (gpupdate /force) et vérifier via reg query.

Intune (Configuration Profiles)

  1. Créer un profil Settings catalog (Windows 10/11) ou un profil Custom (OMADM CSP) pour pousser la valeur.
  2. Renseigner le chemin et la valeur basichostallowlist. Assigner aux groupes AAD concernés.
  3. Surveiller la conformité et tester sur un pilote.

FAQ

« Ouvrir d’abord un autre document Office » fait parfois marcher la macro. Pourquoi ?
Parce que le contexte d’identité varie (cache, jeton, redirection). Ce n’est pas fiable ni reproductible. Traitez‑le comme un artefact, pas une solution.

Que mettre exactement dans basichostallowlist ?
Uniquement les noms d’hôtes (sans schéma ni chemin) : exemple.gov, login.exemple.gov, idp.exemple.gov. Évitez les jokers globaux. Inscrivez la liste complète des hôtes impliqués dans le parcours d’authentification.

Le site impose une redirection 302 vers un portail, puis 401/403. Est‑ce normal ?
Oui dans de nombreux flows SSO. Pour contourner le blocage, soit autorisez tous les hôtes, soit pilotez l’échange côté WinHTTP (souvent plus simple).

Power Query est‑il touché ?
Selon le type d’origine et la politique d’Office, oui. Si votre requête « Depuis le Web » refuse de s’actualiser alors que le navigateur fonctionne, vous êtes probablement dans le même cas. Essayez WinHTTP ou une source « Web.Contents » avec options avancées (si autorisé).

Changer de canal Office peut‑il aider ?
En tant que test (rétrograder ou basculer de canal) cela peut confirmer la corrélation avec une build. Ce n’est pas une stratégie durable. Préférez une correction explicite.

Checklist « express »

  • 🧩 Confirmez l’URL cible et les hôtes de redirection.
  • 🔐 Ajoutez‑les à basichostallowlist (HKCU/HKLM)  → redémarrez Office.
  • 🔁 Si ça coince, réimplémentez l’appel avec WinHTTP (contrôle total).
  • 🧯 Limitez l’allow‑list, journalisez, surveillez.
  • 🏗️ Engagez une migration vers une API moderne.

Annexe : utilitaires VBA

Lire la valeur basichostallowlist depuis VBA

Public Function LireAllowList() As String
    On Error Resume Next
    Dim ws As Object: Set ws = CreateObject("WScript.Shell")
    Dim v As String
    v = ws.RegRead("HKCU\Software\Policies\Microsoft\Office\16.0\Common\Identity\basichostallowlist")
    If Len(v) = 0 Then
        v = ws.RegRead("HKLM\Software\Policies\Microsoft\Office\16.0\Common\Identity\basichostallowlist")
    End If
    LireAllowList = v
End Function

Gestion d’erreurs centralisée

Public Sub TryFetch()
    On Error GoTo KO
    Dim data As String
    data = HttpGet("https://exemple.gov/resource?id=123", "user", "pass")
    Sheets("Data").Range("A1").Value = data
    Exit Sub
KO:
    Sheets("Logs").Cells(Rows.Count, 1).End(xlUp).Offset(1).Value = _
        Now & " | " & Err.Source & " | " & Err.Description
    MsgBox "Échec de la récupération. Voir l'onglet Logs.", vbExclamation
End Sub

Conclusion

Le message « sign‑in method may be unsecure » n’est pas une fatalité. Il révèle un durcissement salutaire des politiques d’authentification d’Office. À court terme, l’allow‑list (basichostallowlist) peut débloquer une situation précise. Pour plus de stabilité, reprenez la main sur l’appel HTTP (WinHTTP) et planifiez une transition vers des méthodes d’authentification modernes. Vous y gagnerez en prévisibilité, en sécurité et en maintenabilité.

Sommaire