Partilhar via


Scripts do PowerShell para Remediações

Este artigo inclui scripts de exemplo que os clientes podem implementar ou utilizar como modelos para aprender a criar os seus próprios. Utilize as informações aqui fornecidas para criar pacotes de scripts para Remediações.

Descrições de scripts

Esta tabela mostra os nomes dos scripts, descrições, detecções, correções e itens configuráveis. Os arquivos de script cujos nomes começam com Detect são scripts de detecção. Os scripts de correção começam com Remediate. Esses scripts podem ser copiados da próxima seção deste artigo.

Nome do script Descrição
Verificar certificados de rede
Detect_Expired_Issuer_Certificates.ps1
Remediate_Expired_Issuer_Certificates.ps1
Detecta certificados emitidos por uma autoridade de certificação no armazenamento pessoal do computador ou do usuário que expiraram ou estão perto de expirar.
Especifique a AC ao alterar o valor para $strMatch no script de deteção. Especifique 0 no campo $expiringDays para localizar certificados expirados ou especifique outro número de dias para localizar certificados próximos à expiração.

Corrija ao emitir uma notificação de alerta para o utilizador.
Especifique os $Title valores e $msgText com o título da mensagem e o texto que pretende que os utilizadores vejam.

Notifica os utilizadores de certificados expirados que poderão ter de ser renovados.

Execute o script com as credenciais com sessão iniciada: Sim
Limpar certificados obsoletos
Detect_Expired_User_Certificates.ps1
Remediate_Expired_User_Certificates.ps1
Detecta certificados expirados emitidos por uma autoridade de certificação no armazenamento pessoal do usuário atual.
Especifique a AC ao alterar o valor para $certCN no script de deteção.

Corrija ao eliminar certificados expirados emitidos por uma AC do arquivo pessoal do utilizador atual.
Especifique a AC ao alterar o valor para $certCN no script de remediação.

Localiza e elimina certificados expirados emitidos por uma AC do arquivo pessoal do utilizador atual.

Execute o script com as credenciais com sessão iniciada: Sim
Atualizar Políticas de Grupo obsoletas (incorporadas )
Detect_stale_Group_Policies.ps1
Remediate_stale_GroupPolicies.ps1
Detecta se a última atualização da Política de Grupo ocorreu 7 days atrás.
Este pacote de script está incluído nas Remediações, mas é fornecida uma cópia se quiser alterar o limiar. Personalize o limite de sete dias alterando o valor $numDays no script de detecção.

Corrija ao executar gpupdate /target:computer /force e gpupdate /target:user /force

Pode ajudar a reduzir as chamadas de suporte relacionadas com a conectividade de rede quando os certificados e as configurações são entregues através de Política de Grupo.

Execute o script com as credenciais com sessão iniciada: Sim

Verificar o pacote de script de certificados de rede

Esse pacote de script detecta certificados emitidos por uma AC no repositório pessoal do Computador ou do Usuário que expiraram ou estão próximos da expiração. O script é corrigido gerando uma notificação do sistema para o usuário.

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)

Limpar o pacote de script de certificados obsoletos

Esse pacote de script detecta certificados expirados emitidos por uma AC no repositório pessoal do usuário atual. O script é corrigido excluindo certificados expirados emitidos por uma AC do repositório pessoal do usuário atual.

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
}

Atualizar o pacote de script de Políticas de Grupo obsoleto

Este pacote de script está incluído nas Remediações, mas é fornecida uma cópia se quiser alterar o limiar.

Este pacote de scripts detecta se a última atualização da Política de Grupo é posterior a 7 days atrás. O script corrige executando gpupdate /target:computer /force e 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
}

Próximas etapas

Para obter informações sobre a implementação de pacotes de scripts, veja Remediações.