Nachmal ein Nachtrag von mir. Ich hab noch Probleme gehabt mich auf eine Samba-Freigabe zu verbinden nachdem das Impersonate erfolgreich verlaufen ist.
Windows prüft über die
API nur die Korrektheit des Passworts als Hashwert, merkt es sich aber nicht in Klartext. Darum ist es ihm nicht möglich das Passwort bei der Anmeldung am Samba-Dienst zu übergeben. Kein Bug, ein "Sicherheitsfeature", dass sich gottseidank sehr leicht umgehen lässt (Was bringt das dann?
).
Will man sich mit seinem Benutzernamen an einem Server anmelden (das wird nicht nur für Samba zutreffen nehme ich an) muss man eine Konstante verwenden, die zumindest in D2k9, in der Windows.pas fehlt. So hab ich's dennoch hin bekommen:
Delphi-Quellcode:
function Impersonate(const aUser, aPass: string): Boolean;
var
LogonType: Integer;
LogonProvider: Integer;
User: String;
Pass: String;
Token: THandle;
const
LOGON32_LOGON_NETWORK_CLEARTEXT = 8; // Fehlt in der Windows.pas
begin
LogonType := LOGON32_LOGON_NETWORK_CLEARTEXT; //LOGON32_LOGON_INTERACTIVE;
LogonProvider := LOGON32_PROVIDER_DEFAULT;
User := aUser;
Pass := aPass;
Result := LogonUser(PChar(User), nil {Domain}, PChar(Pass), LogonType, LogonProvider, Token);
if Result then
Result := ImpersonateLoggedOnUser(Token);
end;
Diese Vorgehensweise ist im
MSDN dokumentiert. Dort hab ichs gefunden.
Gruß,
Toni
Der frühe Vogel fängt den Wurm, richtig.
Aber wird nicht auch der frühe Wurm vom Vogel gefressen?