Comment restreindre l’accès à Python dans Microsoft Excel à l’aide de PowerShell

Dans le monde du travail moderne, la sécurité des données et la gestion des accès sont devenues de plus en plus cruciales, en particulier parce que les entreprises intègrent divers langages et outils de programmation dans leurs activités quotidiennes.

L’une de ces intégrations est l’utilisation de Python dans Microsoft Excel, une fonction puissante qui peut améliorer la productivité, mais qui présente également des risques potentiels pour la sécurité. Pour les professionnels de l’informatique et les fournisseurs de services gérés (MSP), la gestion et la restriction de l’accès à Python dans Excel sont essentielles au maintien d’un environnement sécurisé.

Cet article de blog explore un script PowerShell conçu pour contrôler l’utilisation de Python dans Excel, en veillant à ce que les protocoles de sécurité soient respectés sans compromettre la fonctionnalité.

Contexte

Avec la popularité croissante de Python dans l’analyse et l’automatisation des données, son intégration dans Excel offre aux utilisateurs des capacités avancées. Cependant, cette intégration introduit également des vulnérabilités potentielles, en particulier si des scripts Python sont exécutés sans surveillance adéquate.

Les professionnels de l’informatique et les MSP doivent trouver un équilibre entre les avantages des capacités de Python et la nécessité de protéger les données sensibles. Le script PowerShell présenté ici offre une solution en permettant aux administrateurs de restreindre l’utilisation de Python dans Excel, soit en activant des invites de sécurité, soit en bloquant complètement l’accès à Python, soit en revenant aux paramètres par défaut de Microsoft.

Le script :

<#
.SYNOPSIS
    Restricts the use of Python in Excel for all users. By default it'll enable a security prompt but does have the option to block or to set it back to the Microsoft default (no warnings or prompts).
.DESCRIPTION
    Restricts the use of Python in Excel for all users. By default it'll enable a security prompt but does have the option to block or to set it back to the Microsoft default (no warnings or prompts).
.EXAMPLE
    (No Parameters)
    
    Registry::HKEY_USERS\S-1-5-21-3870645062-3653562310-3850680542-1001\software\policies\microsoft\office\16.0\excel\security\PythonFunctionWarnings changed from 1 to 1
    Registry::HKEY_USERS\S-1-5-21-3870645062-3653562310-3850680542-1002\software\policies\microsoft\office\16.0\excel\security\PythonFunctionWarnings changed from 1 to 1
    Set Registry::HKEY_USERS\S-1-5-21-3870645062-3653562310-3850680542-1003\software\policies\microsoft\office\16.0\excel\security\PythonFunctionWarnings to 1

PARAMETER: -Block
    Blocks the use of Python in Excel.
.EXAMPLE
    -Block

    Registry::HKEY_USERS\S-1-5-21-3870645062-3653562310-3850680542-1001\software\policies\microsoft\office\16.0\excel\security\PythonFunctionWarnings changed from 1 to 2
    Registry::HKEY_USERS\S-1-5-21-3870645062-3653562310-3850680542-1002\software\policies\microsoft\office\16.0\excel\security\PythonFunctionWarnings changed from 1 to 2
    Set Registry::HKEY_USERS\S-1-5-21-3870645062-3653562310-3850680542-1003\software\policies\microsoft\office\16.0\excel\security\PythonFunctionWarnings to 2

PARAMETER: -IncludeNewUsers
    Adds the registry key to the Default Profile so that this change carriers over when new accounts are created.
.EXAMPLE
    -IncludeNewUsers

    Set Registry::HKEY_USERS\DefaultProfile\software\policies\microsoft\office\16.0\excel\security\PythonFunctionWarnings to 1
    Registry::HKEY_USERS\S-1-5-21-3870645062-3653562310-3850680542-1001\software\policies\microsoft\office\16.0\excel\security\PythonFunctionWarnings changed from 1 to 1
    Registry::HKEY_USERS\S-1-5-21-3870645062-3653562310-3850680542-1002\software\policies\microsoft\office\16.0\excel\security\PythonFunctionWarnings changed from 1 to 1
    Set Registry::HKEY_USERS\S-1-5-21-3870645062-3653562310-3850680542-1003\software\policies\microsoft\office\16.0\excel\security\PythonFunctionWarnings to 1

PARAMETER: -ChangeBackToMicrosoftDefault
    Resets the setting/restriction back to the Microsoft Default (enabled with no security prompt).
