I use shutdown.exe /s /m \\%Computer Name% running from a scheduled VBScript which pulls computer names from AD.
Code:
Option Explicit
Dim objConnection, objCommand, objRecordSet
Dim strComputer, strSourceOU
Dim wshell
Dim ArrOUs, strOU
ArrOUs = Array("Room1","Room2","Room3","etc")
Set wshell = CreateObject("wscript.shell")
' Link to AD
Const ADS_SCOPE_SUBTREE = 2
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection
For Each strOU in ArrOUs
' Select all Computer objects
objCommand.CommandText = "Select Name From 'LDAP://OU=" & strOU & ",OU=PCs,DC=example,DC=com' Where objectClass='computer'"
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Timeout") = 30
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
objCommand.Properties("Cache Results") = False
Set objRecordSet = objCommand.Execute
objRecordSet.MoveFirst
Do Until objRecordSet.EOF
strComputer = objRecordSet.Fields("Name").Value
Wshell.Run "shutdown -s -m \\" & strComputer & " -t 60 -c ""Shutting down for updates"" -f"
objRecordSet.MoveNext
Loop
Next