cbx-micha
Goto Top

PowerShell: Authentication - mysql native password failed with Access denied

Hallo liebe Leute,

ich habe viele andere Themen dazu gefunden, aber keines davon hat mich einen Schritt weiter gebracht. Ich denke, es ist nur eine dumme Kleinigkeit, aber ich kann das Problem leider nicht finden und arbeite seit Tagen daran ^^
Zudem hoffe ich mal, das ich hier im richtigen Thema bin; wenn nicht, bitte ich das ob meiner ersten Frage hier zu entschuldigen und mir ggf. den Weg zu weisen.

Basis:
- Windows Server 2016 Rechenzentrum
- MariaDB 10.4.10, MySQL.exe 15.1
- PowerShell 5.1.14393
- PS als Administrator gestartet

Versuch 1:
Melde ich mich mit "mysql -hlocalhost -uroot -pTotalGeheim" aus der PS-Shell an, funktioniert alles ohne Probleme.

Versuch 2:
Wenn ich ein PS Script (nicht meins) starte, bekomme ich ein "Access Denied" für den Benutzer root mit identischem Passwort. Die genaue Meldung lautet: Ausnahme beim Aufruf von „Open“ mit 0 Argument(en): „Authentication to host ‚localhost‘ for user ‚root‘ using method ‚mysql_native_password‘ failed with message: Access denied for user ‚root‘@‘localhost‘ ( Passwort nutzen: JA)"

Die entsprechende PS-Funktion sieht folgendermaßen aus:
$Today = (Get-Date).ToString("yyyyMMdd")  
    $DBErrorLog = "$PSScriptRoot\$Today-DBError.log"  
    $ConnectionString = "server=" + $MySQLHost + ";port=" + $MySQLPort + ";uid=" + $MySQLUserName + ";pwd=" + $MySQLPassword + ";database=" + $MySQLDatabase + ";SslMode=" + $MySQLSSL + ";Default Command Timeout=" + $MySQLCommandTimeOut + ";Connect Timeout=" + $MySQLConnectTimeout + ";"  
    $Error.Clear()
    Try {
        [void][System.Reflection.Assembly]::LoadWithPartialName("MySql.Data")  
        $Connection = New-Object MySql.Data.MySqlClient.MySqlConnection
        $Connection.ConnectionString = $ConnectionString
        $Connection.Open()
        $Command = New-Object MySql.Data.MySqlClient.MySqlCommand($Query, $Connection)
        $DataAdapter = New-Object MySql.Data.MySqlClient.MySqlDataAdapter($Command)
        $DataSet = New-Object System.Data.DataSet
        $RecordCount = $DataAdapter.Fill($DataSet, "data")  
        $DataSet.Tables
    }
    Catch {
        Debug "[ERROR] DATABASE ERROR : Unable to run query : $Query $($Error)"  
    }
    Finally {
        $Connection.Close()
    }
}

Benutzer und Passwort wurden hundertfach geprüft und sind definitiv identisch (Kreuztest via copy&past).

"local-infile = 1" ist bereits in "my.ini" unter [mysql] und unter [mysqld] gesetzt. Es gibt auch eine "dontprotecthome.conf" mit dem Inhalt "ProtectHome=false" im BIN-Verzeichnis, obwohl ich denke, dass dies nur unter Linux relevant ist.

Es wäre wirklich super nett, wenn mir da jemand helfen könnte; leider sind mir die Ideen ausgegangen.

Grüße
Micha

Content-ID: 3721175546

Url: https://administrator.de/contentid/3721175546

Ausgedruckt am: 26.11.2024 um 01:11 Uhr

