PowerShell-scripts voor herstelbewerkingen

Dit artikel bevat voorbeeldscripts die klanten kunnen implementeren of gebruiken als sjablonen om te leren hoe ze hun eigen scripts kunnen maken. Gebruik de informatie hier om scriptpakketten voor herstelbewerkingen te maken.

Scriptbeschrijvingen

In deze tabel ziet u de namen, beschrijvingen, detecties, herstelbewerkingen en configureerbare items. Scriptbestanden waarvan de namen beginnen met Detect zijn detectiescripts. Herstelscripts beginnen met Remediate. Deze scripts kunnen worden gekopieerd uit de volgende sectie in dit artikel.

Scriptnaam Beschrijving
Netwerkcertificaten controleren
Detect_Expired_Issuer_Certificates.ps1
Remediate_Expired_Issuer_Certificates.ps1
Detecteert certificaten die zijn uitgegeven door een CA in het persoonlijke archief van de machine of gebruiker die zijn verlopen of bijna verlopen.
Geef de CA op door de waarde voor $strMatch in het detectiescript te wijzigen. Geef 0 op voor $expiringDays om verlopen certificaten te zoeken of geef nog een aantal dagen op om certificaten te vinden die bijna verlopen.

Herstelt door een pop-upmelding naar de gebruiker te verzenden.
Geef de $Title waarden en $msgText op met de berichttitel en tekst die gebruikers moeten zien.

Hiermee worden gebruikers gewaarschuwd voor verlopen certificaten die mogelijk moeten worden vernieuwd.

Voer het script uit met behulp van de aangemelde referenties: Ja
Verouderde certificaten wissen
Detect_Expired_User_Certificates.ps1
Remediate_Expired_User_Certificates.ps1
Hiermee worden verlopen certificaten gedetecteerd die zijn uitgegeven door een CA in het persoonlijke archief van de huidige gebruiker.
Geef de CA op door de waarde voor $certCN in het detectiescript te wijzigen.

Herstelt door verlopen certificaten te verwijderen die zijn uitgegeven door een CA uit het persoonlijke archief van de huidige gebruiker.
Geef de CA op door de waarde voor $certCN in het herstelscript te wijzigen.

Hiermee vindt en verwijdert u verlopen certificaten die zijn uitgegeven door een CA uit het persoonlijke archief van de huidige gebruiker.

Voer het script uit met behulp van de aangemelde referenties: Ja
Verouderd groepsbeleid bijwerken (ingebouwd)
Detect_stale_Group_Policies.ps1
Remediate_stale_GroupPolicies.ps1
Hiermee wordt gedetecteerd of de laatste groepsbeleid vernieuwing groter is dan 7 days geleden.
Dit scriptpakket is inbegrepen bij Herstelbewerkingen, maar er wordt een kopie opgegeven als u de drempelwaarde wilt wijzigen. Pas de drempelwaarde van zeven dagen aan door de waarde voor $numDays in het detectiescript te wijzigen.

Herstelt door uit te voeren gpupdate /target:computer /force en gpupdate /target:user /force

Kan helpen bij het verminderen van ondersteuningsaanroepen met betrekking tot netwerkconnectiviteit wanneer certificaten en configuraties worden geleverd via groepsbeleid.

Voer het script uit met behulp van de aangemelde referenties: Ja

Scriptpakket voor netwerkcertificaten controleren

Dit scriptpakket detecteert certificaten die zijn uitgegeven door een CA in het persoonlijke archief van de machine of gebruiker die zijn verlopen of bijna verlopen. Het script herstelt door een pop-upmelding naar de gebruiker te verzenden.

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)

Scriptpakket voor verlopen certificaten wissen

Met dit scriptpakket worden verlopen certificaten gedetecteerd die zijn uitgegeven door een CA in het persoonlijke archief van de huidige gebruiker. Het script herstelt door verlopen certificaten te verwijderen die zijn uitgegeven door een CA uit het persoonlijke archief van de huidige gebruiker.

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
}

Scriptpakket voor verlopen groepsbeleid bijwerken

Dit scriptpakket is inbegrepen bij Herstelbewerkingen, maar er wordt een kopie opgegeven als u de drempelwaarde wilt wijzigen.

Met dit scriptpakket wordt gedetecteerd of de laatste groepsbeleid vernieuwing groter is dan 7 days geleden. Het script herstelt door en gpupdate /target:user /forceuit te voerengpupdate /target:computer /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
}

Volgende stappen

Zie Herstelbewerkingen voor meer informatie over het implementeren van scriptpakketten.