Semplificare la verifica UAC in Windows con PowerShell

Punti chiave

  • Verificare UAC in modo automatizzato: Lo script offre una soluzione automatizzata per la verifica delle impostazioni del Controllo dell’account utente sui sistemi Windows.
  • Maggiore sicurezza: Assicurando che le impostazioni UAC siano conformi agli standard di sicurezza, lo script per la verifica UAC rafforza in modo significativo la sicurezza del sistema.
  • Registrazione dei campi personalizzati: Si integra con NinjaOne per il logging dei livelli UAC nei campi personalizzati, migliorando la registrazione e la reportistica.
  • Supporta Windows 7 e versioni successive: Lo script per la verifica UAC è compatibile con Windows 7, Windows Server 2012 e versioni successive.
  • Sono richiesti i privilegi di amministratore: L’esecuzione di questo script per la verifica UAC richiede i diritti amministrativi per accedere e modificare le impostazioni del registro.
  • Versatilità d’uso: Ideale per MSP e professionisti IT che siano impegnati a mantenere alto in livello di sicurezza su più sistemi.
  • Riduzione proattiva del rischio: L’uso regolare aiuta a prevenire in modo proattivo le modifiche non autorizzate al sistema.
  • Integrazione con i servizi gestiti: Particolarmente vantaggioso per chi utilizza NinjaOne per la gestione centralizzata dell’IT.
  • Registrazione per la conformità: Registra le impostazioni UAC, contribuendo alla conformità con i criteri di sicurezza IT e gli audit.

Introduzione

Il Controllo degli account utente (UAC) è un componente fondamentale del sistema operativo Windows, che offre un ulteriore livello di sicurezza. Limita essenzialmente il software applicativo ai privilegi standard dell’utente finché un amministratore non autorizza un aumento del livello di privilegio. Nel panorama dinamico della sicurezza informatica, in cui le vulnerabilità possono essere sfruttate da utenti non autorizzati, è fondamentale mantenere le impostazioni UAC ottimali. In questo articolo analizziamo uno script PowerShell progettato per verificare e configurare le impostazioni UAC su un computer Windows, uno strumento di grande importanza per i professionisti IT e i Managed Service Provider (MSP).

Background

Lo script per la verifica UAC fornisce un approccio completo alla verifica del livello UAC su un sistema Windows. I professionisti IT e gli MSP hanno spesso bisogno di questi strumenti per garantire che i sistemi che gestiscono siano conformi a specifici standard di sicurezza. Lo script non solo verifica, ma facilita anche l’aggiornamento delle impostazioni UAC e può registrare queste impostazioni in un campo personalizzato a scopo di reporting. La capacità di operare all’interno dell’ambiente NinjaOne ne aumenta ulteriormente l’utilità nei servizi IT gestiti.

Lo script per la verifica UAC:

#Requires -Version 2

<#
.SYNOPSIS
    Condition/Audit UAC Level. Can save the UAC Level to a custom field if specified.
.DESCRIPTION
    Condition/Audit UAC Level. Can save the UAC Level to a custom field if specified.

    Exit Code of 0 is that the UAC Level is set to the defaults or higher
    Exit Code of 1 is that the UAC Level is to lower than defaults
    Exit Code of 2 is when this fails to update a custom field
.EXAMPLE
     -CustomField "uac"
    Saves the UAC Level to a custom field.
.OUTPUTS
    String[]
.NOTES
    Minimum OS Architecture Supported: Windows 7, Windows Server 2012
    Release Notes: Renamed script and added Script Variable support
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/it/condizioni-utilizzo
    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()]
    [String]$CustomField
)

begin {
    if ($env:customFieldName -and $env:customFieldName -notlike "null") { $CustomField = $env:customFieldName }
    
    # https://learn.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#registry-key-settings
    # Define the path in the registry
    $Path = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System"

    # Define the values to check
    $Values = "FilterAdministratorToken",
    "EnableUIADesktopToggle",
    "ConsentPromptBehaviorAdmin",
    "ConsentPromptBehaviorUser",
    "EnableInstallerDetection",
    "ValidateAdminCodeSignatures",
    "EnableSecureUIAPaths",
    "EnableLUA",
    "PromptOnSecureDesktop",
    "EnableVirtualization"

    # This function is to make it easier to set Ninja Custom Fields.
    function Set-NinjaProperty {
        [CmdletBinding()]
        Param(
            [Parameter(Mandatory = $True)]
            [String]$Name,
            [Parameter()]
            [String]$Type,
            [Parameter(Mandatory = $True, ValueFromPipeline = $True)]
            $Value,
            [Parameter()]
            [String]$DocumentName
        )

        # If we're requested to set the field value for a Ninja document we'll specify it here.
        $DocumentationParams = @{}
        if ($DocumentName) { $DocumentationParams["DocumentName"] = $DocumentName }

        # This is a list of valid fields we can set. If no type is given we'll assume the input doesn't have to be changed in any way.
        $ValidFields = "Attachment", "Checkbox", "Date", "Date or Date Time", "Decimal", "Dropdown", "Email", "Integer", "IP Address", "MultiLine", "MultiSelect", "Phone", "Secure", "Text", "Time", "URL"
        if ($Type -and $ValidFields -notcontains $Type) { Write-Warning "$Type is an invalid type! Please check here for valid types. https://ninjarmm.zendesk.com/hc/en-us/articles/16973443979789-Command-Line-Interface-CLI-Supported-Fields-and-Functionality" }

        # The below field requires additional information in order to set
        $NeedsOptions = "Dropdown"
        if ($DocumentName) {
            if ($NeedsOptions -contains $Type) {
                # We'll redirect the error output to the success stream to make it easier to error out if nothing was found or something else went wrong.
                $NinjaPropertyOptions = Ninja-Property-Docs-Options -AttributeName $Name @DocumentationParams 2>&1
            }
        }
        else {
            if ($NeedsOptions -contains $Type) {
                $NinjaPropertyOptions = Ninja-Property-Options -Name $Name 2>&1
            }
        }

        # If we received some sort of error it should have an exception property and we'll exit the function with that error information.
        if ($NinjaPropertyOptions.Exception) { throw $NinjaPropertyOptions }

        # The below type's require values not typically given in order to be set. The below code will convert whatever we're given into a format ninjarmm-cli supports.
        switch ($Type) {
            "Checkbox" {
                # While it's highly likely we were given a value like "True" or a boolean datatype it's better to be safe than sorry.
                $NinjaValue = [System.Convert]::ToBoolean($Value)
            }
            "Date or Date Time" {
                # Ninjarmm-cli is expecting the time to be representing as a Unix Epoch string. So we'll convert what we were given into that format.
                $Date = (Get-Date $Value).ToUniversalTime()
                $TimeSpan = New-TimeSpan (Get-Date "1970-01-01 00:00:00") $Date
                $NinjaValue = $TimeSpan.TotalSeconds
            }
            "Dropdown" {
                # Ninjarmm-cli is expecting the guid of the option we're trying to select. So we'll match up the value we were given with a guid.
                $Options = $NinjaPropertyOptions -replace '=', ',' | ConvertFrom-Csv -Header "GUID", "Name"
                $Selection = $Options | Where-Object { $_.Name -eq $Value } | Select-Object -ExpandProperty GUID

                if (-not $Selection) {
                    throw "Value is not present in dropdown"
                }

                $NinjaValue = $Selection
            }
            default {
                # All the other types shouldn't require additional work on the input.
                $NinjaValue = $Value
            }
        }

        # We'll need to set the field differently depending on if its a field in a Ninja Document or not.
        if ($DocumentName) {
            $CustomField = Ninja-Property-Docs-Set -AttributeName $Name -AttributeValue $NinjaValue @DocumentationParams 2>&1
        }
        else {
            $CustomField = Ninja-Property-Set -Name $Name -Value $NinjaValue 2>&1
        }

        if ($CustomField.Exception) {
            throw $CustomField
        }
    }
}
process {

    $UacResults = [PSCustomObject]@{}
    # Loop through each value and get each value and add them to $UacResults as a property
    $Values | ForEach-Object {
        $Value = $_
        $Result = $null
        $Result = Get-ItemProperty -Path $Path -Name $Value -ErrorAction SilentlyContinue | Select-Object -ExpandProperty $Value
        if ($null -eq $Result) {
            switch ($Value) {
                'FilterAdministratorToken' { $Result = 0; break }
                'EnableUIADesktopToggle' { $Result = 0; break }
                'ConsentPromptBehaviorAdmin' { $Result = 5; break }
                'ConsentPromptBehaviorUser' { $Result = 3; break }
                'EnableInstallerDetection' { $Result = 0; break } # Assumes enterprise and not Home
                'ValidateAdminCodeSignatures' { $Result = 0; break }
                'EnableSecureUIAPaths' { $Result = 1; break }
                'EnableLUA' { $Result = 1; break }
                'PromptOnSecureDesktop' { $Result = 1; break }
                'EnableVirtualization' { $Result = 1; break }
                Default { $Result = 1 }
            }
        }
        $UacResults | Add-Member -MemberType NoteProperty -Name $Value -Value $Result
    }

    # Is UAC enabled or disabled
    if (
        $UacResults.ConsentPromptBehaviorAdmin -eq 5 -and
        $UacResults.ConsentPromptBehaviorUser -eq 3 -and
        $UacResults.EnableLUA -eq 1 -and
        $UacResults.FilterAdministratorToken -eq 0 -and
        $UacResults.EnableUIADesktopToggle -eq 0 -and
        $UacResults.ConsentPromptBehaviorAdmin -eq 5 -and
        $UacResults.ConsentPromptBehaviorUser -eq 3 -and
        # Enterprise
        (
            (
                (Get-CimInstance -ClassName Win32_OperatingSystem).Caption -notlike "*Home*" -and $UacResults.EnableInstallerDetection -eq 1
            ) -or
            (
                (Get-CimInstance -ClassName Win32_OperatingSystem).Caption -like "*Home*" -and $UacResults.EnableInstallerDetection -eq 0
            )
        ) -and
        $UacResults.ValidateAdminCodeSignatures -eq 0 -and
        $UacResults.EnableSecureUIAPaths -eq 1 -and
        $UacResults.EnableLUA -eq 1 -and
        $UacResults.PromptOnSecureDesktop -eq 1 -and
        $UacResults.EnableVirtualization -eq 1
    ) {
        "UAC Enabled with defaults." | Write-Host
    }
    elseif (
        $UacResults.EnableLUA -eq 0 -or
        $UacResults.ConsentPromptBehaviorAdmin -eq 0 -or
        $UacResults.PromptOnSecureDesktop -eq 0
    ) {
        "UAC Disabled." | Write-Host
    }

    # Get the UAC Level
    $UACLevel = if (
        $UacResults.EnableLUA -eq 0
    ) {
        0
    }
    elseif (
        $UacResults.ConsentPromptBehaviorAdmin -eq 5 -and
        $UacResults.PromptOnSecureDesktop -eq 0 -and
        $UacResults.EnableLUA -eq 1
    ) {
        1
    }
    elseif (
        $UacResults.ConsentPromptBehaviorAdmin -eq 5 -and
        $UacResults.PromptOnSecureDesktop -eq 1 -and
        $UacResults.EnableLUA -eq 1
    ) {
        2
    }
    elseif (
        $UacResults.ConsentPromptBehaviorAdmin -eq 2 -and
        $UacResults.PromptOnSecureDesktop -eq 1 -and
        $UacResults.EnableLUA -eq 1
    ) {
        3
    }

    # Get the Text version of the UAC Level
    $UACLevelText = switch ($UACLevel) {
        0 { "Never notify"; break }
        1 { "Notify me only (do not dim my desktop)"; break }
        2 { "Notify me only (default)"; break }
        3 { "Always notify"; break }
        Default { "Unknown"; break }
    }

    # Output the UAC Level
    "UAC Level: $UACLevel = $UACLevelText" | Write-Host

    # Output the UAC settings
    $UacResults | Out-String | Write-Host

    # When CustomField is used save the UAC Level to that custom field
    if ($CustomField) {
        try {
            Set-NinjaProperty -Name $CustomField -Value "$UACLevel = $UACLevelText" -ErrorAction Stop
        }
        catch {
            Write-Error "Failed to update Custom Field ($CustomField)"
            exit 2
        }
    }

    # Return and exit code of 0 if UAC is set to the default or higher, or 1 when not set to the default
    if ($UACLevel -ge 2) {
        exit 0
    }
    elseif ($UACLevel -lt 2) {
        exit 1
    }
    else {
        exit 1
    }
}
end {
    
    
    
}

 

Accedi a oltre 700 script nel Dojo NinjaOne

Ottieni l’accesso

Analisi dettagliata dello script per la verifica UAC

Lo script opera in diverse fasi:

  • Inizializzazione dei parametri: Lo script per la verifica UAC inizia definendo un parametro CustomField, che può essere usato per specificare un nome di campo personalizzato a fini di logging.
  • Impostazione dell’ambiente: Controlla le variabili ambientali e imposta i percorsi e i valori del registro di sistema relativi alle impostazioni UAC.
  • Definizione della funzione: Viene definita una funzione, Set-NinjaProperty, che aiuta ad aggiornare i campi personalizzati di NinjaOne. Questa funzione è fondamentale per gli MSP che utilizzano NinjaOne per gestire i sistemi dei clienti.
  • Determinazione del livello UAC: Lo script per la verifica UAC esegue quindi l’iterazione su varie impostazioni del registro di sistema relative a UAC, confrontandole con i valori predefiniti o sicuri per determinare il livello UAC del sistema.
  • Output e registrazione: Invia il livello UAC e le impostazioni alla console. Se viene fornito un campo personalizzato, lo script per la verifica UAC registra il livello UAC in questo campo.
  • Codice di uscita: Infine, lo script per la verifica UAC si conclude restituendo un codice di uscita in base al livello UAC determinato.

Casi d’uso potenziali

Immagina un MSP che gestisce una rete di computer per un cliente. Potrebbe distribuire questo script per la verifica UAC su tutti i computer per garantire che le impostazioni UAC siano ai livelli consigliati, impedendo così modifiche non autorizzate che potrebbero compromettere la sicurezza.

Confronti

Tradizionalmente, la verifica UAC può comportare controlli manuali o script meno sofisticati. Questo script offre un approccio più automatizzato, dettagliato e integrato, in particolare per gli ambienti gestiti tramite NinjaOne.

Domande frequenti

  • Questo script per la verifica UAC può essere eseguito su qualsiasi versione di Windows?
    • Supporta Windows 7, Windows Server 2012 e versioni successive.
  • È necessario disporre di privilegi amministrativi per eseguire questo script per la verifica UAC?
    • Sì, richiede diritti amministrativi per accedere alle impostazioni del registro e modificarle.
  • Lo script per la verifica UAC può modificare le impostazioni UAC?
    • Sebbene sia stato progettato principalmente per l’auditing, può essere esteso per modificare le impostazioni in base ai risultati dell’audit.

Implicazioni

Impostazioni UAC errate possono rendere il sistema vulnerabile ad accessi non autorizzati e a possibili installazioni di malware. Questo script aiuta a mantenere le configurazioni di sicurezza ottimali, riducendo così questi rischi.

Raccomandazioni

  • Esegui regolarmente lo script per la verifica UAC per garantire la costante conformità agli standard di sicurezza.
  • Integra lo script per la verifica UAC nei programmi di manutenzione regolare per una gestione automatizzata.
  • Utilizza la funzionalità di logging per mantenere un registro delle impostazioni UAC per gli audit trail.

Considerazioni finali

Nel contesto della gestione dell’infrastruttura IT, in particolare quando si utilizza NinjaOne, questo script PowerShell per la verifica UAC è una risorsa preziosa. Automatizza un aspetto critico della gestione della sicurezza, garantendo che le impostazioni UAC in tutta la rete di un’organizzazione rimangano a livelli ottimali per la sicurezza e la conformità. Gli utenti di NinjaOne possono trarre particolare vantaggio dalle capacità di integrazione degli script, rafforzando il ruolo della piattaforma come soluzione completa per i servizi IT gestiti.

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.

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.