Zum Inhalt springen
  • 0

WOL Skript


FoxOff

Frage

Hallo an alle hier,

Vorab: Ich bin KEIN Programmierer, was man wahrscheinlich schnell sehen wird :D
Ich bin Systemintegrator und soll ein Skript in Powershell schreiben. 
Meine konkrete Aufgabe: wir haben an der Arbeit 4 Poolräume (alle im selben Netz). Aktuell sind dort ziemlich alle Rechner an, damit die Leute über VMware Horizon sich einloggen und von Zuhause aus am Poolrechner arbeiten können. 
Ich soll ein WOL Skript schreiben, welches alle 5min. on selbst sich durchführt und schaut, ob 2 Rechner an und nicht in Benutzung sind. Wir möchten as "Puffer" 2 Rechner an lassen. Sobald sich dann einer anmeldet und einen PC belegt, soll ein weiterer hochfahren, damit der Puffer wieder auf 2 ist. 
Aufwecken sollen die Rechner über ihre MAC-Adressen. Dafür habe ich eine txt. Datei erstellt, in der die MACs untereinander ohne Sonderzeichen aufgelistet sind.

Ich hab im Internet ein Testskript gefunden, welches auch mit der MAC.txt Datei funktioniert. Um erstmal zu schauen, ob es funktioniert wie es soll -> damit hat es geklappt.
Ich soll nun aber ein eigenes und angepasstes Skript schreiben, welches erstmal einen Poolraum nimmt und es dann ausgeweitet wird auf alle Poolräume. 

Hier einmal mein aktuelles Skript -> wie gesagt, bin kein Programmierer und hab es auch nie wirklich vorher mal gemacht.. Daher hoffe ich sehr, dass ihr mir netterweise helfen könntet 🙏

   #Eingabe der Char MAC Datei
$InputFile = "C:\CharWakeOnLanMAC.txt"
function Send-Packet([string]$MacAddress) { #Sende Magic-Packet an diese MAC-Adressen

    #definierte Variablen
#$Poolname = "physpool-fb06-01";
#$Rechner = (Get-HVMachine -Poolname $Poolname).Base;

$available      #Freie Computer (nicht in Benutzung)
$Poolbuffer =2; #2 PCs sollen IMMER als Puffer an sein
$Pools          #Poolräume (4)

while(true) { #Dauerschleife von $available
            #foreach($Pool in $Pools) { #Geht alle Pools durch

            while($available -lt $Poolbuffer) { #Solange nicht genug PCs (2) frei sind, wird while ausgeführt
                 Send-Packet $MacAddress        #Führe WOL für einen ausgeschalteten PC aus
            }
            #ForEach ($MacAddress in get-content $InputFile) {
                    #Send-Packet $MacAddress
            #}
        #}
        #sleep(300); #alle 300 Sekunden/5 Minuten wird Skript wieder durchgeführt
    }
}

 Das ist das Skript, welches ich im Netz gefunden habe zum testen:

