![]() |
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:43 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