.EXAMPLE
    -ChangeBackToMicrosoftDefault

    Registry::HKEY_USERS\S-1-5-21-3870645062-3653562310-3850680542-1001\software\policies\microsoft\office\16.0\excel\security\PythonFunctionWarnings changed from 1 to 0
    Registry::HKEY_USERS\S-1-5-21-3870645062-3653562310-3850680542-1002\software\policies\microsoft\office\16.0\excel\security\PythonFunctionWarnings changed from 1 to 0
    Set Registry::HKEY_USERS\S-1-5-21-3870645062-3653562310-3850680542-1003\software\policies\microsoft\office\16.0\excel\security\PythonFunctionWarnings to 0
.LINK
    https://support.microsoft.com/en-us/office/data-security-and-python-in-excel-33cc88a4-4a87-485e-9ff9-f35958278327
.OUTPUTS
    None
.NOTES
    Minimum OS Architecture Supported: Windows 8.1, Server 2012
    Release Notes: Initial Release
By using this script, you indicate your acceptance of the following legal terms as well as our Terms of Use at https://ninjastage2.wpengine.com/terms-of-use.
    Ownership Rights: NinjaOne owns and will continue to own all right, title, and interest in and to the script (including the copyright). NinjaOne is giving you a limited license to use the script in accordance with these legal terms. 
    Use Limitation: You may only use the script for your legitimate personal or internal business purposes, and you may not share the script with another party. 
    Republication Prohibition: Under no circumstances are you permitted to re-publish the script in any script library or website belonging to or under the control of any other software provider. 
    Warranty Disclaimer: The script is provided “as is” and “as available”, without warranty of any kind. NinjaOne makes no promise or guarantee that the script will be free from defects or that it will meet your specific needs or expectations. 
    Assumption of Risk: Your use of the script is at your own risk. You acknowledge that there are certain inherent risks in using the script, and you understand and assume each of those risks. 
    Waiver and Release: You will not hold NinjaOne responsible for any adverse or unintended consequences resulting from your use of the script, and you waive any legal or equitable rights or remedies you may have against NinjaOne relating to your use of the script. 
    EULA: If you are a NinjaOne customer, your use of the script is subject to the End User License Agreement applicable to you (EULA).
#>

[CmdletBinding()]
param (
    [Parameter()]
    [Switch]$Block = [System.Convert]::ToBoolean($env:blockPython),
    [Parameter()]
    [Switch]$IncludeNewUsers = [System.Convert]::ToBoolean($env:includeNewUsers),
    [Parameter()]
    [Switch]$ChangeBackToMicrosoftDefault = [System.Convert]::ToBoolean($env:changeBackToMicrosoftDefaultSetting)
)

