mirror of
https://github.com/MLBZ521/MacAdmin.git
synced 2026-02-03 05:53:26 +00:00
723 lines
23 KiB
Bash
723 lines
23 KiB
Bash
#!/bin/sh
|
|
#set -x
|
|
|
|
###################################################################################################
|
|
# Script Name: convert_OfficeLicense.sh
|
|
# By: Zack Thompson / Created: 8/28/2018
|
|
# Version: 1.0 / Updated: 8/28/2018 / By: ZT
|
|
#
|
|
# Description: Allows for a Site Admin to change the current license type of Office 2016 and newer.
|
|
#
|
|
# This is based on: https://github.com/pbowden-msft/Unlicense
|
|
#
|
|
###################################################################################################
|
|
|
|
TOOL_NAME="Microsoft Office 365/2019/2016 License Removal Tool"
|
|
TOOL_VERSION="3.0"
|
|
|
|
## Copyright (c) 2018 Microsoft Corp. All rights reserved.
|
|
## Scripts are not supported under any Microsoft standard support program or service. The scripts are provided AS IS without warranty of any kind.
|
|
## Microsoft disclaims all implied warranties including, without limitation, any implied warranties of merchantability or of fitness for a
|
|
## particular purpose. The entire risk arising out of the use or performance of the scripts and documentation remains with you. In no event shall
|
|
## Microsoft, its authors, or anyone else involved in the creation, production, or delivery of the scripts be liable for any damages whatsoever
|
|
## (including, without limitation, damages for loss of business profits, business interruption, loss of business information, or other pecuniary
|
|
## loss) arising out of the use of or inability to use the sample scripts or documentation, even if Microsoft has been advised of the possibility
|
|
## of such damages.
|
|
## Feedback: pbowden@microsoft.com
|
|
|
|
# Constants
|
|
function SetConstants {
|
|
O365PRODUCT="$HOME/Library/Group Containers/UBF8T346G9.Office"
|
|
WORD2016PATH="/Applications/Microsoft Word.app"
|
|
EXCEL2016PATH="/Applications/Microsoft Excel.app"
|
|
POWERPOINT2016PATH="/Applications/Microsoft PowerPoint.app"
|
|
OUTLOOK2016PATH="/Applications/Microsoft Outlook.app"
|
|
VOLUMELICENSE="/Library/Preferences/com.microsoft.office.licensingV2.plist"
|
|
SHAREDLICENSE="/Library/Application Support/Microsoft/Office365/com.microsoft.Office365.plist"
|
|
O365SUBMAIN="$O365PRODUCT/com.microsoft.Office365.plist"
|
|
O365SUBBAK1="$O365PRODUCT/com.microsoft.e0E2OUQxNUY1LTAxOUQtNDQwNS04QkJELTAxQTI5M0JBOTk4O.plist"
|
|
O365SUBBAK2="$O365PRODUCT/e0E2OUQxNUY1LTAxOUQtNDQwNS04QkJELTAxQTI5M0JBOTk4O"
|
|
O365SUBMAINB="$O365PRODUCT/com.microsoft.Office365V2.plist"
|
|
O365SUBBAK1B="$O365PRODUCT/com.microsoft.O4kTOBJ0M5ITQxATLEJkQ40SNwQDNtQUOxATL1YUNxQUO2E0e.plist"
|
|
O365SUBBAK2B="$O365PRODUCT/O4kTOBJ0M5ITQxATLEJkQ40SNwQDNtQUOxATL1YUNxQUO2E0e"
|
|
REGISTRY="$HOME/Library/Group Containers/UBF8T346G9.Office/MicrosoftRegistrationDB.reg"
|
|
}
|
|
|
|
# HOME folder detection
|
|
function GetHomeFolder {
|
|
HOME=$(dscl . read /Users/"$1" NFSHomeDirectory | cut -d ':' -f2 | cut -d ' ' -f2)
|
|
if [ "$HOME" == "" ]; then
|
|
if [ -d "/Users/$1" ]; then
|
|
HOME="/Users/$1"
|
|
else
|
|
HOME=$(eval echo "~$1")
|
|
fi
|
|
fi
|
|
}
|
|
|
|
|
|
# Shows tool usage and parameters
|
|
function ShowUsage {
|
|
echo $TOOL_NAME - $TOOL_VERSION
|
|
echo "Purpose: Removes current Office 365/2019/2016 for Mac activation license and returns apps to unlicensed state"
|
|
echo "Usage: $0 [--All] [--DetectOnly] [--O365] [--Volume] [--ForceClose] [--User] [--JamfUser]"
|
|
echo "Example: $0 --All --ForceClose"
|
|
echo
|
|
exit 0
|
|
}
|
|
|
|
# Check if Registry exists
|
|
function CheckRegistryExists {
|
|
if [ ! -f "$REGISTRY" ]; then
|
|
echo "ERROR: Registry DOES NOT exist at path $REGISTRY."
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Check to see if we get a response from a URL request
|
|
function ContactURL {
|
|
local URL="$1"
|
|
URLRESULT=$(curl --head -s $URL | awk '/HTTP/' | cut -d ' ' -f2)
|
|
echo $URLRESULT
|
|
}
|
|
|
|
# Get node_id value from Registry
|
|
function GetNodeId {
|
|
local NAME="$1"
|
|
local PARENT="$2"
|
|
local NODEVALUE=$(sqlite3 "$REGISTRY" "SELECT node_id from HKEY_CURRENT_USER WHERE name='$NAME' AND parent_id=$PARENT;")
|
|
if [ "$NODEVALUE" == '' ]; then
|
|
echo "0"
|
|
else
|
|
echo "$NODEVALUE"
|
|
fi
|
|
}
|
|
|
|
# Get node value from Registry
|
|
function GetNodeVal {
|
|
local NAME="$1"
|
|
local NODEID="$2"
|
|
local NODEVALUE=$(sqlite3 "$REGISTRY" "SELECT node_id from HKEY_CURRENT_USER_values WHERE name='$NAME' AND parent_id=$NODEID;")
|
|
if [ "$NODEVALUE" == '' ]; then
|
|
echo "0"
|
|
else
|
|
echo "$NODEVALUE"
|
|
fi
|
|
}
|
|
|
|
# Delete value from Registry
|
|
function DeleteValue {
|
|
local NAME="$1"
|
|
local NODEID="$2"
|
|
sqlite3 "$REGISTRY" "DELETE FROM HKEY_CURRENT_USER_values WHERE name='$NAME' and node_id=$NODEID;"
|
|
}
|
|
|
|
# Remove all flighting keys from the specified app
|
|
function RemoveFlightData {
|
|
local KEY_APP="$1"
|
|
# If the flight keys are set, remove the existing values
|
|
KEY_UPDATETIME=($GetNodeVal "FlightUpdateTime" "$KEY_APP")
|
|
if [ "$KEY_UPDATETIME" != "0" ]; then
|
|
DeleteValue "FlightUpdateTime" "$KEY_APP"
|
|
fi
|
|
KEY_ETAG=($GetNodeVal "ETag" "$KEY_APP")
|
|
if [ "$KEY_ETAG" != "0" ]; then
|
|
DeleteValue "ETag" "$KEY_APP"
|
|
fi
|
|
KEY_IMPRESSION=($GetNodeVal "ImpressionId" "$KEY_APP")
|
|
if [ "$KEY_IMPRESSION" != "0" ]; then
|
|
DeleteValue "ImpressionId" "$KEY_APP"
|
|
fi
|
|
KEY_EXPIRES=($GetNodeVal "Expires" "$KEY_APP")
|
|
if [ "$KEY_EXPIRES" != "0" ]; then
|
|
DeleteValue "Expires" "$KEY_APP"
|
|
fi
|
|
KEY_DEFERRED=($GetNodeVal "DeferredConfigs" "$KEY_APP")
|
|
if [ "$KEY_DEFERRED" != "0" ]; then
|
|
DeleteValue "DeferredConfigs" "$KEY_APP"
|
|
fi
|
|
KEY_CONFIGID=($GetNodeVal "ConfigIds" "$KEY_APP")
|
|
if [ "$KEY_CONFIGID" != "0" ]; then
|
|
DeleteValue "ConfigIds" "$KEY_APP"
|
|
fi
|
|
KEY_NUMBERLINES=($GetNodeVal "FlightNumberlines" "$KEY_APP")
|
|
if [ "$KEY_NUMBERLINES" != "0" ]; then
|
|
DeleteValue "FlightNumberlines" "$KEY_APP"
|
|
fi
|
|
KEY_TASREQ=($GetNodeVal "TasRequestPending" "$KEY_APP")
|
|
if [ "$KEY_TASREQ" != "0" ]; then
|
|
DeleteValue "TasRequestPending" "$KEY_APP"
|
|
fi
|
|
KEY_FLVER=($GetNodeVal "FlightingVersion" "$KEY_APP")
|
|
if [ "$KEY_FLVER" != "0" ]; then
|
|
DeleteValue "FlightingVersion" "$KEY_APP"
|
|
fi
|
|
}
|
|
|
|
# Check that all licensed applications are not running
|
|
function CheckRunning {
|
|
OPENAPPS=0
|
|
WORDRUNSTATE=$(CheckLaunchState "$WORD2016PATH")
|
|
if [ "$WORDRUNSTATE" == "1" ]; then
|
|
OPENAPPS=$(($OPENAPPS + 1))
|
|
echo "ERROR: Word must be closed before license files can be removed."
|
|
fi
|
|
EXCELRUNSTATE=$(CheckLaunchState "$EXCEL2016PATH")
|
|
if [ "$EXCELRUNSTATE" == "1" ]; then
|
|
OPENAPPS=$(($OPENAPPS + 1))
|
|
echo "ERROR: Excel must be closed before license files can be removed."
|
|
fi
|
|
POWERPOINTRUNSTATE=$(CheckLaunchState "$POWERPOINT2016PATH")
|
|
if [ "$POWERPOINTRUNSTATE" == "1" ]; then
|
|
OPENAPPS=$(($OPENAPPS + 1))
|
|
echo "ERROR: PowerPoint must be closed before license files can be removed."
|
|
fi
|
|
OUTLOOKRUNSTATE=$(CheckLaunchState "$OUTLOOK2016PATH")
|
|
if [ "$OUTLOOKRUNSTATE" == "1" ]; then
|
|
OPENAPPS=$(($OPENAPPS + 1))
|
|
echo "ERROR: Outlook must be closed before license files can be removed."
|
|
fi
|
|
if [ "$OPENAPPS" != "0" ]; then
|
|
echo
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Checks to see if a process is running
|
|
function CheckLaunchState {
|
|
local RUNNING_RESULT=$(ps ax | grep -v grep | grep "$1")
|
|
if [ "${#RUNNING_RESULT}" -gt 0 ]; then
|
|
echo "1"
|
|
else
|
|
echo "0"
|
|
fi
|
|
}
|
|
|
|
# Forcibly terminates a running process
|
|
function ForceTerminate {
|
|
$(ps ax | grep -v grep | grep "$1" | awk '{print $1}' | xargs kill -9 2> /dev/null)
|
|
}
|
|
|
|
# Force quit all Office apps that integrate with licensing
|
|
function ForceQuitApps {
|
|
ForceTerminate "$WORD2016PATH"
|
|
ForceTerminate "$EXCEL2016PATH"
|
|
ForceTerminate "$POWERPOINT2016PATH"
|
|
ForceTerminate "$OUTLOOK2016PATH"
|
|
}
|
|
|
|
# Checks to see if a volume license file is present
|
|
function DetectVolumeLicense {
|
|
if [ -f "$VOLUMELICENSE" ]; then
|
|
echo "1"
|
|
else
|
|
echo "0"
|
|
fi
|
|
}
|
|
|
|
# Checks to see if an O365 subscription license file is present
|
|
function DetectO365License {
|
|
if [ -f "$O365SUBMAIN" ] || [ -f "$O365SUBBAK1" ] || [ -f "$O365SUBBAK2" ] || [ -f "$O365SUBMAINB" ] || [ -f "$O365SUBBAK1B" ] || [ -f "$O365SUBBAK2B" ]; then
|
|
echo "1"
|
|
else
|
|
echo "0"
|
|
fi
|
|
}
|
|
|
|
# Removes the volume license file
|
|
function RemoveVolumeLicense {
|
|
VLREADYTOREMOVE=$(DetectVolumeLicense)
|
|
if [ "$VLREADYTOREMOVE" == "1" ]; then
|
|
PRIVS=$(GetSudo)
|
|
if [ "$PRIVS" == "1" ]; then
|
|
echo "1"
|
|
return
|
|
else
|
|
sudo rm -f "$VOLUMELICENSE"
|
|
if [ "$?" == "0" ]; then
|
|
echo "0"
|
|
else
|
|
echo "1"
|
|
fi
|
|
fi
|
|
else
|
|
echo "2"
|
|
fi
|
|
}
|
|
|
|
# Removes the Office 365 Subscription license files
|
|
function RemoveO365License {
|
|
O365READYTOREMOVE=$(DetectO365License)
|
|
if [ "$O365READYTOREMOVE" == "1" ]; then
|
|
if [ -f "$O365SUBMAIN" ]; then
|
|
rm -f "$O365SUBMAIN"
|
|
fi
|
|
if [ -f "$O365SUBBAK1" ]; then
|
|
rm -f "$O365SUBBAK1"
|
|
fi
|
|
if [ -f "$O365SUBBAK2" ]; then
|
|
rm -f "$O365SUBBAK2"
|
|
fi
|
|
if [ -f "$O365SUBMAINB" ]; then
|
|
rm -f "$O365SUBMAINB"
|
|
fi
|
|
if [ -f "$O365SUBBAK1B" ]; then
|
|
rm -f "$O365SUBBAK1B"
|
|
fi
|
|
if [ -f "$O365SUBBAK2B" ]; then
|
|
rm -f "$O365SUBBAK2B"
|
|
fi
|
|
if [ -f "$SHAREDLICENSE" ]; then
|
|
rm -f "$SHAREDLICENSE"
|
|
fi
|
|
O365VERIFYREMOVAL=$(DetectO365License)
|
|
if [ "$O365VERIFYREMOVAL" == "0" ]; then
|
|
echo "0"
|
|
else
|
|
echo "1"
|
|
fi
|
|
else
|
|
echo "2"
|
|
fi
|
|
}
|
|
|
|
# Removes the package receipt metadata
|
|
function RemoveReceipt {
|
|
local PKGARRAY=($(pkgutil --pkgs=$1))
|
|
for p in "${PKGARRAY[@]}"
|
|
do
|
|
sudo pkgutil --forget $p
|
|
if [ $? -eq 0 ] ; then
|
|
echo "0"
|
|
else
|
|
echo "1"
|
|
fi
|
|
done
|
|
}
|
|
|
|
# Reset the first run experience for each licensed app
|
|
function ResetFRE {
|
|
/usr/bin/defaults write com.microsoft.Word kSubUIAppCompletedFirstRunSetup1507 -bool FALSE
|
|
/usr/bin/defaults write com.microsoft.Excel kSubUIAppCompletedFirstRunSetup1507 -bool FALSE
|
|
/usr/bin/defaults write com.microsoft.Powerpoint kSubUIAppCompletedFirstRunSetup1507 -bool FALSE
|
|
/usr/bin/defaults write com.microsoft.Outlook kSubUIAppCompletedFirstRunSetup1507 -bool FALSE
|
|
/usr/bin/defaults write com.microsoft.Outlook FirstRunExperienceCompletedO15 -bool FALSE
|
|
}
|
|
|
|
# Reset the first run experience in sudo for each licensed app
|
|
function SudoResetFRE {
|
|
sudo -u $USER /usr/bin/defaults write com.microsoft.Word kSubUIAppCompletedFirstRunSetup1507 -bool FALSE
|
|
sudo -u $USER /usr/bin/defaults write com.microsoft.Excel kSubUIAppCompletedFirstRunSetup1507 -bool FALSE
|
|
sudo -u $USER /usr/bin/defaults write com.microsoft.Powerpoint kSubUIAppCompletedFirstRunSetup1507 -bool FALSE
|
|
sudo -u $USER /usr/bin/defaults write com.microsoft.Outlook kSubUIAppCompletedFirstRunSetup1507 -bool FALSE
|
|
sudo -u $USER /usr/bin/defaults write com.microsoft.Outlook FirstRunExperienceCompletedO15 -bool FALSE
|
|
}
|
|
|
|
# Checks to see if 'msoCredentialSchemeADAL' entries are present in the keychain
|
|
function FindEntryMsoCredentialSchemeADAL {
|
|
/usr/bin/security find-internet-password -s 'msoCredentialSchemeADAL' 2> /dev/null 1> /dev/null
|
|
echo $?
|
|
}
|
|
|
|
# Removes the first 'msoCredentialSchemeADAL' entry from the keychain
|
|
function RemoveEntryMsoCredentialSchemeADAL {
|
|
/usr/bin/security delete-internet-password -s 'msoCredentialSchemeADAL' 2> /dev/null 1> /dev/null
|
|
}
|
|
|
|
# Checks to see if 'msoCredentialSchemeLiveId' entries are present in the keychain
|
|
function FindEntryMsoCredentialSchemeLiveId {
|
|
/usr/bin/security find-internet-password -s 'msoCredentialSchemeLiveId' 2> /dev/null 1> /dev/null
|
|
echo $?
|
|
}
|
|
|
|
# Removes the first 'msoCredentialSchemeLiveId' entry from the keychain
|
|
function RemoveEntryMsoCredentialSchemeLiveId {
|
|
/usr/bin/security delete-internet-password -s 'msoCredentialSchemeLiveId' 2> /dev/null 1> /dev/null
|
|
}
|
|
|
|
# Checks to see if 'MSOpenTech.ADAL.1*' entries are present in the keychain
|
|
function FindEntryMSOpenTechADAL1 {
|
|
/usr/bin/security find-generic-password -G 'MSOpenTech.ADAL.1' 2> /dev/null 1> /dev/null
|
|
echo $?
|
|
}
|
|
|
|
# Removes the first 'MSOpenTech.ADAL.1*' entry from the keychain
|
|
function RemoveEntryMSOpenTechADAL1 {
|
|
/usr/bin/security delete-generic-password -G 'MSOpenTech.ADAL.1' 2> /dev/null 1> /dev/null
|
|
}
|
|
|
|
# Checks to see if the 'Microsoft Office Identities Cache 2' entry is present in the keychain (15.x builds)
|
|
function FindEntryOfficeIdCache2 {
|
|
/usr/bin/security find-generic-password -l 'Microsoft Office Identities Cache 2' 2> /dev/null 1> /dev/null
|
|
echo $?
|
|
}
|
|
|
|
# Removes the 'Microsoft Office Identities Cache 2' entry from the keychain (15.x builds)
|
|
function RemoveEntryOfficeIdCache2 {
|
|
/usr/bin/security delete-generic-password -l 'Microsoft Office Identities Cache 2' 2> /dev/null 1> /dev/null
|
|
}
|
|
|
|
# Checks to see if the 'Microsoft Office Identities Cache 3' entry is present in the keychain (16.x builds)
|
|
function FindEntryOfficeIdCache3 {
|
|
/usr/bin/security find-generic-password -l 'Microsoft Office Identities Cache 3' 2> /dev/null 1> /dev/null
|
|
echo $?
|
|
}
|
|
|
|
# Removes the 'Microsoft Office Identities Cache 3' entry from the keychain (16.x builds)
|
|
function RemoveEntryOfficeIdCache3 {
|
|
/usr/bin/security delete-generic-password -l 'Microsoft Office Identities Cache 3' 2> /dev/null 1> /dev/null
|
|
}
|
|
|
|
# Checks to see if the 'Microsoft Office Identities Settings 2' entry is present in the keychain (15.x builds)
|
|
function FindEntryOfficeIdSettings2 {
|
|
/usr/bin/security find-generic-password -l 'Microsoft Office Identities Settings 2' 2> /dev/null 1> /dev/null
|
|
echo $?
|
|
}
|
|
|
|
# Removes the 'Microsoft Office Identities Settings 2' entry from the keychain (15.x builds)
|
|
function RemoveEntryOfficeIdSettings2 {
|
|
/usr/bin/security delete-generic-password -l 'Microsoft Office Identities Settings 2' 2> /dev/null 1> /dev/null
|
|
}
|
|
|
|
# Checks to see if the 'Microsoft Office Identities Settings 3' entry is present in the keychain (16.x builds)
|
|
function FindEntryOfficeIdSettings3 {
|
|
/usr/bin/security find-generic-password -l 'Microsoft Office Identities Settings 3' 2> /dev/null 1> /dev/null
|
|
echo $?
|
|
}
|
|
|
|
# Removes the 'Microsoft Office Identities Settings 3' entry from the keychain (16.x builds)
|
|
function RemoveEntryOfficeIdSettings3 {
|
|
/usr/bin/security delete-generic-password -l 'Microsoft Office Identities Settings 3' 2> /dev/null 1> /dev/null
|
|
}
|
|
|
|
# Checks to see if the 'Microsoft Office Ticket Cache' entry is present in the keychain (16.x builds)
|
|
function FindEntryOfficeTicketCache {
|
|
/usr/bin/security find-generic-password -l 'Microsoft Office Ticket Cache' 2> /dev/null 1> /dev/null
|
|
echo $?
|
|
}
|
|
|
|
# Removes the 'Microsoft Office Ticket Cache' entry from the keychain (16.x builds)
|
|
function RemoveEntryOfficeTicketCache {
|
|
/usr/bin/security delete-generic-password -l 'Microsoft Office Ticket Cache' 2> /dev/null 1> /dev/null
|
|
}
|
|
|
|
# Checks to see if the 'com.microsoft.adalcache' entry is present in the keychain (16.x builds)
|
|
function FindEntryAdalCache {
|
|
/usr/bin/security find-generic-password -l 'com.microsoft.adalcache' 2> /dev/null 1> /dev/null
|
|
echo $?
|
|
}
|
|
|
|
# Removes the 'com.microsoft.adalcache' entry from the keychain (16.x builds)
|
|
function RemoveEntryAdalCache {
|
|
/usr/bin/security delete-generic-password -l 'com.microsoft.adalcache' 2> /dev/null 1> /dev/null
|
|
}
|
|
|
|
# Checks to see if the 'com.helpshift.data_com.microsoft.Outlook' entry is present in the keychain
|
|
function FindEntryHelpShift {
|
|
/usr/bin/security find-generic-password -l 'com.helpshift.data_com.microsoft.Outlook' 2> /dev/null 1> /dev/null
|
|
echo $?
|
|
}
|
|
|
|
# Removes the 'com.helpshift.data_com.microsoft.Outlook' entry from the keychain
|
|
function RemoveEntryHelpShift {
|
|
/usr/bin/security delete-generic-password -l 'com.helpshift.data_com.microsoft.Outlook' 2> /dev/null 1> /dev/null
|
|
}
|
|
|
|
# Checks to see if the 'MicrosoftOfficeRMSCredential' entry is present in the keychain
|
|
function FindEntryRMSCredential {
|
|
/usr/bin/security find-generic-password -l 'MicrosoftOfficeRMSCredential' 2> /dev/null 1> /dev/null
|
|
echo $?
|
|
}
|
|
|
|
# Removes the 'MicrosoftOfficeRMSCredential' entry from the keychain
|
|
function RemoveEntryRMSCredential {
|
|
/usr/bin/security delete-generic-password -l 'MicrosoftOfficeRMSCredential' 2> /dev/null 1> /dev/null
|
|
}
|
|
|
|
# Checks to see if the 'MSProtection.framework.service' entry is present in the keychain
|
|
function FindEntryMSProtection {
|
|
/usr/bin/security find-generic-password -l 'MSProtection.framework.service' 2> /dev/null 1> /dev/null
|
|
echo $?
|
|
}
|
|
|
|
# Removes the 'MSProtection.framework.service' entry from the keychain
|
|
function RemoveEntryMSProtection {
|
|
/usr/bin/security delete-generic-password -l 'MSProtection.framework.service' 2> /dev/null 1> /dev/null
|
|
}
|
|
|
|
function GetSudo {
|
|
# Checks to see if the user has root-level permissions
|
|
if [ "$EUID" != "0" ]; then
|
|
sudo -p "Enter administrator password: " echo
|
|
if [ $? -eq 0 ] ; then
|
|
echo "0"
|
|
else
|
|
echo "1"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# Evaluate command-line arguments
|
|
if [[ $# = 0 ]]; then
|
|
ShowUsage
|
|
else
|
|
|
|
# Configured to always run as --JamfUser (save confusion for Site Admins)
|
|
# Used to remove Office 365/2019/2016 activation for Jamf script. Example Self Service script.
|
|
# Parameter 4: --All, Parameter 5: --ForceClose
|
|
USER=$3
|
|
GetHomeFolder "$USER"
|
|
|
|
for KEY in "$@"
|
|
do
|
|
case $KEY in
|
|
--Help|-h|--help)
|
|
ShowUsage
|
|
shift # past argument
|
|
;;
|
|
--All|-a|--all)
|
|
REMOVEVL=true
|
|
REMOVEO365=true
|
|
shift # past argument
|
|
;;
|
|
--DetectOnly|-d|--detectonly)
|
|
DETECT=true
|
|
shift # past argument
|
|
;;
|
|
--O365|-o|--o365)
|
|
REMOVEO365=true
|
|
shift # past argument
|
|
;;
|
|
--Volume|-v|--volume)
|
|
REMOVEVL=true
|
|
shift # past argument
|
|
;;
|
|
--ForceClose|-f|--forceclose)
|
|
FORCECLOSE=true
|
|
shift # past argument
|
|
;;
|
|
--User:*|-u:*)
|
|
USER=${KEY#*:}
|
|
GetHomeFolder "$USER"
|
|
shift # past argument
|
|
;;
|
|
esac
|
|
shift # past argument or value
|
|
done
|
|
fi
|
|
|
|
## Main
|
|
SetConstants
|
|
# Check first for detection mode
|
|
if [ $DETECT ]; then
|
|
VLPRESENT=$(DetectVolumeLicense)
|
|
if [ "$VLPRESENT" == "1" ]; then
|
|
echo "A volume license was detected."
|
|
else
|
|
echo "A volume license was NOT detected."
|
|
fi
|
|
|
|
O365PRESENT=$(DetectO365License)
|
|
if [ "$O365PRESENT" == "1" ]; then
|
|
echo "An Office 365 Subscription license was detected."
|
|
else
|
|
echo "An Office 365 Subscription license was NOT detected."
|
|
fi
|
|
|
|
if [ "$VLPRESENT" == "1" ] && [ "$O365PRESENT" == "1" ]; then
|
|
echo "WARNING: Both volume and Office 365 Subscription licenses were detected. Only the volume license will be used."
|
|
fi
|
|
exit 0
|
|
fi
|
|
|
|
# Remove volume license
|
|
if [ $REMOVEVL ]; then
|
|
VLPRESENT=$(DetectVolumeLicense)
|
|
if [ "$VLPRESENT" == "1" ]; then
|
|
if [ $FORCECLOSE ]; then
|
|
ForceQuitApps
|
|
else
|
|
CheckRunning
|
|
fi
|
|
REMOVEVLFILES=$(RemoveVolumeLicense)
|
|
if [ "$REMOVEVLFILES" == "0" ]; then
|
|
SudoResetFRE
|
|
echo "The volume license files were removed successfully."
|
|
elif [ "$REMOVEVLFILES" == "2" ]; then
|
|
echo "WARNING: No volume license files were present"
|
|
else
|
|
echo "ERROR: The volume license files could NOT be removed. Try using the sudo command to elevate permissions."
|
|
exit 1
|
|
fi
|
|
REMOVEVLRECEIPT=$(RemoveReceipt "com.microsoft.pkg.licensing.volume")
|
|
else
|
|
echo "WARNING: No volume license files were present"
|
|
fi
|
|
fi
|
|
|
|
# Remove subscription license
|
|
if [ $REMOVEO365 ]; then
|
|
O365PRESENT=$(DetectO365License)
|
|
if [ "$O365PRESENT" == "1" ]; then
|
|
if [ $FORCECLOSE ]; then
|
|
ForceQuitApps
|
|
else
|
|
CheckRunning
|
|
fi
|
|
# Find and remove 'msoCredentialSchemeADAL' entries
|
|
MAXCOUNT=0
|
|
KEYNOTPRESENT=$(FindEntryMsoCredentialSchemeADAL)
|
|
while [ "$KEYNOTPRESENT" == "0" ] || [ $MAXCOUNT -gt 20 ]; do
|
|
RemoveEntryMsoCredentialSchemeADAL
|
|
let MAXCOUNT=MAXCOUNT+1
|
|
KEYNOTPRESENT=$(FindEntryMsoCredentialSchemeADAL)
|
|
done
|
|
|
|
# Find and remove 'msoCredentialSchemeLiveId' entries
|
|
MAXCOUNT=0
|
|
KEYNOTPRESENT=$(FindEntryMsoCredentialSchemeLiveId)
|
|
while [ "$KEYNOTPRESENT" == "0" ] || [ $MAXCOUNT -gt 20 ]; do
|
|
RemoveEntryMsoCredentialSchemeLiveId
|
|
let MAXCOUNT=MAXCOUNT+1
|
|
KEYNOTPRESENT=$(FindEntryMsoCredentialSchemeLiveId)
|
|
done
|
|
|
|
# Find and remove 'MSOpenTech.ADAL.1*' entries
|
|
MAXCOUNT=0
|
|
KEYNOTPRESENT=$(FindEntryMSOpenTechADAL1)
|
|
while [ "$KEYNOTPRESENT" == "0" ] || [ $MAXCOUNT -gt 20 ]; do
|
|
RemoveEntryMSOpenTechADAL1
|
|
let MAXCOUNT=MAXCOUNT+1
|
|
KEYNOTPRESENT=$(FindEntryMSOpenTechADAL1)
|
|
done
|
|
|
|
# Find and remove 'Microsoft Office Identities Cache 2' entries
|
|
MAXCOUNT=0
|
|
KEYNOTPRESENT=$(FindEntryOfficeIdCache2)
|
|
while [ "$KEYNOTPRESENT" == "0" ] || [ $MAXCOUNT -gt 20 ]; do
|
|
RemoveEntryOfficeIdCache2
|
|
let MAXCOUNT=MAXCOUNT+1
|
|
KEYNOTPRESENT=$(FindEntryOfficeIdCache2)
|
|
done
|
|
|
|
# Find and remove 'Microsoft Office Identities Cache 3' entries
|
|
MAXCOUNT=0
|
|
KEYNOTPRESENT=$(FindEntryOfficeIdCache3)
|
|
while [ "$KEYNOTPRESENT" == "0" ] || [ $MAXCOUNT -gt 20 ]; do
|
|
RemoveEntryOfficeIdCache3
|
|
let MAXCOUNT=MAXCOUNT+1
|
|
KEYNOTPRESENT=$(FindEntryOfficeIdCache3)
|
|
done
|
|
|
|
# Find and remove 'Microsoft Office Identities Settings 2' entries
|
|
MAXCOUNT=0
|
|
KEYNOTPRESENT=$(FindEntryOfficeIdSettings2)
|
|
while [ "$KEYNOTPRESENT" == "0" ] || [ $MAXCOUNT -gt 20 ]; do
|
|
RemoveEntryOfficeIdSettings2
|
|
let MAXCOUNT=MAXCOUNT+1
|
|
KEYNOTPRESENT=$(FindEntryOfficeIdSettings2)
|
|
done
|
|
|
|
# Find and remove 'Microsoft Office Identities Settings 3' entries
|
|
MAXCOUNT=0
|
|
KEYNOTPRESENT=$(FindEntryOfficeIdSettings3)
|
|
while [ "$KEYNOTPRESENT" == "0" ] || [ $MAXCOUNT -gt 20 ]; do
|
|
RemoveEntryOfficeIdSettings3
|
|
let MAXCOUNT=MAXCOUNT+1
|
|
KEYNOTPRESENT=$(FindEntryOfficeIdSettings3)
|
|
done
|
|
|
|
# Find and remove 'Microsoft Office Ticket Cache' entries
|
|
MAXCOUNT=0
|
|
KEYNOTPRESENT=$(FindEntryOfficeTicketCache)
|
|
while [ "$KEYNOTPRESENT" == "0" ] || [ $MAXCOUNT -gt 20 ]; do
|
|
RemoveEntryOfficeTicketCache
|
|
let MAXCOUNT=MAXCOUNT+1
|
|
KEYNOTPRESENT=$(FindEntryOfficeTicketCache)
|
|
done
|
|
|
|
# Find and remove 'com.microsoft.adalcache' entries
|
|
MAXCOUNT=0
|
|
KEYNOTPRESENT=$(FindEntryAdalCache)
|
|
while [ "$KEYNOTPRESENT" == "0" ] || [ $MAXCOUNT -gt 20 ]; do
|
|
RemoveEntryAdalCache
|
|
let MAXCOUNT=MAXCOUNT+1
|
|
KEYNOTPRESENT=$(FindEntryAdalCache)
|
|
done
|
|
#echo "Default keychain entries removed"
|
|
|
|
# Find and remove 'MicrosoftOfficeRMSCredential' entries
|
|
MAXCOUNT=0
|
|
KEYNOTPRESENT=$(FindEntryRMSCredential)
|
|
while [ "$KEYNOTPRESENT" == "0" ] || [ $MAXCOUNT -gt 20 ]; do
|
|
RemoveEntryRMSCredential
|
|
let MAXCOUNT=MAXCOUNT+1
|
|
KEYNOTPRESENT=$(FindEntryRMSCredential)
|
|
done
|
|
|
|
# Find and remove 'MSProtection.framework.service' entries
|
|
MAXCOUNT=0
|
|
KEYNOTPRESENT=$(FindEntryMSProtection)
|
|
while [ "$KEYNOTPRESENT" == "0" ] || [ $MAXCOUNT -gt 20 ]; do
|
|
RemoveEntryMSProtection
|
|
let MAXCOUNT=MAXCOUNT+1
|
|
KEYNOTPRESENT=$(FindEntryMSProtection)
|
|
done
|
|
#echo "Rights Management keychain entries removed"
|
|
|
|
# Find and remove 'com.helpshift.data_com.microsoft.Outlook' entries
|
|
MAXCOUNT=0
|
|
KEYNOTPRESENT=$(FindEntryHelpShift)
|
|
while [ "$KEYNOTPRESENT" == "0" ] || [ $MAXCOUNT -gt 20 ]; do
|
|
RemoveEntryHelpShift
|
|
let MAXCOUNT=MAXCOUNT+1
|
|
KEYNOTPRESENT=$(FindEntryHelpShift)
|
|
done
|
|
#echo "HelpShift keychain entries removed"
|
|
|
|
REMOVEO365FILES=$(RemoveO365License)
|
|
if [ "$REMOVEO365FILES" == "0" ]; then
|
|
ResetFRE
|
|
echo "The Office 365 Subscription license files were removed successfully."
|
|
elif [ "$REMOVEO365FILES" == "2" ]; then
|
|
echo "WARNING: No Office 365 Subscription license files were present"
|
|
else
|
|
echo "ERROR: The Office 365 Subscription license files could NOT be removed."
|
|
exit 1
|
|
fi
|
|
else
|
|
echo "WARNING: No Office 365 Subscription license files were present"
|
|
fi
|
|
fi
|
|
|
|
if [ $REMOVEVL ] || [ $REMOVEO365 ]; then
|
|
# Check that MicrosoftRegistryDB.reg actually exists.
|
|
CheckRegistryExists
|
|
# Check to see if the flighting server is online
|
|
FLIGHTRESPONSE=$(ContactURL "https://client-office365-tas.msedge.net/ab?")
|
|
echo "Contacting flighting server: $FLIGHTRESPONSE"
|
|
# Walk the registry to find the id of the node that we need
|
|
KEY_SOFTWARE=$(GetNodeId "Software" '-1')
|
|
KEY_MICROSOFT=$(GetNodeId "Microsoft" "$KEY_SOFTWARE")
|
|
KEY_OFFICE=$(GetNodeId "Office" "$KEY_MICROSOFT")
|
|
KEY_VERSION=$(GetNodeId "16.0" "$KEY_OFFICE")
|
|
KEY_COMMON=$(GetNodeId "Common" "$KEY_VERSION")
|
|
KEY_TAS=$(GetNodeId "ExperimentTAS" "$KEY_COMMON")
|
|
KEY_WORD=$(GetNodeId "word" "$KEY_TAS")
|
|
KEY_EXCEL=$(GetNodeId "excel" "$KEY_TAS")
|
|
KEY_POWERPOINT=$(GetNodeId "powerpoint" "$KEY_TAS")
|
|
KEY_OUTLOOK=$(GetNodeId "outlook" "$KEY_TAS")
|
|
KEY_ONENOTE=$(GetNodeId "onenote" "$KEY_TAS")
|
|
KEY_LICENSING=$(GetNodeId "licensingdaemon" "$KEY_TAS")
|
|
|
|
RemoveFlightData "$KEY_WORD"
|
|
RemoveFlightData "$KEY_EXCEL"
|
|
RemoveFlightData "$KEY_POWERPOINT"
|
|
RemoveFlightData "$KEY_OUTLOOK"
|
|
RemoveFlightData "$KEY_ONENOTE"
|
|
RemoveFlightData "$KEY_LICENSING"
|
|
|
|
echo "Existing flight data removed."
|
|
fi
|
|
|
|
exit 0 |