Delphi-PRAXiS
Seite 1 von 2  1 2      

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:23 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz