glintofgold
Goto Top

WakeOnLAN für die Netzwerkkarte remote über ein Powershell- oder WMI-Script aktivieren

Hallo,

ich muss in einem räumlich weit auseinanderliegenden Netzwerk für mehrere Rechner WakeOnLAN aktivieren.

Das ist so ziemlich das einzige, was mit den üblichen Mitteln remote nicht funktioniert.

Hier habe ich zwar eine Lösung gefunden, aber ich kriege es einfach nicht hin: https://technet.microsoft.com/de-de/library/ee617165(v=ws.10).aspx

Hatte schon mal jemand eine ähnliche Aufgabe zu lösen und daher ein Script dafür parat?

Würde mich freuen!

Content-ID: 292949

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

Ausgedruckt am: 24.11.2024 um 06:11 Uhr

Chonta
Chonta 13.01.2016 um 10:41:47 Uhr
Goto Top
Hallo,

wenn im BIOS WOL nicht aktiviert ist gehts halt nicht.
Evtl. hat der Rechnerhersteller ein Tool mit dem man BIOS-Einstellungen setzen kann aber sonst....

Gruß

Chonta
GlintofGold
GlintofGold 13.01.2016 um 10:51:12 Uhr
Goto Top
Es ist im BIOS aktiv, nur für einige Netzwerkkarten fehlt die Aktivierung "WOL über MagicPacket".
Ich komme einfach nicht an diese in dem Artikel genannten Methoden heran, da fehlt mir das Tiefenwissen zu Powershell und WMIC face-sad
GlintofGold
GlintofGold 13.01.2016 um 15:48:13 Uhr
Goto Top
Hatte tatsächlich noch niemand sonst so ein Problem zu lösen?

Ich kann einfach nicht auf die in dem Artikel genannte Methode zugreifen.

Hier ein Beispiel für einen Win7-Rechner, bei dem WMI aktiviert ist und auch WakeOnLAN funktioniert:

wmic nic where "NetConnectionID='LAN-Verbindung'" get PowerManagementcapabilities
gibt einfach nur "PowerManagementcapabilities" zurück

Laut der TechNet-Beschreibung sollte es doch so funktionieren:
wmic nic where "NetConnectionID='LAN-Verbindung'" get guid_ndis_pm_active_capabilities

Es gibt aber die FM: Anfrage ist ungültig
114757
114757 13.01.2016 um 16:09:24 Uhr
Goto Top
Set-NetAdapterPowerManagement -Name Ethernet -WakeOnMagicPacket Enabled
https://technet.microsoft.com/en-us/library/jj130871%28v=wps.630%29.aspx

Gruß jodel32
colinardo
colinardo 13.01.2016 aktualisiert um 17:49:11 Uhr
Goto Top
Hallo GlintofGold,
das gewünschte lässt sich mit der Powershell relativ einfach realisieren, einfach in Zeile 1 den Pfad zu einer Textdatei eintragen in welcher die Rechnernamen oder IP-Adressen untereinander aufgelistet sind. Bei Bedarf das Ping-Delay in Zeile 18 nach Bedarf anpassen.
$computers = gc 'C:\computerliste.txt'  

if ($PSVersionTable.PSVersion.Major -lt 3){write-host "ERROR: Minimum Powershell Version 3.0 is required!" -F Yellow; return}   

function Send-Ping([string]$device,[int]$delay){
    $ping = New-Object System.Net.NetworkInformation.Ping
    try{
        if($ping.Send($device,$delay).Status -ne "Success"){  
            return $false
        }else{
            return $true
        }
    }catch{return $false}
}
 