begin {

    # If incompatible options are detected error out
    if($Block -and $ChangeBackToMicrosoftDefault){
        Write-Error "-ChangeBackToMicrosoftDefault and -Block cannot be used together. The 'Change Back To Microsoft Default' option is to set Python in Excel back to how Microsoft ships the feature (with all security warnings disabled)."
        exit 1
    }

    # Write a warning message for the least secure option
    if($ChangeBackToMicrosoftDefault){
        Write-Warning "Changing the setting back to the default. All Python security warnings will be disabled..."
    }

    function Test-IsElevated {
        $id = [System.Security.Principal.WindowsIdentity]::GetCurrent()
        $p = New-Object System.Security.Principal.WindowsPrincipal($id)
        $p.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)
    }

    # Handy registry setting function
    function Set-HKProperty {
        param (
            $Path,
            $Name,
            $Value,
            [ValidateSet('DWord', 'QWord', 'String', 'ExpandedString', 'Binary', 'MultiString', 'Unknown')]
            $PropertyType = 'DWord'
        )
        if (-not $(Test-Path -Path $Path)) {
            # Check if path does not exist and create the path
            New-Item -Path $Path -Force | Out-Null
        }
        if ((Get-ItemProperty -Path $Path -Name $Name -ErrorAction SilentlyContinue)) {
            # Update property and print out what it was changed from and changed to
            $CurrentValue = (Get-ItemProperty -Path $Path -Name $Name -ErrorAction SilentlyContinue).$Name
            try {
                Set-ItemProperty -Path $Path -Name $Name -Value $Value -Force -Confirm:$false -ErrorAction Stop | Out-Null
            }
            catch {
                Write-Error "[Error] Unable to Set registry key for $Name please see below error!"
                Write-Error $_
                exit 1
            }
            Write-Host "$Path\$Name changed from $CurrentValue to $($(Get-ItemProperty -Path $Path -Name $Name -ErrorAction SilentlyContinue).$Name)"
        }
        else {
            # Create property with value
            try {
                New-ItemProperty -Path $Path -Name $Name -Value $Value -PropertyType $PropertyType -Force -Confirm:$false -ErrorAction Stop | Out-Null
            }
            catch {
                Write-Error "[Error] Unable to Set registry key for $Name please see below error!"
                Write-Error $_
                exit 1
            }
            Write-Host "Set $Path\$Name to $($(Get-ItemProperty -Path $Path -Name $Name -ErrorAction SilentlyContinue).$Name)"
        }
    }

    # This function will gather all the user profiles on the system for use later
    function Get-UserHives {
        param (
            [Parameter()]
            [ValidateSet('AzureAD', 'DomainAndLocal', 'All')]
            [String]$Type = "All",
            [Parameter()]
            [String[]]$ExcludedUsers,
            [Parameter()]
            [switch]$IncludeDefault
        )
    
        # User account SID's follow a particular patter depending on if they're azure AD or a Domain account or a local "workgroup" account.
        $Patterns = switch ($Type) {
            "AzureAD" { "S-1-12-1-(\d+-?){4}$" }
            "DomainAndLocal" { "S-1-5-21-(\d+-?){4}$" }
            "All" { "S-1-12-1-(\d+-?){4}$" ; "S-1-5-21-(\d+-?){4}$" } 
        }
    
        # We'll need the NTuser.dat file to load each users registry hive. So we grab it if their account sid matches the above pattern. 
        $UserProfiles = Foreach ($Pattern in $Patterns) { 
            Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\*" |
                Where-Object { $_.PSChildName -match $Pattern } | 
                Select-Object @{Name = "SID"; Expression = { $_.PSChildName } },
                @{Name = "UserName"; Expression = { "$($_.ProfileImagePath | Split-Path -Leaf)" } }, 
                @{Name = "UserHive"; Expression = { "$($_.ProfileImagePath)\NTuser.dat" } }, 
                @{Name = "Path"; Expression = { $_.ProfileImagePath } }
        }
    
        # There are some situations where grabbing the .Default user's info is needed.
        switch ($IncludeDefault) {
            $True {
                $DefaultProfile = "" | Select-Object UserName, SID, UserHive, Path
                $DefaultProfile.UserName = "Default"
                $DefaultProfile.SID = "DefaultProfile"
                $DefaultProfile.Userhive = "$env:SystemDrive\Users\Default\NTUSER.DAT"
                $DefaultProfile.Path = "$env:SystemDrive\Users\Default"
    
                $DefaultProfile | Where-Object { $ExcludedUsers -notcontains $_.UserName }
            }
        }
    
        $UserProfiles | Where-Object { $ExcludedUsers -notcontains $_.UserName }
    }
}
process {
    if (-not (Test-IsElevated)) {
        Write-Error -Message "Access Denied. Please run with Administrator privileges."
        exit 1
    }

    # If we're only asked to set it for existing users we won't include the default registry hive
    if($IncludeNewUsers){
        $UserProfiles = Get-UserHives -Type "All" -IncludeDefault
    }else{
        $UserProfiles = Get-UserHives -Type "All"
    }
    
    $Key = "software\policies\microsoft\office\16.0\excel\security"
    $PropertyName = "PythonFunctionWarnings"

    if($ChangeBackToMicrosoftDefault){
        # No Prompt and unlocked
        $Value = 0
    }

    # This is the default option for the script
    if(-not ($ChangeBackToMicrosoftDefault) -and -not ($Block)){
        # Prompt
        $Value = 1
    }
    
    if($Block){
        # Block
        $Value = 2
    }

    # Loop through each profile on the machine
    Foreach ($UserProfile in $UserProfiles) {
        # Load User ntuser.dat if it's not already loaded
        If (($ProfileWasLoaded = Test-Path Registry::HKEY_USERS\$($UserProfile.SID)) -eq $false) {
            Start-Process -FilePath "cmd.exe" -ArgumentList "/C reg.exe LOAD HKU\$($UserProfile.SID) `"$($UserProfile.UserHive)`"" -Wait -WindowStyle Hidden
        }

        Set-HKProperty -Path "Registry::HKEY_USERS\$($UserProfile.SID)\$Key" -Name $PropertyName -Value $Value
        
        # Unload NTuser.dat
        If ($ProfileWasLoaded -eq $false) {
            [gc]::Collect()
            Start-Sleep 1
            Start-Process -FilePath "cmd.exe" -ArgumentList "/C reg.exe UNLOAD HKU\$($UserProfile.SID)" -Wait -WindowStyle Hidden | Out-Null
        }
    }
}
end {
    
    
    
}

 

Description détaillée

Le script PowerShell fourni est conçu pour permettre aux administrateurs de contrôler la fonctionnalité de Python dans Excel. Voici une description étape par étape du fonctionnement du script :

1. Paramètres du script :

  • -Block: Ce paramètre bloque l’utilisation de Python dans Excel en attribuant la valeur 2 à la clé de registre PythonFunctionWarnings, empêchant ainsi toute exécution de Python.
  • -IncludeNewUsers: Lorsque ce paramètre est utilisé, le script applique également la restriction aux nouveaux profils d’utilisateur, ce qui garantit que les futurs utilisateurs créés sur le système héritent des mêmes paramètres.
  • -ChangeBackToMicrosoftDefault: Cette option réinitialise la clé de registre à sa valeur par défaut (0), ce qui permet à Python de s’exécuter sans aucune invite ou avertissement de sécurité.

2. Manipulation du registre :

  • Le script agit en modifiant le registre Windows, en ciblant spécifiquement la clé PythonFunctionWarningskey située sous les paramètres de sécurité d’Excel. En fonction des paramètres transmis, le script attribue à cette clé la valeur 0, 1 ou 2, ce qui correspond respectivement à l’absence d’avertissement, à une invite de sécurité ou à un blocage complet.

3. Gestion du profil de l’utilisateur:

  • Le script récupère tous les profils d’utilisateurs sur le système et applique les modifications du registre en conséquence. Il comprend également une fonction permettant de charger et de décharger le fichier NTUSER.DAT pour chaque profil d’utilisateur, ce qui garantit que les modifications sont appliquées même si l’utilisateur n’est pas connecté.

4. Gestion des erreurs et vérification de l’élévation :

  • Le script vérifie s’il est exécuté avec des privilèges élevés (droits d’administrateur) et se termine par un message d’erreur si ce n’est pas le cas. Ceci est crucial car la modification du registre nécessite de tels privilèges.

Cas d’utilisation potentiels

Imaginez une entreprise MSP qui gère l’infrastructure informatique d’une grande entreprise. Elle a récemment introduit l’intégration de Python dans Excel pour l’analyse avancée des données, mais est préoccupée par les risques potentiels de l’exécution non réglementée de scripts Python.

En déployant ce script PowerShell, l’entreprise MSP peut appliquer des invites de sécurité à tous les comptes d’utilisateurs, garantissant que toute tentative d’exécution de Python dans Excel nécessite une approbation explicite. De plus, elle peut bloquer entièrement l’exécution de Python sur les machines qui traitent des informations sensibles, telles que des données financières, afin de réduire davantage les risques.

Comparaisons

Il existe d’autres méthodes pour restreindre l’utilisation de Python dans Excel, comme les paramètres de stratégie de groupe ou les modifications manuelles du registre. Toutefois, ces approches n’offrent pas le même niveau de granularité ou d’automatisation que le script PowerShell.

Par exemple, si la stratégie de groupe peut être efficace, elle peut ne pas s’appliquer facilement à tous les profils d’utilisateurs ou permettre un blocage sélectif par rapport à une invitation. Les modifications manuelles du registre, en revanche, sont sujettes aux erreurs et peu pratiques pour les déploiements à grande échelle.

FAQ

1. Que se passe-t-il si j’utilise les paramètres -Block et -ChangeBackToMicrosoftDefault ensemble ?

  • Le script se terminera par une erreur, car ces deux options sont incompatibles. Il n’est pas possible de bloquer Python et de rétablir les paramètres par défaut simultanément.

2. Dois-je exécuter le script en tant qu’administrateur ?

  • Oui, le script nécessite des privilèges élevés pour modifier le registre.

3. Puis-je appliquer automatiquement ces paramètres aux nouveaux utilisateurs ?

  • Oui, en utilisant le paramètre -IncludeNewUsers, le script s’assure que les nouveaux profils d’utilisateurs héritent des mêmes restrictions Python.

Implications

Restreindre l’utilisation de Python dans Excel peut avoir des conséquences importantes sur la sécurité des données au sein d’une entreprise. En imposant des messages de sécurité ou en bloquant complètement Python, les administrateurs informatiques peuvent empêcher l’exécution de scripts non autorisés ou malveillants, protégeant ainsi les données sensibles. Toutefois, il est également essentiel de tenir compte de l’impact sur la productivité, car des politiques trop restrictives peuvent entraver des cas d’utilisation légitimes.

Recommandations

Lors de l’utilisation de ce script, il est conseillé de :

  • Tester les paramètres sur un petit groupe d’utilisateurs avant de les déployer à grande échelle afin de vous assurer qu’ils ne perturbent pas le fonctionnement normal de l’entreprise.
  • Réviser et mettre à jour régulièrement les restrictions en fonction de l’évolution des besoins de l’entreprise en matière de sécurité et de l’introduction de nouveaux outils ou de nouvelles pratiques.
  • Penser à utiliser le paramètre -IncludeNewUsers pour maintenir des politiques de sécurité cohérentes dans l’ensemble de l’entreprise.

Conclusion

La gestion de l’intégration de Python dans Excel est une tâche essentielle pour les professionnels de l’informatique et les MSP, en particulier dans les environnements où la sécurité des données est primordiale. Ce script PowerShell fournit une solution performante pour contrôler l’utilisation de Python, offrant une flexibilité et une automatisation que d’autres méthodes peuvent ne pas avoir.

Pour ceux qui souhaitent optimiser et sécuriser davantage leurs opérations informatiques, NinjaOne propose des outils et des services complets conçus pour répondre aux besoins de la gestion informatique moderne. Qu’il s’agisse d’automatisation, de surveillance ou de gestion de la sécurité, NinjaOne peut vous aider à maintenir une infrastructure informatique sûre et efficace.

Pour aller plus loin

Pour créer une équipe informatique efficace et performante, il est essentiel d'avoir une solution centralisée qui joue le rôle de nœud principal pour vos services. NinjaOne permet aux équipes informatiques de surveiller, gérer, sécuriser et prendre en charge tous les appareils, où qu'ils soient, sans avoir besoin d'une infrastructure complexe sur site. Pour en savoir plus sur NinjaOne Endpoint Management, participez à une visite guidée, ou profitez d'un essai gratuit de la plateforme NinjaOne.

Catégories :

Vous pourriez aussi aimer

×

Voir NinjaOne en action !

En soumettant ce formulaire, j'accepte la politique de confidentialité de NinjaOne.

Termes et conditions NinjaOne

En cliquant sur le bouton “J’accepte” ci-dessous, vous indiquez que vous acceptez les termes juridiques suivants ainsi que nos conditions d’utilisation:

  • Droits de propriété: NinjaOne possède et continuera de posséder tous les droits, titres et intérêts relatifs au script (y compris les droits d’auteur). NinjaOne vous accorde une licence limitée pour l’utilisation du script conformément à ces conditions légales.
  • Limitation de l’utilisation: Les scripts ne peuvent être utilisés qu’à des fins personnelles ou professionnelles internes légitimes et ne peuvent être partagés avec d’autres entités.
  • Interdiction de publication: Vous n’êtes en aucun cas autorisé à publier le script dans une bibliothèque de scripts appartenant à, ou sous le contrôle d’un autre fournisseur de logiciels.
  • Clause de non-responsabilité: Le texte est fourni “tel quel” et “tel que disponible”, sans garantie d’aucune sorte. NinjaOne ne promet ni ne garantit que le script sera exempt de défauts ou qu’il répondra à vos besoins ou attentes particulières.
  • Acceptation des risques: L’utilisation du script est sous votre propre responsabilité. Vous reconnaissez qu’il existe certains risques inhérents à l’utilisation du script, et vous comprenez et assumez chacun de ces risques.
  • Renonciation et exonération de responsabilité: Vous ne tiendrez pas NinjaOne pour responsable des conséquences négatives ou involontaires résultant de votre utilisation du script, et vous renoncez à tout droit ou recours légal ou équitable que vous pourriez avoir contre NinjaOne en rapport avec votre utilisation du script.
  • EULA: Si vous êtes un client de NinjaOne, votre utilisation du script est soumise au contrat de licence d’utilisateur final qui vous est applicable (End User License Agreement (EULA)).