Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   ShellExecute, Batch über runas starten (https://www.delphipraxis.net/189022-shellexecute-batch-ueber-runas-starten.html)

waldforest 26. Apr 2016 20:52


ShellExecute, Batch über runas starten
 
Hallo,
ich habe ein kleines Problem.

Ich nutze eine kleine Updateroutine in einem alten programm, mit der ich aus einem .\ProgrammData\Aust\Updates Verzeichnis aktuelle DLL-Dateien in mein Applicationsverzeichnis Programm\... kopieren möchte.

Da ich hierzu ab WIN 7 Adminrechte benötige starte ich den Batch aus meiner Anwendung mit anliegendem Befehl.

Code:
ShellExecute(handle, 'runas', PCHAR(batch_ruf), PCHAR(batch_par),
            PCHAR(Aust.data_verzeichnis + 'Updates'), SW_HIDE);
Es erscheint auch der Hinweis, ob das Programm Änderungen vornehmen darf, allerdings werden die Dateien nicht kopiert.

Wie bekomme ich es hin, dass ich über einen Batchaufruf, aus meinem Programm heraus, die Dateien kopiert bekomme, was muss ich tun um die entsprechenden Rechte zu bekommen?.

Bis XP lief dies alles gut, seit win7 nicht mehr.

Dalai 26. Apr 2016 22:36

AW: ShellExecute, Batch über runas starten
 
Was steht in den Variablen drin? Wie sieht die Batch aus?

MfG Dalai

waldforest 26. Apr 2016 23:11

AW: ShellExecute, Batch über runas starten
 
Hallo,

Code:
batch_ruf := Auc.data_verzeichnis + 'updates\AucUpd.bat';
batch_par := ExtractFilePath(Application.ExeName);

ShellExecute(handle, 'runas', PCHAR(batch_ruf), PCHAR(batch_par),
             PCHAR(Auc.data_verzeichnis + 'Updates'), SW_HIDE);
Die Batch sieht wie folgt aus
Code:
@echo off

:s
del %1AucTool.exe
if exist %1AucTool.exe goto s

copy AucTool.exe %1AucTool.exe
copy Auc1.dll %1Auc1.dll
copy Auc2.dll %1Auc2.dll

del AucTool.exe

cd %1
AucTool.exe
exit

Dalai 26. Apr 2016 23:29

AW: ShellExecute, Batch über runas starten
 
Was gibt denn das ShellExecute zurück? Und was tut das Batchfile, wenn du ans Ende (vor das exit) mal ein "pause" setzt und es nicht versteckt ausführen lässt?

Davon abgesehen ist die Batch fehleranfällig. Ich korrigiere mal etwas:
Code:
@echo off

if "%~1"=="" goto :EOF

set "at=%~1AucTool.exe"

:s
del "%at%"
if exist "%at%" goto s

copy "%~dp0AucTool.exe" "%at%"
copy "%~dp0Auc1.dll" "%~1Auc1.dll"
copy "%~dp0Auc2.dll" "%~1Auc2.dll"

del "%~dp0AucTool.exe"

call "%at%"
exit
Sich darauf zu verlassen, dass
  • in den Pfaden keine Leerzeichen vorkommen
  • die relativen Pfade bzw. das Arbeitsverzeichnis stimmen/stimmt
ist fahrlässig, wenigstens aber leichtsinnig. Daher immer Anführungszeichen bei der Verwendung von Variablen, die Pfade enthalten, benutzen. Und immer absolute Pfade angeben, dann gibt es keinerlei Missverständnisse. Eigentlich fehlt da sogar noch eine Prüfung auf Existenz der DLL-Dateien oder der Schalter /Y um sie zu überschreiben. Denn wenn es mindestens eine davon gibt, bleibt die Batch mit einer Nachfrage stehen.

MfG Dalai

waldforest 27. Apr 2016 13:26

AW: ShellExecute, Batch über runas starten
 
Hallo,
danke für die Anpassungsempfehlung.

Ich bekomm es trotzdem nicht nicht hin. Sobald RunAs gesetzt ist wird die Batch nicht mehr aufgerufen.

Dalai 27. Apr 2016 13:33

AW: ShellExecute, Batch über runas starten
 
Zitat:

Zitat von waldforest (Beitrag 1336812)
Sobald RunAs gesetzt ist wird die Batch nicht mehr aufgerufen.

Das heißt, die Batch wird gar nicht ausgeführt, selbst wenn du das SW_HIDE durch SW_SHOW ersetzt? Dann wirst du wohl stattdessen die cmd.exe starten müssen mit der Batch als Parameter, nach diesem Schema:
Code:
cmd.exe /c "x:\pfad\zur\batch"
Sinnvollerweise gibt man auch hier den vollen Pfad zur cmd.exe und zur Batch an.

MfG Dalai

waldforest 27. Apr 2016 14:42

AW: ShellExecute, Batch über runas starten
 
Hmmm,
keine Ahnung warum aber cmd ruft er, auch mit komplettem Pfad nicht auf...
Dennoch Danke ..

Ich glaube ich muss mir unter Win >=7 ne neue Strategie zum Austausch der Dateien ausdenken.

Dalai 27. Apr 2016 14:47

AW: ShellExecute, Batch über runas starten
 
Zitat:

Zitat von waldforest (Beitrag 1336821)
keine Ahnung warum aber cmd ruft er, auch mit komplettem Pfad nicht auf...

Das kann nicht sein. Warum das so ist, sagt dir ShellExecute mit seinem Rückgabewert.

MfG Dalai

waldforest 28. Apr 2016 10:45

AW: ShellExecute, Batch über runas starten
 
Hallo,
OK, ich hab's jetzt doch noch mit einigen Anpassungen hinbekommen.
Eine Ursache war, dass ich den Parameter /C im 3 Parameter mit dabei hatte, also PChar('cmd.exe /C') hieß. Shellexecute lief dann mit Error 2 (kann Datei nicht finden) auf Fehler.
Wichtig sind auch die entsprechenden "" weil auf diese Weise die Parameter getrennt werden müssen (Langer Dateiname mit eventuellen Leerzeichen).
Ein weiterer Fehler war, dass beim Aufruf der Batch mit CMD, das aktuelle Verzeichnis auf c:\windows\system32 verweist.
Übergebe hier das richtige Verzeichnis als 2ten CMD-Parameter, könnte man sicher auch in der Batch abfangen ....


Mit anliegendem Aufruf funktioniert es.

Code:
   
Temp_Vz := 'c:\tmp\Update\'

   
ShellExecute(handle, 'runas', PCHAR('cmd.exe'),
                              PCHAR('/C ""'+Temp_Vz+'A_Upd.bat" '+batch_par+' "'+Temp_Vz+'""' ),
                              PCHAR('"'+Temp_Vz+'"'), SW_HIDE);
lässt sich sicher optisch noch verbessern, aber es funktioniert. Nochmals Danke für die Impulse.

ergänzende Info über http://ss64.com/nt/cmd.html

Dalai 28. Apr 2016 14:43

AW: ShellExecute, Batch über runas starten
 
Zitat:

Zitat von waldforest (Beitrag 1336922)
Wichtig sind auch die entsprechenden "" weil auf diese Weise die Parameter getrennt werden müssen (Langer Dateiname mit eventuellen Leerzeichen).

Jep.

Zitat:

Ein weiterer Fehler war, dass beim Aufruf der Batch mit CMD, das aktuelle Verzeichnis auf c:\windows\system32 verweist.
ShellExecute hat doch einen entsprechenden Parameter zum Setzen des Arbeitsverzeichnisses, den du im Code im OP doch bereits belegt hast.

Zitat:

Code:
   
Temp_Vz := 'c:\tmp\Update\'

   
ShellExecute(handle, 'runas', PCHAR('cmd.exe'),
                              PCHAR('/C ""'+Temp_Vz+'A_Upd.bat" '+batch_par+' "'+Temp_Vz+'""' ),
                              PCHAR('"'+Temp_Vz+'"'), SW_HIDE);

Ich empfehle dringend, die Funktion (SysUtils.)Delphi-Referenz durchsuchenFormat zu benutzen, sonst blickst du später nicht mehr durch, wenn Fehler auftreten und suchst (vermeintlich) fehlende Anführungszeichen oder sonstiges. Delphi-Referenz durchsuchenAnsiQuotedStr bietet sich hier vielleicht auch an, um Anführungszeichen zu setzen.

MfG Dalai


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:03 Uhr.
Seite 1 von 2  1 2      

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