CBX-Micha
CBX-Micha 23.08.2022 um 07:56:02 Uhr
Goto Top
PUSH
3714160434
3714160434 23.08.2022 aktualisiert um 10:37:29 Uhr
Goto Top
( Passwort nutzen: JA)
Die Fehlermeldung sagt es schon eindeutig und zwar das in Klammern. Root wurde auf deine Datenbank, bzw. Tabelle nicht mit einem Passwort berechtigt! Also entweder fehlt für root@localhost der Berechtigungseintrag für die DB/Tabelle oder der Berechtigungseintrag für diese DB/Tabelle hat kein Passwort, das sagt nämlich die Fehlermeldung. Wenn du also mal den Parameter "PWD" inklusive Passwort im Connectionstring weglässt und es funktioniert dann ist der Berechtigungseintrag fehlerhaft!
Des weiteren funktioniert das Verbinden hier natürlich nur vom lokalen Host aus da "localhost" in der Berechtigungen aufgeführt ist.
PUSH
UP BH 😂
und arbeite seit Tagen daran ^^
Wow, so viel zeit möchte ich mal für sowas bekommen, da wäre unser eins bereits gefeuert und für unfähig befunden worden ...
CBX-Micha
CBX-Micha 23.08.2022 um 10:42:39 Uhr
Goto Top
Danke für den Hinweis, aber der ist leider nicht zielführend...
Schau mal meinen "Versuch 1". Auf der Kommandozeile aus einer PS-Shell kann ich mich problemlos mit dem Benutzer "root", dem Kennwort "blablub" an "localhost" anmelden. Und selbstverständlich ist für "root" ausschließlich die Anmeldung von "localhost" und "127.0.0.1" zulässig. Aber was anderes macht das Script ja auch nicht.
Ich habe was ähnliches mal aus PHP heraus gemacht; kein Problem, weder direkt noch per DSN.
Es muss also was ganz konkret PS- spezifisches sein, was hier die Anmeldung an MySQL verhindert.
Ich habe schon fast so den Verdacht, dass das PS-Script hier das Kennwort eben nicht als Klartext übergibt, sondern irgend etwas damit anstellt...
3714160434
3714160434 23.08.2022 aktualisiert um 10:48:10 Uhr
Goto Top
Zitat von @CBX-Micha:

Danke für den Hinweis, aber der ist leider nicht zielführend...
Schau mal meinen "Versuch 1". Auf der Kommandozeile aus einer PS-Shell kann ich mich problemlos mit dem Benutzer "root", dem Kennwort "blablub" an "localhost" anmelden.
Dieser Vergleich hat überhaupt nichts zu sagen! Datenbanken haben ihre eigenen Berechtigungseinträge!!!
Und selbstverständlich ist für "root" ausschließlich die Anmeldung von "localhost" und "127.0.0.1" zulässig. Aber was anderes macht das Script ja auch nicht.
Doch, es fragt eine bestimmte Datenbank ab!
Es muss also was ganz konkret PS- spezifisches sein, was hier die Anmeldung an MySQL verhindert.
Nein, die Fehlermeldung ist eindeutig und kommt von MySQL nicht von der Powershell!
Ich habe schon fast so den Verdacht, dass das PS-Script hier das Kennwort eben nicht als Klartext übergibt, sondern irgend etwas damit anstellt...
Nein. Das liegt eindeutig am Berechtigungseintrag für diese DB/Tabelle auf die zugegriffen werden soll. Die Fehlermeldung ist eindeutig! Hab ich schon öfter gesehen, lag immer am Berechtigungseintrag der DB/Tabelle.
CBX-Micha
CBX-Micha 23.08.2022 um 10:44:38 Uhr
Goto Top
Zitat von @3714160434:

( Passwort nutzen: JA)
Die Fehlermeldung sagt es schon eindeutig und zwar das in Klammern. Root wurde auf deine Datenbank, bzw. Tabelle nicht mit einem Passwort berechtigt! Also entweder fehlt für root@localhost der Berechtigungseintrag für die DB/Tabelle oder der Berechtigungseintrag für diese DB/Tabelle hat kein Passwort, das sagt nämlich die Fehlermeldung. Wenn du also mal den Parameter "PWD" inklusive Passwort im Connectionstring weglässt und es funktioniert dann ist der Berechtigungseintrag fehlerhaft!
Des weiteren funktioniert das Verbinden hier natürlich nur vom lokalen Host aus da "localhost" in der Berechtigungen aufgeführt ist.

