Entwickler-Ecke

Dateizugriff - Ausführen als-Dialog


galagher - Mi 22.02.06 22:21
Titel: Ausführen als-Dialog
Hallo!

Weiss jemand, wie man den "Ausführen als"-Dialog von Windows während der Laufzeit öffnet?


AXMD - Mi 22.02.06 22:32

Such mal nach Suche in: Delphi-Forum RUNAS

AXMD


Delete - Do 23.02.06 09:02

RunAs ist nur das Konsolenprogramm, um einen Prozess unter einem anderen Benutzernamen auszuführen. Aber wie man an den Dialog kommt weiß ich im Moment auch nicht. :gruebel:


UGrohne - Do 23.02.06 09:09

Ich hab mir das eben mal mit dem Process Explorer angeschaut. Folgender Befehl könnte wohl funktionieren:


Quelltext
1:
"C:\WINDOWS\system32\rundll32.exe" C:\WINDOWS\system32\shell32.dll,OpenAs_RunDLL [filename]"                    


galagher - Do 23.02.06 21:46

user profile iconUGrohne hat folgendes geschrieben:

Quelltext
1:
"C:\WINDOWS\system32\rundll32.exe" C:\WINDOWS\system32\shell32.dll,OpenAs_RunDLL [filename]"                    

Das ist der "öffnen mit"-Dialog. Ich suche aber noch in shell32.dll!


galagher - Do 23.02.06 21:52

user profile icongalagher hat folgendes geschrieben:
user profile iconUGrohne hat folgendes geschrieben:

Quelltext
1:
"C:\WINDOWS\system32\rundll32.exe" C:\WINDOWS\system32\shell32.dll,OpenAs_RunDLL [filename]"                    

Das ist der "öffnen mit"-Dialog. Ich suche aber noch in shell32.dll!

Edit:
Control_RunDLLAsUser ist es auch nicht - da tut sich gar nichts.


galagher - Do 23.02.06 22:11

CreateProcessAsUser lautet das Zauberwort, nur kann mir da bitte jemand ein praktisches Beispiel dafür geben? Ist ja der reinste Horror!


UGrohne - Do 23.02.06 22:13

Hmm, stimmt, sorry.

Den krieg ich leider nicht mit dem Process Explorer, ich glaube der geht net über die shell32.dll. Naja, vielleicht finde ich noch was, ansonsten musst Du's wirklich mit dem Konsolenprogramm runas machen und dem die Parameter übergeben.


AXMD - Do 23.02.06 22:13

Ist da bei MSDN nichts? Suche im MSDN CREATEPROCESSASUSER

AXMD


galagher - Do 23.02.06 22:38

user profile iconAXMD hat folgendes geschrieben:
Ist da bei MSDN nichts? Suche im MSDN CREATEPROCESSASUSER
AXMD

Also, ich finde nichts, was mir bei Delphi weiterhilft. Ein konkretes Beispiel wäre da hilfreich, aber so
ist CreateProcessAsUser nicht wirklich durchschaubar...


Delete - Fr 24.02.06 08:43

