Hilfe beim Herrunterfahren Skript



  • Hallo zusammen,

    ich habe da so eine Idee im Kopf, aber habe von programmieren nicht viel Ahnung. Ich habe ein Netzwerk zu Hause mit einem Server auf dem Windows Server 2003 läuft. Der Server soll sich abends, wenn kein Rechner mehr an ist abschalten.

    Meine Idee ist es ein Skript zu schreiben das abläuft und über einen Ping jede IP abfragt.
    Rechner an, Ping erfolgreich --> wird eine Variable auf 1 gesetzt
    Rechner aus, Ping erfolglos --> wird eine Variable auf 0 gesetzt
    Als Endbedinung, in der auch der Herunterfahren Befehl steht, müssen alle Variablen den Wert 0 haben. Dann fährt der Server runter.

    Nun lässt sich sowas programmieren und ist es leicht umsetzbar?

    Ich würde es gerne in C programmieren und dann später als dat-Datei ausführen mit Hilfe der Windows-zeitsteuerung



  • Damit bist du in dem so ziemlich falschestem Forum dafür..
    Hier geht es um Standard C++. Wir kennen hier weder Netzwerke, noch C. 😉

    Im Ernst. Da gibt es doch bestimmt einfachere und bessere Lösungen, als das jetzt selbst basteln zu wollen. Da gibts bestimmt vorgefertige Lösungen. Schau einfach ein wenig danach.

    Ansonsten sollte das durchaus machbar sein, aber dann kommst du nicht drum herum anständig programmieren zu lernen und ich würde dir raten ein gutes (ich bin jetzt mal so frech) C++ Buch zu kaufen und damit anzufangen. Damit gibts zwar noch keine Netzwerke an die Hand, aber du lernst mal die Grundlagen der Programmierung. Und wenn du soweit bist für Netzwerk, wirst du schon selber merken. 😉

    Anderseits gibt es auch einfachere Sprachen, mit denen sich so etwas machen lässt. (Praktisch jede, die anständige Netzwerklibs mitbringt).



  • Hallo,
    wenn Du nicht viel Ahnung vom Programmieren hast, dann wäre der erste Schritt das zu ändern, denn dein Projekt forder schon einige Kenntnisse. Ich habe soetwas ähnliches schon mal gemacht, wobei das nicht in C++ geschah. Wenn Du es einfach haben möchtest, dann schau dir mal die Batchprogrammierung an. Damit ist es nicht so schwer.

    lg, freakC++



  • QuestX schrieb:

    Hallo zusammen,

    ich habe da so eine Idee im Kopf, aber habe von programmieren nicht viel Ahnung. Ich habe ein Netzwerk zu Hause mit einem Server auf dem Windows Server 2003 läuft. Der Server soll sich abends, wenn kein Rechner mehr an ist abschalten.

    Meine Idee ist es ein Skript zu schreiben das abläuft und über einen Ping jede IP abfragt.
    Rechner an, Ping erfolgreich --> wird eine Variable auf 1 gesetzt
    Rechner aus, Ping erfolglos --> wird eine Variable auf 0 gesetzt
    Als Endbedinung, in der auch der Herunterfahren Befehl steht, müssen alle Variablen den Wert 0 haben. Dann fährt der Server runter.

    Nun lässt sich sowas programmieren und ist es leicht umsetzbar?

    Ich würde es gerne in C programmieren und dann später als dat-Datei ausführen mit Hilfe der Windows-zeitsteuerung

    Ja, das ist möglich. Warum in C? Und was hat es mit der dat-Datei auf sich? Normalerweise entsteht eine exe-Datei.

    Ein paar Ideen, wie man das ganze umsetzen könnte:

    Zunächst müsste man sich entscheiden, ob UDP ausreicht oder, ob TCP notwendig ist.

    Wenn du UDP nimmst, ist es ganz einfach:
    Jeder PC schickt einfach alle 2 Minuten eine Nachricht an den Server-PC.
    Der Server-PC hat eine Variable die jeweils die Zeit speichert, an der die letzte Nachricht eingegangen ist. Ist diese Zeit irgendwann mal größer als z.B. 10 Minuten fährt der Server herunter. Fertig.

    Wenn du TCP nimmst, ist es etwas komplexer, da du zusätzlich noch die Verbindungen verwalten musst.
    Das Prinzip ist jedoch im Endeffekt genau das gleiche.

    Alles in allem sollte das kein Problem sein. Funktionen zum Herunterfahren des PCs findet man im Internet genug und im Notfall macht man es einfach mit system und übergibt "shutdown" oder wie das bei deinem Betriebssystem auch immer lauten mag.



  • @echo off
    
    ping meinPC1
    if %errorlevel%==0 goto machnichts
    
    ping meinPC2
    if %errorlevel%==0 goto machnichts
    
    shutdown
    
    :machnichts
    echo Es sind noch PCs erreichbar
    

    Das alles in eine .bat Datei und du hast ungefähr was du willst. Du kannst es noch nach Belieben ausschmücken. Z.B. kann man das Skript einige Zeit warten und dann vorne beginnen lassen , bis der Server heruntergefahren ist.

    Das ist natürlich nur eine simple Umsetzung DEINER Idee. Welche Fallstricke noch exitieren ist nicht bedacht. 😉



  • Da du anscheint nicht sehr viel vom programmieren verstehst
    und ein Script erwähnst, sollte eine Batch hier angebracht sein.

    :start
    FOR /L %i IN (0,1,255) DO ping 168.192.1.%i & set /a Aus=%Aus%+%errorlevel%
    
    IF %Aus% NEQ 0 DO shutdown /s /t 00
    
    goto :start
    

    sollte funktionieren
    hab's nicht getestet
    ein Moderator sollte das Ganze hier vielleicht verschieben



  • irgendwer schrieb:

    Da du anscheint nicht sehr viel vom programmieren verstehst
    und ein Script erwähnst, sollte eine Batch hier angebracht sein.

    :start
    FOR /L %i IN (0,1,255) DO ping 168.192.1.%i & set /a Aus=%Aus%+%errorlevel%
    
    IF %Aus% NEQ 0 DO shutdown /s /t 00
    
    goto :start
    

    sollte funktionieren
    hab's nicht getestet
    ein Moderator sollte das Ganze hier vielleicht verschieben

    Habe es auch nicht getestet, aber ein eventuelles Problem bei deiner Variante ist, dass sich der ausführende PC selber mit einbezieht. Und wenn er dieses Script ausführen kann, ist er natürlich auch erreichbar. Damit würde shutdown nie ausgeführt werden.



  • Dieser Thread wurde von Moderator/in volkard aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • BBBB schrieb:

    Habe es auch nicht getestet, aber ein eventuelles Problem bei deiner Variante ist, dass sich der ausführende PC selber mit einbezieht. Und wenn er dieses Script ausführen kann, ist er natürlich auch erreichbar. Damit würde shutdown nie ausgeführt werden.

    stimmt
    aber dafür muss man nur die 0 in der IF Abfrage durch eine 1 ersetzen

    und was mir grade auffällt:
    %i zu %%i ändern
    und am Anfang ein setlocal einfügen damit %Aus% auf jeden Fall gelöscht wird



  • irgendwer schrieb:

    Da du anscheint nicht sehr viel vom programmieren verstehst.
    ...
    sollte funktionieren
    hab's nicht getestet

    Mein letzter Beitrag war wohl zu rüde und wurde liquidiert. Ich fand es nur sehr anmaßend dem Threadstarter mangelndes Programmierverständnis zu attestieren und dann mit so einer Lösung zu daherzukommen, bei der (fast) nichts stimmt.

    Was soll die Zumüllung des Netzwerks?
    Was bedeutet ping 192.168.1.0?
    Wie soll %Aus% je 0 bleiben?

    Und dann noch die falsche Syntax.

    Darauf wollte ich vorher nur kurz und prägnant hinweisen.

    Hoffe dem allmächtigen volkard ist das jetzt nicht zu rüde. 😉



  • irgendwer schrieb:

    stimmt
    aber dafür muss man nur die 0 in der IF Abfrage durch eine 1 ersetzen

    Ich würde zuerst nochmal durchatmen und in Ruhe drübersehen. Denn das macht es auch nicht besser. 😉



  • stimmt mein Lösungsvorschlag ist nicht ganz richtig
    ok dann werde ich den mal verbessern

    setlocal
    :start
    rem durch gehen aller lokalen IPs 
    rem bei erfolg liefert ping 0 und bei Zeitüberschreitung/ungültig 1
    FOR /L %%i IN (0,1,255) DO ping 168.192.1.%%i & set /a Aus+=%errorlevel%
    
    rem 2 IPs werden auf jeden Fall antworten
    rem der Router und der PC auf dem die .bat läuft
    rem 256-2=254
    
    IF %Aus% EQU 254 DO shutdown /s /t 00
    rem für jedes Gerät mit einer IP, das nicht beachtet werden soll die Zahl um 1 verringern
    
    rem falls ein PC noch an ist, nochmal testen
    goto :start
    

    Und dann noch die falsche Syntax.

    Wo war die Syntax falsch?
    nur in einer .bat muss es %%i heißen, in der cmd wär das sogar ein fehler
    Das FOR /L geht natürlich nur wenn man die Befehlszeilenerweiterungen (oder MS das nennt) einschaltet (bei XP Standart, Server 2003 müsste das auch haben)

    Threadstarter mangelndes Programmierverständnis zu attestieren

    Ich seh rot wenn jemand scripten und programmieren synonym verwendet

    Was bedeutet ping 192.168.1.0?

    anpingen eines Gräts mit dieser IP



  • erstmal sorry für Doppelpost

    Beim Testen hab ich erkannt, dass das %errorlevel% durch !errorlevel! ersetzt werden muss, damit errorlevel erst expandiert wird, wenn es gebraucht wird.
    Sonst wird immer der errorlevel des letzten Befehls vor der FOR-Schleife benutzt

    bei ping kann man noch mit den parameter -w ein Zeitlimit setzen, damit es schneller geht, oder den Bereich der IPs runtersetzen (dann aber auch den Wert beim IF ändern



  • irgendwer schrieb:

    nur in einer .bat muss es %%i heißen, in der cmd wär das sogar ein fehler

    Was heißt "nur"? Wie hast du dir das sonst gedacht, z.B. mit dem goto?

    irgendwer schrieb:

    Ich seh rot wenn jemand scripten und programmieren synonym verwendet

    Haarspalter! 😃

    irgendwer schrieb:

    anpingen eines Gräts mit dieser IP

    Schon mal einem "Gerät" diese spezielle IP-Adresse gegeben? Oder die 192.168.1.255? 😉 Dir fehlen noch etwas die Netzwerkgrundlagen.

    Nebenbei, was denkst du wie lange so ein Durchlauf mit über 250 pings dauert?
    Wer sagt, dass die PCs nur in einem Subnet sitzen?
    Das Polling hab ich ja schon angesprochen.

    Dein Vorschlag ist zwar gut gemeint, aber praktikabel ist er nicht. Der Ansatz ist einfach verkehrt.



  • Sorry, hab deinen Beitrag nicht gesehen.

    Wie es aussieht hast du selbst erkannt, dass das Skript noch ein paar Probleme hat. Ich würde nicht mehr daran rumdoktern. Es geht mit anderen Ansätzen einfacher und schneller.



  • irgendwer schrieb:

    stimmt mein Lösungsvorschlag ist nicht ganz richtig
    ok dann werde ich den mal verbessern

    setlocal
    :start
    rem durch gehen aller lokalen IPs 
    rem bei erfolg liefert ping 0 und bei Zeitüberschreitung/ungültig 1
    FOR /L %%i IN (0,1,255) DO ping 168.192.1.%%i & set /a Aus+=%errorlevel%
    
    rem 2 IPs werden auf jeden Fall antworten
    rem der Router und der PC auf dem die .bat läuft
    rem 256-2=254
    
    IF %Aus% EQU 254 DO shutdown /s /t 00
    rem für jedes Gerät mit einer IP, das nicht beachtet werden soll die Zahl um 1 verringern
    
    rem falls ein PC noch an ist, nochmal testen
    goto :start
    

    Die Rechnung stimmt immer noch nicht, denn die Broadcastadresse 192.168.1.255 liefert dir auch ein errorlevel 0


Anmelden zum Antworten