Page 1 of 2

Teams package and "Meeting Experience" feature

Published: November 14, 2020 - 11:05 AM
by Pierre Baridon
Hello everyone,

Our users have been asking us for a while for the Teams feature "Enable meeting experience / Together mode" which has been available since this summer / early September.
Togethermode.png
Togethermode.png (53.35 KB) Viewed 11780 times
However, this function was available (with the same client version) on standalone installations but not on installations via the Teams package (deployed with the WAPT package for all users on the workstation in a fixed version).
After a somewhat lengthy search, I understood that this function was not available in VDI environments.
And the fact that the VDI environment is simulated in the package installation effectively blocks this functionality.

To get around this, I adapted the script to delete the "VDI" registry entries once the MSI is installed. And then, magically, once the Teams cache is cleared, the long-awaited functionality appears...

Do you think that deleting the "VDI" registry entries after the msi package is installed could have an impact?

Sincerely,

Rock

Re: Teams package and "Meeting Experience" feature

Published: November 16, 2020 - 09:56
by Gaetan
Hi,
thanks for the feedback. I was also looking to do the same thing.

Could you share your script, please? I could test it on a pre-production environment with 30 machines and see if there are any side effects.
Thanks.

Re: Teams package and "Meeting Experience" feature

Published: November 17, 2020 - 09:45
by Yoann
Hello,

Of course this has an impact.

The registry keys are added to simulate a VDI environment and allow the installation to be performed with the argument ALLUSER=1 (without the S).
This is what allows Microsoft Teams to be installed in the C:\Program Files (x86)\Microsoft\Teams and not in each user's %APPDATA%.

I don't know what the consequences of deleting the registry keys after installation might be...

Best regards.

Re: Teams package and "Meeting Experience" feature

Published: November 17, 2020 - 10:20 AM
by Gaetan
Once installed, it shouldn't cause any problems.
And for updates, you just need to reinstall and uninstall them.

Re: Teams package and "Meeting Experience" feature

Published: November 17, 2020 - 10:40 PM
by Pierre Baridon
Gaetan wrote: Nov 16, 2020 - 9:56 AM Hello,
thanks for the feedback. I was also looking to do the same thing.

Could you share your script, please? I could test it on a pre-production environment with 30 machines and see if there are any side effects.
Thanks.
Good morning,
Here is the code for the adapted package (used with version 1.3.0.28779 of the Teams installer):
2 modifications:
- Deleting the VDI registry keys once installed
- cleaning the user profile at session-setup

It's currently being tested on about fifty machines. If anyone finds a way to modify the setting to avoid purging the entire user profile...

Code: Select all

# -*- coding: utf-8 -*-
from setuphelpers import *
import json
import platform
import time

#{731F6BAA-A986-45A4-8936-7C3AAAAA760B}      Teams Machine-Wide Installer        1.3.0.12058         MsiExec.exe /I{731F6BAA-A986-45A4-8936-7C3AAAAA760B}

uninstallkey = []

# Installation procedure: https://docs.microsoft.com/fr-fr/microsoftteams/teams-for-vdi#install-or-update-the-teams-desktop-app-on-vdi

# Defining variables
bin_name_string = 'Teams_windows_%s_x64.msi'
bin_name_temp = 'Teams_windows_x64.msi'
url_dl = "https://teams.microsoft.com/downloads/desktopurl?env=production&plat=windows&arch=x64&managedInstaller=true&download=true"
silent_args = 'OPTIONS="noAutoStart=true" ALLUSER=1' #OPTIONS="noAutoStart=true" ALLUSER=1 ALLUSERS=1
#silent_args = 'ALLUSER=1' #OPTIONS="noAutoStart=true" ALLUSER=1 ALLUSERS=1
app_name_short = 'Teams'
app_dir = makepath(programfiles32,'Microsoft','Teams')
app_path = makepath(app_dir, 'current','Teams.exe')
#sys_json_setup = makepath(app_dir,'setup.json')
#json_setup_content =  json.loads('{"noAutoStart":true,"--exeName":"Teams.exe"}')