$computers | %{
    $computer = $_
    if (Send-Ping $computer -delay 500){
        try{
            gwmi Win32_Networkadapter -Filter "NetEnabled = 'True'" -ComputerName $computer -EA Stop | %{  
                $pnpid = $_.PNPDeviceId; $netcard = $_.Description
                gwmi MSPower_DeviceWakeEnable -Namespace root\wmi -ComputerName $computer | ?{$_.InstanceName -match [regex]::Escape($pnpid)} | %{
                    $_.Enable = $true
                    if($_.Put()){[pscustomobject][ordered]@{"Computer"=$computer;"Adapter"=$netcard;"Result"="OK"}}  
                }
            }
        }catch{
            write-host $_.Exception.Message -ForegroundColor Red
        }
    }else{
        [pscustomobject][ordered]@{"Computer"=$computer;"Result"="Computer was offline"}  
    }
}
Das Skript sollte natürlich mit den nötigen Credentials gestartet werden welche für den Remote-Zugriff auf die Rechner benötigt werden. Jeder Rechner wird vor der Abfrage angepingt, sollte er antworten wird die EInstellung für Wake-On-Lan vorgenommen ansonsten nicht.
Das das BIOS der Rechner entsprechend eingestellt sein muss ist natürlich Voraussetzung.

Die Einstellung wirkt normalerweise erst nach einem Reboot des Rechners, das nur noch zur Info. Bei Bedarf kann man also noch einen Reboot-Befehl mit einbauen wenn das gewünscht ist.

Grüße Uwe
Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate
GlintofGold
GlintofGold 14.01.2016 aktualisiert um 09:59:25 Uhr
Goto Top
@114757
Danke für den Tipp!
Der Test auf einem lokalen Rechner hat aber nicht funktioniert, es wird wohl an der Powershell-Version liegen (Win7-Rechner).
Von einem Server 2012 als invoke-command für diesen Win7-Rechner ausgeführt, gibt es die FM "...es kann keine Verbindung zu dem Ziel hergestellt werden..."
Das liegt wohl am WinRM-Dienst, der in unserem Netzwerk nicht so konfiguriert ist, dass das funktioniert.
GlintofGold
GlintofGold 14.01.2016 um 10:10:19 Uhr
Goto Top
@colinardo
Danke für das tolle Script!
Der Test mit dem Script läuft insofern richtig, dass er mir die Netzwerkkarte anzeigt und auch ein optimistisches "OK" ausgibt.
Die Einstellungen für WakeOnMagicPacket werden aber an denZiel-Geräten nicht verändert, WOL funktioniert somit trotzdem nicht.
In dem TechNet-Artikel https://technet.microsoft.com/de-de/library/ee617165(v=ws.10).aspx
wird das WakeOnMagicPattern als ein Unterschlüssel beschrieben, wie der aber hier eingesetzt werden kann, habe ich nicht herausgekriegt.
colinardo
colinardo 14.01.2016 aktualisiert um 10:23:48 Uhr
Goto Top
Zitat von @GlintofGold:
Die Einstellungen für WakeOnMagicPacket werden aber an denZiel-Geräten nicht verändert, WOL funktioniert somit trotzdem nicht.
Geht hier mit 20 unterschiedlichen Rechnern einwandfrei! Win7/8/10 , nutze ich schon seit eh und jeh ...

Lass dir einfach mal die Ausgabe des $_.Put() Befehls auf der Konsole ausgeben.

Die Einstellungen für WakeOnMagicPacket
Du meinst jetzt aber nicht die Settings des Netzwerkkartentreibers selber (unter Erweitert)? Das ist nämlich ein anderes paar Schuhe...

Mein Skript setzt diese Einstellung
http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-comp ...

Siehe
http://blogs.technet.com/b/heyscriptingguy/archive/2011/08/11/configure ...
114757
114757 14.01.2016 aktualisiert um 12:27:42 Uhr
Goto Top
Zitat von @colinardo:
Zitat von @GlintofGold:
Die Einstellungen für WakeOnMagicPacket werden aber an denZiel-Geräten nicht verändert, WOL funktioniert somit trotzdem nicht.
Geht hier mit 20 unterschiedlichen Rechnern einwandfrei! Win7/8/10 , nutze ich schon seit eh und jeh ...
Läuft hier testweise auch face-smile
GlintofGold
GlintofGold 14.01.2016 um 13:51:58 Uhr
Goto Top
Die Einstellungen für WakeOnMagicPacket werden aber an denZiel-Geräten nicht verändert, WOL funktioniert somit trotzdem nicht.
Geht hier mit 20 unterschiedlichen Rechnern einwandfrei! Win7/8/10 , nutze ich schon seit eh und jeh ...

Lass dir einfach mal die Ausgabe des $_.Put() Befehls auf der Konsole ausgeben.

Die Einstellungen für WakeOnMagicPacket
Du meinst jetzt aber nicht die Settings des Netzwerkkartentreibers selber (unter Erweitert)? Das ist nämlich ein anderes paar Schuhe...

Mein Skript setzt diese Einstellung
http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-comp ...

Es geht schon um die Einstellung im 'Netzwerkkartentreiber/Erweitert'.
Die verwendete Software für Remote-Installation/Remote-Patch verwendet nun mal MagicPacket, was ja eigentlich auch so üblich ist.
Die Rechner haben herstellerseitig im BIOS das Powermanagement eingeschaltet, somit übernimmt das auch die Netzwerkkarte.
Aber offenbar sind die Chargen der Hersteller nicht einheitlich, was die Einstellung für MagicPacket betrifft.
Ca. 1 Drittel hat die Haken an dieser Stelle nicht gesetzt, bei den anderen ist es eingeschaltet.

$_.Put() gibt folgendes wieder:
PS C:\install> C:\install\SetMagicPacket.ps1


Path          : \\PC170\root\wmi:MSPower_DeviceWakeEnable.InstanceName="PCI\\VEN_8086&DEV_1503&SUBSYS_20028086&REV_05\\3&11583659&1&C8_0"  
RelativePath  : MSPower_DeviceWakeEnable.InstanceName="PCI\\VEN_8086&DEV_1503&SUBSYS_20028086&REV_05\\3&11583659&1&C8_0"  
Server        : PC170
NamespacePath : root\wmi
ClassName     : MSPower_DeviceWakeEnable
IsClass       : False
IsInstance    : True
IsSingleton   : False

Computer : PC170
Adapter  : Intel(R) 82579V Gigabit Network Connection
Result   : OK

Computer : PC154
Result   : Computer was offline


PS C:\install> 
colinardo
colinardo 14.01.2016 aktualisiert um 16:17:25 Uhr
Goto Top
Es geht schon um die Einstellung im 'Netzwerkkartentreiber/Erweitert'.
Dann sprachen wir von zwei unterschiedlichen Dingen, das obige Skript war nur für das Powermanagement-Häkchen unter dem Tab Energieverwaltung zuständig nicht für die erweiterten Eigenschaften der Netzwerkkarte, aber das ging aus deinem Post ja leider nicht eindeutig hervor.

Schaue nachher nochmal ein meine Skriptsammlung, aber ich meine das ist abhängig von Treiber und der Netzwerkkarte. Denn die Namen der Eigenschaften können sich da unterscheiden.

Ab Windows 8.1 und Windows 10 geht das hiermit:
Set-NetAdapterAdvancedProperty
Set-NetAdapterAdvancedProperty -Name MyAdapter -DisplayName "Wake on Magic Packet" -DisplayValue "Enable"
Aber wie gesagt können sich die Namen und Werte das je nach Netzwerkkarte unterscheiden!

Die Einstellungen finde sich aber auch in der Registry unter:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class


NACHTRAG:

Du könntest also einfach ein Powershell-Computerstartskript per GPO deployen was die Einstellung in der Registry setzt
$nicname = gwmi win32_networkadapter -Filter "NetEnabled ='True'" | select -First 1 -Expand Description  
gci "HKLM:\SYSTEM\CurrentControlSet\Control\Class" -Recurse -EA SilentlyContinue | ?{$_.GetValue('DriverDesc') -eq $nicname} | %{Set-ItemProperty ($_.Name.Replace('HKEY_LOCAL_MACHINE','HKLM:')) -Name '*WakeOnMagicPacket' -Value 1}  
Das ganze ginge auch Remote dann müsstest du aber zusätzlich den Dienst RemoteRegistry auf den Clients aktivieren.