Page 1 of 1

[RESOLVED] Package to disable migration to the new Outlook

Published: Dec 26, 2024 - 5:16 PM
by bastien30
Good morning,

EDIT 1: Correction of the value of the HideNewOutlookToggle key (1 and not 0), my mistake.
EDIT 2: Registry keys are configured for all users in the install() function rather than during session_setup() because non-admin users do not have the right to write to HKEY_CURRENT_USER\Software\Policies\.
EDIT 3: Re-application of registry key configuration from audit if keys are bad or missing for a user (case of users created after package installation).

Here is a package that allows you to disable the migration to the new Outlook (see https://www.it-connect.fr/gpo-bloquer-m ... l-outlook/).
It also uninstalls the application if it is installed.

Please let me know if it works well for you :D

Code: Select all

# -*- coding: utf-8 -*-
from setuphelpers import *

# https://learn.microsoft.com/en-us/microsoft-365-apps/outlook/get-started/control-install

# Disable new outlook migration
new_outlook_migration = { "path" : r'Software\Policies\Microsoft\office\16.0\outlook\preferences', "name" : "NewOutlookMigrationUserSetting", "value" : 0 }

# Hide "Try new Outlook" button
new_outlook_button = { "path" : r'Software\Microsoft\Office\16.0\Outlook\Options\General', "name" : "HideNewOutlookToggle", "value" : 1 }

def install():
    # Remove new Outlook Appx if installed (computer environment)
    remove_appx(r'Microsoft.OutlookForWindows')

    # Set registry values for all users
    set_registry_all_users()

def session_setup():
    # Remove new Outlook Appx if installed (user environment)
    remove_user_appx(r'Microsoft.OutlookForWindows')
        
def audit():
    audit_result = "OK"
    need_reapply = False
    # Check registry values for all users if exists
    for i in [new_outlook_migration, new_outlook_button]:
        for user_sid in get_all_users_sids():
            if reg_key_exists(HKEY_USERS, user_sid):
                if reg_value_exists(HKEY_USERS, r'%s\%s' % (user_sid, i["path"]), i["name"]):
                    if registry_readstring(HKEY_USERS, r'%s\%s' % (user_sid, i["path"]), i["name"]) != str(i["value"]):
                        print(r'Registry value "%s" is wrong for user "%s", reapplying...' % (i["name"], get_user_from_sid(user_sid)))
                        need_reapply = True
                else:
                    print(r'Registry value "%s" is missing for user "%s", reapplying...' % (i["name"], get_user_from_sid(user_sid)))
                    need_reapply = True

    if need_reapply:
        set_registry_all_users()
        audit_result = "WARNING"

    return audit_result
    
def uninstall():
    # Remove registry values for all users if exists
    for i in [new_outlook_migration, new_outlook_button]:
        for user_sid in get_all_users_sids():
            if reg_value_exists(HKEY_USERS, r'%s\%s' % (user_sid, i["path"]), i["name"]):
                registry_delete(HKEY_USERS, r'%s\%s' % (user_sid, i["path"]), i["name"])

def set_registry_all_users():
    for i in [new_outlook_migration, new_outlook_button]:
        for user_sid in get_all_users_sids():
            if reg_key_exists(HKEY_USERS, user_sid):
                registry_set(HKEY_USERS, r'%s\%s' % (user_sid, i["path"]), i["name"], i["value"], REG_DWORD)

def get_all_users_sids():
    user_sids = []
    with reg_openkey_noredir(HKEY_LOCAL_MACHINE, r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList') as sids:
        for sid in reg_enum_subkeys(sids):
            # Exclude system users SIDs
            if sid.startswith("S-1-5-21-"):
                user_sids.append(sid)
    # Return all users SIDs as list
    return ensure_list(user_sids)

Re: [RESOLVED] Package to disable migration to the new Outlook

Published: January 3, 2025 - 4:55 PM
by fdu
Hi,
Here are some slight modifications made, for our specific case, with the support of Bastien.
And good luck on Monday! :D

---

Clarification on the tests performed (package named disable-newoutlook in our system).
Tested on Windows Pro 10 22H2 & Windows Pro 11 23H2
Works on machines with multiple user sessions
AND do not roll back users who have already migrated to the new Outlook

The computers do not need to be restarted for the change to take effect, just close and reopen Outlook.

Code: Select all

# -*- coding: utf-8 -*-
from setuphelpers import *

#source: https://learn.microsoft.com/en-us/microsoft-365-apps/outlook/get-started/control-install

# Disable new outlook migration
int_newoutlook_migration = 0
# Hide "Try new Outlook" button
int_newoutlook_button = 1

#Migration to New Outlook (default is disabled)
reg_newoutlook_migration = { "path" : r'Software\Policies\Microsoft\office\16.0\outlook\preferences', "name" : "NewOutlookMigrationUserSetting", "value" : int_newoutlook_migration, "type" : REG_DWORD }
# "Try new Outlook" button (default is hidden)
reg_newoutlook_button = { "path" : r'Software\Microsoft\Office\16.0\Outlook\Options\General', "name" : "HideNewOutlookToggle", "value" : int_newoutlook_button, "type" : REG_DWORD }


def install():
    # Remove new Outlook Appx if installed (computer environment)
    #remove_appx(r'Microsoft.OutlookForWindows')

    # Set registry values for all users
    for registry in [reg_newoutlook_migration, reg_newoutlook_button]:
        for user_sid in get_all_users_sids():
            if reg_key_exists(HKEY_USERS, user_sid):
                registry_set(HKEY_USERS, r'%s\%s' % (user_sid, registry["path"]), registry["name"], registry["value"], registry["type"])

def session_setup():
    pass
    # Remove new Outlook Appx if installed (user environment)
    #remove_user_appx(r'Microsoft.OutlookForWindows')

def audit():
    audit_result = "OK"
    # Check registry values for all users if exists
    for registry in [reg_newoutlook_migration, reg_newoutlook_button]:
        for user_sid in get_all_users_sids():
            if reg_value_exists(HKEY_USERS, r'%s\%s' % (user_sid, registry["path"]), registry["name"]):
                if registry_readstring(HKEY_USERS, r'%s\%s' % (user_sid, registry["path"]), registry["name"]) != str(registry["value"]):
                    print(r'Registry value "%s" is wrong for user "%s"' % (registry["name"], get_user_from_sid(user_sid)))
                    audit_result = "ERROR"
    return audit_result

def uninstall():
    #Enable
    # Force new outlook migration
    #int_newoutlook_migration = 1
    # Show "Try new Outlook" button
    int_newoutlook_button = 0

    #Force to New Outlook
    #reg_newoutlook_migration = { "path" : r'Software\Policies\Microsoft\office\16.0\outlook\preferences', "name" : "NewOutlookMigrationUserSetting", "value" : int_newoutlook_migration, "type" : REG_DWORD }
    # "Try new Outlook" button
    reg_newoutlook_button = { "path" : r'Software\Microsoft\Office\16.0\Outlook\Options\General', "name" : "HideNewOutlookToggle", "value" : int_newoutlook_button, "type" : REG_DWORD }

    # Set registry values for all users
    for registry in [reg_newoutlook_button]:
        for user_sid in get_all_users_sids():
            if reg_key_exists(HKEY_USERS, user_sid):
                registry_set(HKEY_USERS, r'%s\%s' % (user_sid, registry["path"]), registry["name"], registry["value"], registry["type"])

def get_all_users_sids():
    user_sids = []
    with reg_openkey_noredir(HKEY_LOCAL_MACHINE, r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList') as sids:
        for sid in reg_enum_subkeys(sids):
            # Exclude system users SIDs
            if sid.startswith("S-1-5-21-"):
                user_sids.append(sid)
    # Return all users SIDs as list
    return ensure_list(user_sids)