def install():
    # Initializing variables
    package_version = control.version.split('-')[0]
    bin_name = bin_name_string % package_version
    app_name = control.name

    # Uninstalling older versions if found
    for uninstall in installed_softwares(name=app_name_short):
        if Version(uninstall['version']) < Version(package_version):
            print('Older %s version found (%s)' % (app_name,uninstall['version']))
            print('Removing: %s (%s)' % (uninstall['name'],uninstall['version']))
            run(uninstall_cmd(uninstall['key']))
            time.sleep(15)

    """ # Force uninstalling to make sure that we are using system-wide installation
    for uninstall in installed_softwares(name=app_name_short):
        print('Removing: %s' % uninstall['name'])
        run(uninstall_cmd(uninstall['key']))
        time.sleep(5) """

    # Adding fake WVD/VDI RegKey
    # Un/comment if needed
    registry_set(HKEY_LOCAL_MACHINE,r'SOFTWARE\VMware, Inc.\VMware VDM\Agent','','')
    registry_set(HKEY_LOCAL_MACHINE,r'SOFTWARE\Citrix\PortICA','','')
    registry_set(HKEY_LOCAL_MACHINE,r'SOFTWARE\Microsoft\Teams','IsWVDEnvironment',1,type=REG_DWORD)

    # Installing the package system wide
    print('Installing: %s' % bin_name)
    install_msi_if_needed(bin_name,
        properties=silent_args,
        min_version=package_version,
        accept_returncodes=[0,3010,1605,1614,1641],
        timeout=900)

    # Disabling AutoStart
    if iswin64():
        registry_delete(HKEY_LOCAL_MACHINE,r'SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run','Teams')
    registry_delete(HKEY_LOCAL_MACHINE,r'SOFTWARE\Microsoft\Windows\CurrentVersion\Run','Teams')

    # Removing shortcuts
    remove_desktop_shortcut(app_name)

    # Adding Firewall Rules for Teams
    run('netsh advfirewall firewall add rule name="%s" dir=in action=allow program="%s" enable=yes protocol=TCP profile=domain' % (app_name,app_path))
    run('netsh advfirewall firewall add rule name="%s" dir=in action=allow program="%s" enable=yes protocol=TCP profile=private' % (app_name,app_path))
    run('netsh advfirewall firewall add rule name="%s" dir=in action=allow program="%s" enable=yes protocol=UDP profile=domain' % (app_name,app_path))
    run('netsh advfirewall firewall add rule name="%s" dir=in action=allow program="%s" enable=yes protocol=UDP profile=private' % (app_name,app_path))

    # clean VDI register key (modif PB)
    if reg_value_exists(HKEY_LOCAL_MACHINE,r'SOFTWARE\Microsoft\Teams','IsWVDEnvironment'):
        registry_delete(HKEY_LOCAL_MACHINE,r'SOFTWARE\Microsoft\Teams','IsWVDEnvironment')

    if reg_key_exists(HKEY_LOCAL_MACHINE,r'SOFTWARE\VMware, Inc.'):
        registry_deletekey(HKEY_LOCAL_MACHINE,r'SOFTWARE\VMware, Inc.\VMware VDM\Agent','',force=False)
        registry_deletekey(HKEY_LOCAL_MACHINE,r'SOFTWARE\VMware, Inc.\VMware VDM','',force=False)
        registry_deletekey(HKEY_LOCAL_MACHINE,r'SOFTWARE\VMware, Inc.','',force=False)

    if reg_key_exists(HKEY_LOCAL_MACHINE,r'SOFTWARE\Citrix\PortICA'):
        registry_deletekey(HKEY_LOCAL_MACHINE,r'SOFTWARE\Citrix\PortICA','',force=False)



def uninstall():
    # Initializing variables
    processes_to_kill = control.impacted_process.split(',')

    # Cleaning fake WVD/VDI RegKey properly
    # Un/comment if needed
    if reg_value_exists(HKEY_LOCAL_MACHINE,r'SOFTWARE\Microsoft\Teams','IsWVDEnvironment'):
        registry_delete(HKEY_LOCAL_MACHINE,r'SOFTWARE\Microsoft\Teams','IsWVDEnvironment')
    if reg_key_exists(HKEY_LOCAL_MACHINE,r'SOFTWARE\VMware, Inc.'):
        registry_deletekey(HKEY_LOCAL_MACHINE,r'SOFTWARE\VMware, Inc.\VMware VDM\Agent','',force=False)
        registry_deletekey(HKEY_LOCAL_MACHINE,r'SOFTWARE\VMware, Inc.\VMware VDM','',force=False)
        registry_deletekey(HKEY_LOCAL_MACHINE,r'SOFTWARE\VMware, Inc.','',force=False)
    if reg_key_exists(HKEY_LOCAL_MACHINE,r'SOFTWARE\Citrix\PortICA'):
        registry_deletekey(HKEY_LOCAL_MACHINE,r'SOFTWARE\Citrix\PortICA','',force=False)

    # Removing remaining files
    if isdir(app_dir):
        killalltasks(processes_to_kill)
        time.sleep(15)
        remove_tree(app_dir)


