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.
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 (carREG 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")
où 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
siHKCU
ne change rien (et vice‑versa). - Assurez‑vous que la clé
Identity
existe et que la valeur est de typeREG_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)
- Reproduire l’erreur : lancez la macro, capturez le message exact et, si possible, le code HTTP attendu (200/401/403).
- Identifier les hôtes : notez l’URL initiale et toute redirection (portail de connexion, sous‑domaine d’API, etc.).
- Tester l’allow‑list : ajoutez les hôtes à
basichostallowlist
(utilisateur ou machine), puis redémarrez Office. - Retenter la macro
QueryTables
. Si le blocage persiste, passez à l’approche WinHTTP. - 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).
- Sécuriser : externalisez les secrets (Windows Credential Manager, fichier chiffré, compte applicatif) et minimisez l’allow‑list.
- Stabiliser : ajoutez journalisation, gestion d’erreurs, timeouts, et tests unitaires simples sur l’URL.
Tableau comparatif des options
Technique | Bloquée par Office ? | Cas d’usage idéal | Points forts | Limites / Risques |
---|---|---|---|---|
QueryTables + allow‑list | Souvent non (si hôte autorisé) | Requêtes historiques faciles à conserver | Peu de code à changer | Dépend d’une exception de sécurité ; fragile en cas de redirection |
WinHTTP (VBA) | Non | Contrôle complet de la requête/réponse | Prévisible, journalisable, testable | Nécessite du code (erreurs, proxys, parsing) |
Power Query (Depuis le Web) | Parfois oui | Transformations de données & rafraîchissements | Interface graphique, M puissant | Peut hériter des politiques d’Office ; gestion des identités |
API moderne (OAuth2/OIDC) | Non | Solution durable et sécurisée | Moins d’exceptions, audit, rotation des secrets | Dé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 ignorerHKLM
si des politiques utilisateur le supplantent. Testez les deux. - Type de valeur : la valeur doit être une
REG_EXPAND_SZ
. UneREG_SZ
peut ne pas être interprétée selon le build. - Proxy d’entreprise : vérifiez
netsh winhttp show proxy
. Le cas échéant, adaptezhttp.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)
- Créer ou éditer un objet GPO ciblant les machines/utilisateurs concernés.
- Naviguer jusqu’à Configuration ordinateur ou Configuration utilisateur → Paramètres → Paramètres du Registre.
- Créer une valeur
REG_EXPAND_SZ
nomméebasichostallowlist
sousSoftware\Policies\Microsoft\Office\16.0\Common\Identity
avec la liste d’hôtes. - Forcer l’application (
gpupdate /force
) et vérifier viareg query
.
Intune (Configuration Profiles)
- Créer un profil Settings catalog (Windows 10/11) ou un profil Custom (OMADM CSP) pour pousser la valeur.
- Renseigner le chemin et la valeur
basichostallowlist
. Assigner aux groupes AAD concernés. - 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é.