Come limitare l’accesso di Python in Microsoft Excel utilizzando PowerShell

Nel mondo del lavoro moderno, la sicurezza dei dati e la gestione degli accessi sono diventate sempre più cruciali, soprattutto perché le organizzazioni integrano diversi linguaggi e strumenti di programmazione nelle loro attività quotidiane.

Una di queste integrazioni è l’uso di Python in Microsoft Excel, una funzione potente che può migliorare la produttività ma che presenta anche potenziali rischi per la sicurezza. Per i professionisti IT e i fornitori di servizi gestiti (MSP), gestire e limitare l’accesso di Python in Excel è essenziale per mantenere un ambiente sicuro.

Questo articolo esplora uno script PowerShell progettato per limitare Python in Excel, garantendo il rispetto dei protocolli di sicurezza senza compromettere la funzionalità.

Background

Con la crescente popolarità di Python nell’analisi dei dati e nell’automazione, la sua integrazione in Excel offre agli utenti funzionalità avanzate. Tuttavia, questa integrazione introduce anche potenziali vulnerabilità, in particolare se gli script Python vengono eseguiti senza un’adeguata supervisione.

I professionisti IT e gli MSP devono bilanciare i vantaggi delle funzionalità di Python con la necessità di proteggere i dati sensibili. Lo script PowerShell qui discusso offre una soluzione consentendo agli amministratori di limitare l’uso di Python in Excel, attivando le richieste di sicurezza, bloccando del tutto l’accesso di Python o tornando alle impostazioni predefinite di Microsoft.

Lo script per limitare Python in Excel:

<#
.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 {
    
    
    
}

 

Analisi dettagliata

Lo script PowerShell fornito è stato progettato per consentire agli amministratori di controllare la funzionalità di Python in Excel. Ecco una descrizione passo per passo di come funziona lo script:

1. Parametri dello script:

  • -Block: Questo parametro blocca l’uso di Python in Excel impostando la chiave di registro PythonFunctionWarnings su 2, impedendo di fatto qualsiasi esecuzione di Python.
  • -IncludeNewUsers: Quando si utilizza questo parametro, lo script applica la restrizione anche ai nuovi profili utente, garantendo che tutti i futuri utenti creati sul sistema ereditino le stesse impostazioni.
  • -ChangeBackToMicrosoftDefault: Questa opzione reimposta la chiave di registro al suo valore predefinito (0), consentendo l’esecuzione di Python senza alcuna richiesta o avviso di sicurezza.

2. Modifica del registro di sistema:

  • Lo script agisce modificando il registro di Windows, in particolare prendendo di mira la chiave PythonFunctionWarnings situata nelle impostazioni di sicurezza di Excel. A seconda dei parametri passati, lo script imposta questa chiave a 0, 1 o 2, che corrispondono rispettivamente a nessun avviso, a un messaggio di sicurezza o a un blocco completo.

3. Gestione del profilo utente:

  • Lo script recupera tutti i profili utente del sistema e applica le modifiche al registro di conseguenza. Include anche una funzione per caricare e scaricare il file NTUSER.DAT per ogni profilo utente, assicurando che le modifiche vengano applicate anche se l’utente non è attualmente connesso.

4. Gestione degli errori e controllo dell’elevazione:

  • Lo script controlla se viene eseguito con privilegi elevati (diritti di amministratore) e, in caso contrario, si conclude con un messaggio di errore. Questo è essenziale perché la modifica del registro richiede tali privilegi.

Casi d’uso potenziali

Immagina un MSP che gestisce l’infrastruttura IT di una grande organizzazione. Hanno recentemente introdotto l’integrazione di Python in Excel per l’analisi avanzata dei dati, ma sono preoccupati per i rischi potenziali dell’esecuzione di script Python non regolamentati.

Distribuendo questo script PowerShell, l’MSP può applicare le richieste di sicurezza a tutti gli account utente, garantendo che qualsiasi tentativo di eseguire Python in Excel richieda un’approvazione esplicita. Inoltre, possono bloccare completamente l’esecuzione di Python sui computer che gestiscono informazioni sensibili, come i dati finanziari, per ridurre ulteriormente i rischi.

Confronti

Esistono altri metodi per limitare l’uso di Python in Excel, come le impostazioni dei Criteri di gruppo o le modifiche manuali del Registro di sistema. Tuttavia, questi approcci potrebbero non offrire lo stesso livello di granularità o automazione dello script PowerShell.

Ad esempio, anche se i Criteri di gruppo offrono una certa efficacia, non è facile che si applichino a tutti i profili utente o che permettano di bloccare in modo selettivo le richieste. Le modifiche manuali del registro, invece, sono soggette a errori e poco pratiche per le implementazioni su larga scala.

Domande frequenti

