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-Key: 280466

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

Printed on: April 23, 2024 at 20:04 o'clock

Member: Meierjo
Meierjo Aug 18, 2015 at 04:46:50 (UTC)
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
Mitglied: 114757
Solution 114757 Aug 18, 2015, updated at Aug 23, 2015 at 12:26:03 (UTC)
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
Member: wlanner
wlanner Aug 19, 2015 at 22:55:58 (UTC)
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
Mitglied: 114757
114757 Aug 20, 2015 updated at 07:51:34 (UTC)
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)
Member: wlanner
wlanner Aug 23, 2015 at 12:26:30 (UTC)
Goto Top
Danke, funktioniert wunderbar face-smile