Since ConfigMgr 1810, there is a new, and much improved way to wake up machines on your network. However, your hardware must be configured to allow it, and so does Windows 10.
Good news, you can use ConfigMgr for that too. I typically use a Task Sequence for most hardware (BIOS) configurations, and a Configuration Item / Configuration Baseline for the Windows 10 settings, but sure, a package that runs a script to set it will do just fine as well, or a Configuration Item that does everything. Anyway, in this guide you learn to use a task sequence for the BIOS configuration, and a Configuration Item / Configuration Baseline for the Windows Wake-On-LAN settings. You can even download the ones I was using 🙂
Credits: Thanks to DarkMallard for the WOL script on TechNet Gallery, and to Maurice Daly for the Invoke-DellCCTKCheck.ps1 script.
Update/Warning: I recently learned that there seem to be an issue with using the new WOL notification method when targeting collections with more than 150-200 active clients. The symptom is that it may soak the fast channel for hours . Thanks Michael for the heads up, I'll update the post as I learn more.
Note #1: Due to changes in Windows 10 (and Windows 8.x), most hardware models does not support waking up from a Shutdown, only from sleep (and some hibernation scenarios). Even with tricks such as setting AllowWakeFromS5 under NDIS settings in the registry, waking up from Shutdown rarely works in Windows 10. More info about these changes in Microsoft KB 2776718: "Wake on LAN"(WOL) behavior in Windows 8, Windows 8.1 and Windows 10.
Note #2: When you wake up a machine via Wake-On-LAN, don't be surprised when it goes back to sleep again after being idle for two minutes. That's been the default behavior since Windows Vista, and is usually not what you want. That timeout is easy to change, but still, it's a rather not-that-bright default timeout IMNSHO. Anyway, I added that setting to my Configuration Item / Configuration Baseline as well. I bumped it up to 1 hour.
Note #3: The new option for waking up machines via client notification (fast channel) usually does not require enabling Wake-on-LAN on the ConfigMgr site level, it's only really needed for the wake-up proxy feature that you can enable via client settings.

Configuring BIOS for Wake-On-LAN
When writing this guide, I used a few Dell Optiplex machines, but the steps works on most of DELL's business models. To configure BIOS unattended I use the DELL cctk.exe tool.
Now, in a perfect world, the latest cctk.exe should work with all DELL models, but of course it doesn't. So the first thing you need is a script that figures out what cctk.exe version you need. Luckily good friend Maurice Daly has written one of those: https://github.com/SCConfigMgr/ConfigMgr/blob/master/Operating%20System%20Deployment/Invoke-DellCCTKCheck.ps1 This script runs the cctk.exe tool without any parameters, depending on exit code, the script sets a ConfigMgr task sequence variable, DellNewCCTKCmds to either true or false, and then sets another variable, DellCCTKPath, to call the correct version of the tool.
Next step is to download the two cctk.exe versions, put them in a folder, and then create a ConfigMgr package with that folder as a data source. In my environment I put cctk.exe version 4.1.0.0 in the root, and cctk.exe version 3.3.0.0 in the Legacy folder. I also added Maurice script to the root folder.

Once the package is created, you can create a task sequence that runs the script, and then calls the vendor tool to do the configuration. The task sequence I used for this guide is available for download here (but without the DELL Command Configure package): EnableWOLonDellMachines.zip.
Note: If you are not using BitLocker (you should, but still), disable the first action in the task sequence.

Configuring Windows 10 for Wake-On-LAN
Once the BIOS configuration is in place, it's time to make sure Windows is configure for Wake-on-LAN. And as mentioned earlier I use a ConfigMgr Configuration Item/Baseline for that.
Note: There is a built-in client setting that configures two of the settings I have in my Configuration Item, two of the Wake-On-LAN settings on the network card, but since I want to have more settings anyway, I put them all in a single Configuration Item.

The Configuration Item contains a few scripts and registry values, disables Energy Efficient Ethernet on the network card, disables Windows 10 Fast Startup, enables Wake-On-LAN settings on the card, and adjusts the default two minute timer for when machines go back to sleep after being waken.

You can download the Configuration baseline and its Configuration Items here: CB-Enable-Wake-on-LAN.cab.
Import the Baseline into ConfigMgr, and then deploy it. When deploying the baseline, make sure to select the Remediate noncompliant rules when supported option.
Note: For the new "going-back-to-sleep-after-being-woken" timeout to take affect, you need to have the machines rebooted. So worst case, the new timeout won't be active until next patch cycle.

Verifying the Configuration
After deploying the WOL BIOS Configuration Task Sequence you can quickly verify that it worked as expected by running the cctk.exe manually on the client with these commands:
cctk –DeepSleepCtrl
cctk –WakeOnLan

To verify the WOL Configuration Baseline, you can open Device Manager, and check the settings on your network card. In the Advanced tab and choose Energy Efficient Ethernet. It should say Off.
Note: This option is not available for all DELL models.

The next set of settings to verify are the two Wake-on-LAN settings on the Power Management tab of the network card properties.