1. Cosa succede se si utilizzano insieme i parametri -Block e -ChangeBackToMicrosoftDefault?

  • Lo script si conclude con un errore, poiché queste due opzioni sono incompatibili. Non è possibile bloccare Python e ripristinare le impostazioni predefinite contemporaneamente.

2. È necessario eseguire lo script come amministratore?

  • Sì, lo script richiede privilegi elevati per modificare il registro.

3. Posso applicare automaticamente queste impostazioni ai nuovi utenti?

  • Sì, utilizzando il parametro -IncludeNewUsers, lo script assicura che i nuovi profili utente ereditino le stesse restrizioni di Python.

Implicazioni

Limitare l’uso di Python in Excel può avere implicazioni significative per la sicurezza dei dati all’interno di un’organizzazione. Applicando le richieste di sicurezza o bloccando del tutto Python, gli amministratori IT possono impedire l’esecuzione di script non autorizzati o dannosi, proteggendo così i dati sensibili. Tuttavia, è anche essenziale considerare l’impatto sulla produttività, poiché policy troppo restrittive possono ostacolare casi d’uso legittimi.

Raccomandazioni

Durante l’utilizzo di questo script:

  • Testa le impostazioni su un piccolo gruppo di utenti prima di una distribuzione su larga scala, per assicurarti che non interrompa le normali operazioni.
  • Verifica e aggiorna regolarmente le restrizioni in base all’evoluzione delle esigenze di sicurezza dell’organizzazione e all’introduzione di nuovi strumenti o pratiche.
  • Considera l’utilizzo del parametro -IncludeNewUsers per mantenere coerenti i criteri di sicurezza in tutta l’organizzazione.

Considerazioni finali

La gestione dell’integrazione di Python in Excel è un compito critico per i professionisti IT e gli MSP, in particolare negli ambienti in cui la sicurezza dei dati è fondamentale. Questo script PowerShell fornisce una soluzione robusta per controllare l’uso di Python, offrendo flessibilità e automazione che altri metodi potrebbero non avere.

Per coloro che desiderano ottimizzare e rendere più sicure le proprie operazioni IT, NinjaOne offre strumenti e servizi completi progettati per soddisfare le esigenze della moderna gestione IT. Che si tratti di automazione, monitoraggio o gestione della sicurezza, NinjaOne può aiutarti a mantenere un’infrastruttura IT sicura ed efficiente.

Passi successivi

La creazione di un team IT efficiente ed efficace richiede una soluzione centralizzata che funga da principale strumento per la fornitura di servizi. NinjaOne consente ai team IT di monitorare, gestire, proteggere e supportare tutti i dispositivi, ovunque essi si trovino, senza la necessità di una complessa infrastruttura locale.

Per saperne di più sulla distribuzione remota di script con NinjaOne, fai un tour dal vivo, o inizia la tua prova gratuita della piattaforma NinjaOne.

Categorie:

Ti potrebbe interessare anche

×

Guarda NinjaOne in azione!

Inviando questo modulo, accetto La politica sulla privacy di NinjaOne.

Termini e condizioni NinjaOne

Cliccando sul pulsante “Accetto” qui sotto, dichiari di accettare i seguenti termini legali e le nostre condizioni d’uso:

  • Diritti di proprietà: NinjaOne possiede e continuerà a possedere tutti i diritti, i titoli e gli interessi relativi allo script (compreso il copyright). NinjaOne ti concede una licenza limitata per l’utilizzo dello script in conformità con i presenti termini legali.
  • Limitazione d’uso: Puoi utilizzare lo script solo per legittimi scopi personali o aziendali interni e non puoi condividere lo script con altri soggetti.
  • Divieto di ripubblicazione: In nessun caso ti è consentito ripubblicare lo script in una libreria di script appartenente o sotto il controllo di un altro fornitore di software.
  • Esclusione di garanzia: Lo script viene fornito “così com’è” e “come disponibile”, senza garanzie di alcun tipo. NinjaOne non promette né garantisce che lo script sia privo di difetti o che soddisfi le tue esigenze o aspettative specifiche.
  • Assunzione del rischio: L’uso che farai dello script è da intendersi a tuo rischio. Riconosci che l’utilizzo dello script comporta alcuni rischi intrinseci, che comprendi e sei pronto ad assumerti.
  • Rinuncia e liberatoria: Non riterrai NinjaOne responsabile di eventuali conseguenze negative o indesiderate derivanti dall’uso dello script e rinuncerai a qualsiasi diritto legale o di equità e a qualsiasi rivalsa nei confronti di NinjaOne in relazione all’uso dello script.
  • EULA: Se sei un cliente NinjaOne, l’uso dello script è soggetto al Contratto di licenza con l’utente finale (EULA) applicabile.