[Windows Server] Php -> bat -> exe

nietaL

NGBler
Registriert
8 Sep. 2013
Beiträge
231
Ort
Exilgullianer
Hey Leute,

ich möchte per PHP-Skript (exec) eine batch-Datei starten, die ihrerseits wiederum neben ein paar anderen Dingen einen Server (exe) startet.

Klicke ich die BAT manuell an, funktioniert alles tadellos. Versuche ich es indirekt über das PHP-Skript, taucht die Server-Exe ca. eine Sekunde im Taskmanager auf und verschwindet dann wieder. Das PHP-Skript hängt sich auf und endet nach ner Zeit mit nem 500-Error. Im Taskmanager sieht man im Hintergrund verbleibend eine cmd.exe und parallel dazu eine conhost.exe. Bei jedem Versuch, mit PHP den Server zu starten, kommt so ein Pärchen dazu.

Das komplette Konstrukt hatte auf einem anderen Server schon einmal funktioniert. Erst seit dem Umzug zickt es rum. Ich denke, dass es etwas mit Windows-Rechten zu tun hat. Oder blockt irgendein Sicherheitssystem den Hintergrundprozess?

Ich würde mich über einen Work-Around freuen. Wie kann ich vorgehen, um dem Problem auf die Schliche zu kommen?


PHP-Skript
[src=php]
<?php
ob_start();
$size = ob_get_length();
header("Content-Length: ".$size);
header('Connection: close');
ob_end_flush();
ob_flush();
flush();

session_start();

@session_write_close();
set_time_limit(0);
ignore_user_abort(true);

error_reporting(E_ALL);
exec("start OurAltis_start.bat", $output, $return_var);

echo "output: <br>";
print_r($output);
echo "<br><br>return: <br>";
print_r($return_var);

exit;
?>
[/src]

BATCH
[src=text]
@echo off

setlocal

set "ProgPath=D:\arma3server\arma3files"
set "Prog=arma3server_x64.exe"

for /f "delims=" %%l in ('for /f "skip=3 tokens=2" %%p in ^('tasklist /fi "imagename eq %Prog%"'^) do @^<NUL set /p "=%%p "') do (
set "PIDs=%%l"
)

start "%Prog%" "%ProgPath%\%Prog%" -profiles=C:\inetpub\vhosts\isleofmine.de\httpdocs\webgui\interface\Profil+Logs -config=ouraltis_server.cfg -port=2302 -world=empty -noSound -filePatching -enableHT -mod=@CBA_A3 -servermod=@extDB3;

for /f "skip=3 tokens=2" %%p in ('tasklist /fi "imagename eq %Prog%"') do (
echo %PIDs% | find "%%p" > NUL || if not defined NewPID set "NewPID=%%p"
)

if defined NewPID echo Neue Instanz: %NewPID%

echo %NewPID% > PID.txt
[/src]
 
Kann nach der Beschreibung nur an Rechten oder der PHP Konfiguration liegen.

Pfade könnten vielleicht auch noch abweichen, ich würde alle konstruierten Strings mal in eine Datei Schreiben lassen und die mal gründlich gegen die Realität des neuen Systems prüfen.
 
  • Thread Starter Thread Starter
  • #3
Kann nach der Beschreibung nur an Rechten oder der PHP Konfiguration liegen.
Meiner Meinung nach kann die PHP-Konfiguration nicht mehr mitspielen, weil ich ja schon weit darüber hinaus gekommen bin. Die BAT wurde ausgelöst und die wiederum hat bereits, wenn auch nur kurzfristig, den Server gestartet. Ich habe überlegt, ob die cmd.exe im Ordner system32 noch Rechte braucht. Die kann ich leider nicht einstellen. Liegt das daran, dass es ein vServer (STRATO) ist?

Pfade könnten vielleicht auch noch abweichen, ich würde alle konstruierten Strings mal in eine Datei Schreiben lassen und die mal gründlich gegen die Realität des neuen Systems prüfen.
Da alles wie geplant auslöst, können Pfade nicht falsch sein. Habe auch schon etliche male gegengetestet, in dem ich den Taschenrechner aufrufen ließ.
 
Pfade waren ja auch nur ein Beispiel, wie gesagt, check alle Strings und idealerweise den Output des Programms das den Dienst verweigert. Aufgerufen wirds ja offenbar.

Können halt immer noch Parameter nicht passen.

edit:
Woher hast du das PHP Skript, funktioniert das?
Warum setzt du den Header so seltsam?

Hat vermutlich nichts mit dem Problem zu tun, aber wenn ich eins gelernt habe dann bei seltsamen Konstellationen sehr skeptisch zu sein.
 
benötigt der Dienst administrative Rechte um zu funktionieren?
Sprich muss er auf Ressourcen zugreifen / in ziele Schreiben die von Benutzern nicht verwendet werden können?

Was passiert wenn du eine cmd-Box / PowerShell-Box auf machst ohne das oben links "Administrator" im Titel steht - und dann die .exe startest die die .bat startet?