#Eingabedatei
$InputFile = "C:\WakeOnLanMAC.txt"
function Send-Packet([string]$MacAddress)
{
try
{
$Broadcast = ([System.Net.IPAddress]::Broadcast)
## Create UDP client instance
$UdpClient = New-Object Net.Sockets.UdpClient
## Create IP endpoints for each port
$IPEndPoint = New-Object Net.IPEndPoint $Broadcast, 9
## Construct physical address instance for the MAC address of the machine (string to byte array)
$MAC = [Net.NetworkInformation.PhysicalAddress]::Parse($MacAddress.ToUpper())
## Construct the Magic Packet frame
$Packet = [Byte[]](,0xFF*6)+($MAC.GetAddressBytes()*16)
## Broadcast UDP packets to the IP endpoint of the machine
$UdpClient.Send($Packet, $Packet.Length, $IPEndPoint) | Out-Null
$UdpClient.Close()
}
catch
{
$UdpClient.Dispose()
$Error | Write-Error;
}
}
#Fuer jede MAC in Zeile: Function 'Send-Paket + MAC'
ForEach ($MacAddress in get-content $InputFile)
{
Send-Packet $MacAddress
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

5 Antworten auf diese Frage

Empfohlene Beiträge

  • 0
vor 2 Minuten schrieb thereisnospace:

Was genau möchtest Du von uns?

Meine Frage ist, ob ihr mir helfen könnt. Bzw. ob das Skript so Funktionieren wird, ob da noch was wichtiges Fehlt, ob ich da eine andere Schleife für nehmen soll, wenn ja welche, ob es ganz umgeschrieben werden müsste, etc.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor 2 Stunden schrieb FoxOff:

Meine Frage ist, ob ihr mir helfen könnt. Bzw. ob das Skript so Funktionieren wird, ob da noch was wichtiges Fehlt, ob ich da eine andere Schleife für nehmen soll, wenn ja welche, ob es ganz umgeschrieben werden müsste, etc.

Ja, wir können Dir helfen. Frage beantwortet? :D

Worauf ich hinaus möchte: Es bringt nichts, wenn wir Dir hier Deinen Code zu Ende schreiben. Wir kennen nicht die genauen Anforderungen und Umstände, außerdem musst Du es selbst schaffen, damit Du einen Lerneffekt hast. Wenn Du eine explizite Frage zu einem Problem hast, können wir Dir sicherlich weiterhelfen. Das geht aber nur wenn eine richtige Frage vorhanden ist.

Du hast bisher geschrieben:

  • Ob wir dir helfen können? Ja
  • Ob das Skript so funktionieren wird? Weiß ich nicht, schmeiß den Code in den Compiler und probier es bei Dir aus.
  • Ob was wichtiges fehlt? Dafür müssten wir die genauen Anforderungen kennen.

usw...

Ich kenne mich mit PowerShell und Deinem Fallbeispiel nicht aus, aber habe den Code mal kurz überflogen und mir fehlt bei Dir generell, was für ein Packet gesendet werden soll. In dem Codebeispiel

vor 2 Stunden schrieb FoxOff:

$MAC = [Net.NetworkInformation.PhysicalAddress]::Parse($MacAddress.ToUpper()) ## Construct the Magic Packet frame

 

$Packet = [Byte[]](,0xFF*6)+($MAC.GetAddressBytes()*16) ## Broadcast UDP packets to the IP endpoint of the machine

$UdpClient.Send($Packet, $Packet.Length, $IPEndPoint) | Out-Null $UdpClient.Close()

wird hier erst der Frame und der Inhalt für das Magic Packet erstellt und gesendet. Das passiert bei Dir gar nicht.

Deine Funktion SendPacket hat das Senden gar nicht enthalten. Du hast zwar im Kommentar geschrieben

#Sende Magic-Packet an diese MAC-Adressen

aber verschickt wir da nichts.

EDIT: Deine Methode ruft sich übrigens selbst auf. Das in Kombination mit der while(true) Kondition hast Du eine Schleife, die NIEMALS abbricht. Neverending story, gefährliche Kiste :D Es fehlt auch generell Code, der neben der Methode läuft. Momentan hast Du alles in einer Methode drin stehen, die niemals aufgerufen wird. Nur innerhalb von der Methode, welche zu einer Endlosschleife führt. Momentan würde also bei Ausführung absolut gar nichts passieren. Da müsstest Du auch nochmal rüberschauen.

Bearbeitet von thereisnospace
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
Gast Ronaldemubs

Hey,


gibt es eine Möglichkeit Eventghost selbst per externem Skript/Programm zu beenden?
Processclose, Windowclose klappt natürlich, aber das scheint mir etwas trastisch.

Kann man die normale Exitroutine von EG irgendwie aufrufen? Damit ggf. auch nicht gespeicherte Änderungen Speicherung bevorzugt im Hintergrund nicht verloren gehen?


Gruß nuts

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Diese Frage beantworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...