Script di PowerShell per correzioni proattive

Usare le informazioni seguenti per creare pacchetti script per le correzioni proattive.

Descrizioni degli script

In questa tabella sono riportati 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
Check network certificates (Verifica certificati di rete)
Detect_Expired_Issuer_Certificates.ps1
Remediate_Expired_Issuer_Certificates.ps1
Rileva i certificati emessi da un'autorità di certificazione scaduti o prossimi alla scadenza nell'archivio personale del computer o dell'utente.
Per specificare l'autorità di certificazione, modificare il valore per $strMatch nello script di rilevamento. Specificare 0 per $expiringDays per trovare i certificati scaduti o specificare un altro numero di giorni per trovare i certificati prossimi alla scadenza.

Le correzioni vengono applicate generando una notifica di tipo avviso popup per l'utente.
Specificare i valori $Title e $msgText con il titolo e il testo del messaggio che verrà visualizzato dagli utenti.

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

Esegui lo script con le credenziali dell'utente connesso: Sì
Clear stale certificates (Cancella certificati non aggiornati)
Detect_Expired_User_Certificates.ps1
Remediate_Expired_User_Certificates.ps1
Rileva i certificati scaduti emessi da un'autorità di certificazione nell'archivio personale dell'utente corrente.
Per specificare l'autorità di certificazione, modificare il valore per $certCN nello script di rilevamento.

Per applicare la correzione, rileva nell'archivio personale dell'utente corrente i certificati scaduti emessi da un'autorità di certificazione.
Per specificare l'autorità di certificazione, modificare il valore per $certCN nello script di correzione.

Rileva ed elimina i certificati scaduti emessi da un'autorità di certificazione nell'archivio personale dell'utente corrente.

Esegui lo script con le credenziali dell'utente connesso: Sì
Aggiornare i criteri di gruppo non aggiornati (predefiniti)
Detect_stale_Group_Policies.ps1
Remediate_stale_GroupPolicies.ps1
Rileva se l'ultimo aggiornamento dei criteri di gruppo è precedente a 7 days.
Questo pacchetto di script è incluso nelle correzioni proattive, 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.

Le correzioni vengono applicate eseguendo gpupdate /target:computer /force e gpupdate /target:user /force

Può aiutare a ridurre le chiamate al supporto tecnico relative alla connettività di rete quando i certificati e le configurazioni vengono recapitati con Criteri di gruppo.

Esegui lo script con le credenziali dell'utente connesso: Sì

Controllare il pacchetto script dei certificati di rete

Questo pacchetto di script rileva i certificati rilasciati da una CA nell'archivio personale del computer o dell'utente scaduti o quasi scaduti. Lo script consente di correggere 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 obsoleti

Questo pacchetto di script rileva i certificati scaduti emessi da una CA nell'archivio personale dell'utente corrente. Lo script consente di correggere 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 nelle correzioni proattive, 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 7 days prima. Lo script esegue la correzione 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 proattive.