AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein ShellExecute, Batch über runas starten
Thema durchsuchen
Ansicht
Themen-Optionen

ShellExecute, Batch über runas starten

Ein Thema von waldforest · begonnen am 26. Apr 2016 · letzter Beitrag vom 12. Sep 2016
Antwort Antwort
Seite 1 von 2  1 2      
waldforest

Registriert seit: 8. Mai 2005
366 Beiträge
 
Delphi XE3 Enterprise
 
#1

ShellExecute, Batch über runas starten

  Alt 26. Apr 2016, 20:52
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.
mfg wf

Geändert von waldforest (26. Apr 2016 um 21:16 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#2

AW: ShellExecute, Batch über runas starten

  Alt 26. Apr 2016, 22:36
Was steht in den Variablen drin? Wie sieht die Batch aus?

MfG Dalai
  Mit Zitat antworten Zitat
waldforest

Registriert seit: 8. Mai 2005
366 Beiträge
 
Delphi XE3 Enterprise
 
#3

AW: ShellExecute, Batch über runas starten

  Alt 26. Apr 2016, 23:11
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
mfg wf
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#4

AW: ShellExecute, Batch über runas starten

  Alt 26. Apr 2016, 23:29
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
  Mit Zitat antworten Zitat
waldforest

Registriert seit: 8. Mai 2005
366 Beiträge
 
Delphi XE3 Enterprise
 
#5

AW: ShellExecute, Batch über runas starten

  Alt 27. Apr 2016, 13:26
Hallo,
danke für die Anpassungsempfehlung.

Ich bekomm es trotzdem nicht nicht hin. Sobald RunAs gesetzt ist wird die Batch nicht mehr aufgerufen.
mfg wf
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#6

AW: ShellExecute, Batch über runas starten

  Alt 27. Apr 2016, 13:33
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
  Mit Zitat antworten Zitat
waldforest

Registriert seit: 8. Mai 2005
366 Beiträge
 
Delphi XE3 Enterprise
 
#7

AW: ShellExecute, Batch über runas starten

  Alt 27. Apr 2016, 14:42
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.
mfg wf
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#8

AW: ShellExecute, Batch über runas starten

  Alt 27. Apr 2016, 14:47
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
  Mit Zitat antworten Zitat
waldforest

Registriert seit: 8. Mai 2005
366 Beiträge
 
Delphi XE3 Enterprise
 
#9

AW: ShellExecute, Batch über runas starten

  Alt 28. Apr 2016, 10:45
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
mfg wf

Geändert von waldforest (28. Apr 2016 um 11:22 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#10

AW: ShellExecute, Batch über runas starten

  Alt 28. Apr 2016, 14:43
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:40 Uhr.
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