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 di script per le correzioni.

Descrizioni degli script

Questa tabella mostra i nomi degli 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 una CA nell'archivio personale del computer o dell'utente che sono scaduti o prossimi alla scadenza.
Specificare la CA modificando il valore $strMatch nello script di rilevamento. Specificare 0 per $expiringDays trovare i certificati scaduti o specificare un altro numero di giorni per trovare i certificati prossimi alla scadenza.

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

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

Eseguire lo script usando le credenziali di accesso: Sì
Cancellare i 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 $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 $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 i Criteri di gruppo non aggiornati (predefinito)
Detect_stale_Group_Policies.ps1
Remediate_stale_GroupPolicies.ps1
Rileva se l'ultimo aggiornamento dei Criteri di gruppo è superiore a quello precedente7 days.
Questo pacchetto di script è incluso in Remediations, ma ne viene fornita una copia se si desidera modificare la soglia. Personalizzare la soglia di sette giorni modificando il valore $numDays nello script di rilevamento.

Corregge correndo e gpupdate /target:computer /forcegpupdate /target:user /force

Può contribuire a ridurre le chiamate di supporto correlate alla connettività di rete quando i certificati e le configurazioni vengono recapitati 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 una CA nell'archivio personale del computer o dell'utente che sono scaduti o prossimi alla scadenza. Lo script risolve generando una notifica di tipo avviso popup per l'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)

Cancella il pacchetto 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 risolve il problema 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 script di Criteri di gruppo non aggiornato

Questo pacchetto di script è incluso in Remediations, ma ne viene fornita una copia se si desidera modificare la soglia.

Questo pacchetto di script rileva se l'ultimo aggiornamento dei Criteri di gruppo è superiore a 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 di script, vedere Correzioni.