To verify that Windows 10 Fast Startup is disabled, go to the good old Control Panel, and in Power Options, select "Choose what the power buttons do". The check box for "Turn on fast startup (recommended)" should not be selected.

Verifying that you can wake the machine
Before trying to use ConfigMgr to wake the machine it's a good idea to a simple test first using any WOL tool of your choosing. In this example I'm using a little PowerShell script:
# Mac Address of machine to wake up from sleep or hibernate
$MacAddress = "18-66-da-31-a3-d1"
Function Send-MagicPacket{
Param(
$MacAddress
)
$MacByteArray = $MacAddress -split "[:-]" | ForEach-Object { [Byte] "0x$_"}
[Byte[]] $MagicPacket = (,0xFF * 6) + ($MacByteArray * 16)
$UdpClient = New-Object System.Net.Sockets.UdpClient
$UdpClient.Connect(([System.Net.IPAddress]::Broadcast),7)
$UdpClient.Send($MagicPacket,$MagicPacket.Length)
$UdpClient.Close()
}
Send-MagicPacket -MacAddress $MacAddress
But there are other small GUI-based tools like WakeMeOnLan v1.85 from NirSoft, and many others.
Troubleshooting Wake-On-LAN
In addition to double-checking the BIOS and Windows 10 settings, you can also use a monitor, like Wake On Lan Monitor from Depicus, to verify that the request reaches the subnet. Don't forget to change the port to whichever port you are using. Port 7 and 9 are commonly used for Wake-ON-LAN.

Another option is to install Wireshark on of the machines, and have it listen to the traffic on that subnet. Below is a capture from a wake-up request via a ConfigMgr client. Unless a client setting is configured otherwise, it's going to use port 7 for the request.

On some of the DELL hardware I was testing on I had to upgrade BIOS and load the default settings before configuring the Wake-On-LAN settings. If you reset to default settings, make sure to make a note of settings like SATA operations or virtualization options before the reset 🙂
Wake-On-LAN in ConfigMgr, behind the scenes
In ConfigMgr you can see the wake-up request being sent from the site server to an available client in the BgbServer.log. Look for the following message:
Starting to send push task (PushID: 122 TaskID: 119 TaskGUID: F1E30996-55F1-4F4F-8BFA-BF4450690FC9 TaskType: 18 TaskParam:
<WakeupInfo WakerMachineID="16777479">
<NetworkInfo SleepingMachineID="16777480" IPAddress="192.168.24.104" IPSubnet="192.168.24.0" MACAddress="18:66:DA:31:A3:A4" MulticastAddress="" Flags="0" />
</WakeupInfo>) to 1 clients with throttling (strategy: 1 param: 42)

In addition to the IP address and Mac Address of the machine to be waken, you will also see the Resource ID of the existing online machine tasked with the waking up. In this case you'll see this: WakerMachineID="16777479"
Happy Deployment / Johan
Thanks for this Johan it works on most machines but also get some script execution errors 0xffffffff
Hi Tony,
Hard to tell why without being able to debug the script on those machines.
/ Johan
Hi Johan,
First of all, thanks for sharing this valuable information, it is really helpful and much appreciated.
I want to share with you, all the implementation it's working fine and computers (Dell Optiplex 5060/5070) are waking up from a full shutdown but not when they are in sleep mode). Any idea?
Sorry for the very late reply, but no idea from the top of my head. Where you able to figure it out?
As always, thanks for your contributions Johan!
Has anyone ever dealt with 802.1x enabled environments? At our agency, machines are in a "no-man's land" VLAN unless they have successfully authenticated via the Windows Wired AutoConfig service. I've been told by our network group that because any offline/unauthenticated machines are in this VLAN, that WOL cannot be implemented.
Anyone else found a way to achieve WOL in this type of environment?
Sorry, don't know about that one.
Hi, any idea why a deployment with 'Send wake up packets' ticked does not wake up the device at the start time, but I can wake up manually via client notification?
I'm pretty sure that the WOL option on required deployments are using the legacy WOL option. I sent a question to the product team to confirm, will update when I get an answer.
Great. I will keep you updated as soon as I get more information from the dev team. 🙂
Thanks Johan, to confirm this is using ConfigMgr 1910 using subnet-directed broadcasts for WoL.
ok, thanks
Nice article.
Be careful when using the WOL feature on large collection though. I have an open case with Microsoft because this functionality is soaking my fast channel for hours when used with more than 150 – 200 computers collection. The dev team is still investigating and I'm expecting news from them in a few days.
Thanks for the heads-up, I'll add a note in my post for now.
wake-up proxy is hell
https://community.cisco.com/t5/switching/mac-address-flapping-and-sccm-wake-up-proxy/td-p/2240432
I agree that the legacy WOL feature in ConfigMgr wasn't very good. But the WOL feature I'm covering in this post is new since ConfigMgr 1810, and doesn't require the old wake-up proxies. The new method just picks a client on the same subnet via the ConfigMgr fast channel, and asks it to send a magic package on that subnet.