Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   C# Explorer und CreateProcessWithLogon (https://www.delphipraxis.net/66866-explorer-und-createprocesswithlogon.html)

Chewie 5. Apr 2006 18:26


Explorer und CreateProcessWithLogon
 
So, nachdem mir Luckie schon in diesem Thread gesagt hat, dass er auch schon vergeblich probiert hat, mit CreateProcessWithLogon einen Ordner im Explorer zu öffnen, frage ich hier nochmal danach.

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:
C:\WINDOWS\explorer ::{20D04FE0-3AEA-1069-A2D8-08002B30309D}
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.

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?

x000x 5. Apr 2006 23:50

Re: Explorer und CreateProcessWithLogon
 
Moin moin,

erstmal funktioniert der Link zu dem anderen Thread nicht...
Zu deinem Problem: Ich habe diesen Code erfolgreich getestet.
Wenn ich dein Problem richtig verstanden habe, sollte das die Lösung sein.

Angel4585 6. Apr 2006 07:22

Re: Explorer und CreateProcessWithLogon
 
Zitat:

Zitat von Chewie
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.

Ich dachte immer sowas unterstützt die DP nicht :gruebel:

Luckie 6. Apr 2006 07:30

Re: Explorer und CreateProcessWithLogon
 
Warum sollten wir das nicht unterstützen? Er hat ja nicht gefragt, wie man dabei das Passwort umgeht.

Angel4585 6. Apr 2006 07:54

Re: Explorer und CreateProcessWithLogon
 
schdimmd au widda :gruebel: ich penn glaub besser weiter... :roll:

Chewie 6. Apr 2006 08:40

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.

x000x 6. Apr 2006 09:52

Re: Explorer und CreateProcessWithLogon
 
Zitat:

Zitat von Chewie
... aber beim Explorer passiert halt nix sichtbares.

Alos entweder war ich gestern Abend schon am schlafen, oder ich weiss auch nicht...
Ich habe es getestet,
Delphi-Quellcode:
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
hat mir den Arbeitsplatz, bzw. einen bestimmten Ordner aufgemacht. Laut Taskman wurde dieser Process auch von Administrator
gestartet.

Chewie 6. Apr 2006 13:31

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 ;)

Chewie 6. Apr 2006 15:23

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:
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.
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.

x000x 6. Apr 2006 18:35

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.

Chewie 6. Apr 2006 18:46

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.

x000x 6. Apr 2006 19:55

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?!

Chewie 6. Apr 2006 19:58

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.

Chewie 7. Apr 2006 16:02

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