Sdílet prostřednictvím


Skripty PowerShellu pro nápravy

Tento článek obsahuje ukázkové skripty, které můžou zákazníci implementovat nebo použít jako šablony, aby se dozvěděli, jak vytvořit vlastní. Pomocí zde uvedených informací můžete vytvářet balíčky skriptů pro nápravy.

Popisy skriptů

Tato tabulka obsahuje názvy skriptů, popisy, detekce, nápravy a konfigurovatelné položky. Soubory skriptu, jejichž názvy začínají na Detect, jsou skripty detekce. Skripty nápravy začínají na Remediate. Tyto skripty můžete zkopírovat z další části tohoto článku.

Název skriptu Popis
Kontrola síťových certifikátů
Detect_Expired_Issuer_Certificates.ps1
Remediate_Expired_Issuer_Certificates.ps1
Zjistí certifikáty vydané certifikační autoritou v osobním úložišti počítače nebo uživatele, jejichž platnost vypršela nebo se blíží vypršení platnosti.
Zadejte certifikační autoritu změnou hodnoty pro $strMatch ve skriptu detekce. Pokud chcete vyhledat certifikáty s prošlou platností, zadejte hodnotu 0 $expiringDays nebo zadejte jiný počet dnů, než se certifikáty budou blížit vypršení platnosti.

Nápravu napravíte tak, že uživateli zobrazíte informační zprávu.
$Title Zadejte hodnoty a $msgText s názvem zprávy a textem, které mají uživatelé vidět.

Upozorní uživatele na certifikáty s prošlou platností, které může být potřeba obnovit.

Spusťte skript pomocí přihlášených přihlašovacích údajů: Ano
Vymazání zastaralých certifikátů
Detect_Expired_User_Certificates.ps1
Remediate_Expired_User_Certificates.ps1
Zjistí certifikáty s prošlou platností vydané certifikační autoritou v osobním úložišti aktuálního uživatele.
Zadejte certifikační autoritu změnou hodnoty pro $certCN ve skriptu detekce.

Opraví se odstraněním prošlých certifikátů vydaných certifikační autoritou z osobního úložiště aktuálního uživatele.
Zadejte certifikační autoritu změnou hodnoty pro $certCN ve skriptu nápravy.

Vyhledá a odstraní certifikáty s vypršenou platností vydané certifikační autoritou z osobního úložiště aktuálního uživatele.

Spusťte skript pomocí přihlášených přihlašovacích údajů: Ano
Aktualizace zastaralých zásad skupiny (integrované)
Detect_stale_Group_Policies.ps1
Remediate_stale_GroupPolicies.ps1
Zjistí, jestli je poslední aktualizace Zásady skupiny větší než 7 days před.
Tento balíček skriptu je součástí oprav, ale pokud chcete změnit prahovou hodnotu, je k dispozici kopie. Přizpůsobte sedmidenní prahovou hodnotu změnou hodnoty pro $numDays ve skriptu detekce.

Opravuje spuštěním a gpupdate /target:computer /forcegpupdate /target:user /force

může pomoct omezit volání podpory související s připojením k síti, když se certifikáty a konfigurace doručují prostřednictvím Zásady skupiny.

Spusťte skript pomocí přihlášených přihlašovacích údajů: Ano

Kontrola balíčku skriptu síťových certifikátů

Tento balíček skriptů rozpozná certifikáty vydané certifikační autoritou v osobním úložišti počítače nebo uživatele, jejichž platnost vypršela nebo se blíží vypršení platnosti. Skript to napraví tak, že uživateli vyvolá informační zprávu.

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)

Vymazání balíčku skriptu zastaralých certifikátů

Tento balíček skriptů detekuje certifikáty s prošlou platností vydané certifikační autoritou v osobním úložišti aktuálního uživatele. Skript napraví odstraněním certifikátů, jejichž platnost vypršela, z osobního úložiště aktuálního uživatele.

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
}

Aktualizace zastaralého balíčku skriptu zásad skupiny

Tento balíček skriptu je součástí oprav, ale pokud chcete změnit prahovou hodnotu, je k dispozici kopie.

Tento balíček skriptu zjistí, jestli je poslední aktualizace Zásady skupiny větší než 7 days před. Skript napraví spuštěním gpupdate /target:computer /force příkazu a 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
}

Další kroky

Informace o nasazení balíčků skriptů najdete v tématu Nápravy.