Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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
}

 

  • Autor
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.

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

  • 1 Monat später...

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

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.