Scripts PowerShell pour les corrections

Cet article inclut des exemples de scripts que les clients peuvent implémenter ou utiliser comme modèles pour apprendre à créer leurs propres scripts. Utilisez les informations fournies ici pour créer des packages de script pour les corrections.

Descriptions des scripts

Ce tableau présente les noms de script, les descriptions, les détections, les corrections et les éléments configurables. Les fichiers de script dont le nom commence par Detect sont des scripts de détection. Les scripts de correction commencent par Remediate. Ces scripts peuvent être copiés à partir de la section suivante de cet article.

Nom du script Description
Vérifier les certificats réseau
Detect_Expired_Issuer_Certificates.ps1
Remediate_Expired_Issuer_Certificates.ps1
Détecte les certificats émis par une autorité de certification dans le magasin personnel de la machine ou de l'utilisateur, qui ont expiré ou sont sur le point de l’être.
Spécifiez l’autorité de certification en modifiant la valeur de $strMatch dans le script de détection. Indiquez 0 pour $expiringDays afin d’identifier les certificats expirés, ou spécifiez un autre nombre de jours afin d’identifier les certificats sur le point d’expirer.

Corrige en lançant une notification toast à l’utilisateur.
Spécifiez les $Title valeurs et $msgText avec le titre et le texte du message que vous souhaitez que les utilisateurs voient.

Avertit les utilisateurs des certificats expirés qui peuvent avoir besoin d’être renouvelés.

Exécutez le script à l’aide des informations d’identification de connexion : Oui
Effacer les certificats obsolètes
Detect_Expired_User_Certificates.ps1
Remediate_Expired_User_Certificates.ps1
Détecte les certificats expirés émis par une autorité de certification dans le magasin personnel de l'utilisateur actuel.
Spécifiez l’autorité de certification en modifiant la valeur de $certCN dans le script de détection.

Corrige en supprimant les certificats expirés émis par une autorité de certification du magasin personnel de l’utilisateur actuel.
Spécifiez l’autorité de certification en modifiant la valeur de $certCN dans le script de correction.

Recherche et supprime les certificats expirés émis par une autorité de certification dans le magasin personnel de l’utilisateur actuel.

Exécutez le script à l’aide des informations d’identification de connexion : Oui
Mettre à jour les stratégies de groupe obsolètes (intégrées)
Detect_stale_Group_Policies.ps1
Remediate_stale_GroupPolicies.ps1
Détecte si la dernière actualisation de la stratégie de groupe est antérieure à 7 days jours.
Ce package de script est inclus dans corrections, mais une copie est fournie si vous souhaitez modifier le seuil. Personnalisez le seuil de sept jours en modifiant la valeur de $numDays dans le script de détection.

Corrige en exécutant gpupdate /target:computer /force et gpupdate /target:user /force

Peut aider à réduire les appels de support liés à la connectivité réseau lorsque les certificats et les configurations sont remis via stratégie de groupe.

Exécutez le script à l’aide des informations d’identification de connexion : Oui

Vérifier le package de script des certificats réseau

Ce package de script détecte les certificats émis par une autorité de certification dans le magasin personnel de l’ordinateur ou de l’utilisateur qui ont expiré ou qui arrivent à expiration. Le script corrige en déclenchant une notification toast à l’utilisateur.

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)

Effacer le package de script de certificats obsolètes

Ce package de script détecte les certificats expirés émis par une autorité de certification dans le magasin personnel de l’utilisateur actuel. Ce script corrige le problème en supprimant les certificats expirés émis par une autorité de certification du magasin personnel de l'utilisateur actuel.

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
}

Mettre à jour le package de script stratégies de groupe obsolètes

Ce package de script est inclus dans corrections, mais une copie est fournie si vous souhaitez modifier le seuil.

Ce paquet de script détecte si la dernière actualisation de la stratégie de groupe est antérieure à 7 days jours. Le script corrige en exécutant gpupdate /target:computer /force et 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
}

Prochaines étapes

Pour plus d’informations sur le déploiement de packages de script, consultez Corrections.