def session_setup():
    # Initializing variables
    user_conf_dir = makepath(application_data,'Microsoft','Teams')
    json_config = makepath(user_conf_dir,'desktop-config.json')
    json_settings = makepath(user_conf_dir,'settings.json')

    user_app_dir = makepath(user_local_appdata,'Microsoft','Teams')
    user_app_path = makepath(user_app_dir,'current','Teams.exe')
    user_app_updater = makepath(user_app_dir,'Update.exe')
    #user_app_version = registry_readstring(HKEY_CURRENT_USER,r'Software\Microsoft\Windows\CurrentVersion\Uninstall\Teams','DisplayVersion')

    user_app_progdata_dir = makepath('C:','ProgramData',get_current_user(),'Microsoft','Teams')
    user_app_progdata_path = makepath(user_app_progdata_dir,'current','Teams.exe')
    user_app_progdata_updater = makepath(user_app_progdata_dir,'Update.exe')

    user_silent_args_uninst = '--uninstall -s'
    processes_to_kill = control.impacted_process.split(',')

    # Uninstalling from user environment (procedure: https://docs.microsoft.com/microsoftteams/msi-deployment)
    if isfile(user_app_path):
        print('Uninstalling Microsoft Teams from user environment')
        killalltasks(processes_to_kill)
        run('"%s" %s' % (user_app_updater,user_silent_args_uninst))
    if isdir(user_app_dir):
        remove_tree(user_app_dir)
    if isfile(user_app_progdata_path):
        print('Uninstalling Microsoft Teams from user ProgramData environment')
        killalltasks(processes_to_kill)
        run('"%s" %s' % (user_app_progdata_updater,user_silent_args_uninst))
    if isdir(user_app_progdata_dir):
        killalltasks(processes_to_kill)
        remove_tree(user_app_progdata_dir)

    if reg_value_exists(HKEY_CURRENT_USER,r'Software\Microsoft\Office\Teams','PreventInstallationFromMsi'):
        registry_delete(HKEY_CURRENT_USER,r'Software\Microsoft\Office\Teams','PreventInstallationFromMsi')

    # suppression autoremplissage uid (modif PB)
    if not reg_value_exists(HKEY_CURRENT_USER,r'Software\Microsoft\Office\Teams','SkipUpnPrefill'):
        registry_set(HKEY_CURRENT_USER,r'Software\Microsoft\Office\Teams','SkipUpnPrefill',1,type=REG_DWORD)

    # nettoyage profil teams utilisateur (un peu violent mais le nettoyage du cache ne suffisant pas...)
    if isdir(user_conf_dir):
        killalltasks(processes_to_kill)
        time.sleep(15)
        remove_tree(user_conf_dir)

    # Define user settings (procedure: https://techcommunity.microsoft.com/t5/microsoft-teams/how-to-disable-check-for-updates-in-microsoft-teams/m-p/54644)
    print('Setting up user settings')
    if not isdir(user_conf_dir):
        mkdirs(user_conf_dir)

    # desktop-config.json
    if isfile(json_config):
        json_config_content = load_json(json_config)
    else:
        json_config_content = json.loads('{"appPreferenceSettings":{}}')
        #json_config_content = json.load({})

    json_config_content['appPreferenceSettings']['registerAsIMProvider'] = False
    json_config_content['appPreferenceSettings']['openAsHidden'] = True
    json_config_content['appPreferenceSettings']['runningOnClose'] = True
    json_config_content['openAtLogin'] = False
    json_config_content['isForeground'] = True
    json_config_content['wamFallbackInProgress'] = False
    json_config_content['disableWarningOnOpenKeyRegistered'] = True
    json_config_content['isAppFirstRun'] = False

    write_json(json_config,json_config_content)

    # settings.json
    if isfile(json_settings):
        json_settings_content = load_json(json_settings)
    else:
        json_settings_content = json.loads('{"baseSettings":{},"initializedSettings":{},"preauthSettings":{"samplingRules":{}}}')
        #json_settings_content = json.load({})

    # Update part
    json_settings_content['baseSettings']['enableBlockSilentUpdate'] = True
    json_settings_content['baseSettings']['disableAllUsersAutoUpdate'] = True
    json_settings_content['baseSettings']['enableUnAuthUpdates'] = False
    """ json_settings_content['initializedSettings']['disableAllUsersAutoUpdate'] = True
    json_settings_content['preauthSettings']['disableAllUsersAutoUpdate'] = True
    json_settings_content['preauthSettings']['samplingRules']['updateNotificationEnabled'] = False """
    # Telemetry part
    json_settings_content['baseSettings']['enableAdalMacTelemetryV2'] = False
    json_settings_content['baseSettings']['enableAdalWinTelemetry'] = False
    json_settings_content['baseSettings']['proplusAdditionalTelemetryEnabled'] = False
    json_settings_content['baseSettings']['regionInTelemetryEnabled'] = False
    json_settings_content['baseSettings']['tenantRegionInTelemetryEnabled'] = False
    """ json_settings_content['initializedSettings']['tenantRegionInTelemetryEnabled'] = False
    json_settings_content['preauthSettings']['tenantRegionInTelemetryEnabled'] = False
    json_settings_content['preauthSettings']['samplingRules']['tenantRegionInTelemetryEnabled'] = False """
    # Other part
    json_settings_content['baseSettings']['enableRegisterProtocolToRoot'] = False
    """ json_settings_content['preauthSettings']['registerAddinOnMeetingPolicySettingsSync'] = False """

    write_json(json_settings,json_settings_content)


