Script di PowerShell per le correzioni

Questo articolo include script di esempio che i clienti possono implementare o usare come modelli per imparare a crearne di propri. Usare le informazioni fornite qui per creare pacchetti script per le correzioni.

Descrizioni degli script

Questa tabella mostra i nomi di script, le descrizioni, i rilevamenti, le correzioni e gli elementi configurabili. I file di script i cui nomi iniziano con Detect sono script di rilevamento. Gli script di correzione iniziano con Remediate. Questi script possono essere copiati dalla sezione successiva di questo articolo.

Nome script Descrizione
Controllare i certificati di rete
Detect_Expired_Issuer_Certificates.ps1
Remediate_Expired_Issuer_Certificates.ps1
Rileva i certificati emessi da un'autorità di certificazione nell'archivio personale del computer o dell'utente scaduto o vicino alla scadenza.
Specificare la CA modificando il valore per $strMatch nello script di rilevamento. Specificare 0 per $expiringDays trovare i certificati scaduti o specificare un altro numero di giorni per trovare i certificati vicino alla scadenza.

Corregge generando una notifica di tipo avviso popup all'utente.
Specificare i $Title valori e $msgText con il titolo e il testo del messaggio che gli utenti devono visualizzare.

Notifica agli utenti i certificati scaduti che potrebbero dover essere rinnovati.

Eseguire lo script usando le credenziali di accesso: Sì
Cancella certificati non aggiornati
Detect_Expired_User_Certificates.ps1
Remediate_Expired_User_Certificates.ps1
Rileva i certificati scaduti emessi da una CA nell'archivio personale dell'utente corrente.
Specificare la CA modificando il valore per $certCN nello script di rilevamento.

Corregge eliminando i certificati scaduti emessi da una CA dall'archivio personale dell'utente corrente.
Specificare la CA modificando il valore per $certCN nello script di correzione.

Trova ed elimina i certificati scaduti emessi da una CA dall'archivio personale dell'utente corrente.

Eseguire lo script usando le credenziali di accesso: Sì
Aggiornare Criteri di gruppo non aggiornati (predefinito)
Detect_stale_Group_Policies.ps1
Remediate_stale_GroupPolicies.ps1
Rileva se l'ultimo aggiornamento Criteri di gruppo è maggiore di quello precedente7 days.
Questo pacchetto di script è incluso in Correzioni, ma viene fornita una copia se si vuole modificare la soglia. Personalizzare la soglia di sette giorni modificando il valore per $numDays nello script di rilevamento.

Corregge eseguendo gpupdate /target:computer /force e gpupdate /target:user /force

Consente di ridurre le chiamate di supporto correlate alla connettività di rete quando vengono recapitati certificati e configurazioni tramite Criteri di gruppo.

Eseguire lo script usando le credenziali di accesso: Sì

Controllare il pacchetto di script dei certificati di rete

Questo pacchetto di script rileva i certificati emessi da un'autorità di certificazione nell'archivio personale del computer o dell'utente scaduto o vicino alla scadenza. Lo script corregge generando una notifica di tipo avviso popup all'utente.

Detect_Expired_Issuer_Certificates.ps1

#=============================================================================================================================
#
# Script Name:     Detect_Expired_Issuer_Certificates.ps1
# Description:     Detect expired certificates issued by "CN=<your CA here>" in either Machine
#                  or User certificate store
# Notes:           Change the value of the variable $strMatch from "CN=<your CA here>" to "CN=..."
#                  For testing purposes the value of the variable $expiringDays can be changed to a positive integer
#                  Don't change the $results variable
#
#=============================================================================================================================

# Define Variables
$results = @()
$expiringDays = 0
$strMatch = "CN=<your CA here>"

try
{
    $results = @(Get-ChildItem -Path Cert:\LocalMachine\My -Recurse -ExpiringInDays $expiringDays | where {$_.Issuer -match $strMatch})
    $results += @(Get-ChildItem -Path Cert:\CurrentUser\My -Recurse -ExpiringInDays $expiringDays | where {$_.Issuer -match $strMatch}) 
    if (($results -ne $null)){
        #Below necessary for Intune as of 10/2019 will only remediate Exit Code 1
        Write-Host "Match"
        Return $results.count
        exit 1
    }
    else{
        #No matching certificates, do not remediate
        Write-Host "No_Match"        
        exit 0
    }   
}
catch{
    $errMsg = $_.Exception.Message
    Write-Error $errMsg
    exit 1
}

Remediate_Expired_Issuer_Certificates.ps1

#=============================================================================================================================
#
# Script Name:     Remediate_Expired_Issuer_Certificates.ps1
# Description:     Raise a Toast Notification if expired certificates issued by "CN=..."
#                  to user or machine on the machine where detection script found them. No remediation action besides
#                  the Toast is taken.
# Notes:           Change the values of the variables $Title and $msgText
#
#=============================================================================================================================

## Raise toast to have user contact whoever is specified in the $msgText

# Define Variables
$delExpCert = 0
$Title = "Title"
$msgText = "message"

# Main script
[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] | Out-Null
[Windows.UI.Notifications.ToastNotification, Windows.UI.Notifications, ContentType = WindowsRuntime] | Out-Null
[Windows.Data.Xml.Dom.XmlDocument, Windows.Data.Xml.Dom.XmlDocument, ContentType = WindowsRuntime] | Out-Null

$APP_ID = '{1AC14E77-02E7-4E5D-B744-2EB1AE5198B7}\WindowsPowerShell\v1.0\powershell.exe'

$template = @"
<toast>
    <visual>
        <binding template="ToastText02">
            <text id="1">$Title</text>
            <text id="2">$msgText</text>
        </binding>
    </visual>
</toast>
"@

$xml = New-Object Windows.Data.Xml.Dom.XmlDocument
$xml.LoadXml($template)
$toast = New-Object Windows.UI.Notifications.ToastNotification $xml
[Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier($APP_ID).Show($toast)

Cancellare il pacchetto di script dei certificati non aggiornati

Questo pacchetto di script rileva i certificati scaduti emessi da una CA nell'archivio personale dell'utente corrente. Lo script corregge eliminando i certificati scaduti emessi da una CA dall'archivio personale dell'utente corrente.

Detect_Expired_User_Certificates.ps1

#=============================================================================================================================
#
# Script Name:     Detect_Expired_User_Certificates.ps1
# Description:     Detect expired certificates issued by "CN=<your CA here>" to User
# Notes:           Change the value of the variable $certCN from "CN=<your CA here>" to "CN=...".
#                  Don't change $results
#
#=============================================================================================================================

# Define Variables
$results = 0
$certCN = "CN=<your CA here>"

try
{   
    $results = Get-ChildItem -Path Cert:\CurrentUser\My -Recurse -ExpiringInDays 0 | where {$_.Issuer -eq($certCN)}
    if (($results -ne $null)){
        #Below necessary for Intune as of 10/2019 will only remediate Exit Code 1
        Write-Host "Match"
        Return $results.count
        exit 1
    }
    else{
        Write-Host "No_Match"
        exit 0
    }    
}
catch{
    $errMsg = $_.Exception.Message
    Write-Error $errMsg
    exit 1
}

Remediate_Expired_User_Certificates.ps1

#=============================================================================================================================
#
# Script Name:     Remediate_Expired_User_Certificates.ps1
# Description:     Remove expired certificates issued by "CN=<your CA here>" to User
# Notes:           Change the value of the variable $certCN from "CN=<your CA here>" to "CN=..."
#
#=============================================================================================================================

# Define Variables
$certCN = "CN=<your CA here>"

try
{
    Get-ChildItem -Path cert:\CurrentUser -Recurse -ExpiringInDays 0 | where {$_.Issuer -eq($certCN)} | Remove-Item
    exit 0
}
catch{
    $errMsg = $_.Exception.Message
    Write-Error $errMsg
    exit 1
}

Aggiornare il pacchetto di script criteri di gruppo non aggiornati

Questo pacchetto di script è incluso in Correzioni, ma viene fornita una copia se si vuole modificare la soglia.

Questo pacchetto di script rileva se l'ultimo aggiornamento Criteri di gruppo è maggiore di quello precedente7 days. Lo script corregge eseguendo gpupdate /target:computer /force e gpupdate /target:user /force.

Detect_stale_Group_Policies.ps1

#=============================================================================================================================
#
# Script Name:     Detect_stale_Group_Policies.ps1
# Description:     Detect if Group Policy has been updated within number of days
# Notes:           Remediate if "Match", $lastGPUpdateDays default value of 7, change as appropriate
#
#=============================================================================================================================

# Define Variables

try {
    $gpResult = [datetime]::FromFileTime(([Int64] ((Get-ItemProperty -Path "Registry::HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine\Extension-List\{00000000-0000-0000-0000-000000000000}").startTimeHi) -shl 32) -bor ((Get-ItemProperty -Path "Registry::HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine\Extension-List\{00000000-0000-0000-0000-000000000000}").startTimeLo))
    $lastGPUpdateDate = Get-Date ($gpResult[0])
    [int]$lastGPUpdateDays = (New-TimeSpan -Start $lastGPUpdateDate -End (Get-Date)).Days
        
    if ($lastGPUpdateDays -gt 7){
        #Exit 1 for Intune. We want it to be within the last 7 days "Match" to remediate in SCCM
        Write-Host "Match"
        exit 1
    }
    else {
        #Exit 0 for Intune and "No_Match" for SCCM, only remediate "Match"
        Write-Host "No_Match"
        exit 0
    }
}
catch {
    $errMsg = $_.Exception.Message
    return $errMsg
    exit 1
}

Remediate_stale_GroupPolicies.ps1

#=============================================================================================================================
#
# Script Name:     Remediate_stale_GroupPolicies.ps1
# Description:     This script triggers Group Policy update
# Notes:           No variable substitution needed
#
#=============================================================================================================================

try {
    $compGPUpd = gpupdate /force
    $gpResult = [datetime]::FromFileTime(([Int64] ((Get-ItemProperty -Path "Registry::HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine\Extension-List\{00000000-0000-0000-0000-000000000000}").startTimeHi) -shl 32) -bor ((Get-ItemProperty -Path "Registry::HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine\Extension-List\{00000000-0000-0000-0000-000000000000}").startTimeLo))
    $lastGPUpdateDate = Get-Date ($gpResult[0])
    [int]$lastGPUpdateDays = (New-TimeSpan -Start $lastGPUpdateDate -End (Get-Date)).Days

    if ($lastGPUpdateDays -eq 0){
        Write-Host "gpupdate completed successfully"
        exit 0
    }
    else{
        Write-Host "gpupdate failed"
        }
}
catch{
    $errMsg = $_.Exception.Message
    return $errMsg
    exit 1
}

Passaggi successivi

Per informazioni sulla distribuzione di pacchetti script, vedere Correzioni.