Düzeltmeler için PowerShell Betikleri

Bu makale, müşterilerin uygulayabileceği veya kendi betiklerini oluşturmayı öğrenmek için şablon olarak kullanabilecekleri örnek betikler içerir. Düzeltmeler için betik paketleri oluşturmak üzere burada sağlanan bilgileri kullanın.

Komut dosyası açıklamaları

Bu tabloda betik adları, açıklamaları, algılamaları, düzeltmeleri ve yapılandırılabilir öğeleri gösterilir. Adları ile Detect başlayan komut dosyaları algılama komut dosyalarıdır. Düzeltme betikleri ile başlar Remediate. Bu betikler bu makalenin bir sonraki bölümünden kopyalanabilir.

Komut dosyası adı Açıklama
Ağ sertifikalarını denetleme
Detect_Expired_Issuer_Certificates.ps1
Remediate_Expired_Issuer_Certificates.ps1
Makinenin veya Kullanıcının kişisel deposundaki bir CA tarafından verilen, süresi dolmuş veya süresi dolmak üzere olan sertifikaları algılar.
Algılama betiğindeki değeri $strMatch değiştirerek CA'yı belirtin. Süresi dolan sertifikaları bulmak için $expiringDays 0 belirtin veya süresi dolmak üzere olan sertifikaları bulmak için başka bir gün sayısı belirtin.

Kullanıcıya bir bildirim göndererek düzeltir.
Kullanıcıların görmesini istediğiniz ileti başlığı ve metni ile birlikte ve $msgText değerlerini belirtin$Title.

Yenilenmesi gerekebilecek, süresi dolmuş sertifikalar konusunda kullanıcıları bilgilendirir.

Oturum açmış kimlik bilgilerini kullanarak betiği çalıştırın: Evet
Eski sertifikaları temizle
Detect_Expired_User_Certificates.ps1
Remediate_Expired_User_Certificates.ps1
Geçerli kullanıcının kişisel deposundaki CA tarafından verilen süresi dolmuş sertifikaları algılar.
Algılama betiğindeki değeri $certCN değiştirerek CA'yı belirtin.

CA tarafından verilen süresi dolmuş sertifikaları geçerli kullanıcının kişisel deposundan silerek düzeltir.
Düzeltme betiğindeki değeri $certCN değiştirerek CA'yı belirtin.

CA tarafından verilen süresi dolmuş sertifikaları bulur ve geçerli kullanıcının kişisel deposundan siler.

Oturum açmış kimlik bilgilerini kullanarak betiği çalıştırın: Evet
Eski Grup İlkelerini güncelleştirme (yerleşik)
Detect_stale_Group_Policies.ps1
Remediate_stale_GroupPolicies.ps1
Son Grup İlkesigrup ilkesi yenilemenin öncesinden 7 days büyük olup olmadığını algılar.
Bu betik paketi Düzeltmelere dahil edilmiştir, ancak eşiği değiştirmek isterseniz bir kopyası sağlanır. Algılama betiğinde değerini $numDays değiştirerek yedi gün eşiğini özelleştirin.

Çalıştırarak gpupdate /target:computer /force düzeltir ve gpupdate /target:user /force

Sertifikalar ve yapılandırmalar Group Policygrup ilkesi aracılığıyla teslim edildiğinde ağ bağlantısıyla ilgili destek çağrılarını azaltmaya yardımcı olabilir.

Oturum açmış kimlik bilgilerini kullanarak betiği çalıştırın: Evet

Ağ sertifikaları komut dosyasını denetleme

Bu komut dosyası paketi, Makinenin veya Kullanıcının kişisel deposundaki bir CA tarafından verilen, süresi dolmuş veya süresi dolmak üzere olan sertifikaları algılar. Betik, kullanıcıya bir bildirim göndererek düzeltir.

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)

Eski sertifikaları temizle betik paketi

Bu betik paketi, geçerli kullanıcının kişisel deposundaki bir CA tarafından verilen süresi dolmuş sertifikaları algılar. Betik, CA tarafından verilen süresi dolmuş sertifikaları geçerli kullanıcının kişisel deposundan silerek düzeltir.

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
}

Eski Grup İlkeleri betik paketini güncelleştirme

Bu betik paketi Düzeltmelere dahil edilmiştir, ancak eşiği değiştirmek isterseniz bir kopyası sağlanır.

Bu betik paketi, son Grup İlkesigrup ilkesi yenilemenin öncesinden 7 days büyük olup olmadığını algılar. Betik, ve komutunu çalıştırarak gpupdate /target:computer /forcegpupdate /target:user /forcedüzeltir.

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
}

Sonraki adımlar

Betik paketlerini dağıtma hakkında daha fazla bilgi için bkz: Düzeltmeler.