def update_package():
    print('Download/Update package content from upstream binary sources')

    # Getting proxy informations from WAPT settings
    proxy = {}
    if platform.system()=='Windows' and isfile(makepath(user_local_appdata(),'waptconsole','waptconsole.ini')):
        proxywapt = inifile_readstring(makepath(user_local_appdata(),'waptconsole','waptconsole.ini'),'global','http_proxy')
        if proxywapt :
            proxy = {'http':proxywapt,'https':proxywapt}

    # Initializing variables
    latest_bin = bin_name_temp

    # Downloading latest binaries
    if isfile(bin_name_temp):
        remove_file(bin_name_temp)
    if not isfile(latest_bin):
        print('Downloading: ' + latest_bin)
        wget(url_dl,latest_bin,proxies=proxy)

        # Get version from file
        version_from_file = get_msi_properties(latest_bin)['ProductVersion']
        version = version_from_file
        old_latest_bin = latest_bin
        latest_bin = bin_name_string % version
        if isfile(latest_bin):
            remove_file(latest_bin)
        os.rename(old_latest_bin,latest_bin)

		# Change version of the package
        pe = PackageEntry().load_control_from_wapt('.')
        pe.version = '%s-%s'%(version,int(pe.version.split('-',1)[1])+1)
        pe.save_control_to_wapt('.')
        print('Changing version to ' + pe.version + ' in WAPT\\control')
        print('Update package done. You can now build-upload your package')
    else:
        print('This package is already up-to-date')

    # Deleting outdated binaries
    for bin_in_dir in glob.glob('*.exe') or glob.glob('*.msi') or glob.glob('*.zip'):
        if bin_in_dir != latest_bin :
            print('Outdated binary: ' + bin_in_dir + ' Deleted')
            remove_file(bin_in_dir)




def load_json(json_filename):
    with open(json_filename) as json_file:
        data = json.load(json_file)
    return data


def write_json(json_filename,data):
    with open(json_filename, 'w') as outfile:
        json.dump(data, outfile, sort_keys=True, indent=4, default=str)


Re: Teams package and "Meeting Experience" feature

Published: November 18, 2020 - 09:01
by Gaetan
Thanks, I'll put it into testing =)

Re: Teams package and "Meeting Experience" feature

Published: November 19, 2020 - 12:03 PM
by jpele
Hello,

I'm waiting for your feedback before adding this to the store. ;)

Re: Teams package and "Meeting Experience" feature

Published: November 26, 2020 - 5:13 PM
by Pierre Baridon
Hello,
The test on about fifty machines was successful; we are now moving to production on 1700 machines.
Best regards,
Pierre

Re: Teams package and "Meeting Experience" feature

Published: November 26, 2020 - 9:11 PM
by Gaetan
For my part, no problem going back up either ;)

Re: Teams package and "Meeting Experience" feature

Published: November 27, 2020 - 2:55 PM
by jpele
Good morning,

Thank you for your feedback, I have modified the package.
Have you received any feedback from users who had to reconnect to Teams very regularly, even daily?
In case I did a one-time cleanup of the profile, here's the code snippet.

Code: Select all

    # No longer Prefill UPN
    registry_set(HKEY_CURRENT_USER,r'Software\Microsoft\Office\Teams','SkipUpnPrefill',1,type=REG_DWORD)

    # Cleaning up Teams profile once
    if registry_readstring(HKEY_CURRENT_USER,r'Software\WAPT\Teams','CleanupOnce') != 'Done':
        if isdir(user_conf_dir):
            killalltasks(processes_to_kill)
            time.sleep(2)
            remove_tree(user_conf_dir)
        registry_set(HKEY_CURRENT_USER,r'Software\WAPT\Teams','CleanupOnce','Done')
We'll need to check that the option doesn't disappear in the next update, but it should be fine ;)

Sincerely,
Jimmy