So geht es: http://www.michael-puff.de/Developer/Delphi/Sonstiges/CreateProcessWithLogonW.html
Oder in meinem Programm RunAsUser [http://runasuser.michael-puff.de] gucken.


Martin1966 - Fr 24.02.06 11:19

user profile icongalagher hat folgendes geschrieben:
CreateProcessAsUser lautet das Zauberwort,

Zeigt diese Funktion wirklich ein Dialog an? :gruebel:


galagher - Fr 24.02.06 17:36

user profile iconLuckie hat folgendes geschrieben:
So geht es: http://www.michael-puff.de/Developer/Delphi/Sonstiges/CreateProcessWithLogonW.html

Wenn ich das aber in der Form

Delphi-Quelltext
1:
CreateProcessAsLogon('User''password''notepad''d:\delphi6\projects\1.txt');                    

einsetze, wird eben d:\delphi6\projects\1.txt mit notepad.exe geöffnet, ausserdem muss ich einen User und ein Passwort angeben! Ich möchte ja aber doch den Ausführen-als-Dialog erst öffnen, mit dem man dann einen User wählt und das Passwort eingibt! Oder übersehe ich da etwas?

user profile iconMartin1966 hat folgendes geschrieben:
user profile icongalagher hat folgendes geschrieben:
CreateProcessAsUser lautet das Zauberwort,

Zeigt diese Funktion wirklich ein Dialog an? :gruebel:

Wird wohl so sein, aber WIE? Wie ruft man das auf - 11 Parameter! Ein einziges praktisches Beispiel wäre hier wirklich hilfreich!


Blackheart666 - Fr 24.02.06 17:43

Lief unter Delphi 4 und ME nicht getestet.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
function SHRunDialog 
  (Owner, IconHandle, Unknow: longint; Title, Prompt: Pchar; Flags: longint): 
    longint; 
  stdcallexternal 'Shell32.dll' INDEX 61
 
procedure ausfuehren(AnzeigeLetzterBefehl, modal: boolean; icon: Hicon); 
var 
  flg, own: longint; 
begin 
  if modal then own := application.handle else own := 0
  if AnzeigeLetzterBefehl then flg := 0 else flg := 2
  shrundialog(own, icon, 0'Ausführen'
    'Geben Sie den Namen eines Programms, Ordners, ' + 
    'Dokuments oder einer Internetressource an.', flg); 
end
 

procedure TForm1.Button3Click(Sender: TObject); 
begin 
  ausfuehren(true, true, application.icon.handle); 
end;


galagher - Fr 24.02.06 17:56

user profile iconBlackheart666 hat folgendes geschrieben:
Lief unter Delphi 4 und ME nicht getestet.

Läuft und funktioniert zwar, aber weder Text noch Titel werden in lesbaren Zeichen angezeigt (nur diese Kästchen). Aber vor allem: Es ist nicht der Ausführen-als-Dialog! :? Trotzdem danke!


Delete - Fr 24.02.06 18:22

user profile icongalagher hat folgendes geschrieben:
user profile iconLuckie hat folgendes geschrieben:
So geht es: http://www.michael-puff.de/Developer/Delphi/Sonstiges/CreateProcessWithLogonW.html

Wenn ich das aber in der Form

Delphi-Quelltext
1:
CreateProcessAsLogon('User''password''notepad''d:\delphi6\projects\1.txt');                    

einsetze, wird eben d:\delphi6\projects\1.txt mit notepad.exe geöffnet, ausserdem muss ich einen User und ein Passwort angeben! Ich möchte ja aber doch den Ausführen-als-Dialog erst öffnen, mit dem man dann einen User wählt und das Passwort eingibt! Oder übersehe ich da etwas?

Nein tust du nicht. Aber man kann sich ja einen eigenen Dialog drumrumbauen. ;)


galagher - Fr 24.02.06 18:43

user profile iconLuckie hat folgendes geschrieben:
Nein tust du nicht. Aber man kann sich ja einen eigenen Dialog drumrumbauen. ;)

Das bedeutet also:
1. Einen eigenen "Ausführen-als"-Dialog basteln. Wird ja weiters kein Problem sein, es wäre aber schön, wenn ich die im System bekannten Benuzternamen in eine ComboBox einlesen könnte, aber wie?
2. Die eingegebenen Werte an CreateProcessAsLogon übergeben.


Delete - Fr 24.02.06 18:57

user profile icongalagher hat folgendes geschrieben:
user profile iconLuckie hat folgendes geschrieben:
Nein tust du nicht. Aber man kann sich ja einen eigenen Dialog drumrumbauen. ;)

Das bedeutet also:
1. Einen eigenen "Ausführen-als"-Dialog basteln. Wird ja weiters kein Problem sein, es wäre aber schön, wenn ich die im System bekannten Benuzternamen in eine ComboBox einlesen könnte, aber wie?
2. Die eingegebenen Werte an CreateProcessAsLogon übergeben.



