![]() |
Impersonate Programm als Admin starten
Hi
Ich versuche eine andere Anwendung als lokaler Admin zu starten und zwar mit ![]() Leider funktioniert das ganze nicht... das Programm wird zwar gestartet, aber nicht als Admin sondern als angemeldeter Benutzer... was mache ich falsch?
Delphi-Quellcode:
Danke schon mal für Deine Hilfe!
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. |
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? |
Re: Impersonate Programm als Admin starten
Welches Betriebssystem?
|
Re: Impersonate Programm als Admin starten
Windows XP SP2
|
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?
|
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... |
Re: Impersonate Programm als Admin starten
ShellExecute und CreateProcess funktionieren nicht zusammen mit ImpersonateLoggedOnUser.
Du musst CreateProcessAsUser benutzen! |
Re: Impersonate Programm als Admin starten
Aber dann wäre ja Impersonate überflüssig oder?
|
Re: Impersonate Programm als Admin starten
Zitat:
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; |
Re: Impersonate Programm als Admin starten
besser wäre:
![]() Obwohl ich diese Funktion für problematisch halte : siehe community comments der API Funkt. in MSDN. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:26 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