Düzeltmeler için PowerShell betikleri

Bu makale, müşterilerin kendi şablonlarını nasıl oluşturacaklarını öğrenmek için şablon olarak uygulayabilecekleri veya kullanabilecekleri örnek betikleri içerir. Düzeltmeler için betik paketleri oluşturmak için burada sağlanan bilgileri kullanın.

Betik açıklamaları

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

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

Kullanıcıya bildirim göndererek düzeltmeler yapın.
$Title $msgText ve değerlerini, kullanıcıların görmesini istediğiniz ileti başlığı ve metniyle belirtin.

Yenilenmesi gerekebilecek süresi dolmuş sertifikaları kullanıcılara bildirir.

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

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

Ca tarafından verilen süresi dolmuş sertifikaları geçerli kullanıcının kişisel deposundan bulur ve 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 İlkesi yenilemenin öncekinden 7 days büyük olup olmadığını algılar.
Bu betik paketi Düzeltmeler'e dahil edilir, ancak eşiği değiştirmek istiyorsanız bir kopya sağlanır. Algılama betiğindeki değerini $numDays değiştirerek yedi günlük eşiği özelleştirin.

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

Sertifikalar ve yapılandırmalar Grup İlkesi 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ı betik paketini denetleme

Bu betik paketi, bir CA tarafından Makinenin veya Kullanıcının kişisel deposunda süresi dolan veya süresi dolmak üzere olan sertifikaları algılar. Betik, kullanıcıya bildirim göndererek düzeltildi.

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 betik paketini temizleme

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 dolan 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üzeltmeler'e dahil edilir, ancak eşiği değiştirmek istiyorsanız bir kopya sağlanır.

Bu betik paketi, son Grup İlkesi yenilemenin öncekinden 7 days büyük olup olmadığını algılar. Betik, ve gpupdate /target:user /forcekomutunu çalıştırarak gpupdate /target:computer /force düzeltildi.

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 bilgi için bkz. Düzeltmeler.