Warum das Thema plötzlich heiß ist
Früher hast Du Benutzername und Passwort direkt geprüft.
Heute? Geht nicht mehr so einfach.
Microsoft 365 (bzw. Azure AD) blockt Basic Auth und klassische Anmeldewege zunehmend ab.
Wenn Du mit VBA auf M365-Dienste (z. B. Outlook, OneDrive, SharePoint, Graph API) zugreifen willst, brauchst Du OAuth2.
Und einen cleveren Login-Flow.
Was Du brauchst
- Einen registrierten App-Client in Azure AD
- Redirect-URL (z. B. http://localhost)
- VBA mit Zugriff auf
WinHttp.WinHttpRequest.5.1
oderMSXML2.XMLHTTP
- Optional: Webbrowser-Steuerung für den Login
Schritt 1: App in Azure AD registrieren
Im Azure-Portal:
- App registrieren unter Azure Active Directory → App-Registrierungen
- Redirect-URI auf „http://localhost“ setzen
- Relevante Berechtigungen (z. B.
User.Read
,Mail.Read
,Files.Read
) zuweisen - Client-ID notieren
Multi-Tenant oder nur für die eigene Organisation – je nach Use Case.
Schritt 2: Login über Systembrowser erzwingen
Du schickst den Benutzer zum Login per Link – im Defaultbrowser.
Sub StarteLogin()
Dim clientId As String
Dim redirectUri As String
Dim scope As String
Dim authUrl As String
clientId = "deine-client-id"
redirectUri = "http://localhost"
scope = "https%3A%2F%2Fgraph.microsoft.com%2FUser.Read"
authUrl = "https://login.microsoftonline.com/common/oauth2/v2.0/authorize?" & _
"client_id=" & clientId & _
"&response_type=code" & _
"&redirect_uri=" & redirectUri & _
"&response_mode=query" & _
"&scope=" & scope & _
"&state=12345"
Shell "cmd /c start " & authUrl, vbHide
End Sub
Der Benutzer meldet sich an. Microsoft leitet um auf http://localhost/?code=...
Jetzt brauchst Du einen lokalen Listener. Nicht trivial in VBA. Aber möglich.
Schritt 3: Code per lokalen Listener abfangen (VBA & Winsock)
Du baust Dir einen Mini-HTTP-Listener mit Winsock oder mit einer externen kleinen EXE, die Du ansteuerst.
Alternativ: Du machst das über eine temporäre UserForm
mit Webbrowser-Steuerelement (weniger elegant, aber geht).
' Diese Lösung nutzt die Webbrowser-Control und filtert den Redirect
Private WithEvents Web As Object
Sub StarteLoginMitWebForm()
Set Web = UserForm1.WebBrowser1
UserForm1.Show
Web.Navigate authUrl
End Sub
Private Sub Web_NavigateComplete2(ByVal pDisp As Object, URL As Variant)
If InStr(URL, "http://localhost/?code=") > 0 Then
' Token auslesen
MsgBox "Code empfangen: " & URL
' Jetzt folgt Token-Anforderung
End If
End Sub
Nicht schön. Aber funktioniert.
Schritt 4: Access Token mit POST holen
Function HoleAccessToken(authCode As String) As String
Dim http As Object
Set http = CreateObject("MSXML2.XMLHTTP")
Dim clientId As String
Dim redirectUri As String
Dim clientSecret As String ' Optional, je nach Flow
clientId = "deine-client-id"
redirectUri = "http://localhost"
Dim postData As String
postData = "client_id=" & clientId & _
"&scope=https%3A%2F%2Fgraph.microsoft.com%2FUser.Read" & _
"&code=" & authCode & _
"&redirect_uri=" & redirectUri & _
"&grant_type=authorization_code"
http.Open "POST", "https://login.microsoftonline.com/common/oauth2/v2.0/token", False
http.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
http.Send postData
HoleAccessToken = http.responseText
End Function
Du bekommst ein JSON mit AccessToken und RefreshToken.
Schritt 5: Zugriff auf Graph API per VBA
Function HoleBenutzerdaten(accessToken As String) As String
Dim http As Object
Set http = CreateObject("MSXML2.XMLHTTP")
http.Open "GET", "https://graph.microsoft.com/v1.0/me", False
http.setRequestHeader "Authorization", "Bearer " & accessToken
http.Send
HoleBenutzerdaten = http.responseText
End Function
Du bekommst JSON zurück – parsen per JsonConverter
oder eigenem Parser.
Token zwischenspeichern
Access Token ist nur kurz gültig. Refresh Token hält länger.
Du kannst die Tokens verschlüsselt in einer Tabelle oder Registry ablegen.
Dann musst Du nicht jedes Mal neu einloggen.
Tabelle: Was Du brauchst je nach Flow
Anforderung | Lösung |
---|---|
Einfache Anmeldung | Authorization Code Flow |
Ohne User-Interaktion | Client Credentials Flow |
Access in Outlook/Graph | MS Graph + OAuth2 |
Token-Handling | JSON parsen + speichern |
Trockener Tipp zum Schluss
Wenn Du versuchst, OAuth2 wie ein klassisches Login zu behandeln – scheiterst Du.
Bau lieber eine OAuth-Schicht außenrum.
Dann kannst Du Deine alte Logik weiter nutzen – mit modernem Login.
No responses yet