IADsUser::ChangePassword() schlägt seit Kurzem fehl

Seit dem 09. Oktober 2016 kann es vorkommen, dass Skripte oder Webseiten, welche Passwortänderungen für Benutzer durchführen, nicht mehr funktionieren. Dies kann aus der Verwendung der IADsUser::ChangePassword()-Methode in Verbindung mit dem ADSI WinNT Provider und dem Sicherheitsupdate KB3167679 vom 09.08.2016 resultieren. Mit dem Update wurden bestimmte Fallbacks bei der Authentifizierungsaushandlung deaktiviert, um unter anderem Downgradeangriffe zu verhindern. Der ADSI WinNT Provider verwendet unter bestimmten Umständen eine nun verbotene Authentifizierungsstrategie und resultiert ab nun in einem Fehler mit dem Errorcode: -2147023631 (ERROR_DOWNGRADE_DETECTED).

Errorcode bestimmen


Um dies als Ursache zu bestätigen, sollte zunächst der Errorcode wie folgt überprüft werden:
set objUser = GetObject("WinNT://domain.local/foobar,user")
If (Err.Number<>0) Then
MsgBox("An error has occurred while connecting to the server: " & Err.Number)
End If
objUser.ChangePassword "altesPw!", "neuesPw!"
If (Err.Number<>0) Then
MsgBox("An error has occurred while changing the password: " & Err.Number)
End If



Workaround


Um den Fehler ERROR_DOWNGRADE_DETECTED zu vermeiden, kann zum ADSI?LDAP?Provider gewechselt werden, welcher eine andere (erlaubte) Authentifizierungsstrategie verfolgt:
set objUser = GetObject("LDAP://CN=foobar,CN=Users,DC=domain,DC=local")
Hierbei ist allerdings zu beachten, dass der LDAP-Provider (im Gegensatz zum WinNT-Provider) die Hierarchie der Domäne mit abbildet. Je nach Struktur der Domäne könnte daher noch eine ADODB-Abfrage [2] nötig werden, welche den DistinguishedName des gesuchten Users bestimmt.

Fix


Microsoft ist das Problem bekannt und stellt einen Fix in Aussicht: [1] unter dem Abschnitt Bekanntes Problem 3.

[1] https://support.microsoft.com/de-de/kb/3167679

[2] http://www.selfadsi.de/search.htm#Execute