user profile iconLuckie hat folgendes geschrieben:
So geht es: http://www.michael-puff.de/Developer/Delphi/Sonstiges/CreateProcessWithLogonW.html
Oder in meinem Programm RunAsUser [http://runasuser.michael-puff.de] gucken.


galagher - Fr 24.02.06 19:19

user profile iconLuckie hat folgendes geschrieben:
user profile iconLuckie hat folgendes geschrieben:
So geht es: http://www.michael-puff.de/Developer/Delphi/Sonstiges/CreateProcessWithLogonW.html
Oder in meinem Programm RunAsUser [http://runasuser.michael-puff.de] gucken.

Ich will ja nicht undankbar erscheinen und weiss auch, was du meinst: MpuWinNT, MpuNTUser, MpuRegistry einbinden und dann gibt's in MpuNTUser eine Funktion oder Prozedur, die das kann. Aber beim Compilieren erhalte ich gleich mal einen Gruss von Delphi:

Delphi-Quelltext
1:
2:
3:
4:
5:
[Fehler] MpuNTUser.pas(133): Undefinierter Bezeichner: 'NET_API_STATUS'
[Fehler] MpuNTUser.pas(199): Undefinierter Bezeichner: 'NERR_InvalidComputer'
[Fehler] MpuNTUser.pas(200): Undefinierter Bezeichner: 'NERR_NotPrimary'
[Fehler] MpuNTUser.pas(200): Doppeltes Case-Label
...

Ich will doch nur Strings in eine ComboBox schreiben! Nur das! :(


Delete - Fr 24.02.06 19:30

Ich kann mein Programm problems kkompilieren. :gruebel: Ich mache dir nachher mal ein Beispiel.


Delete - Fr 24.02.06 20:24

Im Anhang die Demo mit aktueller MpuNTUser.pas


AXMD - Fr 24.02.06 20:27

Scheint nicht zu funktionieren... Leere Box...

AXMD


Delete - Fr 24.02.06 20:30

Dann guck mal in den Quellcode. Ich glaube nicht, dass dein Rechner HAL9000 heißt. ;)


AXMD - Fr 24.02.06 20:32

*räusper* :oops: Hab nur die Demo ausgeführt, weil ich grade nichts besseres zu tun hatte :P

AXMD


Delete - Fr 24.02.06 20:34

Ich war zu faul noch den Computernamen zu ermitteln, obwohl ich dafür wohl auch was passendes in der Unit MpuTools.pas hätte. ;)


galagher - Fr 24.02.06 21:17

@Luckie:
Jetzt hab' ich's! So klappt es, und ich kann dann anfangen, mir einen Dialog zu stricken! Vielen Dank! :P


galagher - Sa 25.02.06 12:48

Bei Windows werden nur jene User aufgelistet, die ich selbst eingerichtet habe. Kann man die Usernamen auch filtern, so wie Windows das macht?


Delete - Sa 25.02.06 14:26

Das sollte nicht sein. Bei mir wird zum Beispiel auch das Supportkonto angezeigt, welches Windows bei der Installation automatisch anlegt.


galagher - Sa 25.02.06 15:03

user profile iconLuckie hat folgendes geschrieben:
Bei mir wird zum Beispiel auch das Supportkonto angezeigt, welches Windows bei der Installation automatisch anlegt.

Ja, stimmt, Administrator ist auch dabei. Momentan bin ich als "normaler" User eingeloggt, und es werden mir zwei Usernamen angezeigt: Administrator (=Windows) und galagher (=Admin-Rechte). Sonst nichts. Es wird also gefiltert und ausserdem der Name des aktuellen Users herausgenommen. Das bekomme ich schon hin: Einfach den Usernamen eruieren und den entsprechenden Eintrag in der ComboBox löschen.

Aber wie könnte man selbst so einen Filter schreiben? Was unterscheidet selbst eingerichtete Usernamen von solchen, die sagen wir mal "software-mässig" eingerichtet wurden?


Delete - Sa 25.02.06 15:30

Kann ich nicht bestätigen, siehe Anhang. Das sind alle Benutzer auf meinem Rechner, die auch in der Benutzerverwaltung von Windows angezeigt werden.


galagher - Sa 25.02.06 16:38

user profile iconLuckie hat folgendes geschrieben:
Kann ich nicht bestätigen, siehe Anhang. Das sind alle Benutzer auf meinem Rechner, die auch in der Benutzerverwaltung von Windows angezeigt werden.

So ähnlich sieht's bei mir ja auch aus. Nur, woher kommt "APPNET", "Gast", "Hilfeassistent"? Die habe ich doch nicht angelegt, sondern Windows! Keine Ahnung, welches Passwort ich bei Gast eingeben muss - kein Passwort klappt nicht. Ich möchte die Auswahl gerne auf jene User reduzieren, die nicht automatisch von Windows angelegt wurden. Geht das überhaupt?


Delete - Sa 25.02.06 16:46

Ach so, du hat alle, willst aber nur die, die nachträglich angelegt wurden? Ich wüßte nicht, in was sich diese Konten unterscheiden sollten.


galagher - Sa 25.02.06 18:20

user profile iconLuckie hat folgendes geschrieben:
Ach so, du hat alle, willst aber nur die, die nachträglich angelegt wurden?

Genau!

user profile iconLuckie hat folgendes geschrieben:
Ich wüßte nicht, in was sich diese Konten unterscheiden sollten.

Schade, ich dachte, jemand kennt eine Möglichkeit, nur nachträglich angelegte Konten auszulesen. Windows macht offenbar genau das.

Aber deine Hilfe hat mich schon sehr weit gebracht (Danke!!!) - der Dialog steht und es klappt alles soweit. Nur kein Mensch (jedenfalls ich nicht) weiss, welches Passwort zB. "Gast" erfordert! Und zB. APPNET - damit werden wohl die wenigsten etwas anfangen können.


galagher - Mi 08.03.06 11:38

user profile iconBlackheart666 hat folgendes geschrieben:
Lief unter Delphi 4 und ME nicht getestet.

Wenn man folgendes:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
 
procedure ausfuehren(AnzeigeLetzterBefehl, modal: boolean; icon: Hicon); 
var 
  flg, own: longint; 
begin 
  if modal then own := application.handle else own := 0
  if AnzeigeLetzterBefehl then flg := 0 else flg := 2
  shrundialog(own, icon, 0'Ausführen'
    'Geben Sie den Namen eines Programms, Ordners, ' + 
    'Dokuments oder einer Internetressource an.', flg); 
end;

... ändert zu:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure ausfuehren(AnzeigeLetzterBefehl, modal: boolean; icon: Hicon);
var
  flg, own: longint;
  Text, Title: String;
begin
 Title := 'Ausführen';
 Text := 'Geben Sie den Namen eines Programms, Ordners, ' +
         'Dokuments oder einer Internetressource an.';
  if modal then own := application.handle else own := 0;
  if AnzeigeLetzterBefehl then flg := 0 else   flg := 2;
  shrundialog(own, icon, 0, PChar(Title[1]), PChar(Text[1]), flg);
end;

... dann ist die Textanzeige korrekt. Ich verstehe aber nicht, was es mit diesem PChar(Text[1]) auf sich hat, weil man genauso gut PChar(Text[25]) angeben kann und es immer noch funktioniert. Auch ist es egal, ob Title und Text als PChar oder String deklariert werden.


Delete - Mi 08.03.06 13:02

So sieht es besser aus:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
function SHRunDialog (Owner, IconHandle, Unknow: longint; Title, Prompt: LPWSTR; Flags: longint): longint;
  stdcallexternal 'Shell32.dll' INDEX 61;
 
procedure RunDialog(hOwner: THandle; const Caption, Text:String; ShowLastCmd: Boolean; ShowModal: boolean; hIcon: HIcon);
var
  Flag, own: longint;
begin
  if ShowModal then
    own := hOwner
  else
    own := 0;
  if ShowLastCmd then
    Flag := 0
  else
    Flag := 2;
  SHRunDialog(hOwner, hIcon, 0, PWideChar(WideString(Caption)), PWideChar(WideString(Text)), Flag);
end;
 

procedure TForm1.Button1Click(Sender: TObject);
begin 
  RunDialog(Handle, 'Ausführen''Wählen Sie eine Anwendnung aus', True, True, Icon.Handle);
end;

Das sind keine einfachen PChar's sondern PWideChar's ;) Man sollte ummer die Parameterdeklaration beachten und auch dort immer den Windows Datentyp nehmen und nicht den Delphi eigenen, obwohl diese im Endeffekt natürlich identisch sind. Man ist dann aber konform mit der Deklaration in den Header-Dateien und man weiß dass ein LPWSTR erwartet wird und kein PWideChar, den es unter Windows gar nicht gibt.


galagher - Mi 08.03.06 13:50

Danke, klappt!
Wie kann man die Position bestimmen, an der der Dialog erscheint?


Delete - Mi 08.03.06 14:48

Gar nicht. Mit ShowModal wird er wohl an der lionken oberen Ecke der Clientarea des Fensters ausgerichtet.


galagher - Mi 08.03.06 15:54

user profile iconLuckie hat folgendes geschrieben:
Mit ShowModal wird er wohl an der lionken oberen Ecke der Clientarea des Fensters ausgerichtet.

Stimmt. Ist ja auch egal, Hauptsache, es funktioniert! Danke dir!