(Windows) Programm als Administrator ausführen

Rund um die LCL und andere Komponenten
Antworten
MitjaStachowiak
Lazarusforum e. V.
Beiträge: 395
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

(Windows) Programm als Administrator ausführen

Beitrag von MitjaStachowiak »

Hallo,
ich habe vor kurzem ein kleines Tool geschrieben, wofür ich jetzt aber ein vollwertiges Setup erstellen möchte. Das heißt, man soll bei der Installation auswählen können "Nur für diesen Benutzer installieren" oder "Für alle Benutzer installieren". Für letzteres bräuchte das Setup dann Administratorrecht und es soll eine entsprechende Windows-Meldung kommen "Möchten Sie zulassen, dass durch folgendes Programm [...] Änderungen an diesem Computer vorgenommen werden?". Es wäre wichtig, dass diese Meldung erst kommt, wenn man auf "Für alle Benutzer installieren" klickt. Das Programm müsste sich irgendwie mit Administratorrecht neustarten.

Folgender Code hat in verschiedensten Ausführungen nichts gebracht:

Code: Alles auswählen

var
 StartInfo : TStartupInfo;
 ProcInfo  : TProcessInformation;
 Token     : Handle;
 
[...]
 
 ZeroMemory(@StartInfo,SizeOf(StartInfo));
 ZeroMemory(@ProcInfo,SizeOf(ProcInfo));
 StartInfo.cb := SizeOf(StartInfo);
 LogonUser('administrator',nil,nil,LOGON32_LOGON_INTERACTIVE,LOGON32_PROVIDER_DEFAULT,@Token);
 CreateProcessAsUser(Token,nil,PChar(ParamStr(0) + ' -all'),nil,nil,false,NORMAL_PRIORITY_CLASS,nil,PChar(ExtractFilePath(ParamStr(0))),@StartInfo,@ProcInfo);
 Application.Terminate;
Meine Alternativ-Idee war es, ein Mini-Programm mit Manifest-XML in Windows-Temp zu entpacken, das dann das Setup neustartet, aber sonderlich gut gefällt mir das nicht.

Hat jemand eine bessere Idee?

Benutzeravatar
theo
Beiträge: 10905
Registriert: Mo 11. Sep 2006, 19:01

Re: (Windows) Programm als Administrator ausführen

Beitrag von theo »

Wie wär's mit sowas?
http://wiki.freepascal.org/Deploying_Your_Application" onclick="window.open(this.href);return false;

MitjaStachowiak
Lazarusforum e. V.
Beiträge: 395
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: (Windows) Programm als Administrator ausführen

Beitrag von MitjaStachowiak »

Naja, so eine fertige Lösung wäre sicher auch etwas. Aber ich möchte dieses mal einen eigenen Installer schreiben, mit Layout usw. Außerdem brauche ich das mit dem Admin-Recht noch an anderer Stelle: Man soll die Möglichkeit haben, gewisse Standradeinstellungen für alle Benutzer vorzugeben und der Uninstaller braucht entsprechend auch Admin-Recht. Ich möchte nicht zwei Uninstaller mit und ohne Manifest mitliefern müssen.

Aber Danke für den Tipp.

Benutzeravatar
theo
Beiträge: 10905
Registriert: Mo 11. Sep 2006, 19:01

Re: (Windows) Programm als Administrator ausführen

Beitrag von theo »

Was hast denn schon alles versucht?
Google führt mich z.B. zu sowas hier: http://www.delphipraxis.net/232752-post.html#268996" onclick="window.open(this.href);return false;

MitjaStachowiak
Lazarusforum e. V.
Beiträge: 395
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: (Windows) Programm als Administrator ausführen

Beitrag von MitjaStachowiak »

Auf CreateProcessWithLogonW bin ich auch schon gestoßen. Jedoch stand da nicht, dass man JWAWinbase braucht, also dachte ich, das ginge in Lazarus nicht. Naja, jetzt habe ich den Code entsprechend zusammenkopiert, aber es geht trotzdem nicht. Es passiert einfach nichts. Also es kommt auch kein Fehler, aber das Programm wird nur beendet, ohne dass CreateProcess es mit Admin-Recht neustartet :-(

Code: Alles auswählen

uses JWAWinbase:
 
[...]
 
var
 StartInfo : TStartupInfoW;
 ProcInfo  : TProcessInformation;
 s         : AnsiString;
 cmd       : PWideChar;
 
[...]
 
 ZeroMemory(@ProcInfo,SizeOf(ProcInfo));
 ZeroMemory(@StartInfo,SizeOf(StartInfo));
 StartInfo.cb := SizeOf(StartInfo);
 StartInfo.dwFlags := STARTF_USESHOWWINDOW;
 StartInfo.wShowWindow := 1;
 StartInfo.lpReserved := nil;
 StartInfo.lpDesktop := nil;
 StartInfo.lpTitle := 'Konsole';
 s := ParamStr(0) + ' -all';
 getmem(cmd,Length(s) * 2);
 cmd := StringToWideChar(s,cmd,Length(s) * 2);
 CreateProcessWithLogonW('Administrator','','password',LOGON_WITH_PROFILE,nil,cmd,CREATE_DEFAULT_ERROR_MODE,nil,nil,StartInfo,ProcInfo);
 freemem(cmd); 
 Application.Terminate;

Antworten