'Option Explicit '========================================================== ' LANG : VBScript ' NAME : WOL VBS ' AUTHOR : Garth Jones (Garth@enhansoft.com) ' VERSION : 1.03 ' DATE : 2014-Oct-9 ' Description : Inventories WOL setting ' Stores results within WMI for CM12 to collect ' It is recommend to run this script at least weekly but Daily better ' ' LICENSE : ' Copyright (c) 2014, Enhansoft Inc. ' All rights reserved. ' ' Redistribution and use in source and binary forms, with or without ' modification, are permitted provided that the following conditions are met: ' ' * Redistributions of source code must retain the above copyright notice, ' this list of conditions and the following disclaimer. ' * Redistributions in binary form must reproduce the above copyright notice, ' this list of conditions and the following disclaimer in the documentation ' and/or other materials provided with the distribution. ' * Neither the name SYDI nor the names of its contributors may be used ' to endorse or promote products derived from this software without ' specific prior written permission. ' ' THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" ' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ' IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ' ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE ' LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ' CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ' SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS ' INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN ' CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ' ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ' POSSIBILITY OF SUCH DAMAGE. ' '========================================================== ' Notes '========================================================== ' 'History '1.03 - Updated Clean up WMI class '1.02 - Set "True/False" options for Column; Set Default to "False" '1.01 - internal version '1.00 - Version for Invesco '========================================================== '========================================================== ' Settings '========================================================== Dim colNetworkAdapters Dim objNetworkAdapter Dim strDevInstanceName Dim strNetworkAdapterID Dim strComputer, Debug, i, iNext Dim objWMIService, objWMIServiceWMI Dim ArrayNAName(50), ArrayNAMAC(50), ArrayNAPNPID(50) Dim ArrayNAWakeEnable(50), ArrayNAWakeActive(50) Dim ArrayNAMagicActive(50), ArrayNAMagicPacket(50) ' Contants Const adVarChar = 200 Const MaxCharacters = 255 Const LargeMaxCharacters = 4000 Const wbemCimtypeSint16 = 2 Const wbemCimtypeSint32 = 3 Const wbemCimtypeReal32 = 4 Const wbemCimtypeReal64 = 5 Const wbemCimtypeString = 8 Const wbemCimtypeBoolean = 11 Const wbemCimtypeObject = 13 Const wbemCimtypeSint8 = 16 Const wbemCimtypeUint8 = 17 Const wbemCimtypeUint16 = 18 Const wbemCimtypeUint32 = 19 Const wbemCimtypeSint64 = 20 Const wbemCimtypeUint64 = 21 Const wbemCimtypeDateTime = 101 Const wbemCimtypeReference = 102 Const wbemCimtypeChar16 = 103 Debug = False 'Debug = True ' Script version Dim strScriptVersion strScriptVersion = "1.03" strComputer = "." if debug = True then strComputer = "Win2k8" ' SQL 2008 and 2008 R2 Test server 'strComputer = "iis75test" 'SQL 2008 and SQL 2008 R2 'strComputer = "CM12-cm4" 'SQL 2012 SQL+ RP 'strComputer = "Win81-cm4" 'SQL 2014 'strComputer = "Win7-cm12" 'SQL 2005, 2008, 2012 Test server (express version) 'strComputer = "SCCMr2" 'SQL 2005 with RS strComputer = "Win2k8r2" 'SQL 2012 with RS 'strComputer = "CM12-Clean" 'SQL 2012 with RS Else strComputer = "." End if Sub ReportProgress(strMessage) If debug = True Then WScript.Echo strMessage End If End Sub ' ReportProgress Sub GetNICDetails i=0 'Query for all of the Win32_NetworkAdapters that are wired Ethernet (AdapterTypeId=0 corresponds to Ethernet 802.3) Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set objWMIServiceWMI = GetObject("winmgmts:{impersonationLevel=impersonate}\\" & strComputer & "\root\wmi") Set colNetworkAdapters = objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapter where PhysicalAdapter = True and NetEnabled = True","WQL",48) If debug = True Then ReportProgress "Enabling WoL for the following adapters:" End If For Each objNetworkAdapter In colNetworkAdapters ArrayNAName(i) = objNetworkAdapter.Name ArrayNAMAC(i) = objNetworkAdapter.MACAddress If debug = True Then ReportProgress " " & ArrayNAName(i) & " [" & ArrayNAMAC(i) & "]" End If strNetworkAdapterID = UCase(objNetworkAdapter.PNPDeviceID) 'Query for all of the MSPower_DeviceWakeEnable classes Dim colPowerWakeEnables Dim objPowerWakeEnable Set colPowerWakeEnables = objWMIServiceWMI.ExecQuery("SELECT * FROM MSPower_DeviceWakeEnable") 'Compare the PNP Device ID from the network adapter against the MSPower_DeviceEnabled instances For Each objPowerWakeEnable In colPowerWakeEnables 'We have to compare the leftmost part as MSPower_DeviceEnabled.InstanceName contains an instance suffix 'tmp = objPowerWakeEnable.InstanceName strDevInstanceName = UCase(Left(objPowerWakeEnable.InstanceName, Len(strNetworkAdapterID))) ArrayNAPNPID(i) = strDevInstanceName 'Match found, enable WOL If StrComp(strDevInstanceName, strNetworkAdapterID)=0 Then tmp = objPowerWakeEnable.Enable If tmp = 1 Or tmp = "True" Then ArrayNAWakeEnable(i) = "True" Else ArrayNAWakeEnable(i) = "False" End If tmp = objPowerWakeEnable.Active If tmp = 1 Or tmp = "True" Then ArrayNAWakeActive(i) = "True" Else ArrayNAWakeActive(i) = "False" End If End If Next 'Query for all of the MSNdis_DeviceWakeOnMagicPacketOnly classes Dim colMagicPacketOnlys Dim objMagicPacketOnly Set colMagicPacketOnlys = objWMIServiceWMI.ExecQuery("SELECT InstanceName, Active, EnableWakeOnMagicPacketOnly FROM MSNdis_DeviceWakeOnMagicPacketOnly") 'Compare the PNP Device ID from the network adapter against the MSNdis_DeviceWakeOnMagicPacketOnly instances For Each objMagicPacketOnly In colMagicPacketOnlys 'We have to compare the leftmost part as MSNdis_DeviceWakeOnMagicPacketOnly.InstanceName contains an instance suffix strDevInstanceName = UCase(Left(objMagicPacketOnly.InstanceName, Len(strNetworkAdapterID))) 'Match found, enable WOL for Magic Packets only If StrComp(strDevInstanceName, strNetworkAdapterID)=0 Then tmp = objMagicPacketOnly.EnableWakeOnMagicPacketOnly If tmp = 1 Or tmp = "True" Then ArrayNAMagicPacket(i) = "True" Else ArrayNAMagicPacket(i) = "False" End If tmp = objMagicPacketOnly.Active If tmp = 1 Or tmp = "True" Then ArrayNAWakeActive(i) = "True" Else ArrayNAWakeActive(i) = "False" End If End If Next iNext = i i=i+1 Next End Sub Function CreateWMIClass if debug = True Then ReportProgress "Start subroutine: CreateWMIClass()" End if 'Create data class structure - Database oDataObject.Path_.Class = "ES_WOL" oDataObject.Properties_.add "PNPID", wbemCimtypeString oDataObject.Properties_.add "NICName", wbemCimtypeString oDataObject.Properties_.add "NICMac", wbemCimtypeString oDataObject.Properties_.add "MagicPacket", wbemCimtypeString oDataObject.Properties_.add "WakeEnable", wbemCimtypeString oDataObject.Properties_.add "DetectionMethod", wbemCimtypeString 'Allow for Reg method at late date oDataObject.Properties_.add "LastScanDate", wbemCimtypeString oDataObject.Properties_.add "ScriptVersion", wbemCimtypeString oDataObject.Properties_("PNPID").Qualifiers_.add "key", True oDataObject.Put_ If debug = True then ReportProgress "End subroutine: CreateWMIClass()" End if End Function ' UpdateWMI9 Sub WriteWMI Set oNewObject = oServices.Get("ES_WOL").SpawnInstance_ For i=0 To inext oNewObject.PNPID = ArrayNAPNPID(i) oNewObject.NICName = ArrayNAName(i) oNewObject.NICMac = ArrayNAMAC(i) tmp = ArrayNAMagicPacket(i) If IsEmpty(tmp) = True Or IsNull(tmp)= True Or tmp = "" Then tmp = "False" End If oNewObject.MagicPacket = tmp tmp = ArrayNAWakeEnable(i) If IsEmpty(tmp) = True Or IsNull(tmp)= True Or tmp = "" Then tmp = "False" End If oNewObject.WakeEnable = tmp oNewObject.DetectionMethod = "Script" oNewObject.LastScanDate = datetime oNewObject.ScriptVersion = strScriptVersion oNewObject.Put_ Next End Sub '========================== '= Main '========================== On Error Resume Next datetime = Now() 'Main WMI Class Set oLocation = CreateObject("WbemScripting.SWbemLocator") Set oServices = oLocation.ConnectServer(strComputer, "root\cimv2") set oNewObject = oServices.Get("ES_WOL") oNewObject.Delete_ 'Set oLocation = CreateObject("WbemScripting.SWbemLocator") 'Set oServices = oLocation.ConnectServer(strComputer, "root\cimv2") Set oDataObject = oServices.Get On Error Goto 0 GetNICDetails() CreateWMIClass() WriteWMI() If debug = True Then ReportProgress "****Done****" End If