Compartir vía


Scripts de PowerShell para correcciones

En este artículo se incluyen scripts de ejemplo que los clientes pueden implementar o usar como plantillas para aprender a crear los suyos propios. Use la información que se proporciona aquí para crear paquetes de script para correcciones.

Descripciones de los scripts

En esta tabla se muestran los nombres de los scripts, sus descripciones, detecciones, correcciones y los elementos configurables. Los archivos de script cuyos nombres empiezan por Detect son scripts de detección. Los scripts de corrección empiezan por Remediate. Estos scripts se pueden copiar en la sección siguiente de este artículo.

Nombre de script Descripción
Comprobación de certificados de red
Detect_Expired_Issuer_Certificates.ps1
Remediate_Expired_Issuer_Certificates.ps1
Detecta los certificados emitidos por una entidad de certificación en el almacén personal de la máquina o del usuario que han expirado o que están a punto de expirar.
Especifique la entidad de certificación cambiando el valor de $strMatch en el script de detección. Especifique 0 para $expiringDays para buscar certificados expirados, o bien especifique otro número de días para buscar certificados que estén por expirar.

Se corrige mediante la generación de una notificación del sistema al usuario.
Especifique los $Title valores y $msgText con el título del mensaje y el texto que desea que vean los usuarios.

Notifica a los usuarios los certificados expirados que podrían tener que renovarse.

Ejecute el script con las credenciales iniciadas: Sí
Borrar certificados obsoletos
Detect_Expired_User_Certificates.ps1
Remediate_Expired_User_Certificates.ps1
Detecta los certificados expirados emitidos por una entidad de certificación en el almacén personal del usuario actual.
Especifique la entidad de certificación cambiando el valor de $certCN en el script de detección.

Se corrige mediante la eliminación de certificados expirados emitidos por una ENTIDAD de certificación del almacén personal del usuario actual.
Especifique la entidad de certificación cambiando el valor de $certCN en el script de corrección.

Busca y elimina los certificados expirados emitidos por una entidad de certificación del almacén personal del usuario actual.

Ejecute el script con las credenciales iniciadas: Sí
Actualizar directivas de grupo obsoletas (integradas)
Detect_stale_Group_Policies.ps1
Remediate_stale_GroupPolicies.ps1
Detecta si la última actualización de las directivas de grupo ocurrió hace más de 7 days.
Este paquete de script se incluye con correcciones, pero se proporciona una copia si desea cambiar el umbral. Personalice el umbral de siete días cambiando el valor de $numDays en el script de detección.

Corrige mediante la ejecución gpupdate /target:computer /force y gpupdate /target:user /force

puede ayudar a reducir las llamadas de soporte técnico relacionadas con la conectividad de red cuando se entregan certificados y configuraciones a través de la directiva de grupo.

Ejecute el script con las credenciales iniciadas: Sí

Comprobar el paquete de scripts de certificados de red

Este paquete de scripts detecta los certificados emitidos por una CA en el almacén personal del equipo o del usuario que han expirado o están a punto de expirar. El script se corrige generando una notificación del sistema al usuario.

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)

Borrar paquete de scripts de certificados obsoletos

Este paquete de scripts detecta certificados expirados emitidos por una CA en el almacén personal del usuario actual. El script se corrige eliminando los certificados expirados emitidos por una CA del almacén personal del usuario actual.

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
}

Actualizar paquete de scripts de directivas de grupo obsoletas

Este paquete de script se incluye con correcciones, pero se proporciona una copia si desea cambiar el umbral.

Este paquete de scripts detecta si la última actualización de directiva de grupo es mayor que la de hace 7 days. El script corrige ejecutando gpupdate /target:computer /force y 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
}

Siguientes pasos

Para obtener información sobre la implementación de paquetes de scripts, vea Correcciones.