Ich hoffe und bange das das der php-Interpreter Befehle nicht im erhöhten Rechte-Kontext ausführt. Das sollte er auch auf gar keinen Fall tun. Nur wenn der Dienst das benötigt dann erklärt das warum es nicht funktioniert.
 
  • Thread Starter Thread Starter
  • #7
Ich kann mich nur als Admin bei Windows einloggen. Gibt es eine Möglichkeit, die cmd ohne Adminrechte auszuführen, obwohl ich in Windows als Admin eingeloggt bin?
 
  • Thread Starter Thread Starter
  • #9
Egal, auf welchem Wege ich sie starte, oben links steht

Administrator: C:\Windows\system32\cmd.exe
 
Sicherheitstechnisch eher bedenklich - aber gut dann dürfte das in der Tat mit dem Dienst auch keine Probleme machen. Dann scheint die UAC abgeschaltet zu sein? :(

Nichts desto trotz - was passiert wenn du deine Exe dann einfach in dem Fenster startest?
Unter welchem Benutzer läuft denn der php-dienst?
 
  • Thread Starter Thread Starter
  • #11
Die UAC habe ich nicht abgeschaltet. Komischerweise steht im Kontextmenü trptzdem noch "als Administator starten". Wie dem auch sei, ich kann den Server mit der cmd problemlos starten.

Ich habe gerade im PHP-Skript das Starten der Batch-Datei ersetzt durch das Starten der Server-Exe. Also quasi auf dem direkten Weg, um herauszufinden, ob die CMD überhaupt das Problem ist. Siehe da, das Phänomen ist dasselbe: Der Server taucht kurz als Hintergrundprozess auf und verschwindet sofort wieder. Übrigens hat die Batch-Datei auch alles andere sauber erledigt, was sie neben dem Serverstart noch zu tun hatte.

Es scheint also ein Problem mit dem Server ansich zu sein. Vielleicht möchte er nicht im Hintergrund gestartet werden?

Ich habe auch versucht, den Server manuell mithilfe der CMD im Hintergrund zu starten:

D:\arma3server\arma3files>start /b arma3server_x64.exe
Er startet trotzdem im Vordergrund.
 
klar kann durchaus sein das wenn die Anwendung kein Fenster erstellen kann - abbricht.
Oder das Dateien in z.B. %appdata% geschrieben werden soll - und der Ordner nicht existiert. Daher die Frage unter welchem Benutzer php läuft und mit welchem Benutzer der Server gestartet wird kurz bevor er abbricht.
 
  • Thread Starter Thread Starter
  • #13
Ich sende mal einen Screenshot, den ich in dem kurzen Moment des Auftauchens gemacht habe. Sieht so aus, als liefen beide unter dem selben Namen
Unbenannt-1.jpg

Doppelklicke ich die server.exe direkt, steht als Benutzername ADMINISTRATOR.
 
ah unter dem IIS-Benutzer ok.
Da steht auch werfault.exe - das heißt die Anwendung ist abgestürzt.
Darüber sollte etwas in der Ereigenisanzeige unter Anwendung stehen.
 
nachdem der php opcache wohl mit abstürzt kannst du diesen in der php.ini deaktivieren:

opcache.enable=0

sonst such mal nach allen .dmp dateien und ob dabei eine arma3server_64.dmp oder irgendwie sowas dabei ist (oder php-fpm, opcache..) - die könntest du dann irgendwo hoch laden und mir eine pn schicken (dort könnten in der Theorie auch userdaten mit drin sein - normal aber nicht).
 
  • Thread Starter Thread Starter
  • #17
mhh, der Ordner C:\Windows\Minidump ist leer.

Habe den server jetzt einmal über die aufgabenplanung in den hintergrund gejagd und einmal über einen neuangelegten Benutze ohne Adminrecht. Beides funktioniert.
Nur wenn PHP den server aufruft und wenn er damit unter dem IIS Benutzer laufen will, stürzt er sofort wieder ab.
 
Zuletzt bearbeitet:
Nur ne doofe Vermutung: Änder deinen Befehl mal in [kw]"start /b OurAltis_start.bat"[/kw].
 
Würde es mal wie folgt versuchen:
exec("runas /user:Administrator /savecred " . '"OurAltis_start.bat"', $output, $return_var);

Du musst die Batch natürlich vorher einmal mit runas /user:Administrator /savecred "OurAltis_start.bat"
manuell starten, damit der Deine Usercredentials auch speichern kann
 
und danach kann man übers weg ohne Passwort alles als Admin starten... super :D
Das Passwort wird jeweils beim user der es ausgeführt gespeichert und nur dieser hat darauf zugriff - das heißt der Befehl müsste vorher einmalig mit dem IIS benutzer ausgeführt werden.

Der IIS-Benutzer dürfte wie geschrieben kein Profil haben - damit können Dateien die beim start ins Profil geschrieben werden würden - nicht geschrieben werden.

Dies kann man aber aktivieren:


ist ein alter Tipp - ist nun eventuell ein wenige an einer anderen stelle - habe gerade keinen IIS zum nachgucken.
 
Zurück
Oben