Autor Beitrag
teamrocket0
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 172
Erhaltene Danke: 1

Win ME, Win XP, Win 7, Win 10
Delphi 7, 10.2 Tokyo
BeitragVerfasst: Mi 01.07.20 19:22 
Guten Abend an die besten Programmierer der Entwickler-Ecke, und alle anderen.

Hintergrund:
Für die Neueinrichtung von Servern möchte ich ein kleines Werkzeug programmieren, welches die Installation von Programmen (AVG, Firefox, Adobe usw.) im Silent-Modus ausführt und ein paar Windows-Einstellungen anpasst.
Die Silent-Installation ist bereits erledigt.
Lediglich die Windows-Einstellungen müssen noch umgesetzt werden.
Das soll, zumindest vorerst, durch ein PowerShell-Script erledigt werden. Einfach nur, weil der Inhalt des Scriptes bereits bekannt ist.

Problem:
Der Installations-Helfer erstellt das PowerShell-Script, nachdem man sich zusammen klicken konnte was man ändern möchte, und speichert es als *.ps1-Datei.
Nun soll das Delphi-Prog das liebe Powershell aufrufen und den Dateipfad des Scriptes (liegt direkt neben der Delphi-Anwendung) an PowerShell übergeben.

Folgender Code wird derzeit verprügelt, damit er seine Arbeit erledigt:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
Form1.Memo1.Lines.SaveToFile(ExtractFilePath(ParamStr(0)) + 'Script.ps1');
filename:=' -file ' + ExtractFilePath(ParamStr(0))+ 'Script.ps1';
Showmessage(filename);
ShellExecute(handle,'open','powershell.exe',PChar(filename)',nil,SW_hide);


PowerShell wird zwar ausgeführt, aber ich sehe nicht, das jenes Script abgearbeitet wird.
Das Script, als auch das Delphi-Prog, sind selbst elevierend. ...run as admin....
Der Dateipfad zum Script wird in der "ShowMessage" richtig wiedergegeben.
Wird das Script separat mit PowerShell ausgeführt, treten die Änderungen in Kraft, auch ohne "als Administrator ausführen"
Der Dateipfad wurde bereits mit und ohne Anführungszeichen übergeben. Oder zumindest versucht.

Frage:
Wie kann ich es anstellen, das dieses kleine Delphi-Prog PowerShell dazu bringt das Script abzuarbeiten!?

Es ist sicherlich nur eine Kleinigkeit die fehlt. Für den treffenden Hinweis wäre ich euch echt dankbar.

mit besten Grüßen

teamrocket0

_________________
To be forgotten is worse than death!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 01.07.20 19:50 
Hallo,

versuche doch mal mit SW_SHOWNORMAL zu starten, ob Ausgaben vom Script zu sehen sind.

Falls es doch Rechteproblem sind, kannst du es auch mal mit 'runas' (statt 'open') versuchen.
teamrocket0 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 172
Erhaltene Danke: 1

Win ME, Win XP, Win 7, Win 10
Delphi 7, 10.2 Tokyo
BeitragVerfasst: Mi 01.07.20 20:40 
Hallo Th69.

SW_SHOWNORMAL und SW_HIDE machen keinen Unterschied. PowerShell flackert kurz auf und das wars. Geleiches für 'runas'.
Das PowerShell-Fenster ist auch völlig ohne Ausgabe. Keine Fehlermeldung und nix.
Schade eigentlich. :-/

_________________
To be forgotten is worse than death!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 01.07.20 22:31 
Da werden schon noch Themen wie Set-ExecutionPolicy usw. eine Rolle spielen. Wenn du einmal ein Skript mit Pause erstellst, das also anhält, kannst du das ja im Windows Explorer über "Mit Powershell ausführen" im Kontextmenü starten. Dann schau einfach einmal in den Taskmanager, dann siehst du in der Spalte Befehlszeile die Parameter...
teamrocket0 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 172
Erhaltene Danke: 1

Win ME, Win XP, Win 7, Win 10
Delphi 7, 10.2 Tokyo
BeitragVerfasst: Mi 01.07.20 23:21 
Hallo Jaenicke,

das mit dem Taskmanager war ein guter Hinweiß. Aber selbst wenn ich eine Pause-Zeile einfüge bleibt PowerShell nicht geöffnet.
Das Script einzeln ausgeführt hält aber an jener Zeile an.
Ich musste in der Kürze der Zeit einen Sceenshot machen um zu sehen ob die Parameter richtig übergeben werden.
Sieht völlig OK aus.

Die Parameter "Set-ExecutionPolicy -ExecutionPolicy Bypass" haben augenscheinlich nichts daran geändert. Aber ich teste noch paar andere Parameter.
Einloggen, um Attachments anzusehen!
_________________
To be forgotten is worse than death!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 02.07.20 06:43 
Die Parameter sehen bei mir anders aus, bei dir fehlen komplett die Klammern usw., die sicher wichtig sind...
Bei mir sieht die Kommandozeile so aus (im Process Explorer kann man die übrigens auch kopieren):
Zitat:
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-Command" "if((Get-ExecutionPolicy ) -ne 'AllSigned') { Set-ExecutionPolicy -Scope Process Bypass }; & 'C:\Temp\test.ps1'"


Und wenn ich das so ausführe, klappt das auch ohne Änderungen am System:
ausblenden Delphi-Quelltext
1:
2:
  ShellExecute(Handle, 'open''powershell.exe''"-Command" "if((Get-ExecutionPolicy ) -ne ''AllSigned'') '
    + '{ Set-ExecutionPolicy -Scope Process Bypass }; & ''C:\Temp\test.ps1''"''', SW_SHOWNORMAL);

Für diesen Beitrag haben gedankt: teamrocket0
teamrocket0 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 172
Erhaltene Danke: 1

Win ME, Win XP, Win 7, Win 10
Delphi 7, 10.2 Tokyo
BeitragVerfasst: Do 02.07.20 22:05 
Oh...WAS? Ich werd verrückt. Es...funktioniert.
Ich hätte nicht erwartet, das noch so viele Parameter von Nöten sind.

Ich habe jedoch noch den variablen Pfad mit berücksichtigt.

ausblenden Delphi-Quelltext
1:
2:
3:
Form1.Memo1.Lines.SaveToFile(ExtractFilePath(ParamStr(0)) + 'Script.ps1');
filename:='"-Command" "if((Get-ExecutionPolicy ) -ne '+ Chr($27) + 'AllSigned' + Chr($27) + ')' + '{ Set-ExecutionPolicy -Scope Process Bypass }; & '+ Chr($27)+ ExtractFilePath(ParamStr(0))+ 'Script.ps1'+ Chr($27)+ '"';
ShellExecute(handle,'open','powershell.exe',PChar(filename),nil,SW_SHOWNORMAL);


Hab vielen dank jaenicke.

_________________
To be forgotten is worse than death!