Created
November 11, 2019 15:22
-
-
Save kevinblumenfeld/fc594570dea2481783fe3a973f812367 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'******************************************************************************* | |
' Name: OLicenseCleanup.vbs - v 1.15 | |
' Author: Microsoft Customer Support Services | |
' Copyright (c) Microsoft Corporation | |
' | |
' Removes all licenses for Office 2013 and 2016 | |
' from the (Office) Software Protection Platform | |
'******************************************************************************* | |
'Option Explicit | |
Dim oProductInstances, oWmiLocal, oReg, oWShell, oFso | |
Dim sQuery, sTemp, sLogDir, sOSinfo | |
Dim f64, fO64, fCScript, fQuiet, fClearO15, fClearO16, fSafeForRoamingUsers | |
Dim LogStream | |
Const SKUFILTER = "" 'Removes all licenses | |
'Const SKUFILTER = "O365" 'Removes all licenses that contain O365 in their name | |
'Const SKUFILTER = "2013" 'Removes all licenses that contain 2013 in their name | |
'Const SKUFILTER = "2016" 'Removes all licenses that contain 2016 in their name | |
fQuiet = True | |
fClearO15 = True | |
fClearO16 = True | |
sLogDir = "" 'Custom log folder/directory. No trailing "\" in the path! | |
'Set this to False if the script needs to run more than once and you don't | |
'have roaming profile users | |
fSafeForRoamingUsers = True | |
'******************************************************************************* | |
Const OfficeAppId = "0ff1ce15-a989-479d-af46-f275c6370663" 'Office 2013/2016 | |
Const HKLM = &H80000002 | |
Const SCRIPTVERSION = "1.15" | |
' MAIN | |
On Error Resume Next | |
Set oWShell = CreateObject("WScript.Shell") | |
Initialize | |
LogH2 "Cleanup start" | |
CleanOSPP SKUFILTER | |
ResetOfficeIdentityKey | |
ResetOfficeUserRegistrationKey | |
ResetUserLicensingKey | |
ClearCredmanCache | |
ClearSCALicCache | |
ClearConfigUser | |
LogH2 "Cleanup end" | |
' END | |
'------------------------------------------------------------------------------- | |
' Initialize | |
' | |
' Initialize script settings | |
'------------------------------------------------------------------------------- | |
Sub Initialize | |
Dim ComputerItem, Item | |
Dim sOsVersion | |
'Check if we're running as 32 bit process on a 64 bit OS | |
If InStr(LCase(wscript.path), "syswow64") > 0 Then RelaunchAs64Host | |
Set oWmiLocal = GetObject("winmgmts:\\.\root\cimv2") | |
Set oReg = GetObject("winmgmts:\\.\root\default:StdRegProv") | |
Set oFso = CreateObject("Scripting.FileSystemObject") | |
sTemp = oWShell.ExpandEnvironmentStrings("%TEMP%") | |
fCScript = (UCase(Mid(Wscript.FullName, Len(Wscript.Path) + 2, 1)) = "C") | |
' get Win32_OperatingSystem details | |
'---------------------------------- | |
Set ComputerItem = oWmiLocal.ExecQuery("Select * from Win32_OperatingSystem") | |
For Each Item in ComputerItem | |
sOSinfo = sOSinfo & Item.Caption | |
sOSinfo = sOSinfo & Item.OtherTypeDescription | |
sOSinfo = sOSinfo & ", " & "SP " & Item.ServicePackMajorVersion | |
sOSinfo = sOSinfo & ", " & "Version: " & Item.Version | |
sOsVersion = Item.Version | |
sOSinfo = sOSinfo & ", " & "Codepage: " & Item.CodeSet | |
sOSinfo = sOSinfo & ", " & "Country Code: " & Item.CountryCode | |
sOSinfo = sOSinfo & ", " & "Language: " & Item.OSLanguage | |
Next | |
DetectOSBitness | |
DetectOfficeBitness | |
CreateLog | |
LogOnly "Remove O15 Lic: " & fClearO15 | |
LogOnly "Remove O16 Lic: " & fClearO16 | |
LogOnly "Quiet mode: " & fQuiet | |
End Sub | |
'------------------------------------------------------------------------------- | |
' ResetUserLicensingKey | |
' | |
' clear HKCU cached user license registry | |
'------------------------------------------------------------------------------- | |
Sub ResetUserLicensingKey () | |
Dim sSettingsKey, sCount, sRetVal, sCmd | |
Dim iCount | |
Dim oExec | |
If fClearO15 Then | |
'remove current user key | |
Log "Remove key HKCU\Software\Microsoft\Office\15.0\Common\Licensing" | |
sRetVal = oWShell.Run("REG DELETE HKCU\Software\Microsoft\Office\15.0\Common\Licensing /f", 0, True) | |
'create user settings key to cover other profiles | |
sSettingsKey = "SOFTWARE\Wow6432Node\Microsoft\Office\15.0\User Settings" | |
If (f64 And fO64) Or (Not f64) Then sSettingsKey = "SOFTWARE\Microsoft\Office\15.0\User Settings" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetUserLicense" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetUserLicense\Delete" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetUserLicense\Delete\Software" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetUserLicense\Delete\Software\Microsoft" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetUserLicense\Delete\Software\Microsoft\Office" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetUserLicense\Delete\Software\Microsoft\Office\15.0" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetUserLicense\Delete\Software\Microsoft\Office\15.0\Common" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetUserLicense\Delete\Software\Microsoft\Office\15.0\Common\Licensing" | |
iCount = 1 | |
If Not fSafeForRoamingUsers Then | |
If RegReadDWordValue(HKLM, sSettingsKey & "\ResetUserLicense", "Count", sCount) Then iCount = CInt(sCount) + 1 | |
End If | |
oReg.SetDWordValue HKLM, sSettingsKey & "\ResetUserLicense", "Count", iCount | |
oReg.SetDWordValue HKLM, sSettingsKey & "\ResetUserLicense", "Order", 1 | |
LogOnly "Add SettingsKey: HKLM\" & sSettingsKey & "\ResetUserLicense\Delete\Software\Microsoft\Office\15.0\Common\Licensing" | |
LogOnly "Count: " & iCount | |
End If | |
'O16 | |
If fClearO16 Then | |
'remove current user key | |
Log "Remove key HKCU\Software\Microsoft\Office\16.0\Common\Licensing" | |
sRetVal = oWShell.Run("REG DELETE HKCU\Software\Microsoft\Office\16.0\Common\Licensing /f", 0, True) | |
'create user settings key to cover other profiles | |
sSettingsKey = "SOFTWARE\Wow6432Node\Microsoft\Office\16.0\User Settings" | |
If (f64 And fO64) Or (Not f64) Then sSettingsKey = "SOFTWARE\Microsoft\Office\16.0\User Settings" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetUserLicense" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetUserLicense\Delete" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetUserLicense\Delete\Software" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetUserLicense\Delete\Software\Microsoft" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetUserLicense\Delete\Software\Microsoft\Office" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetUserLicense\Delete\Software\Microsoft\Office\16.0" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetUserLicense\Delete\Software\Microsoft\Office\16.0\Common" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetUserLicense\Delete\Software\Microsoft\Office\16.0\Common\Licensing" | |
iCount = 1 | |
If Not fSafeForRoamingUsers Then | |
If RegReadDWordValue(HKLM, sSettingsKey & "\ResetUserLicense", "Count", sCount) Then iCount = CInt(sCount) + 1 | |
End If | |
oReg.SetDWordValue HKLM, sSettingsKey & "\ResetUserLicense", "Count", iCount | |
oReg.SetDWordValue HKLM, sSettingsKey & "\ResetUserLicense", "Order", 1 | |
LogOnly "Add SettingsKey: HKLM\" & sSettingsKey & "\ResetUserLicense\Delete\Software\Microsoft\Office\16.0\Common\Licensing" | |
LogOnly "Count: " & iCount | |
End If | |
End Sub 'ResetUserLicensingKey | |
'------------------------------------------------------------------------------- | |
' ClearConfigUser | |
' | |
' clear HKLM cached user license id | |
'------------------------------------------------------------------------------- | |
Sub ClearConfigUser | |
Dim value | |
Dim sConfigKey, sRetVal, sCmd | |
Dim arrNames, arrTypes | |
If NOT fClearO16 Then Exit Sub | |
sConfigKey = "SOFTWARE\Microsoft\Office\ClickToRun\Configuration" | |
If RegEnumValues(HKLM, sConfigKey, arrNames, arrTypes) Then | |
For Each value in arrNames | |
If (InStr(LCase(value), LCase(".EmailAddress")) > 0) Or (InStr(LCase(value), LCase(".TenantId")) > 0) Or (LCase(value) = "productkeys") Then | |
sCmd = "REG DELETE HKLM\" & sConfigKey & " /v " & value & " /f" | |
sRetVal = oWShell.Run(sCmd, 0, True) | |
Log "Remove entry: HKLM\" & sConfigKey & "\" & value | |
End If | |
Next | |
End If | |
End Sub 'ClearConfigUser | |
'------------------------------------------------------------------------------- | |
' ClearSCALicCache | |
' | |
' clear local license cache for SharedComputerActivation | |
'------------------------------------------------------------------------------- | |
Sub ClearSCALicCache | |
Dim attr, fld | |
Dim sLocalAppData, sCmd, sDelFld | |
sLocalAppData = oWShell.ExpandEnvironmentStrings("%localappdata%") | |
If fClearO15 Then | |
sDelFld = sLocalAppData & "\Microsoft\Office\15.0\Licensing" | |
If oFso.FolderExists(sDelFld) Then | |
Set fld = oFso.GetFolder(sDelFld) | |
'ensure to remove read only flag | |
attr = fld.Attributes | |
If CBool(attr And 1) Then fld.Attributes = attr And (attr - 1) | |
'delete folder | |
fld.Delete True | |
Set fld = Nothing | |
'check if removal succeeded. If not try to RD | |
If oFso.FolderExists(sDelFld) Then | |
sCmd = "cmd.exe /c rd /s " & chr(34) & sDelFld & chr(34) & " /q" | |
Log "Remove folder: " & sDelFld | |
oWShell.Run sCmd, 0, True | |
End If | |
End If | |
End If | |
If fClearO16 Then | |
sDelFld = sLocalAppData & "\Microsoft\Office\16.0\Licensing" | |
If oFso.FolderExists(sDelFld) Then | |
Set fld = oFso.GetFolder(sDelFld) | |
'ensure to remove read only flag | |
attr = fld.Attributes | |
If CBool(attr And 1) Then fld.Attributes = attr And (attr - 1) | |
'delete folder | |
fld.Delete True | |
Set fld = Nothing | |
'check if removal succeeded. If not try to RD | |
If oFso.FolderExists(sDelFld) Then | |
sCmd = "cmd.exe /c rd /s " & chr(34) & sDelFld & chr(34) & " /q" | |
Log "Remove folder: " & sDelFld | |
oWShell.Run sCmd, 0, True | |
End If | |
End If | |
End If | |
End Sub 'ClearSCALicCache | |
'------------------------------------------------------------------------------- | |
' ClearCredmanCache | |
' | |
' clear Office credentials from Windows Credentials Manager Cache | |
'------------------------------------------------------------------------------- | |
Sub ClearCredmanCache | |
Dim oExec, line | |
Dim sCmd, sRetVal, sCmdOut, sLine | |
Dim arrLines | |
sCmd = "cmdkey.exe /list:MicrosoftOffice1*" | |
Set oExec = oWShell.Exec(sCmd) | |
sCmdOut = oExec.StdOut.ReadAll() | |
Do While oExec.Status = 0 | |
WScript.Sleep 100 | |
Loop | |
arrLines = Split(sCmdOut) | |
For Each line In arrLines | |
If InStr(line, "MicrosoftOffice1") > 0 And Not InStr(line, "MicrosoftOffice1*") > 0 Then | |
sLine = Replace(line, vbCrLf, "") | |
sCmd = "cmdkey.exe /delete:" & Trim(sLine) | |
Log "Remove from CredmanCache: " & sLine | |
sRetVal = oWShell.Run(sCmd, 0, True) | |
End If | |
Next | |
End Sub 'ClearCredmanCache | |
'------------------------------------------------------------------------------- | |
' ResetOfficeIdentityKey | |
' | |
' configures the Office Identity key to be reset on next application launch | |
'------------------------------------------------------------------------------- | |
Sub ResetOfficeIdentityKey () | |
Dim sSettingsKey, sCount, sRetVal, sCmd | |
Dim iCount | |
Dim oExec | |
If fClearO15 Then | |
'remove current user key | |
Log "Remove key HKCU\Software\Microsoft\Office\15.0\Common\Identity" | |
sRetVal = oWShell.Run("REG DELETE HKCU\Software\Microsoft\Office\15.0\Common\Identity /f", 0, True) | |
'create user settings key to cover other profiles | |
sSettingsKey = "SOFTWARE\Wow6432Node\Microsoft\Office\15.0\User Settings" | |
If (f64 And fO64) Or (Not f64) Then sSettingsKey = "SOFTWARE\Microsoft\Office\15.0\User Settings" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetIdentity" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetIdentity\Delete" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetIdentity\Delete\Software" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetIdentity\Delete\Software\Microsoft" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetIdentity\Delete\Software\Microsoft\Office" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetIdentity\Delete\Software\Microsoft\Office\15.0" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetIdentity\Delete\Software\Microsoft\Office\15.0\Common" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetIdentity\Delete\Software\Microsoft\Office\15.0\Common\Identity" | |
iCount = 1 | |
If Not fSafeForRoamingUsers Then | |
If RegReadDWordValue(HKLM, sSettingsKey & "\ResetIdentity", "Count", sCount) Then iCount = CInt(sCount) + 1 | |
End If | |
oReg.SetDWordValue HKLM, sSettingsKey & "\ResetIdentity", "Count", iCount | |
oReg.SetDWordValue HKLM, sSettingsKey & "\ResetIdentity", "Order", 1 | |
LogOnly "Add SettingsKey: HKLM\" & sSettingsKey & "\ResetIdentity\Delete\Software\Microsoft\Office\15.0\Common\Identity" | |
LogOnly "Count: " & iCount | |
End If | |
If fClearO16 Then | |
'remove current user key | |
Log "Remove key HKCU\Software\Microsoft\Office\16.0\Common\Identity" | |
sRetVal = oWShell.Run("REG DELETE HKCU\Software\Microsoft\Office\16.0\Common\Identity /f", 0, True) | |
'create user settings key to cover other profiles | |
sSettingsKey = "SOFTWARE\Wow6432Node\Microsoft\Office\16.0\User Settings" | |
If (f64 And fO64) Or (Not f64) Then sSettingsKey = "SOFTWARE\Microsoft\Office\16.0\User Settings" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetIdentity" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetIdentity\Delete" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetIdentity\Delete\Software" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetIdentity\Delete\Software\Microsoft" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetIdentity\Delete\Software\Microsoft\Office" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetIdentity\Delete\Software\Microsoft\Office\16.0" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetIdentity\Delete\Software\Microsoft\Office\16.0\Common" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetIdentity\Delete\Software\Microsoft\Office\16.0\Common\Identity" | |
iCount = 1 | |
If Not fSafeForRoamingUsers Then | |
If RegReadDWordValue(HKLM, sSettingsKey & "\ResetIdentity", "Count", sCount) Then iCount = CInt(sCount) + 1 | |
End If | |
oReg.SetDWordValue HKLM, sSettingsKey & "\ResetIdentity", "Count", iCount | |
oReg.SetDWordValue HKLM, sSettingsKey & "\ResetIdentity", "Order", 1 | |
LogOnly "Add SettingsKey: HKLM\" & sSettingsKey & "\ResetIdentity\Delete\Software\Microsoft\Office\16.0\Common\Identity" | |
LogOnly "Count: " & iCount | |
End If | |
End Sub 'ResetOfficeIdentityKey | |
'------------------------------------------------------------------------------- | |
' ResetOfficeUserRegistrationKey | |
' | |
' configures the Office Identity key to be reset on next application launch | |
'------------------------------------------------------------------------------- | |
Sub ResetOfficeUserRegistrationKey () | |
Dim sSettingsKey, sCount, sRetVal, sCmd | |
Dim iCount | |
Dim oExec | |
If fClearO15 Then | |
'remove current user key | |
Log "Remove key HKCU\Software\Microsoft\Office\15.0\Registration" | |
sRetVal = oWShell.Run("REG DELETE HKCU\Software\Microsoft\Office\15.0\Registration /f", 0, True) | |
'create user settings key to cover other profiles | |
sSettingsKey = "SOFTWARE\Wow6432Node\Microsoft\Office\15.0\User Settings" | |
If (f64 And fO64) Or (Not f64) Then sSettingsKey = "SOFTWARE\Microsoft\Office\15.0\User Settings" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetUserRegistration" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetUserRegistration\Delete" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetUserRegistration\Delete\Software" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetUserRegistration\Delete\Software\Microsoft" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetUserRegistration\Delete\Software\Microsoft\Office" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetUserRegistration\Delete\Software\Microsoft\Office\15.0" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetUserRegistration\Delete\Software\Microsoft\Office\15.0\Registration" | |
iCount = 1 | |
If Not fSafeForRoamingUsers Then | |
If RegReadDWordValue(HKLM, sSettingsKey & "\ResetUserRegistration", "Count", sCount) Then iCount = CInt(sCount) + 1 | |
End If | |
oReg.SetDWordValue HKLM, sSettingsKey & "\ResetUserRegistration", "Count", iCount | |
oReg.SetDWordValue HKLM, sSettingsKey & "\ResetUserRegistration", "Order", 1 | |
LogOnly "Add SettingsKey: HKLM\" & sSettingsKey & "\ResetUserRegistration\Delete\Software\Microsoft\Office\15.0\Registration" | |
LogOnly "Count: " & iCount | |
End If | |
If fClearO16 Then | |
'remove current user key | |
Log "Remove key HKCU\Software\Microsoft\Office\16.0\Registration" | |
sRetVal = oWShell.Run("REG DELETE HKCU\Software\Microsoft\Office\16.0\Registration /f", 0, True) | |
'create user settings key to cover other profiles | |
sSettingsKey = "SOFTWARE\Wow6432Node\Microsoft\Office\16.0\User Settings" | |
If (f64 And fO64) Or (Not f64) Then sSettingsKey = "SOFTWARE\Microsoft\Office\16.0\User Settings" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetUserRegistration" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetUserRegistration\Delete" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetUserRegistration\Delete\Software" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetUserRegistration\Delete\Software\Microsoft" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetUserRegistration\Delete\Software\Microsoft\Office" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetUserRegistration\Delete\Software\Microsoft\Office\16.0" | |
oReg.CreateKey HKLM, sSettingsKey & "\ResetUserRegistration\Delete\Software\Microsoft\Office\16.0\Registration" | |
iCount = 1 | |
If Not fSafeForRoamingUsers Then | |
If RegReadDWordValue(HKLM, sSettingsKey & "\ResetUserRegistration", "Count", sCount) Then iCount = CInt(sCount) + 1 | |
End If | |
oReg.SetDWordValue HKLM, sSettingsKey & "\ResetUserRegistration", "Count", iCount | |
oReg.SetDWordValue HKLM, sSettingsKey & "\ResetUserRegistration", "Order", 1 | |
LogOnly "Add SettingsKey: HKLM\" & sSettingsKey & "\ResetUserRegistration\Delete\Software\Microsoft\Office\16.0\Registration" | |
LogOnly "Count: " & iCount | |
End If | |
End Sub 'ResetOfficeUserRegistrationKey | |
'------------------------------------------------------------------------------- | |
' CleanOSPP | |
' | |
' unpkeys the licenses from OSPP | |
'------------------------------------------------------------------------------- | |
Sub CleanOSPP (sFilter) | |
Dim pi | |
Dim oProductInstances | |
' Initialize the software protection platform object with a filter on Office 2013/2016 products | |
If GetVersionNT > 601 Then | |
Set oProductInstances = oWmiLocal.ExecQuery("SELECT ID, ApplicationId, PartialProductKey, Description, Name, ProductKeyID FROM SoftwareLicensingProduct WHERE ApplicationId = '" & OfficeAppId & "' " & "AND PartialProductKey <> NULL") | |
Else | |
Set oProductInstances = oWmiLocal.ExecQuery("SELECT ID, ApplicationId, PartialProductKey, Description, Name, ProductKeyID FROM OfficeSoftwareProtectionProduct WHERE ApplicationId = '" & OfficeAppId & "' " & "AND PartialProductKey <> NULL") | |
End If | |
' Remove all licenses | |
For Each pi in oProductInstances | |
Log "License: " & pi.Name | |
If NOT IsNull(pi) Then | |
If InStr(pi.Name, sFilter) > 0 Or sFilter = "" Then | |
Log "Uninstall ProductKey: " & pi.Name & " - Key: " & pi.ProductKeyID | |
pi.UninstallProductKey(pi.ProductKeyID) | |
End If | |
End If | |
Next 'pi | |
End Sub 'CleanOSPP | |
'------------------------------------------------------------------------------- | |
' DetectOfficeBitness | |
' | |
' detect bitness of Office | |
'------------------------------------------------------------------------------- | |
Sub DetectOfficeBitness () | |
Dim sOPlatform, sInstallRootPath | |
fO64 = False | |
If Not f64 Then Exit Sub | |
If RegReadStringValue(HKLM, "SOFTWARE\Microsoft\Office\ClickToRun\Configuration", "platform", sOPlatform) Then | |
fO64 = (sOPlatform = "x64") | |
Exit Sub | |
End If | |
If RegReadStringValue(HKLM, "SOFTWARE\Microsoft\Office\15.0\ClickToRun\Configuration", "platform", sOPlatform) Then | |
fO64 = (sOPlatform = "x64") | |
Exit Sub | |
End If | |
If RegReadStringValue(HKLM, "SOFTWARE\Microsoft\Office\ClickToRun\propertyBag", "Platform", sOPlatform) Then | |
fO64 = (sOPlatform = "x64") | |
Exit Sub | |
End If | |
If RegReadStringValue(HKLM, "SOFTWARE\Microsoft\Office\15.0\ClickToRun\propertyBag", "Platform", sOPlatform) Then | |
fO64 = (sOPlatform = "x64") | |
Exit Sub | |
End If | |
If RegReadStringValue(HKLM, "SOFTWARE\Wow6432Node\Microsoft\Office\Common\InstallRoot", "Path", sInstallRootPath) Then | |
'fO64 = Not (InStr(sInstallRootPath,"(x86)") > 0) | |
fO64 = False | |
Exit Sub | |
End If | |
If RegReadStringValue(HKLM, "SOFTWARE\Wow6432Node\Microsoft\Office\15.0\Common\InstallRoot", "Path", sInstallRootPath) Then | |
'fO64 = Not (InStr(sInstallRootPath,"(x86)") > 0) | |
fO64 = False | |
Exit Sub | |
End If | |
If RegReadStringValue(HKLM, "SOFTWARE\Microsoft\Office\Common\InstallRoot", "Path", sInstallRootPath) Then | |
'fO64 = Not (InStr(sInstallRootPath,"(x86)") > 0) | |
fO64 = True | |
Exit Sub | |
End If | |
If RegReadStringValue(HKLM, "SOFTWARE\Microsoft\Office\15.0\Common\InstallRoot", "Path", sInstallRootPath) Then | |
'fO64 = Not (InStr(sInstallRootPath,"(x86)") > 0) | |
fO64 = True | |
Exit Sub | |
End If | |
End Sub 'DetectOfficeBitness | |
'------------------------------------------------------------------------------- | |
' DetectOSBitness | |
' | |
' detect bitness of the operating system | |
'------------------------------------------------------------------------------- | |
Sub DetectOSBitness () | |
Dim ComputerItem, item | |
Set ComputerItem = oWmiLocal.ExecQuery("Select * from Win32_ComputerSystem") | |
For Each item In ComputerItem | |
f64 = Instr(Left(item.SystemType, 3), "64") > 0 | |
Next | |
End Sub 'DetectOSBitness | |
'------------------------------------------------------------------------------- | |
' GetVersionNT | |
' | |
' Calculate the VerionNT number as integer | |
'------------------------------------------------------------------------------- | |
Function GetVersionNT () | |
Dim sOsVersion | |
Dim arrVersion | |
Dim qOS | |
Dim oOsItem | |
Set qOS = oWmiLocal.ExecQuery( "Select * from Win32_OperatingSystem") | |
For Each oOsItem in qOS | |
sOsVersion = oOsItem.Version | |
Next | |
arrVersion = Split( sOsVersion, GetDelimiter( sOsVersion)) | |
GetVersionNT = CInt( arrVersion( 0)) * 100 + CInt( arrVersion( 1)) | |
End Function | |
'------------------------------------------------------------------------------- | |
' GetDelimiter | |
' | |
' Returns the delimiter in a version string | |
'------------------------------------------------------------------------------- | |
Function GetDelimiter (sVersion) | |
Dim iCnt, iAsc | |
GetDelimiter = " " | |
For iCnt = 1 To Len(sVersion) | |
iAsc = Asc(Mid(sVersion, iCnt, 1)) | |
If Not (iASC >= 48 And iASC <= 57) Then | |
GetDelimiter = Mid(sVersion, iCnt, 1) | |
Exit Function | |
End If | |
Next 'iCnt | |
End Function | |
'------------------------------------------------------------------------------- | |
' RegReadDWordValue | |
' | |
' Check if a string value exists and return on zero if not | |
'------------------------------------------------------------------------------- | |
Function RegReadDWordValue(hDefKey, sSubKeyName, sName, sValue) | |
Dim RetVal | |
RetVal = oReg.GetDWORDValue(hDefKey, sSubKeyName, sName, sValue) | |
RegReadDWordValue = (RetVal = 0) | |
End Function 'RegReadDWordValue | |
'------------------------------------------------------------------------------- | |
' RegReadStringValue | |
' | |
' Check if a string value exists and return on zero if not | |
'------------------------------------------------------------------------------- | |
Function RegReadStringValue(hDefKey, sSubKeyName, sName, sValue) | |
Dim RetVal | |
RetVal = oReg.GetStringValue(hDefKey, sSubKeyName, sName, sValue) | |
RegReadStringValue = (RetVal = 0) | |
End Function 'RegReadSringValue | |
'------------------------------------------------------------------------------- | |
' RegEnumValues | |
' | |
' Enumerate a registry key to return all values | |
'------------------------------------------------------------------------------- | |
Function RegEnumValues(hDefKey, sSubKeyName, arrNames, arrTypes) | |
Dim RetVal | |
RetVal = oReg.EnumValues(hDefKey, sSubKeyName, arrNames, arrTypes) | |
RegEnumValues = (RetVal = 0) AND IsArray(arrNames) AND IsArray(arrTypes) | |
End Function 'RegEnumValues | |
'------------------------------------------------------------------------------- | |
' RelaunchAs64Host | |
' | |
' Relaunch self with 64 bit CScript host | |
'------------------------------------------------------------------------------- | |
Sub RelaunchAs64Host | |
Dim Argument, sCmd | |
Dim fQuietRelaunch | |
fQuietRelaunch = False | |
sCmd = Replace(LCase(wscript.Path), "syswow64", "sysnative") & "\cscript.exe " & Chr(34) & WScript.scriptFullName & Chr(34) | |
If fQuiet Then fQuietRelaunch = True | |
If Wscript.Arguments.Count > 0 Then | |
For Each Argument in Wscript.Arguments | |
sCmd = sCmd & " " & chr(34) & Argument & chr(34) | |
Select Case UCase(Argument) | |
Case "/Q", "/QUIET" | |
fQuietRelaunch = True | |
End Select | |
Next 'Argument | |
End If | |
sCmd = sCmd & " /ChangedHostBitness" | |
If fQuietRelaunch Then | |
sCmd = Replace (sCmd, "\cscript.exe", "\wscript.exe") | |
Wscript.Quit CLng(oWShell.Run (sCmd, 0, True)) | |
Else | |
Wscript.Quit CLng(oWShell.Run (sCmd, 1, True)) | |
End If | |
End Sub 'RelaunchAs64Host | |
'------------------------------------------------------------------------------- | |
' CreateLog | |
' | |
' Create the removal log file | |
'------------------------------------------------------------------------------- | |
Sub CreateLog | |
Dim DateTime | |
Dim sLogName | |
On Error Resume Next | |
' create the log file | |
Set DateTime = CreateObject("WbemScripting.SWbemDateTime") | |
DateTime.SetVarDate Now, True | |
If sLogDir = "" Then sLogDir = sTemp | |
sLogName = sLogDir & "\" & oWShell.ExpandEnvironmentStrings("%COMPUTERNAME%") | |
sLogName = sLogName & "_" & Left(DateTime.Value, 14) | |
sLogName = sLogName & "_OLicenseClean.txt" | |
Err.Clear | |
Set LogStream = oFso.CreateTextFile(sLogName, True, True) | |
If Err <> 0 Then | |
Err.Clear | |
sLogDir = sTemp | |
sLogName = sLogDir & "\" & oWShell.ExpandEnvironmentStrings("%COMPUTERNAME%") | |
sLogName = sLogName & "_" & Left(DateTime.Value, 14) | |
sLogName = sLogName & "_oLicenseClean.txt" | |
Set LogStream = oFso.CreateTextFile(sLogName, True, True) | |
End If | |
On Error Goto 0 | |
LogH2 "Microsoft Customer Support Services - Office License Reset Utility" & vbCrLf & vbCrLf & _ | |
"Version: " & vbTab & SCRIPTVERSION & vbCrLf & _ | |
"64 bit OS: " & vbTab & f64 & vbCrLf & _ | |
"64 bit Office: " & vbTab & fO64 & vbCrLf & _ | |
"Cleanup start: " & vbTab & Time | |
LogH2 "OS Details: " & sOSinfo & vbCrLf | |
End Sub 'CreateLog | |
'------------------------------------------------------------------------------- | |
' LogH | |
' | |
' Write a header log string to the log file | |
'------------------------------------------------------------------------------- | |
Sub LogH (sLog) | |
LogStream.WriteLine "" | |
sLog = sLog & vbCrLf & String(Len(sLog), "=") | |
If NOT fQuiet AND fCScript Then wscript.echo "" | |
If NOT fQuiet AND fCScript Then wscript.echo sLog | |
LogStream.WriteLine sLog | |
End Sub 'Logh | |
'------------------------------------------------------------------------------- | |
' LogH1 | |
' | |
' Write a header log string to the log file | |
'------------------------------------------------------------------------------- | |
Sub LogH1 (sLog) | |
LogStream.WriteLine "" | |
sLog = sLog & vbCrLf & String(Len(sLog), "-") | |
If NOT fQuiet AND fCScript Then wscript.echo "" | |
If NOT fQuiet AND fCScript Then wscript.echo sLog | |
LogStream.WriteLine sLog | |
End Sub 'LogH1 | |
'------------------------------------------------------------------------------- | |
' LogH2 | |
' | |
' Write w/o indent Cmd window and the log file | |
'------------------------------------------------------------------------------- | |
Sub LogH2 (sLog) | |
If NOT fQuiet AND fCScript Then wscript.echo sLog | |
LogStream.WriteLine "" | |
LogStream.WriteLine sLog | |
End Sub 'LogH2 | |
'------------------------------------------------------------------------------- | |
' Log | |
' | |
' Echos the log string to the Cmd window and the log file | |
'------------------------------------------------------------------------------- | |
Sub Log (sLog) | |
If NOT fQuiet AND fCScript Then wscript.echo sLog | |
If sLog = "" Then | |
LogStream.WriteLine | |
Else | |
LogStream.WriteLine " " & Time & ": " & sLog | |
End If | |
End Sub 'Log | |
'------------------------------------------------------------------------------- | |
' LogOnly | |
' | |
' Commits the log string to the log file | |
'------------------------------------------------------------------------------- | |
Sub LogOnly (sLog) | |
If sLog = "" Then | |
LogStream.WriteLine | |
Else | |
LogStream.WriteLine " " & Time & ": " & sLog | |
End If | |
End Sub 'Log |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment