Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Kommandozeile aus Programm (https://www.delphipraxis.net/205010-kommandozeile-aus-programm.html)

lukdelphias 23. Jul 2020 11:04

Kommandozeile aus Programm
 
Hallo liebes Forum,

ich möchte in einem Delphiprogramm folgendes in der Kommandozeile aufrufen:
Code:
cmdkey /add:server7 /user:domäne\user /pass:"passwort"
Allerdings möchte ich dafür keine Batch schreiben und dann diese Aufrufen. Es soll wirklich hart in den Quellcode geschrieben werden, dass er die Kommandozeile ausführen soll mit dem oben geschriebenen "Parametern".

Wie funktioniert sowas?

Grüße

Jasocul 23. Jul 2020 11:14

AW: Kommandozeile aus Programm
 
Suche mal hier in der DP nach Hier im Forum suchenshellexecute.
Da dürften genügend Treffer mit Beispielen kommen.

lukdelphias 23. Jul 2020 11:43

AW: Kommandozeile aus Programm
 
ShellExecute hab ich schon in 1000 verschiedenen Varianten probiert bis jetzt hat noch nichts funktioniert...:cry:

Rollo62 23. Jul 2020 12:07

AW: Kommandozeile aus Programm
 
Oder schau Dir DosCommand an, gibts glaube ich auch per GetIt.

QuickAndDirty 23. Jul 2020 12:09

AW: Kommandozeile aus Programm
 
Zitat:

Zitat von lukdelphias (Beitrag 1470193)
ShellExecute hab ich schon in 1000 verschiedenen Varianten probiert bis jetzt hat noch nichts funktioniert...:cry:

Zeig mir eine!

Dalai 23. Jul 2020 12:09

AW: Kommandozeile aus Programm
 
Zitat:

Zitat von lukdelphias (Beitrag 1470193)
ShellExecute hab ich schon in 1000 verschiedenen Varianten probiert bis jetzt hat noch nichts funktioniert...:cry:

Heißt genau was? Code funktioniert nicht? Wird der Befehl nicht ausgeführt? Wenn letzteres: Hast du den Rückgabewert von ShellExecute ausgewertet? Was sagt dieser? Der Debugger kann ggf. auch helfen.

Grüße
Dalai

Moombas 23. Jul 2020 12:10

AW: Kommandozeile aus Programm
 
Schon mal so probiert?

Delphi-Quellcode:
Programm := 'cmdkey';
Parameter := /add:server7 /user:domäne\user /pass:"passwort";
Shellexecute(Handle, 'open', PChar(Programm), PChar(Parameter), nil, SW_SHOW);
Wenn ja, was passiert (nicht)?

QuickAndDirty 23. Jul 2020 12:18

AW: Kommandozeile aus Programm
 
Ich Benutze diese Funktion zum Installieren von Diensten
Die Funktion wartet darauf das die Anwendung zurückkehrt.
Wenn du das nicht willst musste das ausbauen.
Die bedingte Compilierung je nach Framework evtl auch ausbauen.
Delphi-Quellcode:
Procedure TKannDiensteKram.SetInstalledAsService(aValue : Boolean);
Begin
  if aValue <> GetInstalledAsService then
  Begin
    if aValue then
    Begin
      ExecAndWait(ServiceExe, '/install /silent', 60000, SW_SHOWNORMAL, true);
    end
    else
    Begin
      ExecAndWait(ServiceExe, '/uninstall /silent', 60000, SW_SHOWNORMAL, true);
    End;
  End;
End;

function TKannDiensteKram.ExecAndWait(Filename, Params: string; TimeOut:int64=-1 ; WindowState: word = SW_SHOWNORMAL; elevated:Boolean = false): boolean;
var
  ShExecInfo: SHELLEXECUTEINFO;
  started,h_res : Cardinal;
  const
  SEE_MASK_NOASYNC= $100;
begin
  Result := false;
  if Filename = '' then
    exit;
  if not FileExists(FileName) then
  Begin
    {$IFDEF FrameWork_VCL}
    ShowMessage('Datei nicht existent!');
    {$ENDIF}
    {$IFDEF FrameWork_FMX}
    TDialogService.ShowMessage('Datei nicht existent!');
    {$ENDIF}
    Exit;
  End;
  ZeroMemory(@ShExecInfo, SizeOf(ShExecInfo));
  ShExecInfo.Wnd := 0;
  ShExecInfo.cbSize := sizeof(SHELLEXECUTEINFO);
  ShExecInfo.fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_NOASYNC;
  if elevated then
    ShExecInfo.lpVerb := 'runas'
  else
    ShExecInfo.lpVerb := 'open'; //'run as' statt 'open' ist für Systeme ab Vista evtl. besser
  ShExecInfo.lpFile := PChar(Filename);
  ShExecInfo.lpParameters := PChar(Params);
  ShExecInfo.lpDirectory := PChar(ExtractFileDir(Filename));
  ShExecInfo.nShow := WindowState;
  Result := ShellExecuteEx(@ShExecInfo);
  if Result then
  begin
    started := Gettickcount;
    repeat
      h_res := MsgWaitForMultipleObjects(1, ShExecInfo.hProcess, False, TimeOut, QS_ALLINPUT);
      if h_res <> WAIT_OBJECT_0 then
        Application.ProcessMessages;
    until (h_res = WAIT_OBJECT_0) or ( (Timeout >-1) and ( Started + TimeOut < GetTickCount )) ;
    if (timeout > -1) then
      Result := not( Started + TimeOut < GetTickCount );
    CloseHandle(ShExecInfo.hProcess);
  end
  else
    {$IFDEF FrameWork_VCL}
    Showmessage('Fehler beim Installieren des Dienstes:' + Filename +
                 #13#10'System Fehler: ' + SysErrorMessage(GetLastError));
    {$ENDIF}
    {$IFDEF FrameWork_FMX}
    TDialogService.Showmessage('Fehler beim Installieren des Dienstes:' + Filename +
                 #13#10'System Fehler: ' + SysErrorMessage(GetLastError));
    {$ENDIF}

End;

lukdelphias 24. Jul 2020 06:58

AW: Kommandozeile aus Programm
 
Allllso, gestern nochmal ein Stück probiert und der Fehler ist mir aufgefallen.
Ich habe bis jetzt immer über ShellExecute versucht das Programm
Code:
cmd.exe
mit den Parametern
Code:
cmdkey /add:server3 ....
aufzurufen.
Gestern ist mir dann aufgefallen das es ja auch die
Code:
cmdkey.exe
gibt.
Also neuer Versuch mit ShellExecute das Programm
Code:
cmdkey.exe
mit den Parametern
Code:
/add:server3 ....
aufzurufen.
Und siehe da es klappt. Stand anscheinend ganz schön auf den Schlauch. Trotzdem natürlich Danke für die Antworten.

Gruß


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf