Autor Beitrag
motion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 295

XP, Linux
D7 Prof
BeitragVerfasst: Di 29.03.16 09:42 
Hallo,
ich muss aus einer Delphi XE7 Anwendung heraus externe Programme (exe-Dateien wie z.B. Totalcommander, Testprogramme für serielle Ports, aber auch elevated (=Admin Rechte nötig!) wie z.B. control (Systemsteuerung), Regedit etc. aufrufen).
Bisher sind unsere Windows 7 Stationen so konfiguriert, das die UAC (Benutzerkontensteuerung) abgeschaltet ist.

Mittels
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
CreateProcessWithLogonW(PWideChar(WideString(sUser)),
                                 PWideChar(WideString(sDomain)),
                                 PWideChar(WideString(sPassword)),
                                 LOGON_WITH_PROFILE, nil,
                                 PWideChar(WideString(sCommand)),
                                 CREATE_UNICODE_ENVIRONMENT, pEnvironmentBlock,
                                 aPath, rStartupInfo, rProcessInformation)

starten wir die externen Programme mit einem speziellen AD Benutzer (sUser,sDomain,sPassword).
Funktioniert einwandfrei schon seit Jahren.

Jetzt steht ins Haus, das wir die UAC aktivieren müssen.

Das starten der externen Programme mit dem angegebenen User funktioniert immer noch, ALLERDINGS sind diese nicht mehr elevated, d.h. die Rechte für Control, Regedit etc. fehlen.

Ich habe einige Versuche mit ShellExecuteEx gemacht; damit klappt der Start elevated, aber ich finde keinen Weg zur Übergabe von Benutzername und Kennwort (d.h. es geht immer ein Anmeldedialog auf):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
FillChar(SEI, SizeOf(SEI), 0);
  SEI.cbSize := SizeOf(SEI);
  SEI.fMask := SEE_MASK_NOCLOSEPROCESS;
  {$IFDEF UNICODE}
  SEI.fMask := SEI.fMask or SEE_MASK_UNICODE;
  {$ENDIF}
  SEI.Wnd := AWnd;
  SEI.lpVerb := 'runas';
  SEI.lpFile := PChar(Host);
  SEI.lpParameters := PChar(Args);
  SEI.nShow := SW_NORMAL;

  if not ShellExecuteEx(@SEI) then ....


Hat jemand einen Tipp, wie man erfolgreich bei aktiver UAC aus einem Delphi Programm heraus
-ein externes Programm (exe Datei)
-mit Übergabe von Benutzername & Kennwort
-elevated d.h. mit Administratorrechten
-ohne Anmeldedialog; ein Administrator-Bestätigungsdialog wäre in Ordnung (also quasi nur "ok" klicken)
aufruft?

Vielen Dank
t.roller
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 118
Erhaltene Danke: 34



BeitragVerfasst: Di 29.03.16 20:45 
Vielleicht Spaces vergessen? 'SPACEBenutzernameSPACEKennwort';

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure RunAsAdmin(hWnd: HWND; aFile: string; aParameters: string);
var SEI: TShellExecuteInfo;
begin
    FillChar(SEI, SizeOf(SEI), 0);
    SEI.cbSize := sizeof(SEI);
    SEI.Wnd := hWnd;
    SEI.fMask := SEE_MASK_NOCLOSEPROCESS;
    SEI.lpVerb := 'runas';
    SEI.lpFile := PChar(aFile);
    SEI.lpParameters := PChar(aParameters);
    SEI.nShow := SW_SHOWNORMAL;  // SW_SHOWNORMAL; SW_HIDE; SW_MAXIMIZE;
    if not ShellExecuteEx(@SEI) then RaiseLastOSError;
end;

procedure TForm1.Button3Click(Sender: TObject);
var strParams, PN : String;
begin
  PN:= ExtractFilePath(ParamStr(0))+ 'ZielProg.exe';
  strParams:= ' '+Edit1.Text+' '+ Edit2.Text;  //' Benutzername Kennwort';
  RunAsAdmin(Application.Handle,PN, strParams);
end;
motion Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 295

XP, Linux
D7 Prof
BeitragVerfasst: Di 29.03.16 21:58 
Username und Kennwort werden direkt unterstützt? Irgendwie ist die Doku zum "runas" Parameter sehr dünn. Selbst aus MSDN muß man da ziemlich rumsuchen.
Werde ich morgen noch mal testen.
Momentan habe ich vielleicht eine Lösung über einen Wrapper.
Die Wrapper-Exe macht nichts anderes als aufgezeigt: Starten eines Programmes des aktuellen Benutzers, aber ELEVATED.
Also zerlege ich das Problem in zwei Teile:
1. Aufruf des Wrappers mit den gewünschten Benutzernamen und Kennwort; als Parameter das gewünschte "Zielprogramm" mit Parametern
2. Der Wrapper startet dann elevated das gewünschte Zielprogramm mit Parametern.

Diese Zweiteilung habe ich heute schon mal getestet und die scheint zu funktionieren.
motion Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 295

XP, Linux
D7 Prof
BeitragVerfasst: Mi 30.03.16 09:17 
Ich habe das eben mal ausprobiert (username/Passwort nach dem runas Parameter übergeben). Funktioniert leider nicht; es kommt immer ein UAC Login-Dialog hoch.
drstar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 79
Erhaltene Danke: 2

Windows 8.1/x64
Delphi 10.1
BeitragVerfasst: So 17.04.16 18:07 
Runas unterstützt sehr wohl auch ein Kennwort, allerdings zweistufig. Man ruft zunächst "runas" mit dem Paramter " /user:xxx /elevated xyz.exe" auf und bestätigt mit Enter, anschließend muß man dann das Kennwort übergeben. Da im Hintergrund ja Runas noch als cmd aktiv ist, sollte es mit Delphi ja möglich sein, das Kennwort direkt zu übergeben und somit das Programm zu starten. Die UAC fällt dabei weg, denn das erforderliche Kennwort für erweiterte Rechte wurde ja mittels Runas bereits angefordert.
motion Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 295

XP, Linux
D7 Prof
BeitragVerfasst: So 17.04.16 18:13 
Ich habe das Problem jetzt zweistufig gelöst:
1. Ich rufe mittels CreateProcessWithLogonW ein externes Programms "Runelevated" auf; als Parameter das eigentlich gewünschte Zielprogramm
2. Runelevated läuft also damit schon unter dem gewünschten Benutzernamen; und seine Paramter geben das eigentlich Zielprogramm an, welches es als Elevated startet.

Die Tests der letzten Woche sehen schon ganz gut aus. Diese Woche sehen wir weiter.