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
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
UGrohne 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
galagher hat folgendes geschrieben: |
UGrohne 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.
galagher - Do 23.02.06 22:38
Also, ich finde nichts, was mir bei Delphi weiterhilft. Ein konkretes Beispiel wäre da hilfreich, aber so
ist CreateProcessAsUser nicht wirklich durchschaubar...
Martin1966 - Fr 24.02.06 11:19
galagher hat folgendes geschrieben: |
CreateProcessAsUser lautet das Zauberwort, |
Zeigt diese Funktion wirklich ein Dialog an? :gruebel:
galagher - Fr 24.02.06 17:36
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?
Martin1966 hat folgendes geschrieben: |
galagher 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; stdcall; external '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
Blackheart666 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
galagher hat folgendes geschrieben: |
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
Luckie 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
galagher hat folgendes geschrieben: |
Luckie 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. |
galagher - Fr 24.02.06 19:19
Luckie hat folgendes geschrieben: |
|
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
Luckie 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
Luckie 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
Luckie hat folgendes geschrieben: |
Ach so, du hat alle, willst aber nur die, die nachträglich angelegt wurden? |
Genau!
Luckie 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
Blackheart666 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; stdcall; external '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
Luckie 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!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!