wlanner
Goto Top

PowerShell CMD Wake On Lan - Paket erstellen

Guten Abend,

ich habe unter
TechNet.Microsoft.Com
eine gute Anleitung gefunden, um Wake-On-Lan Pakete ohne lästige Software abzuschicken.

Das funktioniert auch, jedoch stören mich da ein paar Dinge:
Kann man das Script in Batch umschreiben, sodass ich nicht die ExecutionPolicy auf Unrestricted o.ä. setzen muss (also dass diese auf Restricted bleibt)?

Ich habe mir das so vorgestellt, dass ich einfach eine Batch-Datei erstelle und in dieser dann den Code auf einen Ein-Zeiler (oder mehr) herunterbreche, um die Restricted-ExecutionPolicy zu umgehen. (Einzelne PowerShell-Commandos lassen sich ja dann auch noch in Batch ausführen)

Dabei müssen/sollen IP, Mac, etc. nicht variabel sein.

Dass müsste ja am Ende in etwa so aussehen:

Batch
@echo off
powershell
$UDPclient = new-Object System.Net.Sockets.UdpClient
$UDPclient.Connect( << broadcast  (kann ja direkt ohne Konvertierung etc.. eingetippt werden, ist ja fix>>),9)
[void]$UDPclient.Send((,[byte]255 * 6) + (0,2,4,6,8,10 | % {[convert]::ToByte( <<mac-Adresse mit , -Format kann ja auch fest, da fix>>.substring($_,2),16)}  * 16)

Bis zum Punkt UDPclient.Connect komme ich auch, nur beim Entscheidenden hakt's

Vielen Dank für eure Hilfe

Content-ID: 280466

Url: https://administrator.de/contentid/280466

Ausgedruckt am: 25.11.2024 um 09:11 Uhr

Meierjo
Meierjo 18.08.2015 um 06:46:50 Uhr
Goto Top
Hallo

Ich mache das über das schlanke Tool wol.exe

Benötigt keine Installation, wird einfach auf dem Server ins system32 kopiert, und kann mittels

wol.exe aabbccdd1122 ausgeführt werden

Gruss Urs
114757
Lösung 114757 18.08.2015, aktualisiert am 23.08.2015 um 14:26:03 Uhr
Goto Top
Mit deinem PS Code von oben, für das direkte ausführen in der CMD:
@echo off
set "mac=00:00:00:00:00:00"  
set "ip=255.255.255.255"  
powershell -ExecutionPolicy ByPass -Command "&{$mac = '%mac%' -replace '[\|:]','';$UDPclient = new-Object System.Net.Sockets.UdpClient; $UDPclient.Connect('%ip%',9);[void]$UDPclient.Send((,[byte]255 * 6) + ((0,2,4,6,8,10 | %% {[convert]::ToByte($mac.substring($_,2),16)}) * 16) , 102)}"  
Wenn es in eine Batch kommen soll musst du das Prozentzeichen verdoppeln...

Gruß jodel
wlanner
wlanner 20.08.2015 um 00:55:58 Uhr
Goto Top
Hallo Jodel,
Danke erstmal für deine Hilfe, nur war der Code von oben meine Überlegung (=Falsch); vielleicht funktioniert er deshalb nicht (obwohl PS nur meckert, dass eine Klammer fehlt).
Auf jeden Fall ist hier der komplette; richtige Code von der Microsoft-Site:
<Code-Type="plain">
function Send-WOL
{
<#
.SYNOPSIS
Send a WOL packet to a broadcast address
.PARAMETER mac
The MAC address of the device that need to wake up
.PARAMETER ip
The IP address where the WOL packet will be sent to
.EXAMPLE
Send-WOL -mac 00:11:32:21:2D:11 -ip 192.168.8.255
.EXAMPLE
Send-WOL -mac 00:11:32:21:2D:11

#>

[CmdletBinding()]
param(
[Parameter(Mandatory=$True,Position=1)]
[string]$mac,
[string]$ip="255.255.255.255",
[int]$port=9
)
$broadcast = [Net.IPAddress]::Parse($ip)

$mac=(($mac.replace(":","")).replace("-","")).replace(".","")
$target=0,2,4,6,8,10 | % {[convert]::ToByte($mac.substring($_,2),16)}
$packet = (,[byte]255 * 6) + ($target * 16)

$UDPclient = new-Object System.Net.Sockets.UdpClient
$UDPclient.Connect($broadcast,$port)
[void]$UDPclient.Send($packet, 102)

}


lg
114757
114757 20.08.2015 aktualisiert um 09:51:34 Uhr
Goto Top
ist oben korrigiert ... (Achtung: ist für eine Batch angepasst, d.h das Prozentzeichen für die ForEach-Schleife im Powershellkonstrukt wurde verdoppelt!!). Bei Ausführung direkt auf der Kommandozeile muss es durch ein einfaches ersetzt werden)
wlanner
wlanner 23.08.2015 um 14:26:30 Uhr
Goto Top
Danke, funktioniert wunderbar face-smile