PUSH
UP BH 😂
    • lach * Genau... Wer viel hat lässt viel hängen 😂
    und arbeite seit Tagen daran ^^
    Wow, so viel zeit möchte ich mal für sowas bekommen, da wäre unser eins bereits gefeuert und für unfähig befunden worden ...
    Tja, das problem hatte ich nie und habe ich hier sowieso nicht, da rein privates "Vergnügen" ...
CBX-Micha
CBX-Micha 23.08.2022 aktualisiert um 10:57:42 Uhr
Goto Top
Zitat von @3714160434:
Dieser Vergleich hat überhaupt nichts zu sagen! Datenbanken haben ihre eigenen Berechtigungseinträge!!!

... ok, gerade versucht aus der PS- Shell:

PS C:\> mysql -hlocalhost -uroot -pVollGeheim unacore

Kein Problem. Ich kann mich also an der Datenbank "unacore" ohne Probleme aus einer PS- Shell anmelden und auch mit "show tables;" die vorhandenen Tabellen auflisten, was ohne korrekte Anmeldung nicht ginge.
Ich denke, nun hat der Vergleich doch was zu sagen ;)

BTW: Root hat bei mir alle Rechte global und alle Rechte zu jeder vorhandenen DB, darf also uneingeschränkt überall dran...
3714160434
Lösung 3714160434 23.08.2022 aktualisiert um 11:06:17 Uhr
Goto Top
pwd=" + $MySQLPassword + "
Enthält weder Quoting noch evt. escaping - und an das PS Sonderzeichen in normalen Anführungszeichen speziell behandelt hast du gedacht?
CBX-Micha
CBX-Micha 23.08.2022 um 13:05:26 Uhr
Goto Top
Das Script ist nicht von mir und nach Aussage zumindest eines anderen Anwenders läuft das bei denen so out-of-the-box.
Hmmm... Das Kennwort enthält zumindest Ziffern, ein Dollar-Zeichen und Bindestriche.
Ziffern und Bindestriche/Unterstriche dürften keine Probleme machen, aber vielleicht das Dollar-Zeichen? Ich hab sonst nichts mit PS am Hut und kann das nicht beurteilen...
3714160434
Lösung 3714160434 23.08.2022 aktualisiert um 14:40:45 Uhr
Goto Top
Zitat von @CBX-Micha:

Das Script ist nicht von mir und nach Aussage zumindest eines anderen Anwenders läuft das bei denen so out-of-the-box.
Heißt erst mal nix.
Hmmm... Das Kennwort enthält zumindest Ziffern, ein Dollar-Zeichen und Bindestriche.
Ziffern und Bindestriche/Unterstriche dürften keine Probleme machen, aber vielleicht das Dollar-Zeichen?
Da ham wirs doch, das Dollarzeichen gehört zu einer Variablen und das versucht die PowerShell zu expandieren wenn es innerhalb von normalen Anführungszeichen steht! Ergo definiere dein Passwort innerhalb von Hochkommas dann findet keine Variable oder Escape Sequence Expansion statt
$MySQLPassword = 'Passw0rdWith$signInSingleQuotesIsNoProblem'  
CBX-Micha
CBX-Micha 23.08.2022 um 14:43:06 Uhr
Goto Top
Ahhhh gut!
Probiere ich heute Abend gleich mal aus und melde mich, ob es geht oder nicht.

Danke für den Tipp!
CBX-Micha
CBX-Micha 23.08.2022 um 18:54:43 Uhr
Goto Top
Jupp! Genau das ist es!
Erstaunlich, dass das noch niemandem aufgefallen ist. Die anderen Nutzer scheinen ziemlich einfache Kennwörter zu haben, die zumindest nicht das $-Zeichen beinhalten.

Ich danke Dir ganz herzlich für die Hilfe!

DLzG
Micha