Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Impersonate Programm als Admin starten (https://www.delphipraxis.net/125764-impersonate-programm-als-admin-starten.html)

cherry 11. Dez 2008 08:09


Impersonate Programm als Admin starten
 
Hi

Ich versuche eine andere Anwendung als lokaler Admin zu starten und zwar mit Impersonate und ShellExecute...

Leider funktioniert das ganze nicht... das Programm wird zwar gestartet, aber nicht als Admin sondern als angemeldeter Benutzer...
was mache ich falsch?

Delphi-Quellcode:
program startsignout;

{$APPTYPE CONSOLE}

uses
  Windows,Sysutils,ShellAPI;

var
  USER:String='Administrator';
  PW:String='xxxxxx';
  TokenHandle      : THandle;

// Impersonates other user ...
function Impersonate(const User, PW: string): Boolean;
var
  LogonType        : Integer;
  LogonProvider    : Integer;
  strAdminUser     : string;
  strAdminDomain   : string;
  strAdminPassword : string;
begin
  LogonType := LOGON32_LOGON_INTERACTIVE;
  LogonProvider := LOGON32_PROVIDER_DEFAULT;
  strAdminUser := USER;
  strAdminDomain := '';
  strAdminPassword := PW;
  Result := LogonUser(PChar(strAdminUser), nil,
    PChar(strAdminPassword), LogonType, LogonProvider, TokenHandle);
  if Result then
  begin
    Result := ImpersonateLoggedOnUser(TokenHandle);
  end;
end;

begin

  if Impersonate(USER, PW) then
  begin
    ShellExecute(TokenHandle, 'open', PChar('signout'), nil, nil, SW_SHOWNORMAL) ;
    RevertToSelf;
    //WinExec('signout.exe', SW_SHOW); [EDITED]
  end
  else
  begin
    WriteLn(PChar(SysErrorMessage(GetLastError)));
    readln;
  end;

end.
Danke schon mal für Deine Hilfe!

cherry 11. Dez 2008 08:11

Re: Impersonate Programm als Admin starten
 
Huch, kann es sein das das Programm zwar mit Adminrechten ausgeführt wird, nicht aber als dessen Benutzer?!
Wenn ja, wie kann ich das Programm als wirklichen Benutzer Admin starten?

Luckie 11. Dez 2008 08:28

Re: Impersonate Programm als Admin starten
 
Welches Betriebssystem?

cherry 11. Dez 2008 08:29

Re: Impersonate Programm als Admin starten
 
Windows XP SP2

Luckie 11. Dez 2008 08:36

Re: Impersonate Programm als Admin starten
 
Warum startest du den Prozess zweimal? Einmal mit Shellexecute, dann rufst du RevertToSelf auf und dann startest du den Prozess noch mal mit WinExec. Und als was führst du den Code aus? Du bist nicht zufällig schon als Administrator angemeldet auf dem System?

cherry 11. Dez 2008 08:41

Re: Impersonate Programm als Admin starten
 
Oops... das wollte ich natürlich nicht. Die Zeile WinExec('signout.exe', SW_SHOW); sollte eigentlich nicht da stehen. Habe ich wohl beim Präparieren fürs Forum übersehen...

Ich bin als th21498 angemeldet, das ist ein Domänenbenutzer der aber über lokale Admin - rechte verfügt. Es geht mir eigentlich auch nicht direkt um die Rechte, sondern darum das Programm als anderen Benutzer zu starten...

Dezipaitor 11. Dez 2008 11:50

Re: Impersonate Programm als Admin starten
 
ShellExecute und CreateProcess funktionieren nicht zusammen mit ImpersonateLoggedOnUser.
Du musst CreateProcessAsUser benutzen!

Luckie 11. Dez 2008 11:53

Re: Impersonate Programm als Admin starten
 
Aber dann wäre ja Impersonate überflüssig oder?

cherry 11. Dez 2008 12:58

Re: Impersonate Programm als Admin starten
 
Zitat:

Zitat von Luckie
Aber dann wäre ja Impersonate überflüssig oder?

Richtig... ich war ein bisschen verwirrt so früh am Morgen. Hab hier im Forum gefunden was ich gesucht habe, habe aber grad den Link verloren... Der Code war glaube ich sogar von dir. Wie auch immer so hab ichs jetzt gemacht:

Delphi-Quellcode:
uses
  SysUtils, Classes, Windows;

type
  _STARTUPINFOW = record
    cb: DWORD;
    lpReserved: Pointer;
    lpDesktop: Pointer;
    lpTitle: Pointer;
    dwX: DWORD;
    dwY: DWORD;
    dwXSize: DWORD;
    dwYSize: DWORD;
    dwXCountChars: DWORD;
    dwYCountChars: DWORD;
    dwFillAttribute: DWORD;
    dwFlags: DWORD;
    wShowWindow: Word;
    cbReserved2: Word;
    lpReserved2: PByte;
    hStdInput: THandle;
    hStdOutput: THandle;
    hStdError: THandle;
  end;
  TStartUpInfoW = _STARTUPINFOW;
  PStartUpInfoW = ^_STARTUPINFOW;

function Runas(USER,DOMAIN,PW,EXE:PWideChar):boolean;

const
  LOGON_WITH_PROFILE = $00000001;

function CreateProcessWithLogonW(lpUsername, lpDomain, lpPassword: PWideChar;
  dwLogonFlags: dword; lpApplicationName, lpCommandLine: PWideChar;
  dwCreationFlags: dword; lpEnvironment: pointer;
  lpCurrentDirectory: PWideChar; lpStartupInfo: PStartUpInfoW;
  lpProcessInfo: PProcessInformation): boolean; stdcall;
  external 'advapi32.dll';

implementation

function Runas(USER,DOMAIN,PW,EXE:PWideChar):boolean;
var
  si : TStartupInfoW;
  pif : TProcessInformation;

begin
  ZeroMemory(@si,sizeof(si));
  si.cb         := sizeof(si);
  si.dwFlags    := STARTF_USESHOWWINDOW;
  si.wShowWindow := 1;

  if DOMAIN <> 'nil' then
  begin
    result        := CreateProcessWithLogonW(USER,DOMAIN,
      PW,LOGON_WITH_PROFILE,nil,
      EXE,
      CREATE_DEFAULT_ERROR_MODE,nil,nil,@si,@pif);
  end
  else
  begin
     result        := CreateProcessWithLogonW(USER,nil,
      PW,LOGON_WITH_PROFILE,nil,
      EXE,
      CREATE_DEFAULT_ERROR_MODE,nil,nil,@si,@pif);
  end;

end;

Dezipaitor 11. Dez 2008 13:31

Re: Impersonate Programm als Admin starten
 
besser wäre:
http://www.delphipraxis.net/internal...ct.php?t=60486

Obwohl ich diese Funktion für problematisch halte : siehe community comments der API Funkt. in MSDN.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:33 Uhr.

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