![]() |
Explorer und CreateProcessWithLogon
So, nachdem mir Luckie schon
![]() Hintergrund ist folgender: Ich schreibe ein Programm, in dem es u.a. die Möglichkeit geben soll, Arbeitsplatz und Systemsteuerung oder auch die Laufwerke im Explorer mit den rechten eines anderen Benutzers (vor allem des Administrators) zu öffnen. Der Arbeistplatz kann ganz einfach angezeigt werden:
Code:
Das funktioniert sowohl bei Start->Ausführen (was wohl mit ShellExecute arbeitet) als auch bei Process.Start im .NET-Framework 1.1. Es genügt bei beiden sogar, die CLSID anzugeben bzw. das Verzeichnis, ohne Angabe des Explorers.
C:\WINDOWS\explorer ::{20D04FE0-3AEA-1069-A2D8-08002B30309D}
Nun könnte man denken, dass ein Process.Start an einer Stelle, in der man das aktuelle Programm in den Administrator-Kontext (mittels ImpersonateUser) ungeschaltet hat, Prozesse auch in diesem Kontext gestartet werden würde. Leider funktioniert Windows nicht so, wie ich feststellen musste. Also bleibt die Möglichkeit, auf CreateProcessWithLogon auszuweichen. Doch dort erscheint kein Explorer-Fenster, wenn er gestartet wird! Nun steh ich vor dem Dilemma, dass ich kaum noch eine Idee mehr hab, wie ich das was ich will realisieren kann. Ich könnte noch anstelle von CreateProcessWithLogon CreateProcessWithToken oder CreateProcessAsUser probieren, aber ich bezweifle, dass die sich anders verhalten. Hat einer eine Idee, was ich noch tun kann oder weiß jemand, warum sich der Explorer nicht via CreateProcessWithLogon öffnen lässt? |
Re: Explorer und CreateProcessWithLogon
Moin moin,
erstmal funktioniert der Link zu dem anderen Thread nicht... Zu deinem Problem: Ich habe ![]() Wenn ich dein Problem richtig verstanden habe, sollte das die Lösung sein. |
Re: Explorer und CreateProcessWithLogon
Zitat:
|
Re: Explorer und CreateProcessWithLogon
Warum sollten wir das nicht unterstützen? Er hat ja nicht gefragt, wie man dabei das Passwort umgeht.
|
Re: Explorer und CreateProcessWithLogon
schdimmd au widda :gruebel: ich penn glaub besser weiter... :roll:
|
Re: Explorer und CreateProcessWithLogon
Hallo Peter,
danke für den Link, aber das ist die gleiche Variante, die Luckie in seinem RunAsUser benutzt und die ich auch getestet habe. Bei den meisten Programmen funktioniert sie auch, aber beim Explorer passiert halt nix sichtbares. Ach ja, den Link oben hab ich korrigiert, war mein Fehler. Und ich will natürlich keine Passwörter umgehen, das Passwort zum benutzerwechsel ist natürlich bekannt ;) Also, das Problem besteht weiterhin. |
Re: Explorer und CreateProcessWithLogon
Zitat:
Ich habe es getestet,
Delphi-Quellcode:
hat mir den Arbeitsplatz, bzw. einen bestimmten Ordner aufgemacht. Laut Taskman wurde dieser Process auch von Administrator
RunAsUser('Administrator', '***', 'C:\Windows\Explorer.exe ::{20D04FE0-3AEA-1069-A2D8-08002B30309D}')
//RunAsUser('Administrator', '***', 'C:\Windows\Explorer.exe /e, "C:\Programme") <-- habe nicht die genaue syntax im Kopf, glaube so war es aber gestartet. |
Re: Explorer und CreateProcessWithLogon
Hm, ich hab den Code mangels Delphi-Compiler nicht ausprobiert, aber vom Lesen her sah er gleich aus. Naja, dann wirds doch mal wieder Zeit, Delphi zu installieren und es auszuprobieren ;)
|
Re: Explorer und CreateProcessWithLogon
Hm, sehr seltsam, ich hab den Code aus x000xs erstem Beitrag probiert, komme aber gar nicht zu der jeweiligen Stelle, weil schon CreateEnvironmentBlock mit Fehler 203 fehlschlägt.
Wenn ich als Token an diese Funktion 0 übergebe, funktioniert das Starten beispielsweise des Taskmanagers, aber halt nicht des Explorers :cry: Hier ist das Listing. Die auskommentierte Zeile oben ist aus dem Original, der Ersatz, der bei mir funktioniert, steht direkt darunter.
Delphi-Quellcode:
Kann das jemand vielleicht mal bei sich ausprobieren? Interessant ist zum einen, ob bei euch die Sache mit dem CreateEnvironmentBlock funktioniert und zum anderen, ob der Explorer gestartet wird.
program RunAsUserTest;
{$APPTYPE CONSOLE} uses SysUtils, Windows, Dialogs; function CreateProcessWithLogon(lpUsername: PWideChar; lpDomain: PWideChar; lpPassword: PWideChar; dwLogonFlags: DWORD; lpApplicationName: PWideChar; lpCommandLine: PWideChar; dwCreationFlags: DWORD; lpEnvironment: Pointer; lpCurrentDirectory: PWideChar; var lpStartupInfo: TStartupInfo; var lpProcessInfo: TProcessInformation): BOOL; stdcall; external 'advapi32' name 'CreateProcessWithLogonW'; function CreateEnvironmentBlock(var lpEnvironment: Pointer; hToken: THandle; bInherit: BOOL): BOOL; stdcall; external 'userenv'; function DestroyEnvironmentBlock(pEnvironment: Pointer): BOOL; stdcall; external 'userenv'; const LOGON_WITH_PROFILE = $00000001; function RunAs(User, Password, Command: String): Integer; var dwSize: DWORD; hToken: THandle; lpvEnv: Pointer; pi: TProcessInformation; si: TStartupInfo; szPath: Array [0..MAX_PATH] of WideChar; begin ZeroMemory(@szPath, SizeOf(szPath)); ZeroMemory(@pi, SizeOf(pi)); ZeroMemory(@si, SizeOf(si)); si.cb:=SizeOf(TStartupInfo); if LogonUser(PChar(User), '.', PChar(Password), LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, hToken) then begin //if CreateEnvironmentBlock(lpvEnv, hToken, True) then if CreateEnvironmentBlock(lpvEnv, 0, True) then begin dwSize:=SizeOf(szPath) div SizeOf(WCHAR); if (GetCurrentDirectoryW(dwSize, @szPath) > 0) then begin if (CreateProcessWithLogon(PWideChar(WideString(User)), nil, PWideChar(WideString(Password)), LOGON_WITH_PROFILE, nil, PWideChar(WideString(Command)), CREATE_UNICODE_ENVIRONMENT, lpvEnv, szPath, si, pi)) then begin result:=ERROR_SUCCESS; CloseHandle(pi.hProcess); CloseHandle(pi.hThread); end else result:=GetLastError; end else result:=GetLastError; DestroyEnvironmentBlock(lpvEnv); end else result:=GetLastError; CloseHandle(hToken); end else result:=GetLastError; end; var res: Integer; user, pass: string; begin Write('Benutzername angeben: '); ReadLn(user); Write('Passwort angeben: '); ReadLn(pass); WriteLn('Prozess wird gestartet...'); res := RunAs(user, pass, 'c:\windows\explorer.exe ::{20D04FE0-3AEA-1069-A2D8-08002B30309D}'); //res := RunAs(user, pass, 'c:\windows\system32\taskmgr.exe'); if (res <> ERROR_SUCCESS) then begin WriteLn('Fehler ', res, ': ', SysErrorMessage(res)); end else begin WriteLn('Prozess gestartet.'); end; Readln; end. |
Re: Explorer und CreateProcessWithLogon
Liste der Anhänge anzeigen (Anzahl: 1)
Also ich habe dein Code kopiert und es funktioniert (Siehe Screenshot)
EDIT: Habe grade gesehen, Delphi 5, habe nur mit Delphi 6 Prof auf WinXP SP2 getestet. |
Re: Explorer und CreateProcessWithLogon
Liste der Anhänge anzeigen (Anzahl: 2)
Das Delphi5 ist veraltet, könnte das eigentlich mal aktualisieren, hab das ganze mit Delphi 2005 getestet.
Das ist ja in der Tat ein Mysterium, ich installier mir mal eine ältere Delphi-Version und probiers damit aus. Auch wenn ich denke, dass es eher an Windows liegt. Dei Frage ist nur, was bei uns beiden unterschiedlich ist. Hat dein Standardbenutzer vielleicht Administrator-Rechte? Ich habe keine idee, ob das was damit zu tun haben könnte, aber irgendwo muss man ja ansetzen. Und welche Variante hast du probiert? Die mit hToken oder o bei CreateEnvironmentBlock? Es wäre nett, wenn noch ein paar Leute dies ausprobieren würde, ich hänge mal beide Versionen als Anhang an. |
Re: Explorer und CreateProcessWithLogon
Also ich habe beide Versionen ohne Fehler erfolgreich getestet. Mein Benutzer ist nur in der Gruppe Benutzer, sonst nix.
Hab keinen Plan woran es liegen könnte, evtl. findet sich ja noch jemand der testen kann?! |
Re: Explorer und CreateProcessWithLogon
Ja, ich hab vor kurzem jemanden gebeten, es zu testen.
Ergebnis: Bei beiden Versionen wird kein Explorer angezeigt, aber bei der Version mit dem Token-Handle gibt es auch keinen Fehler 203. Also eine neue Version :mrgreen: Ich kann langsam nur noch lachen, ist besser als sich aufzuregen. Wenn es noch einer testet, mal sehen, was bei dem dann passiert :shock: Ach so, bei dem Tester und bei mir läuft auch WinXP SP2. |
Re: Explorer und CreateProcessWithLogon
Yippie, ich hab herausgefunden, wie es funktioniert!
Und zwar muss für den Benutzer, in dessen Kontext der Explorer abgezeigt werden soll, die Ordneroption "Jeden Ordner in einem eigenen Prozess starten" aktiviert sein. Zumindest hat das bei mir geholfen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:47 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz