Dela via


PowerShell-skript för reparation

Den här artikeln innehåller exempelskript som kunder kan implementera eller använda som mallar för att lära sig att skapa egna. Använd informationen här för att skapa skriptpaket för reparation.

Skriptbeskrivningar

Den här tabellen visar skriptnamn, beskrivningar, identifieringar, åtgärder och konfigurerbara objekt. Skriptfiler vars namn börjar med Detect är identifieringsskript. Reparationsskript börjar med Remediate. Dessa skript kan kopieras från nästa avsnitt i den här artikeln.

Skriptnamn Beskrivning
Kontrollera nätverkscertifikat
Detect_Expired_Issuer_Certificates.ps1
Remediate_Expired_Issuer_Certificates.ps1
Identifierar certifikat som utfärdats av en certifikatutfärdare i antingen datorns eller användarens personliga arkiv som har upphört att gälla eller nästan upphör att gälla.
Ange certifikatmottagaren genom att ändra värdet för $strMatch i identifieringsskriptet. Ange 0 för för att hitta utgångna certifikat eller ange ytterligare ett antal dagar för $expiringDays att hitta certifikat som snart har upphört att gälla.

Åtgärdar genom att skapa ett popup-meddelande till användaren.
$Title Ange värdena och $msgText med meddelanderubriken och texten som du vill att användarna ska se.

Meddelar användare av utgångna certifikat som kan behöva förnyas.

Kör skriptet med de inloggade autentiseringsuppgifterna: Ja
Rensa inaktuella certifikat
Detect_Expired_User_Certificates.ps1
Remediate_Expired_User_Certificates.ps1
Identifierar utgångna certifikat som utfärdats av en certifikatutfärdare i den aktuella användarens personliga arkiv.
Ange certifikatmottagaren genom att ändra värdet för $certCN i identifieringsskriptet.

Åtgärdar genom att ta bort utgångna certifikat som utfärdats av en certifikatutfärdare från den aktuella användarens personliga arkiv.
Ange certifikatmottagaren genom att ändra värdet för $certCN i reparationsskriptet.

Söker efter och tar bort utgångna certifikat som utfärdats av en certifikatutfärdare från den aktuella användarens personliga arkiv.

Kör skriptet med de inloggade autentiseringsuppgifterna: Ja
Uppdatera inaktuella grupprinciper (inbyggda)
Detect_stale_Group_Policies.ps1
Remediate_stale_GroupPolicies.ps1
Identifierar om den senaste uppdateringen av grupprincipen är större än 7 days sedan.
Det här skriptpaketet ingår i Reparation, men en kopia tillhandahålls om du vill ändra tröskelvärdet. Anpassa tröskelvärdet på sju dagar genom att ändra värdet för $numDays i identifieringsskriptet.

Åtgärdar genom att köra gpupdate /target:computer /force och gpupdate /target:user /force

kan hjälpa till att minska nätverksanslutningsrelaterade supportanrop när certifikat och konfigurationer levereras via grupprincip.

Kör skriptet med de inloggade autentiseringsuppgifterna: Ja

Kontrollera skriptpaketet för nätverkscertifikat

Det här skriptpaketet identifierar certifikat som utfärdats av en certifikatutfärdare i antingen datorns eller användarens personliga arkiv som har upphört att gälla eller nästan upphör att gälla. Skriptet åtgärdar genom att skapa ett popup-meddelande till användaren.

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)

Rensa inaktuellt certifikatskriptpaket

Det här skriptpaketet identifierar utgångna certifikat som utfärdats av en certifikatutfärdare i den aktuella användarens personliga arkiv. Skriptet åtgärdar genom att ta bort utgångna certifikat som utfärdats av en certifikatutfärdare från den aktuella användarens personliga arkiv.

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
}

Uppdatera skriptpaketet för inaktuella grupprinciper

Det här skriptpaketet ingår i Reparation, men en kopia tillhandahålls om du vill ändra tröskelvärdet.

Det här skriptpaketet identifierar om den senaste grupprincipuppdateringen är större än 7 days sedan. Skriptet åtgärdar genom att köra gpupdate /target:computer /force och 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
}

Nästa steg

Information om hur du distribuerar skriptpaket finns i Reparation.