Guarda una demo×
×

Guarda NinjaOne in azione!

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

Gestire in modo efficiente i suggerimenti di Windows Spotlight e del menu Start con PowerShell

Punti chiave

  • Semplifica la personalizzazione: Lo script gestisce in modo efficiente i suggerimenti di Windows Spotlight e del menu Start su più profili utente.
  • Sono richiesti privilegi amministrativi: L’esecuzione di questo script richiede diritti amministrativi a causa delle modifiche apportate al registro di sistema.
  • Comprende vari profili di utenti: Si occupa di Azure AD, domini e account utente locali, garantendo un’applicazione completa.
  • Caratteristiche specifiche del sistema operativo: Adeguato alle differenze tra Windows 10 e Windows 11, soprattutto nelle edizioni aziendali.
  • Automatizza le attività più noiose: Sostituisce la necessità di modificare manualmente il registro di sistema o di configurare i criteri di gruppo.
  • Equilibrio tra privacy ed esperienza utente: Offre il controllo su contenuti e suggerimenti personalizzati, in linea con gli standard di privacy e le preferenze degli utenti.
  • Essenziale per gli MSP e i professionisti IT: Uno strumento prezioso per i provider di servizi gestiti e i professionisti IT nella gestione degli ambienti di rete.
  • Si consiglia di eseguire test e backup: Consiglia di testare lo script in un ambiente controllato e di eseguire il backup delle impostazioni del registro prima dell’implementazione.
  • Rafforzato con NinjaOne: Le capacità dello script per configurare Windows Spotlight possono essere aumentate se utilizzate insieme alla piattaforma di gestione IT di NinjaOne.

Il sistema operativo Windows offre una serie di funzioni personalizzabili per migliorare l’esperienza dell’utente, tra cui i suggerimenti di Windows Spotlight e del menu Start. Questo blog approfondisce uno script PowerShell progettato per la configurazione di queste funzionalità, evidenziandone l’importanza per i professionisti IT e i fornitori di servizi gestiti (MSP).

Background

In seguito all’evoluzione dell’interfaccia di Windows, la gestione e la personalizzazione dell’esperienza utente sono diventate sempre più importanti. I suggerimenti di Spotlight e del menu Start sono caratteristiche fondamentali in Windows 10 e 11, in quanto forniscono contenuti personalizzati e consigli sulle app. Tuttavia, per vari motivi, tra cui la privacy e le preferenze degli utenti, i professionisti IT e gli MSP spesso cercano di controllare queste funzionalità su più profili utente. Questo script PowerShell offre una soluzione, abilitando o disabilitando queste funzioni in modo sistematico.

Lo script per configurare Windows Spotlight:

 

#Requires -Version 5.1

<#
.SYNOPSIS
    Enable or Disable Spotlight and Suggestions in the Start Menu.
.DESCRIPTION
    Enable or Disable Spotlight and Suggestions in the Start Menu.
.EXAMPLE
    (No Parameters)

    On Windows 11, only recommendations for tips, shortcuts, and new apps are disabled/enabled from the Start Menu.
    Attempting to Disable Spotlight and Start Menu Suggestions
    Registry::HKEY_USERS\S-1-11-1-1111111111-1111111111-1111111111-1111111111\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager\SubscribedContent-338389Enabled changed from 0 to 0
    Registry::HKEY_USERS\S-1-11-1-1111111111-1111111111-1111111111-1111111111\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager\SubscribedContent-338388Enabled changed from 0 to 0
    Registry::HKEY_USERS\S-1-11-1-1111111111-1111111111-1111111111-1111111111\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager\SystemPaneSuggestionsEnabled changed from 0 to 0
    Registry::HKEY_USERS\S-1-11-1-1111111111-1111111111-1111111111-1111111111\SOFTWARE\Policies\Microsoft\Windows\CloudContent\DisableWindowsSpotlightFeatures changed from 1 to 1
    Registry::HKEY_USERS\S-1-11-1-1111111111-1111111111-1111111111-1111111111\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Start_IrisRecommendations changed from 0 to 0
    Registry::HKEY_USERS\S-1-11-1-1111111111-1111111111-1111111111-1111111111\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager\SubscribedContent-338389Enabled changed from 0 to 0
    Registry::HKEY_USERS\S-1-11-1-1111111111-1111111111-1111111111-1111111111\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager\SubscribedContent-338388Enabled changed from 0 to 0
    Registry::HKEY_USERS\S-1-11-1-1111111111-1111111111-1111111111-1111111111\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager\SystemPaneSuggestionsEnabled changed from 0 to 0
    Registry::HKEY_USERS\S-1-11-1-1111111111-1111111111-1111111111-1111111111\SOFTWARE\Policies\Microsoft\Windows\CloudContent\DisableWindowsSpotlightFeatures changed from 1 to 1
    Registry::HKEY_USERS\S-1-11-1-1111111111-1111111111-1111111111-1111111111\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Start_IrisRecommendations changed from 0 to 0

PARAMETER: -Enable
    Enables Spotlight and Suggestions in the Start Menu.
.OUTPUTS
    None
.NOTES
    Minimum OS Architecture Supported: Windows 10
    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://www.ninjaone.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]$Enable
)

begin {
    # Retrieve Dynamic Script Form Values
    if ($env:enableOrDisable -and $env:enableOrDisable -notlike "null") {
        if ($env:enableOrDisable -eq "Enable") { $Enable = $True }
    }

    # Local Admin Privileges are required to set other users' registry keys
    function Test-IsElevated {
        $id = [System.Security.Principal.WindowsIdentity]::GetCurrent()
        $p = New-Object System.Security.Principal.WindowsPrincipal($id)
        $p.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)
    }

    # Get a list of all the user profiles for when the script is run as System.
    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 pattern 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 user's 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 = "C:\Users\Default"
    
                $DefaultProfile | Where-Object { $ExcludedUsers -notcontains $_.UserName }
            }
        }
    
        $UserProfiles | Where-Object { $ExcludedUsers -notcontains $_.UserName }
    }

    # Helper function for setting registry keys
    function Set-RegKey {
        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 Ignore)) {
            # Update property and print out what it was changed from and changed to
            $CurrentValue = (Get-ItemProperty -Path $Path -Name $Name -ErrorAction Ignore).$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 the error below!"
                Write-Error $_
                exit 1
            }
            Write-Host "$Path\$Name changed from $CurrentValue to $($(Get-ItemProperty -Path $Path -Name $Name -ErrorAction Ignore).$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 the error below!"
                Write-Error $_
                exit 1
            }
            Write-Host "Set $Path\$Name to $($(Get-ItemProperty -Path $Path -Name $Name -ErrorAction Ignore).$Name)"
        }
    }

    # Gets the OS Name, e.g., Windows 10 Enterprise or Windows 11 Enterprise
    function Get-OSName {
        systeminfo | findstr /B /C:"OS Name"
    }

    $OSName = Get-OSName
}
process {

    # Error out if the script doesn't have local administrator privileges
    if (-not (Test-IsElevated)) {
        Write-Error -Message "Access Denied. Please run with Administrator privileges." -Exception (New-Object -TypeName System.UnauthorizedAccessException) -Category PermissionDenied
        exit 1
    }

    # Get the registry hive for all users
    $UserProfiles = Get-UserHives -Type "All"

    # Initialize generic list for the keys we're going to set
    $Keys = New-Object System.Collections.Generic.List[Object]
    $LoadedProfiles = New-Object System.Collections.Generic.List[Object]

    Foreach ($UserProfile in $UserProfiles) {
        # Load User ntuser.dat if it's not already loaded
        if ((Test-Path "Registry::HKEY_USERS\$($UserProfile.SID)" -ErrorAction Ignore) -eq $false) {
            $LoadedProfiles.Add($UserProfile)
            Start-Process -FilePath "cmd.exe" -ArgumentList "/C reg.exe LOAD HKU\$($UserProfile.SID) `"$($UserProfile.UserHive)`"" -Wait -WindowStyle Hidden
        }

        $Keys.Add(
            [PSCustomObject]@{
                Path  = "Registry::HKEY_USERS\$($UserProfile.SID)\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager"
                Name  = "SubscribedContent-338389Enabled"
                Value = if ($Enable) { 1 }Else { 0 }
            }
        )

        $Keys.Add(
            [PSCustomObject]@{
                Path  = "Registry::HKEY_USERS\$($UserProfile.SID)\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager"
                Name  = "SubscribedContent-338388Enabled"
                Value = if ($Enable) { 1 }Else { 0 }
            }
        )

        $Keys.Add(
            [PSCustomObject]@{
                Path  = "Registry::HKEY_USERS\$($UserProfile.SID)\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager"
                Name  = "SystemPaneSuggestionsEnabled"
                Value = if ($Enable) { 1 }Else { 0 }
            }
        )

        # This key only works on Windows 10/11 Enterprise
        if ($OSName -Like "*Enterprise*") {
            $Keys.Add(
                [PSCustomObject]@{
                    Path  = "Registry::HKEY_USERS\$($UserProfile.SID)\SOFTWARE\Policies\Microsoft\Windows\CloudContent"
                    Name  = "DisableWindowsSpotlightFeatures"
                    Value = if ($Enable) { 0 }Else { 1 }
                }
            )
        }
        else {
            Write-Warning "Disabling Spotlight is only possible on an Enterprise edition of Windows." 
        }

        # The recommended section in Windows 11 is slightly helpful; this will simply remove the ads but keep the useful frequently used section.
        if ($OSName -Like "*11*") {
            $Keys.Add(
                [PSCustomObject]@{
                    Path  = "Registry::HKEY_USERS\$($UserProfile.SID)\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced"
                    Name  = "Start_IrisRecommendations"
                    Value = if ($Enable) { 1 }Else { 0 }
                }
            )
        }
    }

    if($OSName -Like "*11*"){
        Write-Host "On Windows 11, only recommendations for tips, shortcuts, and new apps are disabled/enabled from the Start Menu."
    }
    
    if ($Enable) {
        Write-Host "Attempting to Enable Spotlight and Start Menu Suggestions"
    }
    else {
        Write-Host "Attempting to Disable Spotlight and Start Menu Suggestions"
    }

    # Set all the registry keys
    $Keys | ForEach-Object { Set-RegKey -Path $_.Path -Name $_.Name -Value $_.Value }

    # Unload any profiles we loaded up earlier (if any)
    Foreach ($LoadedProfile in $LoadedProfiles) {
        [gc]::Collect()
        Start-Sleep 1
        Start-Process -FilePath "cmd.exe" -ArgumentList "/C reg.exe UNLOAD HKU\$($LoadedProfile.SID)" -Wait -WindowStyle Hidden | Out-Null
    }
}
end {
    
    
    
}

 

Accedi a oltre 700 script nel Dojo di NinjaOne

Ottieni l’accesso

Analisi dettagliata

Lo script inizia con una sinossi e una descrizione, indicando il suo scopo: attivare i suggerimenti di Windows Spotlight e del menu Start. Utilizza le funzionalità di PowerShell per modificare le impostazioni del registro di sistema per i singoli profili utente, compresi gli account Azure AD e di dominio.

  • Inizializzazione: Lo script inizia controllando la variabile d’ambiente $env:enableOrDisable per determinare se deve abilitare o disabilitare le funzioni.
  • Controllo dei diritti di amministratore: Include una funzione Test-IsElevated per verificare se lo script viene eseguito con privilegi di amministratore, essenziali per modificare le chiavi di registro.
  • Gestione del profilo utente: La funzione Get-UserHives viene utilizzata per recuperare i profili degli utenti. Filtra gli account Azure AD, di dominio e locali, assicurando che lo script si rivolga ai profili utente necessari.
  • Modifica del registro: Lo script costruisce un elenco di chiavi di registro da modificare. Questi tasti controllano vari aspetti dei suggerimenti di Spotlight e del menu Start. A seconda dell’interruttore $Enable, imposta questi tasti per abilitare o disabilitare le funzioni.
  • Gestione specifica del sistema operativo: Lo script include anche controlli per la versione del sistema operativo, tenendo conto delle specificità di Windows 10 e Windows 11.
  • Esecuzione e pulizia: Infine, lo script applica le modifiche a ciascun profilo utente e scarica tutti gli hive caricati, assicurando che non vi sia alcun impatto residuo sulle prestazioni del sistema.

Casi d’uso potenziali

Considera un MSP che gestisce una rete aziendale. Per motivi di privacy, è necessario disabilitare i suggerimenti del menu Start su tutti i profili degli utenti. Utilizzando questo script, l’MSP può applicare sistematicamente queste modifiche senza configurare manualmente ogni profilo, risparmiando tempo e riducendo il rischio di incongruenze.

Confronti

Solitamente tali modifiche richiedevano la modifica manuale del registro di sistema o l’adeguamento dei criteri di gruppo. Questo script semplifica il processo, fornendo un metodo più efficiente e meno soggetto a errori. Inoltre, comprende i profili utente che potrebbero non essere influenzati dai criteri di gruppo, offrendo una soluzione più completa.

Domande frequenti

  • D: Questo script può essere utilizzato su versioni non aziendali di Windows?
    • R: Sì, ma alcune funzioni come la disabilitazione di Windows Spotlight sono specifiche delle edizioni Enterprise.
  • D: I privilegi amministrativi sono obbligatori per l’esecuzione di questo script?
    • R: Sì, la modifica delle chiavi di registro richiede diritti amministrativi.

Implicazioni

Se da un lato questo script offre una potente personalizzazione, dall’altro comporta implicazioni per l’esperienza dell’utente e la privacy. La disattivazione di Spotlight e dei suggerimenti può avere un impatto sul modo in cui gli utenti interagiscono con il sistema operativo e trovano nuove funzioni o app. Gli amministratori IT devono valutare queste considerazioni in base alle policy organizzative e alle esigenze degli utenti.

Raccomandazioni

  • Testa accuratamente: Esegui lo script in un ambiente controllato prima della distribuzione.
  • Effettua un backup dei registri: Esegui sempre un backup delle impostazioni del registro prima di apportare modifiche.
  • Informa gli utenti: Se la distribuzione avviene in un ambiente aziendale, informa gli utenti delle modifiche per garantire la trasparenza.

Considerazioni finali

Nel contesto di questo script, NinjaOne fornisce una piattaforma in grado di semplificare ulteriormente tali attività di gestione IT. La sua capacità di distribuire script in tutta la rete può rendere l’implementazione di modifiche simili più facile da gestire ed efficiente, rafforzando il suo valore come soluzione di gestione IT completa.

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ù su NinjaOne Endpoint Management, fai un tour dal vivo, o inizia la tua prova gratuita della piattaforma NinjaOne.

Ti potrebbe interessare anche

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.