Teilen über


PowerShell-Skripts für Wartungen

Dieser Artikel enthält Beispielskripts, die Kunden implementieren oder als Vorlagen verwenden können, um zu erfahren, wie sie eigene erstellen. Verwenden Sie die hier bereitgestellten Informationen, um Skriptpakete für Wartungen zu erstellen.

Angaben zu den Skripts

In dieser Tabelle werden die Skriptnamen, Beschreibungen, Erkennungen, Wiederherstellungen und konfigurierbaren Elemente angezeigt. Skriptdateien, deren Namen mit Detect beginnen, sind Erkennungsskripts. Wiederherstellungsskripts beginnen mit Remediate. Diese Skripts können aus dem nächsten Abschnitt dieses Artikels kopiert werden.

Skriptname Beschreibung
Überprüfen von Netzwerkzertifikaten
Detect_Expired_Issuer_Certificates.ps1
Remediate_Expired_Issuer_Certificates.ps1
Erkennt, ob von einer Zertifizierungsstelle ausgestellte Zertifikate, die sich entweder im persönlichen Speicher des Computers oder des Benutzers befinden, abgelaufen oder fast abgelaufen sind.
Geben Sie die Zertifizierungsstelle an, indem Sie den Wert für $strMatch im Erkennungsskript ändern. Geben Sie 0 für $expiringDays an, um abgelaufene Zertifikate zu suchen, oder geben Sie eine andere Anzahl von Tagen an, um fast abgelaufene Zertifikate zu finden.

Korrigiert, indem eine Popupbenachrichtigung für den Benutzer ausgelöst wird.
Geben Sie die $Title Werte und $msgText mit dem Nachrichtentitel und dem Text an, den Benutzer sehen sollen.

Benachrichtigt Benutzer über abgelaufene Zertifikate, die möglicherweise erneuert werden müssen.

Führen Sie das Skript mit den anmeldeinformationen aus: Ja
Löschen veralteter Zertifikate
Detect_Expired_User_Certificates.ps1
Remediate_Expired_User_Certificates.ps1
Erkennt von einer Zertifizierungsstelle ausgestellte abgelaufene Zertifikate im persönlichen Speicher des aktuellen Benutzers.
Geben Sie die Zertifizierungsstelle an, indem Sie den Wert für $certCN im Erkennungsskript ändern.

Löscht abgelaufene Zertifikate, die von einer Zertifizierungsstelle ausgestellt wurden, aus dem persönlichen Speicher des aktuellen Benutzers.
Geben Sie die Zertifizierungsstelle an, indem Sie den Wert für $certCN im Wartungsskript ändern.

Sucht und löscht abgelaufene Zertifikate, die von einer Zertifizierungsstelle ausgestellt wurden, im persönlichen Speicher des aktuellen Benutzers.

Führen Sie das Skript mit den anmeldeinformationen aus: Ja
Aktualisieren veralteter Gruppenrichtlinien (integriert)
Detect_stale_Group_Policies.ps1
Remediate_stale_GroupPolicies.ps1
Erkennt, ob die letzte Gruppenrichtlinienaktualisierung mehr als 7 days zurückliegt.
Dieses Skriptpaket ist in Remediations enthalten, aber eine Kopie wird bereitgestellt, wenn Sie den Schwellenwert ändern möchten. Passen Sie den Sieben-Tage-Schwellenwert an, indem Sie den Wert für $numDays im Erkennungsskript ändern.

Korrekturen durch Ausführen gpupdate /target:computer /force von und gpupdate /target:user /force

Kann dazu beitragen, netzwerkkonnektivitätsbezogene Supportaufrufe zu reduzieren, wenn Zertifikate und Konfigurationen über Gruppenrichtlinien übermittelt werden.

Führen Sie das Skript mit den anmeldeinformationen aus: Ja

Skriptpaket zur Überprüfung von Netzwerkzertifikaten

Dieses Skriptpaket erkennt, ob von einer Zertifizierungsstelle ausgestellte Zertifikate, die sich entweder im persönlichen Speicher des Computers oder des Benutzers befinden, abgelaufen oder fast abgelaufen sind. Die Korrektur durch das Skript erfolgt durch Senden einer Popupbenachrichtigung an den Benutzer.

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)

Skriptpaket zum Löschen veralteter Zertifikate

Dieses Skriptpaket erkennt von einer Zertifizierungsstelle ausgestellte abgelaufene Zertifikate im persönlichen Speicher des aktuellen Benutzers. Die Korrektur durch das Skript erfolgt durch Löschen der von einer Zertifizierungsstelle ausgestellten abgelaufenen Zertifikate im persönlichen Speicher des aktuellen Benutzers.

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
}

Skriptpaket zum Aktualisieren veralteter Gruppenrichtlinien

Dieses Skriptpaket ist in Remediations enthalten, aber eine Kopie wird bereitgestellt, wenn Sie den Schwellenwert ändern möchten.

Dieses Skriptpaket erkennt, ob die letzte Gruppenrichtlinienaktualisierung mehr als 7 days zurückliegt. Die Korrektur durch das Skript erfolgt durch Ausführen von gpupdate /target:computer /force und 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ächste Schritte

Informationen zum Bereitstellen von Skriptpaketen finden Sie unter Wartung.