Skrypty programu PowerShell dotyczące korygowania

Ten artykuł zawiera przykładowe skrypty, które klienci mogą zaimplementować lub używać jako szablonów, aby dowiedzieć się, jak tworzyć własne. Skorzystaj z informacji podanych tutaj, aby utworzyć pakiety skryptów na potrzeby korygowania.

Opisy skryptów

W poniższej tabeli przedstawiono nazwy skryptów, opisy, wykrycia, środki zaradcze i możliwe do skonfigurowania elementy. Pliki skryptów, których nazwy zaczynają się od Detect są skryptami wykrywania. Skrypty korygowania zaczynają się od Remediate. Te skrypty można skopiować z następnej sekcji tego artykułu.

Nazwa skryptu Opis
Sprawdzanie certyfikatów sieciowych
Detect_Expired_Issuer_Certificates.ps1
Remediate_Expired_Issuer_Certificates.ps1
Wykrywa certyfikaty wystawione przez urząd certyfikacji w magazynie osobistym komputera lub użytkownika, które wygasły lub wkrótce wygasną.
Określ urząd certyfikacji, zmieniając jego wartość $strMatch w skrypcie wykrywania. Określ wartość 0 $expiringDays , aby znaleźć certyfikaty, które wygasły, lub określ inną liczbę dni, aby znaleźć certyfikaty zbliżające się do wygaśnięcia.

Rozwiązuje ten problem, wysyłając wyskakujące powiadomienie do użytkownika.
Określ $Title wartości i $msgText z tytułem wiadomości i tekstem, które mają być widoczne dla użytkowników.

Powiadamia użytkowników o wygasłych certyfikatach, które mogą wymagać odnowienia.

Uruchom skrypt przy użyciu poświadczeń logowania: Tak
Czyszczenie przestarzałych certyfikatów
Detect_Expired_User_Certificates.ps1
Remediate_Expired_User_Certificates.ps1
Wykrywa wygasłe certyfikaty wystawione przez urząd certyfikacji w magazynie osobistym bieżącego użytkownika.
Określ urząd certyfikacji, zmieniając jego wartość $certCN w skrypcie wykrywania.

Działania naprawcze polegają na usunięciu wygasłych certyfikatów wystawionych przez urząd certyfikacji z magazynu osobistego bieżącego użytkownika.
Określ urząd certyfikacji, zmieniając jego wartość $certCN w skrypcie korygowania.

Znajduje i usuwa wygasłe certyfikaty wystawione przez urząd certyfikacji w magazynie osobistym bieżącego użytkownika.

Uruchom skrypt przy użyciu poświadczeń logowania: Tak
Aktualizowanie nieaktualnych zasad grupy (wbudowane)
Detect_stale_Group_Policies.ps1
Remediate_stale_GroupPolicies.ps1
Wykrywa, czy ostatnie odświeżenie zasady grupy jest większe niż 7 days wcześniej.
Ten pakiet skryptów jest dołączony do korygowania, ale jeśli chcesz zmienić próg, jego kopia jest dostarczana. Dostosuj siedmiodniowy próg, zmieniając wartość w $numDays skrypcie wykrywania.

Można rozwiązać problemy, uruchamiając gpupdate /target:computer /force i gpupdate /target:user /force

Może pomóc ograniczyć liczbę zgłoszeń pomocy technicznej związanych z łącznością sieciową, gdy certyfikaty i konfiguracje są dostarczane za pośrednictwem zasady grupy.

Uruchom skrypt przy użyciu poświadczeń logowania: Tak

Sprawdź pakiet skryptów certyfikatów sieciowych

Ten pakiet skryptów wykrywa certyfikaty wystawione przez urząd certyfikacji w magazynie osobistym komputera lub użytkownika, które wygasły lub wkrótce wygasną. Skrypt rozwiązuje problem, zgłaszając wyskakujące powiadomienie do użytkownika.

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)

Wyczyść pakiet skryptu starych certyfikatów

Ten pakiet skryptów wykrywa wygasłe certyfikaty wystawione przez urząd certyfikacji w magazynie osobistym bieżącego użytkownika. Skrypt rozwiązuje problem usuwając wygasłe certyfikaty wystawione przez urząd certyfikacji z magazynu osobistego bieżącego użytkownika.

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
}

Aktualizowanie przestarzałego pakietu skryptów zasad grupy

Ten pakiet skryptów jest dołączony do korygowania, ale jeśli chcesz zmienić próg, jego kopia jest dostarczana.

Ten pakiet skryptów wykrywa, czy ostatnie odświeżenie zasady grupy jest większe niż 7 days wcześniej. Skrypt rozwiązuje problemy poprzez uruchomienie gpupdate /target:computer /force i 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
}

Następne kroki

Aby uzyskać informacje na temat wdrażania pakietów skryptów, zobacz Korygowanie.