'Copyright (c) Microsoft Corporation. All rights reserved. '//////////////////////////////////////////////////////////////////////////////////////// '//////////////////////////////////////////////////////////////////////////////////////// CONST wshOK =0 CONST VALUE_ICON_WARNING =16 CONST wshYesNoDialog =4 CONST VALUE_ICON_QUESTIONMARK =32 CONST VALUE_ICON_INFORMATION =64 CONST HKEY_LOCAL_MACHINE =&H80000002 CONST KEY_SET_VALUE =&H0002 CONST KEY_QUERY_VALUE =&H0001 CONST REG_SZ =1 CONST OfficeAppId = "0ff1ce15-a989-479d-af46-f275c6370663" CONST STR_SYS32PATH = ":\Windows\System32\" CONST STR_OSPPREARMPATH = "\Microsoft Office\Office16\OSPPREARM.EXE" CONST STR_OSPPREARMPATH_DEBUG = "\Microsoft Office Debug\Office16\OSPPREARM.EXE" CONST REG_OSPP = "SOFTWARE\Microsoft\OfficeSoftwareProtectionPlatform" CONST STR_HEARTBEATPATH = "\Microsoft\Office\Heartbeat\HeartbeatCache.xml" CONST REG_SPP = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\SoftwareProtectionPlatform" CONST VER_INFO = "Version Info: 2016 1.0" '//////////////////////////////////////////////////////////////////////////////////////// CONST MSG_NOREGRIGHTS = "Insufficient rights to perform operation." CONST MSG_ISCMD_ELEVATED = "Ensure cmd.exe is elevated (right click > run as administrator)." CONST MSG_CREDENTIALFAILURE = "Connection failed with passed credentials." CONST MSG_FILENOTFOUND = "File not found: " CONST MSG_SEPERATESMALL = "---------------" CONST MSG_SEPERATE = "---------------------------------------" CONST MSG_PROCESSING = "---Processing--------------------------" CONST MSG_EXIT = "---Exiting-----------------------------" CONST MSG_UNSUPPORTED = "Unsupported command passed." CONST MSG_UNSUPPORTEDOPEROS7 = "The following command is supported on Windows 7 only: " CONST MSG_UNSUPPORTEDOPEROS8 = "The following command is supported on Windows 8 and above only: " CONST MSG_UNSUPPORTEDLOCAL = "The following command is supported on local machine only: " CONST MSG_CREDENTIALERR = "Passing credentials is not supported for this command." CONST MSG_SUCCESS = "Successfully applied setting." CONST MSG_NOKMSLICS = "No Office KMS licenses were found on the system." CONST MSG_ACTATTEMPT = "Installed product key detected - attempting to activate the following product:" CONST MSG_TOKACTATTEMPT = "Installed product key detected - attempting to token activate the following product:" CONST MSG_NOKEYSINSTALLED = "" CONST MSG_UNINSTALLKEYSUCCESS = "" CONST MSG_ACTSUCCESS = "" CONST MSG_OFFLINEACTSUCCESS = "" CONST MSG_KEYINSTALLSUCCESS = "" CONST MSG_PARTIALKEY = "Last 5 characters of installed product key: " CONST MSG_UNINSTALLKEY = "Uninstalling product key for: " CONST MSG_UNRECOGFILE = "Unrecognized file. Office licenses have an .xrm-ms file extension." CONST MSG_INSTALLLICENSE = "Installing Office license: " CONST MSG_INSTALLLICSUCCESS = "Office license installed successfully." CONST MSG_SEARCHEVENTSKMS = "Searching for KMS activation events on machine: " CONST MSG_SEARCHEVENTSRET = "Searching for Internet activation failure events on machine: " CONST MSG_NOEVENTSSKMS = "No KMS activation events found on machine: " CONST MSG_NOEVENTSRET = "No failure events found on machine: " CONST MSG_OSPPSVC_NOINSTALL = "Error: The Software Protection Platform service is not installed." CONST MSG_OSPPSVC_NORUN = "Error: The Software Protection Platform service is not running." CONST MSG_ERRPARTIALKEY = "The last 5 characters of an installed product key are required to run this option. Run the /dstatus option to display the partial product key." CONST MSG_KEYNOTFOUND = "" CONST MSG_CMID = "Client Machine ID (CMID): " CONST MSG_CMID_NOTFOUND = "Not found." CONST MSG_NOLICENSEFOUND = "" CONST MSG_AUTHERR = "Authorization Error: 0x" CONST MSG_REMILID = "Removed Token-based Activation License with License ID (ILID): " CONST MSG_NOTFOUNDILID = "License not found with License ID (ILID): " CONST MSG_KMSLOOKUP = "KMS Lookup Domain: " CONST MSG_INFO_ONLY = " (for information purposes only as the status is licensed)" CONST MSG_ACT_ERROR_FOUND_KB = "NOTICE: A KB article has been detected for activation failure: " CONST MSG_ACT_ERROR_KB_LINK = "FOR MORE INFORMATION PLEASE VISIT: http://support.microsoft.com/kb/2870357#Error0x" '//////////////////////////////////////////////////////////////////////////////////////// CONST MSG_VLActivationType = "Activation Type Configuration: " '//////////////////////////////////////////////////////////////////////////////////////// CONST MSG_Act_Recent = "Most recent successful activation client information: " CONST MSG_KMS_DNS = "KMS machine name from DNS: " CONST MSG_KMS_DNS_ERR = "DNS auto-discovery: KMS name not available" CONST MSG_ADInfoAOName = "Activation Object name: " CONST MSG_ADInfoAODN = "AO DN: " CONST MSG_ADInfoExtendedPid = "AO extended PID: " CONST MSG_ADInfoActID = "AO activation ID: " CONST MSG_ACTIVATION_INTERVAL = "Activation Interval: " CONST MSG_RENEWAL_INTERVAL = "Renewal Interval: " CONST MSG_HOST_CACHING = "KMS host caching: " CONST MSG_HOST_REG_OVERRIDE = "KMS machine registry override defined: " CONST MSG_DEFAULT_PORT = "1688" '//////////////////////////////////////////////////////////////////////////////////////// CONST MSG_PID = "PRODUCT ID: " CONST MSG_SKUID = "SKU ID: " CONST MSG_LICENSENAME = "LICENSE NAME: " CONST MSG_DESCRIPTION = "LICENSE DESCRIPTION: " CONST MSG_LICSTATUS = "LICENSE STATUS: " CONST MSG_LICENSED = " ---LICENSED--- " CONST MSG_UNLICENSED = " ---UNLICENSED--- " CONST MSG_OOBGRACE = " ---OOB_GRACE--- " CONST MSG_OOTGRACE = " ---OOT_GRACE--- " CONST MSG_NONGENGRACE = " ---NON_GENUINE_GRACE--- " CONST MSG_NOTIFICATION = " ---NOTIFICATIONS--- " CONST MSG_EXTENDEDGRACE = " ---EXTENDED GRACE--- " CONST MSG_LICUNKNOWN = " ---UNKNOWN--- " CONST MSG_REMAINGRACE = "REMAINING GRACE: " CONST MSG_LICEXPIRY = "BETA EXPIRATION: " CONST MSG_ERRCODE = "ERROR CODE: " CONST MSG_ERRDESC = "ERROR DESCRIPTION: " CONST MSG_ERRUNKNOWN = "An unknown error occurred." CONST MSG_ERRCODEVALUE = "An error code must start with '0x'. Example: 0xC004F009" '//////////////////////////////////////////////////////////////////////////////////////// CONST MSG_NOEVENTS = "No events found." CONST MSG_HEARTBEAT_LOCALONLY = "HEARTBEATCACHE.XML SUPPORTED FOR LOCAL MACHINE ONLY." CONST MSG_SEARCHFOR = "SEARCHING FOR INSTANCES OF " CONST MSG_SEARCH_FORKEY = "SEARCHING FOR OFFICE PRODUCT KEYS ON MACHINE: " CONST MSG_EVENT_1013 = "ACTIVATION SUCCESS EVENT: " CONST MSG_EVENT_8200 = "ACTIVATION FAILURE EVENT: " CONST MSG_EVENT_1016 = "INSTALL PRODUCT KEY SUCCESS EVENT: " CONST MSG_EVENT_1017 = "INSTALL PRODUCT KEY FAILURE EVENT: " CONST MSG_EVENT_2011 = "OLC-OLS EVENT: " CONST MSG_NOKEYSINSTALLED_SUB = "<<<<< NO INSTALLED -SUBSCRIPTION- PRODUCT KEYS DETECTED >>>>>" CONST MSG_NOKEYSINSTALLED_PERP = "<<<<< NO INSTALLED -PERPETUAL- PRODUCT KEYS DETECTED >>>>" CONST MSG_KEYSINSTALLED_SUB = "<<<<< -SUBSCRIPTION- PRODUCT KEY DETECTED. REPORTING ON ADDITIONAL PROPERTIES >>>>>" CONST MSG_KEYSINSTALLED_PERP = "<<<<< -PERPETUAL- PRODUCT KEY DETECTED. REPORTING ON ADDITIONAL PROPERTIES >>>>>" '//////////////////////////////////////////////////////////////////////////////////////// '//////////////////////////////////////////////////////////////////////////////////////// On Error Resume Next Set WshShell = WSCript.CreateObject("WSCript.Shell") Set objFSO = CreateObject("Scripting.FileSystemObject") Set objNetwork = WSCript.CreateObject("WSCript.Network") Dim globalResource, globalErr, foundSlUi, strSluiPath, strLocal, objWMI, objWMI1, wmiErr, productinstances, strValue, Win7, productClass, tokenClass, intIsKms, kmsCounter, isAdActivated, dlicense, foundSubKey, foundPerpKey, Win8, strSkuId, errorKBs globalResource = "" globalErr = "" foundSlUi = False Win7 = False Win8 = False kmsCounter = 0 isAdActivated = False dlicense = False strSkuId = Null currentDir = Left(WScript.ScriptFullName, InStrRev(WScript.ScriptFullName, "\")) ' Activation error codes for which a KB is available errorKBs = "80070422|80070426|C004F074|80070001|80070005|8007000D|8007232B|8007251D|C004F014|C004F038|C004F039|C004F041|C004F042|C004C003|4004F040" 'Select Case WSCript.Arguments.Count ' Case 0 ' verifyFileExists currentDir & "ospp.htm" ' showIePopUp currentDir & "ospp.htm" ' WScript.Quit ' Case 1 ' var1 = WSCript.Arguments(0) ' Case 2 ' var1 = WSCript.Arguments(0) ' var2 = WSCript.Arguments(1) ' Case 3 ' var1 = WSCript.Arguments(0) ' var2 = WSCript.Arguments(1) ' var3 = WSCript.Arguments(2) ' Case 4 ' var1 = WSCript.Arguments(0) ' var2 = WSCript.Arguments(1) ' var3 = WSCript.Arguments(2) ' var4 = WSCript.Arguments(3) ' Case Else 'End Select '//////////////////////////////////////////////////////////////////////////////////////// '//////////////////////////////////////////////////////////////////////////////////////// var1="/dstatus" Call Main(var1,var2,var3,var4) '//////////////////////////////////////////////////////////////////////////////////////// '//////////////////////////////////////////////////////////////////////////////////////// Sub Main(strCommand,strMachine,strUser,strPassword) 'Wscript.Echo strCommand & " " & strMachine & " " & strUser & " " & strPassword On Error Resume Next getEngine() pProcessing() getSlui() strLocal = objNetwork.ComputerName strCommand = LCase(strCommand) strCommand="/dstatus" Select Case strCommand Case "/act", "/dstatus", "/dstatusall", "/dinstid", "/dtokils", _ "/remhst", "/stokflag", "/ctokflag", "/dcmid", "/dtokcerts", "/ckms-domain", "/dpid" connectWMI strMachine,strUser,strPassword,"" performLicAction strCommand,"","" Case "/dlicenseinfo" If strMachine <> "" Then WScript.Echo MSG_SEARCH_FORKEY & strMachine Else WScript.Echo MSG_SEARCH_FORKEY & strLocal End If WScript.Echo MSG_SEPERATE 'Connect WMI dlicense = True connectWMI strMachine,strUser,strPassword,"" 'Display licensestatus for all product keys performLicAction "/dstatusall","","" 'Display PID/MachineID for sub keys performLicAction "/dpid","",strMachine WScript.Echo MSG_SEPERATE 'Display MachineId getMachineId strMachine 'Display HeartBeatXml getHeartbeatXml strMachine 'Display OLC-OLS events getEvents MSG_EVENT_2011,"Application","2011","Microsoft Office 15",strMachine 'Display SPP related events: InstallProof & SLActivate If Win7 = True Then getEvents MSG_EVENT_1016,"Application","1016","Office Software Protection Platform Service",strMachine getEvents MSG_EVENT_1017,"Application","1017","Office Software Protection Platform Service",strMachine getEvents MSG_EVENT_1013,"Application","1013","Office Software Protection Platform Service",strMachine getEvents MSG_EVENT_8200,"Application","8200","Office Software Protection Platform Service",strMachine Else getEvents MSG_EVENT_1016,"Application","1016","Microsoft-Windows-Security-SPP",strMachine getEvents MSG_EVENT_1017,"Application","1017","Microsoft-Windows-Security-SPP",strMachine getEvents MSG_EVENT_1013,"Application","1013","Microsoft-Windows-Security-SPP",strMachine getEvents MSG_EVENT_8200,"Application","1014","Microsoft-Windows-Security-SPP",strMachine End If quitExit() Case "/dhistoryacterr", "/dhistorykms" connectWMI strMachine,strUser,strPassword,"" performLicAction strCommand,"",strMachine Case "/puserops", "/duserops" connectWMI strMachine,strUser,strPassword,"reg" performRegAction strCommand Case "/osppsvcrestart", "/osppsvcauto" connectWMI strMachine,strUser,strPassword,"" performServiceAction strCommand Case "/help", "help", "?", "/?", "/?" verifyFileExists currentDir & "ospp.htm" showIePopUp currentDir & "ospp.htm" quitExit() Case "/regmof" registerMof "osppwmi.mof" Case "/rearm" If strMachine = "" Then reARM "" Else globalPopFailure MSG_UNSUPPORTEDLOCAL & vbCr & strCommand,True End If quitExit() Case "/version" globalPopSuccess VER_INFO,True Case Else pos = InStr(strCommand,":") Select Case pos Case 7 getCommand = Left(strCommand,6) Case 8 getCommand = Left(strCommand,7) Case 13 getCommand = Left(strCommand,12) Case Else globalPopFailure MSG_UNSUPPORTED,True End Select Select Case getCommand Case "/skms-domain", "/actype", "/inpkey", "/unpkey", "/inslic", "/actcid", "/sethst", "/setprt", "/ddescr", "/rtokil", "/tokact", "/cachst", "/rearm" strValue = Replace(strCommand,getCommand & ":","") If strValue = "" Then globalPopFailure MSG_UNSUPPORTED & " A value is required for: " & strCommand,True End If If getCommand = "/ddescr" Then If Left(strValue,2) = "0x" Then getDescription strValue,"" Else WScript.Echo MSG_ERRCODEVALUE quitExit() End If ElseIf getCommand = "/rearm" Then If strMachine = "" Then reARM strValue Else globalPopFailure MSG_UNSUPPORTEDLOCAL & vbCr & strCommand,True End If quitExit() Else connectWMI strMachine,strUser,strPassword,"" performLicAction getCommand,strValue,"" End If Case Else globalPopFailure MSG_UNSUPPORTED,True End Select End Select End Sub '//////////////////////////////////////////////////////////////////////////////////////// '//////////////////////////////////////////////////////////////////////////////////////// Function showIePopUp(strPath) On Error Resume Next Set objExplorer = CreateObject("InternetExplorer.Application") With objExplorer .Navigate strPath .ToolBar = 0 .StatusBar = 0 .Width = 1000 .Height = 593 .Left = 1 .Top = 1 .Visible = 1 End With End Function '//////////////////////////////////////////////////////////////////////////////////////// '//////////////////////////////////////////////////////////////////////////////////////// Function getEngine() strEngine = LCase(Right(WScript.FullName,12)) If strEngine <> "\cscript.exe" Then WshShell.Popup "Unable to perform operation. " & WSCript.ScriptName & " requires the cscript engine." & _ vbCr & "Command line example: cscript ospp.vbs ?", _ ,WSCript.ScriptName, VALUE_ICON_WARNING WScript.Quit End If End Function '//////////////////////////////////////////////////////////////////////////////////////// '//////////////////////////////////////////////////////////////////////////////////////// Function WMIDateStringToDate(dtmEventDate) WMIDateStringToDate = CDate(Mid(dtmEventDate, 5, 2) & "/" & _ Mid(dtmEventDate, 7, 2) & "/" & Left(dtmEventDate, 4) _ & " " & Mid (dtmEventDate, 9, 2) & ":" & _ Mid(dtmEventDate, 11, 2) & ":" & Mid(dtmEventDate, _ 13, 2)) End Function '//////////////////////////////////////////////////////////////////////////////////////// '//////////////////////////////////////////////////////////////////////////////////////// Function getDescription(strSearch,cType) If foundSlUi <> True Then If cType <> "wmi" Then globalPopFailure "slui.exe not found.",True quitExit() End If Else Set objScriptExec = WshShell.Exec (strSluiPath & " 0x2a " & strSearch) readOut = objScriptExec.StdOut.ReadAll quitExit() End If End Function '//////////////////////////////////////////////////////////////////////////////////////// '//////////////////////////////////////////////////////////////////////////////////////// Function checkRegRights(wmiObject,strKeyPath) On Error Resume next wmiObject.CheckAccess HKEY_LOCAL_MACHINE, strKeyPath, KEY_SET_VALUE, _ bHasAccessRight If bHasAccessRight = True Then 'Success Else globalPopFailure MSG_NOREGRIGHTS & vbCr & MSG_ISCMD_ELEVATED,True End If End Function '//////////////////////////////////////////////////////////////////////////////////////// '//////////////////////////////////////////////////////////////////////////////////////// Function quitExit() Set WshShell = Nothing Set objFSO = Nothing Set objNetwork = Nothing Set objWMI = Nothing 'WScript.Echo MSG_SEPERATE 'WScript.Echo MSG_EXIT WSCript.Quit End Function '//////////////////////////////////////////////////////////////////////////////////////// '//////////////////////////////////////////////////////////////////////////////////////// Function verifyFileExists(file) If Not objFSO.FileExists(file) Then If file = currentDir & "slerror.xml" Then 'WScript.Echo "[" & MSG_FILENOTFOUND & file & " Unable to display error description.]" ElseIf file = currentDir & "ospp.htm" Then 'globalPopFailure MSG_FILENOTFOUND & vbCr & file,False quitExit() Else 'globalPopFailure MSG_FILENOTFOUND & vbCr & file,True End If End If End Function '//////////////////////////////////////////////////////////////////////////////////////// '//////////////////////////////////////////////////////////////////////////////////////// Function registerMof(strFile) For Each Drv In objFSO.Drives If Drv.DriveType=2 Then If objFSO.FileExists(Drv.DriveLetter & STR_SYS32PATH & "wbem\mofcomp.exe") Then foundComp = True strMofExePath = Drv.DriveLetter & STR_SYS32PATH & "wbem\mofcomp.exe" If objFSO.FileExists(Drv.DriveLetter & STR_SYS32PATH & "wbem\" & strFile) Then foundMof = True strOWmi = Drv.DriveLetter & STR_SYS32PATH & "wbem\" & strFile Set objScriptExec = WshShell.Exec (strMofExePath & " " & strOWmi) readOut = objScriptExec.StdOut.ReadAll WScript.Echo readOut quitExit() End If End If End If Next If foundComp <> True Then globalPopFailure MSG_FILENOTFOUND & Replace(STR_SYS32PATH,":","") & "wbem\mofcomp.exe",True Else If foundMof <> True Then globalPopFailure MSG_FILENOTFOUND & Replace(STR_SYS32PATH,":","") & "wbem\osppwmi.mof",True End If End If End Function '//////////////////////////////////////////////////////////////////////////////////////// '//////////////////////////////////////////////////////////////////////////////////////// Function pProcessing() 'WScript.Echo MSG_PROCESSING 'WScript.Echo MSG_SEPERATE End Function '//////////////////////////////////////////////////////////////////////////////////////// '//////////////////////////////////////////////////////////////////////////////////////// Function getSlui() For Each Drv In objFSO.Drives If Drv.DriveType=2 Then If objFSO.FileExists(Drv.DriveLetter & STR_SYS32PATH & "slui.exe") Then strSluiPath = Drv.DriveLetter & STR_SYS32PATH & "slui.exe" foundSlUi = True Exit For End If End If Next End Function '//////////////////////////////////////////////////////////////////////////////////////// '//////////////////////////////////////////////////////////////////////////////////////// ' Returns the encoding for a givven file. ' Possible return values: ascii, unicode, unicodeFFFE (big-endian), utf-8 Function GetFileEncoding(strFileName) Dim strData Dim strEncoding Set oStream = CreateObject("ADODB.Stream") oStream.Type = 1 'adTypeBinary oStream.Open oStream.LoadFromFile(strFileName) ' Default encoding is ascii strEncoding = "ascii" strData = BinaryToString(oStream.Read(2)) ' Check for little endian (x86) unicode preamble If (Len(strData) = 2) and strData = (Chr(255) + Chr(254)) Then strEncoding = "unicode" Else oStream.Position = 0 strData = BinaryToString(oStream.Read(3)) ' Check for utf-8 preamble If (Len(strData) >= 3) and strData = (Chr(239) + Chr(187) + Chr(191)) Then strEncoding = "utf-8" End If End If oStream.Close GetFileEncoding = strEncoding End Function '//////////////////////////////////////////////////////////////////////////////////////// '//////////////////////////////////////////////////////////////////////////////////////// ' Converts binary data (VT_UI1 | VT_ARRAY) to a string (BSTR) Function BinaryToString(dataBinary) Dim i Dim str For i = 1 To LenB(dataBinary) str = str & Chr(AscB(MidB(dataBinary, i, 1))) Next BinaryToString = str End Function '//////////////////////////////////////////////////////////////////////////////////////// '//////////////////////////////////////////////////////////////////////////////////////// ' Returns string containing the whole text file data. ' Supports ascii, unicode (little-endian) and utf-8 encoding. Function ReadAllTextFile(strFileName) Dim strData Set oStream = CreateObject("ADODB.Stream") oStream.Type = 2 'adTypeText oStream.Open oStream.Charset = GetFileEncoding(strFileName) oStream.LoadFromFile(strFileName) strData = oStream.ReadText(-1) 'adReadAll oStream.Close ReadAllTextFile = strData End Function '//////////////////////////////////////////////////////////////////////////////////////// '//////////////////////////////////////////////////////////////////////////////////////// Function sppErrHandle(strCommand) globalErr = Hex(Err.Number) Select Case Err.Number Case 0 'Success Select Case strCommand Case "/act","/tokact" WScript.Echo MSG_ACTSUCCESS Case "/inpkey" WScript.Echo MSG_KEYINSTALLSUCCESS quitExit() Case "/inslic" WScript.Echo MSG_INSTALLLICSUCCESS quitExit() Case "/ckms-domain","/skms-domain","/actype","/sethst","/setprt","/remhst","/stokflag","/ctokflag","/cachst" WScript.Echo MSG_SUCCESS quitExit() Case "/rtokil" WScript.Echo MSG_REMILID & UCase(strValue) quitExit() Case "/unpkey" WScript.Echo MSG_UNINSTALLKEYSUCCESS quitExit() Case Else End Select Case Else verifyFileExists currentDir & "slerror.xml" getResource("err" & "0x" & globalErr) If globalResource = "" Then If Len(globalErr) <> "8" Then WScript.Echo MSG_ERRDESC & MSG_ERRUNKNOWN Else If foundSlUi = True Then WScript.Echo MSG_ERRCODE & "0x" & globalErr WScript.Echo MSG_ERRDESC & "Run the following: cscript ospp.vbs /ddescr:0x" & globalErr Else WScript.Echo MSG_ERRCODE & "0x" & globalErr End If End If If strCommand <> "/act" Then quitExit() End If Else WScript.Echo MSG_ERRCODE & "0x" & globalErr Wscript.Echo MSG_ERRDESC & globalResource End If If strCommand = "/dtokcerts" Or strCommand = "/ignore" Then quitExit() End If End Select If globalErr = "C004F074" Then WScript.Echo "To view the activation event history run: cscript " & WScript.ScriptName & " /dhistorykms" End If If strCommand = "/act" And globalErr <> "0" Then ' If a KB article is found, show the KB link lookupKBArticle(globalErr) End If globalResource = "" globalErr = "" Err.Clear End Function '//////////////////////////////////////////////////////////////////////////////////////// '//////////////////////////////////////////////////////////////////////////////////////// Function wmiErrHandle() Select Case Err.Number Case 0 'Successs Case 424 globalPopFailure MSG_ERRCODE & Err.Number & vbCr & MSG_ERRDESC & MSG_CREDENTIALFAILURE,True Case Else If Err.Description <> "" Then globalPopFailure MSG_ERRCODE & Err.Number & vbCr & MSG_ERRDESC & Err.Description,True Else globalPopFailure "An error occurred while making the connection." & vbCr & MSG_ERRCODE & Err.Number,True End If End Select End Function '//////////////////////////////////////////////////////////////////////////////////////// '//////////////////////////////////////////////////////////////////////////////////////// Function setRegValue(wmiObject,opsValue,strValueName) On Error Resume Next Err.Clear() If Win7 = True Then strKeyPath = REG_OSPP Else strKeyPath = REG_SPP End If Select Case strValueName Case "UserOperations" wmiObject.CreateKey HKEY_LOCAL_MACHINE,strKeyPath wmiObject.SetDWORDValue HKEY_LOCAL_MACHINE,_ strKeyPath,strValueName,opsValue Case Else End Select wmiErrHandle() WScript.Echo MSG_SUCCESS quitExit() End Function '//////////////////////////////////////////////////////////////////////////////////////// '//////////////////////////////////////////////////////////////////////////////////////// Function getResource(resource) On Error Resume Next Set xmlDoc = CreateObject("Msxml2.DOMDocument.6.0") xmlDoc.load(currentDir & "slerror.xml") Set ElemList = xmlDoc.getElementsByTagName(resource) resValue = ElemList.item(0).text globalResource = resValue End Function '//////////////////////////////////////////////////////////////////////////////////////// '//////////////////////////////////////////////////////////////////////////////////////// Function globalPopSuccess(strSuccess,boolQuit) If boolQuit = True Then WshShell.Popup strSuccess,,WScript.ScriptName, wshOK + VALUE_ICON_INFORMATION quitExit() Else WshShell.Popup strSuccess,,WScript.ScriptName, wshOK + VALUE_ICON_INFORMATION End If End Function '//////////////////////////////////////////////////////////////////////////////////////// '//////////////////////////////////////////////////////////////////////////////////////// Function globalPopFailure(strFailure,boolQuit) If boolQuit = True Then WshShell.Popup strFailure,,WScript.ScriptName, wshOK + VALUE_ICON_WARNING quitExit() Else WshShell.Popup strFailure,,WScript.ScriptName, wshOK + VALUE_ICON_WARNING End If End Function '//////////////////////////////////////////////////////////////////////////////////////// '//////////////////////////////////////////////////////////////////////////////////////// Function connectWMI(strMachine,strUser,strPassword,ctype) On Error Resume Next If ctype = "" Then If strMachine = "" Or LCase(strMachine) = LCase(strLocal) Then Set objWMI = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" & "." & "\root\cimv2") Else If strUser = "" And strPassword = "" Then Set objWMI = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" & strMachine & "\root\cimv2") Else Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator") Set objWMI = objSWbemLocator.ConnectServer _ (strMachine, "\root\cimv2", strUser, strPassword) wmiErr = CStr(Hex(Err.Number)) If Len(wmiErr) = "8" Then getDescription "0x" & wmiErr,"wmi" End If objWMI.Security_.ImpersonationLevel = 3 End If End If Else If strUser <> "" Then globalPopFailure MSG_CREDENTIALERR,True End If If strMachine = "" Or LCase(strMachine) = LCase(strLocal) Then Set objWMI1 = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" & "." & "\root\default:StdRegProv") Set objWMI = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" & "." & "\root\cimv2") Else Set objWMI1 = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" & strMachine & "\root\default:StdRegProv") Set objWMI = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" & strMachine & "\root\cimv2") End If End If wmiErrHandle() setWinOS() End Function '//////////////////////////////////////////////////////////////////////////////////////// '//////////////////////////////////////////////////////////////////////////////////////// Private Function TkaGetSigner() On Error Resume Next If Win7 = True Then Set TkaGetSigner = WScript.CreateObject("OSPPWMI.OSppWmiTokenActivationSigner") Else Set TkaGetSigner = WScript.CreateObject("SPPWMI.SppWmiTokenActivationSigner") End If If Hex(Err.Number) = "80020009" Then globalPopFailure MSG_ERRCODE & "0x" & Hex(Err.Number) & vbCr & MSG_ERRDESC & Err.Description,True End If End Function '//////////////////////////////////////////////////////////////////////////////////////// '//////////////////////////////////////////////////////////////////////////////////////// Function TkaPrintCertificate(strThumbprint) arrParams = Split(strThumbprint, "|") WScript.Echo "Thumbprint: " & arrParams(0) WScript.Echo "Subject: " & arrParams(1) WScript.Echo "Issuer: " & arrParams(2) vf = FormatDateTime(CDate(arrParams(3)), vbShortDate) WScript.Echo "Valid From: " & vf vt = FormatDateTime(CDate(arrParams(4)), vbShortDate) WScript.Echo "Valid To: " & vt WScript.Echo MSG_SEPERATE End Function '//////////////////////////////////////////////////////////////////////////////////////// '//////////////////////////////////////////////////////////////////////////////////////// Function ExecuteQuery(strSelect,strWhere,strClass) Err.Clear If strWhere = "" Then Set productinstances = objWMI.ExecQuery("SELECT " & strSelect & " FROM " & strClass) Else Set productinstances = objWMI.ExecQuery("SELECT " & strSelect & " FROM " & strClass & " WHERE " & strWhere) End If sppErrHandle "" End Function '//////////////////////////////////////////////////////////////////////////////////////// '//////////////////////////////////////////////////////////////////////////////////////// Function performLicAction(strCommand,strValue,strMachine) On Error Resume Next If strCommand = "/dhistorykms" Or strCommand = "/dhistoryacterr" Then verifyFileExists currentDir & "slerror.xml" If strCommand = "/dhistorykms" Then '12288 = KMS Activation event id eventCode = "12288" strSrcEvents = MSG_SEARCHEVENTSKMS strNoEvents = MSG_NOEVENTSSKMS Else '8200 = Internet Activation event id eventCode = "8200" strSrcEvents = MSG_SEARCHEVENTSRET strNoEvents = MSG_NOEVENTSRET End If If strMachine <> "" Then WScript.Echo strSrcEvents & strMachine Else WScript.Echo strSrcEvents & strLocal End If WScript.Echo "Event ID: " & eventCode WScript.Echo vbCr Set objEvents = objWMI.ExecQuery _ ("Select * from Win32_NTLogEvent Where Logfile = 'Application' and " _ & "EventCode = '" & eventCode & "'") If objEvents.Count > 0 Then For each objEvent in objEvents If strCommand = "/dhistoryacterr" Then i = i + 1 dtmEventDate = objEvent.TimeWritten strTimeWritten = WMIDateStringToDate(dtmEventDate) WScript.Echo "Coordinated Universal Time Written: " & strTimeWritten strReplCrs = Replace(objEvent.Message,vbCrLf,"") WScript.Echo "MESSAGE: " & strReplCrs strhr10 = Right(strReplCrs,10) getResource("err" & strhr10) If globalResource = "" Then If foundSlUi = True Then WScript.Echo MSG_ERRDESC & "Run the following: cscript ospp.vbs /ddescr:" & strhr10 Else WScript.Echo MSG_ERRDESC & "Not available." End If Else Wscript.Echo MSG_ERRDESC & globalResource End If WScript.Echo MSG_SEPERATE Else strhr10 = Mid(objEvent.Message,90,10) strReplCrs = Replace(objEvent.Message,vbCrLf,"") If Right(strReplCrs,2) = " 5" Then strReplStrs = Replace(strReplCrs,"The client has sent an activation request to the key management service machine.Info:","") dtmEventDate = objEvent.TimeWritten strTimeWritten = WMIDateStringToDate(dtmEventDate) WScript.Echo "Coordinated Universal Time Written: " & strTimeWritten intColon = InStr(strReplStrs,":") strErrHost = Left(strReplStrs,intColon) strErrHost = Trim(strErrHost) strErrHost = Replace(strErrHost,":","") WScript.Echo "ERROR/HOST: " & strErrHost Select Case strhr10 Case "0x00000000" WScript.Echo MSG_ERRDESC & "N/A" Case Else getResource("err" & strhr10) If globalResource = "" Then If foundSlUi = True Then WScript.Echo MSG_ERRDESC & "Run the following: cscript ospp.vbs /ddescr:" & strhr10 ' If a KB article is found, show the KB link lookupKBArticle(Right(strhr10, 8)) Else WScript.Echo MSG_ERRDESC & "Not available." End If Else Wscript.Echo MSG_ERRDESC & globalResource ' If a KB article is found, show the KB link lookupKBArticle(Right(strhr10, 8)) End If End Select WScript.Echo MSG_SEPERATE End If End If Next Else WScript.Echo MSG_SEPERATE If strMachine <> "" Then WScript.Echo strNoEvents & strMachine Else WScript.Echo strNoEvents & strLocal End If WScript.Echo MSG_SEPERATE End If quitExit() End If 'Verify osppsvc service is installed for win7 case If Win7 = True Then Set colListOfServices = objWMI.ExecQuery _ ("Select * from Win32_Service ") For Each objService in colListOfServices If objService.Name = "osppsvc" Then installed = True Exit For End If Next If installed <> True Then globalPopFailure MSG_OSPPSVC_NOINSTALL,True End If End If Select Case strCommand 'The following operations are performed @ a service level Case "/inpkey", "/dcmid", "/inslic", "/cachst", "/stokflag", "/ctokflag", "/dstatus", "/dstatusall", "/dpid" If Win7 = True Then For Each objService in objWMI.InstancesOf("OfficeSoftwareProtectionService") Set objOspp = objService Exit For Next Else 'Win8 and beyond For Each objService in objWMI.InstancesOf("SoftwareLicensingService") Set objOspp = objService Exit For Next End If Case Else End Select sppErrHandle "" If strCommand = "/inpkey" Then i = i + 1 Err.Clear objOspp.InstallProductKey(strValue) sppErrHandle(strCommand) ElseIf strCommand = "/cachst" Then i = i + 1 If strValue = "true" Then objOspp.DisableKeyManagementServiceHostCaching(False) sppErrHandle(strCommand) ElseIf strValue = "false" Then objOspp.DisableKeyManagementServiceHostCaching(True) sppErrHandle(strCommand) Else globalPopFailure MSG_UNSUPPORTED & " A TRUE or FALSE value is required for: " & strCommand,True End If ElseIf strCommand = "/dcmid" Then If Win8 = True Then 'Check if KMS key installed. If yes retrieve the SKUID value. ExecuteQuery "ID, ApplicationId, Description, Name","ApplicationId = '" & OfficeAppId & "' " & "AND PartialProductKey <> NULL ",productClass For each instance in productinstances sppErrHandle "" intIsKms = InStr(UCase(instance.Description),"KMS") If intIsKms <> 0 Then strSkuId = instance.ID Exit For End If Next If strSkuId = Null Then WScript.Echo MSG_CMID & MSG_CMID_NOTFOUND quitExit() End If 'Return the last Office KMS event containing containing the SKUID value for the installed KMS key. '& retrieve the CMID value from the event. oKmsEventCounter = 0 eventCode = "12288" Set objEvents = objWMI.ExecQuery _ ("Select * from Win32_NTLogEvent Where Logfile = 'Application' and " _ & "EventCode = '" & eventCode & "'") If objEvents.Count > 0 Then For each objEvent in objEvents oKmsEvent = InStr(objEvent.Message,strSkuId) If oKmsEvent <> 0 Then oKmsEventCounter = oKmsEventCounter + 1 parseEvntMsg1 = InStr(objEvent.Message, ", ") parseEvntMsg2 = InStr(parseEvntMsg1 + 2,objEvent.Message, ", ") parseEvntMsg3 = InStr(parseEvntMsg2 + 2,objEvent.Message, ", ") parseEvntMsg4 = InStr(parseEvntMsg3 + 2,objEvent.Message, ", ") WScript.Echo MSG_CMID & Mid(objEvent.Message,parseEvntMsg3 + 2,parseEvntMsg4 - (parseEvntMsg3 + 2)) Exit For End If Next End If If oKmsEventCounter = 0 Then WScript.Echo MSG_CMID & MSG_CMID_NOTFOUND End If Else If objOspp.ClientMachineID <> "" Or objOspp.ClientMachineID <> Null Then WScript.Echo MSG_CMID & objOspp.ClientMachineID Else WScript.Echo MSG_CMID & MSG_CMID_NOTFOUND End If End If quitExit() ElseIf strCommand = "/inslic" Then i = i + 1 If Right(strValue,7) = ".xrm-ms" Then verifyFileExists strValue WScript.Echo MSG_INSTALLLICENSE & strValue Else globalPopFailure MSG_UNRECOGFILE,True End If LicenseData = ReadAllTextFile(strValue) objOSpp.InstallLicense(LicenseData) SppErrHandle(strCommand) ElseIf strCommand = "/stokflag" Then i = i + 1 If Win7 = True Then objOspp.DisableKeyManagementServiceActivation(True) sppErrHandle(strCommand) Else 'Unsupported - osppsvc only supports this. globalPopFailure MSG_UNSUPPORTEDOPEROS7 & vbCr & strCommand,True End If ElseIf strCommand = "/ctokflag" Then i = i + 1 If Win7 = True Then objOspp.DisableKeyManagementServiceActivation(False) SppErrHandle(strCommand) Else 'Unsupported - osppsvc only supports this. globalPopFailure MSG_UNSUPPORTEDOPEROS7 & vbCr & strCommand,True End If ElseIf strCommand = "/dtokils" Then Err.Clear Set objWmiDate = CreateObject("WBemScripting.SWbemDateTime") ExecuteQuery "ILID, ILVID, AuthorizationStatus, ExpirationDate, Description, AdditionalInfo","",tokenClass For Each instance in productinstances sppErrHandle "" i = i + 1 WScript.Echo "License ID (ILID): " & instance.ILID WScript.Echo "Version ID (ILvID): " & instance.ILVID If Not IsNull(instance.ExpirationDate) Then objWmiDate.Value = instance.ExpirationDate If (objWmiDate.GetFileTime(false) <> 0) Then WScript.Echo "Expiry Date: " & objWmiDate.GetVarDate End If End If If Not IsNull(instance.AdditionalInfo) Then WScript.Echo "Additional Info: " & instance.AdditionalInfo End If If Not IsNull(instance.AuthorizationStatus) And instance.AuthorizationStatus <> 0 Then globalErr = CStr(Hex(instance.AuthorizationStatus)) WScript.Echo MSG_AUTHERR & globalErr quitExit() Else WScript.Echo "Description: " & instance.Description End If WScript.Echo MSG_SEPERATE Next If i = 0 Then WScript.Echo MSG_NOLICENSEFOUND End If quitExit() ElseIf strCommand = "/rtokil" Then Err.Clear ExecuteQuery "ILID, ID","",tokenClass For Each instance in productinstances sppErrHandle "" i = i + 1 If LCase(strValue) = LCase(instance.ILID) Then instance.Uninstall SppErrHandle(strCommand) Else WScript.Echo MSG_NOTFOUNDILID & strValue & " Run /dtokils to display the ILID for installed licenses." End If Next If i = 0 Then WScript.Echo MSG_NOLICENSEFOUND End If quitExit() ElseIf strCommand = "/dtokcerts" Then Err.Clear Set objSigner = TkaGetSigner() sppErrHandle(strCommand) ExecuteQuery "ID, Name, ApplicationId, PartialProductKey, Description, LicenseIsAddon ","ApplicationId = '" & OfficeAppId & "' " & "AND PartialProductKey <> NULL " & "AND LicenseIsAddon = FALSE",productClass For each instance in productinstances i = i + 1 sppErrHandle "" iRet = instance.GetTokenActivationGrants(arrGrants) If Err.Number = 0 Then arrThumbprints = objSigner.GetCertificateThumbprints(arrGrants) If Err.Number = 0 Then For Each strThumbprint in arrThumbprints TkaPrintCertificate strThumbprint Next Else sppErrHandle "" End If Else sppErrHandle "" End If WScript.Echo MSG_SEPERATE Err.Clear Next ElseIf strCommand = "/tokact" Then Err.Clear Set objSigner = TkaGetSigner() sppErrHandle "/ignore" pos1 = InStr(strValue,":") If pos1 = 0 Then 'PIN not passed strThumbprint = strValue Else 'PIN passed strThumbprint = Left(strValue,pos1 - 1) strPin = Replace(strValue,strThumbprint & ":","") End If ExecuteQuery "ID, Name, ApplicationId, PartialProductKey, Description, LicenseIsAddon ","ApplicationId = '" & OfficeAppId & "' " & "AND PartialProductKey <> NULL " & "AND LicenseIsAddon = FALSE",productClass For each instance in productinstances i = i + 1 sppErrHandle "" WScript.Echo MSG_TOKACTATTEMPT WScript.Echo MSG_SKUID & instance.ID WScript.Echo MSG_LICENSENAME & instance.Name WScript.Echo MSG_DESCRIPTION & instance.Description WScript.Echo MSG_PARTIALKEY & instance.PartialProductKey iRet = instance.GenerateTokenActivationChallenge(strChallenge) If Err.Number = 0 Then strAuthInfo1 = objSigner.Sign(strChallenge, strThumbprint, strPin, strAuthInfo2) If Err.Number = 0 Then iRet = instance.DepositTokenActivationResponse(strChallenge, strAuthInfo1, strAuthInfo2) SppErrHandle(strCommand) Else sppErrHandle "" End If Else sppErrHandle "" End If WScript.Echo MSG_SEPERATE Next Else Err.Clear If strCommand = "/dstatus" Or strCommand = "/dstatusall" Or strCommand = "/dpid" Then If Win7 = True Then ExecuteQuery "ID, ApplicationId, EvaluationEndDate, PartialProductKey, Description, Name, LicenseStatus, LicenseStatusReason, ProductKeyID, GracePeriodRemaining, DiscoveredKeyManagementServiceMachineName, DiscoveredKeyManagementServiceMachinePort, VLActivationInterval, VLRenewalInterval, KeyManagementServiceMachine, KeyManagementServicePort, ProductKeyID2","ApplicationId = '" & OfficeAppId & "' ",productClass Else ExecuteQuery "ID, ApplicationId, EvaluationEndDate, PartialProductKey, Description, Name, LicenseStatus, LicenseStatusReason, ProductKeyID, GracePeriodRemaining, KeyManagementServiceLookupDomain, VLActivationType, ADActivationObjectName, ADActivationObjectDN, ADActivationCsvlkPid, ADActivationCsvlkSkuId, VLActivationTypeEnabled, DiscoveredKeyManagementServiceMachineName, DiscoveredKeyManagementServiceMachinePort, VLActivationInterval, VLRenewalInterval, KeyManagementServiceMachine, KeyManagementServicePort, ProductKeyID2","ApplicationId = '" & OfficeAppId & "' ",productClass End If ElseIf strCommand = "/act" Then ExecuteQuery "ID, ApplicationId, PartialProductKey, Description, Name","ApplicationId = '" & OfficeAppId & "' " & "AND PartialProductKey <> NULL ",productClass ElseIf strCommand = "/unpkey" Then ExecuteQuery "ID, ApplicationId, Description, PartialProductKey, Name, ProductKeyID","ApplicationId = '" & OfficeAppId & "' " & "AND PartialProductKey <> NULL ",productClass ElseIf strCommand = "/dinstid" Or strCommand = "/actcid" Then ExecuteQuery "ID, ApplicationId, Description, PartialProductKey, Name, OfflineInstallationId","ApplicationId = '" & OfficeAppId & "' " & "AND PartialProductKey <> NULL ",productClass ElseIf strCommand = "/actype" Or strCommand = "/skms-domain" Or strCommand = "/ckms-domain" Then If Win7 = True Then 'Unsupported - sppsvc only supports this. globalPopFailure MSG_UNSUPPORTEDOPEROS8 & vbCr & strCommand,True Else ExecuteQuery "ID, Description, PartialProductKey, ApplicationId ","ApplicationId = '" & OfficeAppId & "' ",productClass End If ElseIf strCommand = "/sethst" Or strCommand = "/setprt" Or strCommand = "/remhst" Then ExecuteQuery "ID, Description, PartialProductKey, ApplicationId ","ApplicationId = '" & OfficeAppId & "' ",productClass End If For Each instance in productinstances sppErrHandle "" If (LCase(instance.ApplicationId) = OfficeAppId) Then If instance.PartialProductKey <> "" Then i = i + 1 End If intIsKms = InStr(UCase(instance.Description),"KMS") If intIsKms <> 0 Then kmsCounter = kmsCounter + 1 End If Select Case strCommand Case "/actype" Select Case strValue Case "0","1","2","3" Case Else globalPopFailure MSG_UNSUPPORTED & " A value of" & vbCr & _ "0 (for all)" & vbCr & "1 (for AD)" & vbCr & "2 (for KMS" & vbCr & _ "3 (for Token)" & vbCr & "Is required for: " & strCommand,True End Select If intIsKms <> 0 Then If strValue <> 0 Then instance.SetVLActivationTypeEnabled(strValue) Else instance.ClearVLActivationTypeEnabled() End If End If sppErrHandle "" Case "/skms-domain" If intIsKms <> 0 Then instance.SetKeyManagementServiceLookupDomain(strValue) End If sppErrHandle "" Case "/ckms-domain" If intIsKms <> 0 Then instance.ClearKeyManagementServiceLookupDomain() End If sppErrHandle "" Case "/sethst" If intIsKms <> 0 Then instance.SetKeyManagementServiceMachine(strValue) End If sppErrHandle "" Case "/setprt" If intIsKms <> 0 Then instance.SetKeyManagementServicePort(strValue) End If sppErrHandle "" Case "/remhst" If intIsKms <> 0 Then instance.ClearKeyManagementServiceMachine() sppErrHandle "" instance.ClearKeyManagementServicePort() sppErrHandle "" End If Case "/act" WScript.Echo MSG_ACTATTEMPT WScript.Echo MSG_SKUID & instance.ID WScript.Echo MSG_LICENSENAME & instance.Name WScript.Echo MSG_DESCRIPTION & instance.Description WScript.Echo MSG_PARTIALKEY & instance.PartialProductKey instance.Activate SppErrHandle(strCommand) WScript.Echo MSG_SEPERATE Case "/unpkey" If Len(strValue) <> "5" Then globalPopFailure MSG_ERRPARTIALKEY,True End If If UCase(strValue) = instance.PartialProductKey Then y = y + 1 WScript.Echo MSG_UNINSTALLKEY & instance.Name instance.UninstallProductKey(instance.ProductKeyID) SppErrHandle(strCommand) End If Case "/dinstid" WScript.Echo "Installation ID for: " & instance.Name & ": " & instance.OfflineInstallationId WScript.Echo MSG_SEPERATE Case "/actcid" instance.DepositOfflineConfirmationId instance.OfflineInstallationId, strValue If Err.Number = 0 Then If telsuccess <> True Then WScript.Echo MSG_LICENSENAME & instance.Name WScript.Echo MSG_OFFLINEACTSUCCESS telsuccess = True End If Else WScript.Echo MSG_LICENSENAME & instance.Name sppErrHandle "" End If WScript.Echo MSG_SEPERATE Case "/dpid" If instance.ProductKeyID <> "" Then intOccurSub = InStr(LCase(instance.Name),"_sub") intOccurPerp = InStr(LCase(instance.Name),"_retail") If intOccurSub <> 0 Or intOccurPerp <> 0 Then WScript.Echo MSG_SEPERATE If intOccurSub <> 0 Then foundSubKey = True WScript.Echo MSG_KEYSINSTALLED_SUB End If If intOccurPerp <> 0 Then foundPerpKey = True WScript.Echo MSG_KEYSINSTALLED_PERP End If WScript.Echo MSG_SEPERATE WScript.Echo MSG_SKUID & UCase(instance.ID) WScript.Echo MSG_LICENSENAME & instance.Name WScript.Echo MSG_PARTIALKEY & instance.PartialProductKey WScript.Echo MSG_PID & instance.ProductKeyID2 'Determine machinekey from PID strPid2 = Replace(instance.ProductKeyID2,"-","") strPid2 = Right(strPid2,19) strGid = Mid(strPid2,1,5) strSerial1 = Mid(strPid2,6,3) strSerial2 = Mid(strPid2,9,6) WScript.Echo "Machine Key: " & strGid & "-" & strSerial1 & "-" & strSerial2 End If End If Case "/dstatus", "/dstatusall" getInstalled = False verifyFileExists currentDir & "slerror.xml" licSr = Hex(instance.LicenseStatusReason) If strCommand = "/dstatusall" Then getInstalled = True ' WScript.Echo MSG_SKUID & instance.ID 'WScript.Echo MSG_LICENSENAME & instance.Name 'WScript.Echo MSG_DESCRIPTION & instance.Description Else If instance.ProductKeyID <> "" Then getInstalled = True 'WScript.Echo MSG_PID & instance.ProductKeyID2 'WScript.Echo MSG_SKUID & instance.ID 'WScript.Echo MSG_LICENSENAME & instance.Name WScript.Echo MSG_DESCRIPTION & instance.Description 'EvaluationEndDate always returns a value. When an expiry date is not defined "1/1/1601" is returned. 'So avoid displaying this against RTM licenses as that date = no expiry defined. If instance.EvaluationEndDate <> "" Then Set objDate = CreateObject("WBemScripting.SWbemDateTime") objDate.Value = instance.EvaluationEndDate If objDate.GetVarDate() <> "1/1/1601" Then WScript.Echo MSG_LICEXPIRY & objDate.GetVarDate() End If Set objDate = Nothing End If End If End If If getInstalled = True Then Select Case instance.LicenseStatus Case 0 WScript.Echo MSG_LICSTATUS & MSG_UNLICENSED Case 1 WScript.Echo MSG_LICSTATUS & MSG_LICENSED Case 2 WScript.Echo MSG_LICSTATUS & MSG_OOBGRACE Case 3 WScript.Echo MSG_LICSTATUS & MSG_OOTGRACE Case 4 WScript.Echo MSG_LICSTATUS & MSG_NONGENGRACE Case 5 WScript.Echo MSG_LICSTATUS & MSG_NOTIFICATION Case 6 WScript.Echo MSG_LICSTATUS & MSG_EXTENDEDGRACE Case Else WScript.Echo MSG_LICSTATUS & MSG_LICUNKNOWN End Select If licSr <> "0" Then If instance.LicenseStatus <> 1 Then 'WScript.Echo MSG_ERRCODE & "0x" & licSr Else 'WScript.Echo MSG_ERRCODE & "0x" & licSr & MSG_INFO_ONLY End If getResource("err" & "0x" & licSr) If globalResource = "" Then If foundSlUi <> True Then 'WScript.Echo MSG_ERRDESC & "Not available." Else 'WScript.Echo MSG_ERRDESC & "Run the following: cscript ospp.vbs /ddescr:0x" & licSr End if Else 'WScript.Echo MSG_ERRDESC & globalResource End If End If If instance.GracePeriodRemaining <> 0 Then dGrace = instance.GracePeriodRemaining / 60 / 24 rndDown = Int(dGrace) WScript.Echo MSG_REMAINGRACE & rndDown & " days " & " (" & instance.GracePeriodRemaining & " minute(s) before expiring" & ")" End If quitExit() If instance.PartialProductKey <> "" Then 'WScript.Echo MSG_PARTIALKEY & instance.PartialProductKey 'WScript.Echo MSG_PARTIALKEY & instance.PartialProductKey 'Display additional volume info for KMS licenses If intIsKms <> 0 Then 'Display activation type set (Win8+). If Win7 <> True Then Select Case instance.VLActivationTypeEnabled Case 1 WScript.Echo MSG_VLActivationType & "AD" Case 2 WScript.Echo MSG_VLActivationType & "KMS" Case 3 WScript.Echo MSG_VLActivationType & "Token" Case Else WScript.Echo MSG_VLActivationType & "ALL" End Select 'Check to see if last activated via AD- display object info (Win8+). If instance.VLActivationType = 1 Then isAdActivated = True WScript.Echo MSG_Act_Recent + "AD" WScript.Echo vbTab & MSG_ADInfoAOName & instance.ADActivationObjectName WScript.Echo vbTab & MSG_ADInfoAODN & instance.ADActivationObjectDN WScript.Echo vbTab & MSG_ADInfoExtendedPid & instance.ADActivationCsvlkPid WScript.Echo vbTab & MSG_ADInfoActID & instance.ADActivationCsvlkSkuId End If End If If isAdActivated = False Then strKms = instance.DiscoveredKeyManagementServiceMachineName strPort = instance.DiscoveredKeyManagementServiceMachinePort If IsNull(strKms) Or (strKms = "") Or IsNull(strPort) Or (strPort = 0) Then WScript.Echo vbTab & MSG_KMS_DNS_ERR Else WScript.Echo vbTab & MSG_KMS_DNS & strKMS & ":" & strPort End If 'Check to see if registry override is defined strKms = instance.KeyManagementServiceMachine If strKms <> "" And Not IsNull(strKms) Then strPort = instance.KeyManagementServicePort If (strPort = 0) Then strPort = MSG_DEFAULT_PORT End If WScript.Echo vbTab & MSG_HOST_REG_OVERRIDE & strKms & ":" & strPort End If WScript.Echo vbTab & MSG_ACTIVATION_INTERVAL & instance.VLActivationInterval & " minutes" WScript.Echo vbTab & MSG_RENEWAL_INTERVAL & instance.VLRenewalInterval & " minutes" If (objOspp.KeyManagementServiceHostCaching = True) Then WScript.Echo vbTab & MSG_HOST_CACHING & "Enabled" Else WScript.Echo vbTab & MSG_HOST_CACHING & "Disabled" End If If Win7 <> True Then If instance.KeyManagementServiceLookupDomain <> "" Then WScript.Echo vbTab & MSG_KMSLOOKUP & instance.KeyManagementServiceLookupDomain End If End If End If End If End If WScript.Echo MSG_SEPERATE End If Case Else End Select End If Next End If Select Case strCommand Case "/unpkey" If y = 0 Then WScript.Echo MSG_KEYNOTFOUND quitExit() End If Case "/ckms-domain","/skms-domain","/actype","/sethst","/setprt","/remhst" If kmsCounter = 0 Then WScript.Echo MSG_NOKMSLICS quitExit() Else sppErrHandle(strCommand) End If Case Else End Select If strCommand <> "/dpid" Then If i = 0 Then WScript.Echo MSG_NOKEYSINSTALLED WScript.Echo MSG_SEPERATE End If Else If foundSubKey <> True Then WScript.Echo MSG_SEPERATE WScript.Echo MSG_NOKEYSINSTALLED_SUB WScript.Echo MSG_SEPERATE End If If foundPerpKey <> True Then WScript.Echo MSG_SEPERATE WScript.Echo MSG_NOKEYSINSTALLED_PERP WScript.Echo MSG_SEPERATE End If End If If dlicense = False Then quitExit() End Function '//////////////////////////////////////////////////////////////////////////////////////// '//////////////////////////////////////////////////////////////////////////////////////// Function performRegAction(strCommand) On Error Resume Next If Win7 = True Then Set colListOfServices = objWMI.ExecQuery _ ("Select * from Win32_Service ") For Each objService in colListOfServices If objService.Name = "osppsvc" Then installed = True Exit For End If Next If installed <> True Then globalPopFailure MSG_OSPPSVC_NOINSTALL,True End If checkRegRights objWMI1,REG_OSPP Else checkRegRights objWMI1,REG_SPP End If Select Case strCommand Case "/puserops" setRegValue objWMI1,"1","UserOperations" Case "/duserops" setRegValue objWMI1,"0","UserOperations" End Select End Function '//////////////////////////////////////////////////////////////////////////////////////// '//////////////////////////////////////////////////////////////////////////////////////// Function performServiceAction(strCommand) On Error Resume Next Set colListOfServices = objWMI.ExecQuery _ ("Select * from Win32_Service ") For Each objService in colListOfServices If objService.Name = "osppsvc" Then installed = True Exit For End If Next If installed <> True Then globalPopFailure MSG_OSPPSVC_NOINSTALL,True End If Set objService = Nothing Set colListOfServices = Nothing If strCommand = "/osppsvcauto" Then Set colListOfServices = objWMI.ExecQuery _ ("Select * from Win32_Service where StartMode = 'Manual' or StartMode = 'Disabled'") For Each objService in colListOfServices If LCase(objService.Name) = "osppsvc" Then foundOsppNonAuto = True objService.Change , , , , "Automatic" WScript.Sleep(15000) Exit For End If Next If foundOsppNonAuto <> True Then WScript.Echo "Service startup type already set to automatic: Office Software Protection Platform" quitExit() End If Set objService = Nothing Set colListOfServices = Nothing Set colListOfServices = objWMI.ExecQuery _ ("Select * from Win32_Service where StartMode = 'Auto'") For Each objService in colListOfServices If LCase(objService.Name) = "osppsvc" Then foundOsppAuto = True WScript.Echo "Successfully set service startup to automatic:" & objService.DisplayName quitExit() End If Next If foundOsppAuto <> True Then WScript.Echo "Unsuccessful setting service startup to automatic. " & MSG_ISCMD_ELEVATED quitExit() End If Else Set colListOfServices = objWMI.ExecQuery _ ("Select * from Win32_Service ") For Each objService in colListOfServices If LCase(objService.Name) = "osppsvc" Then Select Case LCase(objService.State) Case "running" objService.StopService() WScript.Sleep(15000) objService.StartService() WScript.Sleep(15000) Case Else objService.StartService() WScript.Sleep(15000) End Select Exit For End If Next Set objService = Nothing Set colListOfServices = Nothing Set colListOfServices = objWMI.ExecQuery _ ("Select * from Win32_Service ") For Each objService in colListOfServices If LCase(objService.Name) = "osppsvc" Then If LCase(objService.State) = "running" Then WScript.Echo "Successfully restarted: " & objService.DisplayName quitExit() Else WScript.Echo "Unsuccessful restart: " & objService.DisplayName & ". Status: " _ & objService.State & ". " & MSG_ISCMD_ELEVATED quitExit() End If Exit For End If Next End If End Function '//////////////////////////////////////////////////////////////////////////////////////// '//////////////////////////////////////////////////////////////////////////////////////// Function reARM(skuid) progFiles = WshShell.ExpandEnvironmentStrings("%ProgramFiles%") If objFSO.FileExists(progFiles & STR_OSPPREARMPATH) Then rearmPath = progFiles & STR_OSPPREARMPATH ElseIf objFSO.FileExists(progFiles & STR_OSPPREARMPATH_DEBUG) Then rearmPath = progFiles & STR_OSPPREARMPATH_DEBUG Else progFilesX86 = WshShell.ExpandEnvironmentStrings("%ProgramFiles(x86)%") If objFSO.FileExists(progFilesX86 & STR_OSPPREARMPATH) Then rearmPath = progFilesX86 & STR_OSPPREARMPATH ElseIf objFSO.FileExists(progFilesX86 & STR_OSPPREARMPATH_DEBUG) Then rearmPath = progFilesX86 & STR_OSPPREARMPATH_DEBUG Else WScript.Echo MSG_FILENOTFOUND & "OSPPREARM.EXE" quitExit() End If End If If skuid = "" Then Set objScriptExec = WshShell.Exec (rearmPath) Else Set objScriptExec = WshShell.Exec (rearmPath & " " & skuid) End If readOut = objScriptExec.StdOut.ReadAll WScript.Echo readOut End Function '//////////////////////////////////////////////////////////////////////////////////////// '//////////////////////////////////////////////////////////////////////////////////////// Function setWinOS() Set colOperatingSystems = objWMI.ExecQuery _ ("Select * from Win32_OperatingSystem") For Each objOperatingSystem in colOperatingSystems Ver = Split(objOperatingSystem.Version, ".", -1, 1) ' Win7/Server2008R2 If (Ver(0) = "6" And Ver(1) = "1") Then Win7 = True Exit For End If ' Win8/Server2012 If (Ver(0) = "6" And Ver(1) = "2") Then Win8 = True Exit For End If Next setWmiClasses() End Function '//////////////////////////////////////////////////////////////////////////////////////// '//////////////////////////////////////////////////////////////////////////////////////// Function setWmiClasses() If Win7 = True Then productClass = "OfficeSoftwareProtectionProduct" tokenClass = "OfficeSoftwareProtectionTokenActivationLicense" Else productClass = "SoftwareLicensingProduct" tokenClass = "SoftwareLicensingTokenActivationLicense" End If End Function '//////////////////////////////////////////////////////////////////////////////////////// '//////////////////////////////////////////////////////////////////////////////////////// Function getEvents(strMessage,strLog,strEventCode,strSource,strMachine) WScript.Echo MSG_SEARCHFOR & strMessage & "<<<<< Log: " & strLog & " Source: " & strSource & " Event: " & strEventCode & " >>>>>" WScript.Echo MSG_SEPERATE Set objEvents = objWMI.ExecQuery _ ("Select * from Win32_NTLogEvent Where Logfile = '" & strLog & "'" & " and "_ & "EventCode = '" & strEventCode & "'" & " and SourceName = '" & strSource & "'") If objEvents.Count > 0 Then WScript.Echo MSG_SEPERATESMALL For each objEvent in objEvents dtmEventDate = objEvent.TimeWritten strTimeWritten = WMIDateStringToDate(dtmEventDate) WScript.Echo "Coordinated Universal Time Written: " & strTimeWritten WScript.Echo objEvent.Message WScript.Echo MSG_SEPERATESMALL Next WScript.Echo MSG_SEPERATE Else WScript.Echo MSG_NOEVENTS WScript.Echo MSG_SEPERATE End If Set objEvents = Nothing End Function '//////////////////////////////////////////////////////////////////////////////////////// '//////////////////////////////////////////////////////////////////////////////////////// Function getMachineId(strMachine) Set objInstances = objWMI.InstancesOf("Win32_ComputerSystemProduct") For Each objInstance in objInstances WScript.Echo "MachineID: " & objInstance.uuid WScript.Echo MSG_SEPERATE Next End Function '//////////////////////////////////////////////////////////////////////////////////////// '//////////////////////////////////////////////////////////////////////////////////////// Function getHeartbeatXml(strMachine) On Error Resume Next If strMachine <> "" Then WScript.Echo MSG_HEARTBEAT_LOCALONLY Else If objFSO.FileExists(CreateObject("Shell.Application").Namespace(&H23&).Self.Path & STR_HEARTBEATPATH) Then fHeartBeat = True Set MyXmlDoc = CreateObject("Msxml2.DOMDocument.6.0") MyXmlDoc.load(CreateObject("Shell.Application").Namespace(&H23&).Self.Path & STR_HEARTBEATPATH) WScript.Echo "HeartbeatCache.xml found: " & CreateObject("Shell.Application").Namespace(&H23&).Self.Path & STR_HEARTBEATPATH WScript.Echo "Contents:" WScript.Echo MSG_SEPERATESMALL Set nodes = MyXmlDoc.selectNodes("//*") For i = 0 to nodes.length - 1 If LCase(nodes(i).nodeName) <> "heartbeatcache" Then 'lastchk & skuid are attribs of License node If LCase(nodes(i).nodeName) = "license" Then hLastChk = nodes(i).attributes.getNamedItem("lastCheckTime").text WScript.Echo "lastCheckTime: " & hLastChk hSkuId = nodes(i).attributes.getNamedItem("skuId").text WScript.Echo "skuId: " & hSkuId Else WScript.Echo nodes(i).nodeName & ": " & nodes(i).text End If End If Next End If If fHeartBeat <> True Then WScript.Echo MSG_FILENOTFOUND & "HeartbeatCache.xml" End If End If 'WScript.Echo MSG_SEPERATE 'WScript.Echo MSG_SEPERATE End Function '//////////////////////////////////////////////////////////////////////////////////////// '//////////////////////////////////////////////////////////////////////////////////////// ' Checks if there is a KB article for the specified error Function lookupKBArticle(errorCode) If InStr(errorKBs, errorCode) > 0 Then WScript.Echo MSG_ACT_ERROR_FOUND_KB & "0x" & errorCode WScript.Echo MSG_ACT_ERROR_KB_LINK & errorCode End If End Function '//////////////////////////////////////////////////////////////////////////////////////// '//////////////////////////////////////////////////////////////////////////////////////// '' SIG '' Begin signature block '' SIG '' MIIh/QYJKoZIhvcNAQcCoIIh7jCCIeoCAQExDzANBglg '' SIG '' hkgBZQMEAgEFADB3BgorBgEEAYI3AgEEoGkwZzAyBgor '' SIG '' BgEEAYI3AgEeMCQCAQEEEE7wKRaZJ7VNj+Ws4Q8X66sC '' SIG '' AQACAQACAQACAQACAQAwMTANBglghkgBZQMEAgEFAAQg '' SIG '' 4vheswXseneht9uy7KD3k1cmAvgfi9gbNFIZwuj6I2ag '' SIG '' gguDMIIFCzCCA/OgAwIBAgITMwAAAO/Yhy41o4KKLwAA '' SIG '' AAAA7zANBgkqhkiG9w0BAQsFADB+MQswCQYDVQQGEwJV '' SIG '' UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH '' SIG '' UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv '' SIG '' cmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQgQ29kZSBT '' SIG '' aWduaW5nIFBDQSAyMDEwMB4XDTE1MTAyODIwMzEyNFoX '' SIG '' DTE3MDEyODIwMzEyNFowgYMxCzAJBgNVBAYTAlVTMRMw '' SIG '' EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt '' SIG '' b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRp '' SIG '' b24xDTALBgNVBAsTBE1PUFIxHjAcBgNVBAMTFU1pY3Jv '' SIG '' c29mdCBDb3Jwb3JhdGlvbjCCASIwDQYJKoZIhvcNAQEB '' SIG '' BQADggEPADCCAQoCggEBALJ0E/jV5rNSkHE9O/gQfgZB '' SIG '' UXrNnP3leetQAdPP8Emqg8WQLlabSNhXHoD4zvEwO9YW '' SIG '' kMNdTByTOuNKPPCtCtvVMwvuBd9P9vMDZR13ea9VZBkx '' SIG '' BhZAoBshFyabg+laa3PFf+lxGbM8VtZ2gGMCv6xHMLf8 '' SIG '' 4eJkNcMra58MWSU5RjbAcByPF9m0VepqLMkcN91OEx4T '' SIG '' I+0EMpyfCjL0ktHwpXoy4beG/3FLY4nbDxjjQkQam9zl '' SIG '' wQBry/6NVN/5uPr5L7iJiRyHpgIffT6Bqo2DTZ3VX8D5 '' SIG '' ZHHhhWE7NG7tVG1Iw9Pa0NNPfs3/PlY4BoRg1Aop78sC '' SIG '' VvTAAlnsnj8CAwEAAaOCAXowggF2MB8GA1UdJQQYMBYG '' SIG '' CCsGAQUFBwMDBgorBgEEAYI3PQYBMB0GA1UdDgQWBBSK '' SIG '' j++N9Cw1BHStvZrpVGVHTZ8FnzBRBgNVHREESjBIpEYw '' SIG '' RDENMAsGA1UECxMETU9QUjEzMDEGA1UEBRMqMzgwNzYr '' SIG '' YWQ1OGEzODEtMzM0My00ZGQ3LTg4MzMtMGRlODNkNDFm '' SIG '' NWYwMB8GA1UdIwQYMBaAFOb8X3u7IgBY5HJOtfQhdCMy '' SIG '' 5u+sMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9jcmwu '' SIG '' bWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01p '' SIG '' Y0NvZFNpZ1BDQV8yMDEwLTA3LTA2LmNybDBaBggrBgEF '' SIG '' BQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6Ly93d3cu '' SIG '' bWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljQ29kU2ln '' SIG '' UENBXzIwMTAtMDctMDYuY3J0MAwGA1UdEwEB/wQCMAAw '' SIG '' DQYJKoZIhvcNAQELBQADggEBAOeulgH2vbTzbPk0eIMf '' SIG '' OXxP1tM8ax++uidoi8v39kb4F0gcea5Ojen3/HnQSoyK '' SIG '' qBbF+IwWKbv2n3iLG6ncY9dO4wHO3F7jvvim+VScQE+G '' SIG '' cnPAhZ1y5Zdqgy6Mw5vj1/LwEnY3fOERcTDT6Qays8aQ '' SIG '' MC3QGGbJLzxz0LxO+24pFGWsaKqhrslzfkYeTQu3tNVP '' SIG '' rYdrTRMkELCbi1ONDk+uDWKyIucjRMUFt5ZuW5Kbpsv1 '' SIG '' 72ccNwWsgaTAi+dbxaOKMzznL2QdK3GmhRk1C0c7zfHy '' SIG '' R5PEZI03ERnqyjvq3zTw8HzwVn0twuUlc1oagQouOEhC '' SIG '' FPx/dwbZMLVfvUAwggZwMIIEWKADAgECAgphDFJMAAAA '' SIG '' AAADMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJV '' SIG '' UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH '' SIG '' UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv '' SIG '' cmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUm9vdCBD '' SIG '' ZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAxMDAeFw0xMDA3 '' SIG '' MDYyMDQwMTdaFw0yNTA3MDYyMDUwMTdaMH4xCzAJBgNV '' SIG '' BAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYD '' SIG '' VQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg '' SIG '' Q29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBD '' SIG '' b2RlIFNpZ25pbmcgUENBIDIwMTAwggEiMA0GCSqGSIb3 '' SIG '' DQEBAQUAA4IBDwAwggEKAoIBAQDpDmRQeWe1xOP9CQBM '' SIG '' npSs91Zo6kTYz8VYT6mldnxtRbrTOZK0pB75+WWC5BfS '' SIG '' j/1EnAjoZZPOLFWEv30I4y4rqEErGLeiS25JTGsVB97R '' SIG '' 0sKJHnGUzbV/S7SvCNjMiNZrF5Q6k84mP+zm/jSYV9Ud '' SIG '' XUn2siou1YW7WT/4kLQrg3TKK7M7RuPwRknBF2ZUyRy9 '' SIG '' HcRVYldy+Ge5JSA03l2mpZVeqyiAzdWynuUDtWPTshTI '' SIG '' wciKJgpZfwfs/w7tgBI1TBKmvlJb9aba4IsLSHfWhUfV '' SIG '' ELnG6Krui2otBVxgxrQqW5wjHF9F4xoUHm83yxkzgGqJ '' SIG '' TaNqZmN4k9Uwz5UfAgMBAAGjggHjMIIB3zAQBgkrBgEE '' SIG '' AYI3FQEEAwIBADAdBgNVHQ4EFgQU5vxfe7siAFjkck61 '' SIG '' 9CF0IzLm76wwGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBD '' SIG '' AEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8w '' SIG '' HwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9lJBb186aGMQw '' SIG '' VgYDVR0fBE8wTTBLoEmgR4ZFaHR0cDovL2NybC5taWNy '' SIG '' b3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMvTWljUm9v '' SIG '' Q2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoGCCsGAQUFBwEB '' SIG '' BE4wTDBKBggrBgEFBQcwAoY+aHR0cDovL3d3dy5taWNy '' SIG '' b3NvZnQuY29tL3BraS9jZXJ0cy9NaWNSb29DZXJBdXRf '' SIG '' MjAxMC0wNi0yMy5jcnQwgZ0GA1UdIASBlTCBkjCBjwYJ '' SIG '' KwYBBAGCNy4DMIGBMD0GCCsGAQUFBwIBFjFodHRwOi8v '' SIG '' d3d3Lm1pY3Jvc29mdC5jb20vUEtJL2RvY3MvQ1BTL2Rl '' SIG '' ZmF1bHQuaHRtMEAGCCsGAQUFBwICMDQeMiAdAEwAZQBn '' SIG '' AGEAbABfAFAAbwBsAGkAYwB5AF8AUwB0AGEAdABlAG0A '' SIG '' ZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQAadO9X '' SIG '' Tyl7xBaFeLhQ0yL8CZ2sgpf4NP8qLJeVEuXkv8+/k8jj '' SIG '' NKnbgbjcHgC+0jVvr+V/eZV35QLU8evYzU4eG2Giwloj '' SIG '' GvCMqGJRRWcI4z88HpP4MIUXyDlAptcOsyEp5aWhaYwi '' SIG '' k8x0mOehR0PyU6zADzBpf/7SJSBtb2HT3wfV2XIALGmG '' SIG '' dj1R26Y5SMk3YW0H3VMZy6fWYcK/4oOrD+Brm5XWfShR '' SIG '' sIlKUaSabMi3H0oaDmmp19zBftFJcKq2rbtyR2MX+qbW '' SIG '' oqaG7KgQRJtjtrJpiQbHRoZ6GD/oxR0h1Xv5AiMtxUHL '' SIG '' vx1MyBbvsZx//CJLSYpuFeOmf3Zb0VN5kYWd1dLbPXM1 '' SIG '' 8zyuVLJSR2rAqhOV0o4R2plnXjKM+zeF0dx1hZyHxlpX '' SIG '' hcK/3Q2PjJst67TuzyfTtV5p+qQWBAGnJGdzz01Ptt4F '' SIG '' Vpd69+lSTfR3BU+FxtgL8Y7tQgnRDXbjI1Z4IiY2vsqx '' SIG '' jG6qHeSF2kczYo+kyZEzX3EeQK+YZcki6EIhJYocLWDZ '' SIG '' N4lBiSoWD9dhPJRoYFLv1keZoIBA7hWBdz6c4FMYGlAd '' SIG '' OJWbHmYzEyc5F3iHNs5Ow1+y9T1HU7bg5dsLYT0q15Is '' SIG '' zjdaPkBCMaQfEAjCVpy/JF1RAp1qedIX09rBlI4HeyVx '' SIG '' RKsGaubUxt8jmpZ1xTGCFdIwghXOAgEBMIGVMH4xCzAJ '' SIG '' BgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAw '' SIG '' DgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3Nv '' SIG '' ZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29m '' SIG '' dCBDb2RlIFNpZ25pbmcgUENBIDIwMTACEzMAAADv2Icu '' SIG '' NaOCii8AAAAAAO8wDQYJYIZIAWUDBAIBBQCggcAwGQYJ '' SIG '' KoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGC '' SIG '' NwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkE '' SIG '' MSIEIFvqecBpo6fCMDVHiuz968x/S2HfhukiLP0MIRfs '' SIG '' U5g7MFQGCisGAQQBgjcCAQwxRjBEoCKAIABNAGkAYwBy '' SIG '' AG8AcwBvAGYAdAAgAE8AZgBmAGkAYwBloR6AHGh0dHA6 '' SIG '' Ly9vZmZpY2UubWljcm9zb2Z0LmNvbS8wDQYJKoZIhvcN '' SIG '' AQEBBQAEggEAiyXGxn6PkhWgrhrbeizd/MH0A9xUa+E/ '' SIG '' uWFHjG1xNoAZSjRxQKeh3LbIcKaB94w/Z56gSKwoRqw2 '' SIG '' gJsysTd9QdzGT80PmxnDoSuV7iYRfPykmw7w9DyxZ4g4 '' SIG '' UguqCeYDjwBWXr48pGGBUMNjiQFJFOBPGsPruu+ooNF3 '' SIG '' khiYhQFd6Yt5LxjM7HR5XJwFKogSJ2uWLnw387tRqYxh '' SIG '' 2CzYgqFDXn7AbHGk8mKJ04XR28ZX2SYooxBGCZRBuf4I '' SIG '' ZeAWO8KODq/eM/zcO+h/8LG0yLrX++1rf091ZxfM4PqQ '' SIG '' i/8ieOOpQxYvOAF7qXVqpSidhxDZIl/ENdmAMMXiz8zb '' SIG '' 2aGCE0owghNGBgorBgEEAYI3AwMBMYITNjCCEzIGCSqG '' SIG '' SIb3DQEHAqCCEyMwghMfAgEDMQ8wDQYJYIZIAWUDBAIB '' SIG '' BQAwggE6BgsqhkiG9w0BCRABBKCCASkEggElMIIBIQIB '' SIG '' AQYKKwYBBAGEWQoDATAxMA0GCWCGSAFlAwQCAQUABCA1 '' SIG '' Wsz0oC4FLAOejdVsmjIOpjDRLq8OzdUvmE9RK4L2aAIG '' SIG '' V2mAHcR5GBMyMDE2MDcwMzExNTE1OC41NjFaMASAAgH0 '' SIG '' oIG5pIG2MIGzMQswCQYDVQQGEwJVUzETMBEGA1UECBMK '' SIG '' V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG '' SIG '' A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMQ0wCwYD '' SIG '' VQQLEwRNT1BSMScwJQYDVQQLEx5uQ2lwaGVyIERTRSBF '' SIG '' U046MTQ4Qy1DNEI5LTIwNjYxJTAjBgNVBAMTHE1pY3Jv '' SIG '' c29mdCBUaW1lLVN0YW1wIFNlcnZpY2Wggg7QMIIGcTCC '' SIG '' BFmgAwIBAgIKYQmBKgAAAAAAAjANBgkqhkiG9w0BAQsF '' SIG '' ADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp '' SIG '' bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoT '' SIG '' FU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMp '' SIG '' TWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9y '' SIG '' aXR5IDIwMTAwHhcNMTAwNzAxMjEzNjU1WhcNMjUwNzAx '' SIG '' MjE0NjU1WjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMK '' SIG '' V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG '' SIG '' A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYD '' SIG '' VQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAx '' SIG '' MDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB '' SIG '' AKkdDbx3EYo6IOz8E5f1+n9plGt0VBDVpQoAgoX77Xxo '' SIG '' SyxfxcPlYcJ2tz5mK1vwFVMnBDEfQRsalR3OCROOfGEw '' SIG '' WbEwRA/xYIiEVEMM1024OAizQt2TrNZzMFcmgqNFDdDq '' SIG '' 9UeBzb8kYDJYYEbyWEeGMoQedGFnkV+BVLHPk0ySwcSm '' SIG '' XdFhE24oxhr5hoC732H8RsEnHSRnEnIaIYqvS2SJUGKx '' SIG '' Xf13Hz3wV3WsvYpCTUBR0Q+cBj5nf/VmwAOWRH7v0Ev9 '' SIG '' buWayrGo8noqCjHw2k4GkbaICDXoeByw6ZnNPOcvRLqn '' SIG '' 9NxkvaQBwSAJk3jN/LzAyURdXhacAQVPIk0CAwEAAaOC '' SIG '' AeYwggHiMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQW '' SIG '' BBTVYzpcijGQ80N7fEYbxTNoWoVtVTAZBgkrBgEEAYI3 '' SIG '' FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYD '' SIG '' VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTV9lbLj+ii '' SIG '' XGJo0T2UkFvXzpoYxDBWBgNVHR8ETzBNMEugSaBHhkVo '' SIG '' dHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2NybC9w '' SIG '' cm9kdWN0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5j '' SIG '' cmwwWgYIKwYBBQUHAQEETjBMMEoGCCsGAQUFBzAChj5o '' SIG '' dHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRz '' SIG '' L01pY1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNydDCBoAYD '' SIG '' VR0gAQH/BIGVMIGSMIGPBgkrBgEEAYI3LgMwgYEwPQYI '' SIG '' KwYBBQUHAgEWMWh0dHA6Ly93d3cubWljcm9zb2Z0LmNv '' SIG '' bS9QS0kvZG9jcy9DUFMvZGVmYXVsdC5odG0wQAYIKwYB '' SIG '' BQUHAgIwNB4yIB0ATABlAGcAYQBsAF8AUABvAGwAaQBj '' SIG '' AHkAXwBTAHQAYQB0AGUAbQBlAG4AdAAuIB0wDQYJKoZI '' SIG '' hvcNAQELBQADggIBAAfmiFEN4sbgmD+BcQM9naOhIW+z '' SIG '' 66bM9TG+zwXiqf76V20ZMLPCxWbJat/15/B4vceoniXj '' SIG '' +bzta1RXCCtRgkQS+7lTjMz0YBKKdsxAQEGb3FwX/1z5 '' SIG '' Xhc1mCRWS3TvQhDIr79/xn/yN31aPxzymXlKkVIArzgP '' SIG '' F/UveYFl2am1a+THzvbKegBvSzBEJCI8z+0DpZaPWSm8 '' SIG '' tv0E4XCfMkon/VWvL/625Y4zu2JfmttXQOnxzplmkIz/ '' SIG '' amJ/3cVKC5Em4jnsGUpxY517IW3DnKOiPPp/fZZqkHim '' SIG '' bdLhnPkd/DjYlPTGpQqWhqS9nhquBEKDuLWAmyI4ILUl '' SIG '' 5WTs9/S/fmNZJQ96LjlXdqJxqgaKD4kWumGnEcua2A5H '' SIG '' moDF0M2n0O99g/DhO3EJ3110mCIIYdqwUB5vvfHhAN/n '' SIG '' MQekkzr3ZUd46PioSKv33nJ+YWtvd6mBy6cJrDm77MbL '' SIG '' 2IK0cs0d9LiFAR6A+xuJKlQ5slvayA1VmXqHczsI5pgt '' SIG '' 6o3gMy4SKfXAL1QnIffIrE7aKLixqduWsqdCosnPGUFN '' SIG '' 4Ib5KpqjEWYw07t0MkvfY3v1mYovG8chr1m1rtxEPJdQ '' SIG '' cdeh0sVV42neV8HR3jDA/czmTfsNv11P6Z0eGTgvvM9Y '' SIG '' BS7vDaBQNdrvCScc1bN+NR4Iuto229Nfj950iEkSMIIE '' SIG '' 2jCCA8KgAwIBAgITMwAAAIlJ9Qzk8YuUswAAAAAAiTAN '' SIG '' BgkqhkiG9w0BAQsFADB8MQswCQYDVQQGEwJVUzETMBEG '' SIG '' A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u '' SIG '' ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u '' SIG '' MSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQ '' SIG '' Q0EgMjAxMDAeFw0xNjAzMzAxOTI0MjZaFw0xNzA2MzAx '' SIG '' OTI0MjZaMIGzMQswCQYDVQQGEwJVUzETMBEGA1UECBMK '' SIG '' V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG '' SIG '' A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMQ0wCwYD '' SIG '' VQQLEwRNT1BSMScwJQYDVQQLEx5uQ2lwaGVyIERTRSBF '' SIG '' U046MTQ4Qy1DNEI5LTIwNjYxJTAjBgNVBAMTHE1pY3Jv '' SIG '' c29mdCBUaW1lLVN0YW1wIFNlcnZpY2UwggEiMA0GCSqG '' SIG '' SIb3DQEBAQUAA4IBDwAwggEKAoIBAQC+fkG19/HHNSE7 '' SIG '' TldOHjggXPWq3FUnDrEfQjenen2Gm/xOtgltPecoIH0a '' SIG '' GRoby5NiG6CxLiZFA3ynqx4X+1CHgBXzAeNqAehWrW7Y '' SIG '' fpBnPvWK3Lrao46DMY7ZQq2c4hEnST4SP1lslq0hfpkn '' SIG '' krmx43RmNCQgoPsZTXLQAbK24bgHak+tYcod4N4wmj47 '' SIG '' h1xr4AE1TL2yYQ2+0D0OHDxQUnGRWyIVehSoFq+VkFQh '' SIG '' g6Hy0qiIforbctLzY8g3vzxEAaCRLKceqvmoA4N8sqr3 '' SIG '' 9pD/wimSpMkPFIUJLk0ybdWXxWaFxI6B6qF3TNy776GE '' SIG '' Kv5SEer/oU3xef1J4/BDAgMBAAGjggEbMIIBFzAdBgNV '' SIG '' HQ4EFgQU1cD6QRRdl9dOeQrZm4ekv1f+U7AwHwYDVR0j '' SIG '' BBgwFoAU1WM6XIoxkPNDe3xGG8UzaFqFbVUwVgYDVR0f '' SIG '' BE8wTTBLoEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQu '' SIG '' Y29tL3BraS9jcmwvcHJvZHVjdHMvTWljVGltU3RhUENB '' SIG '' XzIwMTAtMDctMDEuY3JsMFoGCCsGAQUFBwEBBE4wTDBK '' SIG '' BggrBgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3NvZnQu '' SIG '' Y29tL3BraS9jZXJ0cy9NaWNUaW1TdGFQQ0FfMjAxMC0w '' SIG '' Ny0wMS5jcnQwDAYDVR0TAQH/BAIwADATBgNVHSUEDDAK '' SIG '' BggrBgEFBQcDCDANBgkqhkiG9w0BAQsFAAOCAQEAo1Ms '' SIG '' 6PwQeePR/Dso89MXvroZCcT71Qua1mPOZhJlPpSYDsRu '' SIG '' gEDu7BdlUN2eDBcHEJzHABSqH8hY+gDfna0Y8K9hd9Fc '' SIG '' YcXmAzsWllS20GPWFZd7E7bdtwygNN3OWwpDBit8B3P6 '' SIG '' Fgez0pBg4ckxqzzFmYw+yDAEBnPBvq4DfNoo8Qph05wI '' SIG '' ZaTTtb9GFdwli4y5uyFTcf9ncvrUzKYrR6Zz2n9e1Frh '' SIG '' dMXHLE4BAL3d63oSxHZ8pZv3qGEcr5Nm43NSZI+4f2oL '' SIG '' ukPBxWN75xi0MfvP4tYg/eI+k2SDZG1sdA/oJQ0xbeHo '' SIG '' u6fQt9FqaJ93auH6jlDn7s3/xTllr6GCA3kwggJhAgEB '' SIG '' MIHjoYG5pIG2MIGzMQswCQYDVQQGEwJVUzETMBEGA1UE '' SIG '' CBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEe '' SIG '' MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMQ0w '' SIG '' CwYDVQQLEwRNT1BSMScwJQYDVQQLEx5uQ2lwaGVyIERT '' SIG '' RSBFU046MTQ4Qy1DNEI5LTIwNjYxJTAjBgNVBAMTHE1p '' SIG '' Y3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2WiJQoBATAJ '' SIG '' BgUrDgMCGgUAAxUAhliSROk+gXvnoNkAeOBC+3yiyuig '' SIG '' gcIwgb+kgbwwgbkxCzAJBgNVBAYTAlVTMRMwEQYDVQQI '' SIG '' EwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4w '' SIG '' HAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xDTAL '' SIG '' BgNVBAsTBE1PUFIxJzAlBgNVBAsTHm5DaXBoZXIgTlRT '' SIG '' IEVTTjo0REU5LTBDNUUtM0UwOTErMCkGA1UEAxMiTWlj '' SIG '' cm9zb2Z0IFRpbWUgU291cmNlIE1hc3RlciBDbG9jazAN '' SIG '' BgkqhkiG9w0BAQUFAAIFANsjGbQwIhgPMjAxNjA3MDMw '' SIG '' NDU3MjRaGA8yMDE2MDcwNDA0NTcyNFowdzA9BgorBgEE '' SIG '' AYRZCgQBMS8wLTAKAgUA2yMZtAIBADAKAgEAAgIjMQIB '' SIG '' /zAHAgEAAgIanzAKAgUA2yRrNAIBADA2BgorBgEEAYRZ '' SIG '' CgQCMSgwJjAMBgorBgEEAYRZCgMBoAowCAIBAAIDB6Eg '' SIG '' oQowCAIBAAIDB6EgMA0GCSqGSIb3DQEBBQUAA4IBAQCM '' SIG '' dszrd8xj9rumnKn7dABKmpf1YWXXNc50Wg+N1TqCA9ZC '' SIG '' 4Xkf+jwNemOKD+7iQQIPsu/SKY425MhGgUF/gtFRrSv4 '' SIG '' 4EHTAjfj4kSJnFOhxGHLZoSByhrSBas6+24cR2S0AaZ0 '' SIG '' gGgl8BhpAdymCb8xIyeg5OrUl3mycwBh3SGrNSUaYa21 '' SIG '' USTDckumtdrbuUYn3AnNh0TYlDDjS/WwKnlBmuCVrbPM '' SIG '' Eb5htNqK4XVo2UPhUIRljKTglfBaipcAj8Hl9TMrW7WW '' SIG '' Q2RHuYQgkD53qhr2UwbahLi0YQCYJ7NnONlDC2aA4vSg '' SIG '' z1N3LQ4sPQLqMusD63qYFbsJwekgD0mcMYIC9TCCAvEC '' SIG '' AQEwgZMwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldh '' SIG '' c2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNV '' SIG '' BAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UE '' SIG '' AxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAC '' SIG '' EzMAAACJSfUM5PGLlLMAAAAAAIkwDQYJYIZIAWUDBAIB '' SIG '' BQCgggEyMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRAB '' SIG '' BDAvBgkqhkiG9w0BCQQxIgQgdDeYSC9sUFxEuqbk8ow0 '' SIG '' Oebpo9Ph/9P2ZFDIoO9slm4wgeIGCyqGSIb3DQEJEAIM '' SIG '' MYHSMIHPMIHMMIGxBBSGWJJE6T6Be+eg2QB44EL7fKLK '' SIG '' 6DCBmDCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQI '' SIG '' EwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4w '' SIG '' HAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAk '' SIG '' BgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAy '' SIG '' MDEwAhMzAAAAiUn1DOTxi5SzAAAAAACJMBYEFHxgQOSq '' SIG '' 23A9VCRlK2QB1h0xijoYMA0GCSqGSIb3DQEBCwUABIIB '' SIG '' AH/do9Y/XRSxEjdIIZWhXpwhm+TjyGRyMrpaD/OZlSzN '' SIG '' 8xr7yMrAID5eYPzqIKIgOZOG0GW6LAH1UJgd3H9MQhjM '' SIG '' BAoocDNpTygwXXurUASojfEAYc469befIGKy0q+XclfZ '' SIG '' 5YyLK4lrLlQW5TRw4keE7lWxnyOBYaiQJva1SgE6Enrr '' SIG '' IwEkgkwRPLHNzDx8KXq5uRD3C1Jl82iRE3nTFvQFNJqh '' SIG '' x5xzWFfgzn8GC63sZsMhlcrR5vX5QuXQf0Yu0sx/UiQc '' SIG '' CZR4FE6Ul0ZaBOCLgRmmKC5wchNQy8BCQHOF93XFlcd7 '' SIG '' YevSiIi5y1SokiLlBvhegRCDf0uFQbt2Td8= '' SIG '' End signature block