Cómo establecer la longitud mínima de una contraseña y su antigüedad en Windows con PowerShell

Puntos clave

  • Establecer políticas de contraseñas sólidas es fundamental para la seguridad de TI.
  • El script PowerShell que analizaremos hoy automatiza la acción de establecer la longitud mínima de una contraseña y su antigüedad en Windows.
  • El script requiere privilegios de administrador para su ejecución.
  • Los métodos automatizados, como este script creado para establecer la longitud mínima de una contraseña, son más eficaces que las configuraciones manuales, especialmente en entornos grandes.
  • Las revisiones y actualizaciones periódicas de las políticas son esenciales para una seguridad proactiva.
  • La integración con plataformas como NinjaOne puede amplificar las ventajas de estos scripts.
  • Garantizar unos requisitos coherentes en materia de contraseñas refuerza directamente la seguridad de TI.
  • Las herramientas de automatización son fundamentales en la era de la rápida expansión y las amenazas de las TI.

En el ámbito de la seguridad de TI, en constante evolución, salvaguardar el acceso a las cuentas de usuario sigue siendo un principio fundamental. A medida que las empresas se esfuerzan por mejorar las medidas de seguridad, resulta primordial establecer requisitos adecuados para las contraseñas. En este caso, un script de PowerShell desempeña un papel fundamental al automatizar la acción de establecer la longitud mínima de una contraseña y su antigüedad en dispositivos Windows.

Antecedentes

Históricamente, los profesionales de TI y los proveedores de servicios gestionados (MSP ) establecían manualmente los requisitos de contraseña. Sin embargo, a medida que las infraestructuras crecen y la ampliación se hace imprescindible, los procesos manuales se vuelven poco prácticos. Este script PowerShell para establecer la longitud mínima de una contraseña aborda sin problemas esta necesidad permitiendo a los administradores establecer longitudes de contraseña y antigüedades específicas para cuentas locales en sistemas Windows. Mediante la automatización de tareas tan mundanas pero esenciales, los profesionales pueden garantizar la coherencia de las políticas de contraseñas y, por extensión, un entorno de seguridad informática más sólido.

El script para establecer la longitud mínima de una contraseña y su antigüedad

#Requires -Version 5.1

<#
.SYNOPSIS
    Set the minium password length or age for local accounts.
.DESCRIPTION
    Set the minium password length or age for local accounts.
.EXAMPLE
     -Length 14
    Set the minium password length for local accounts.
.EXAMPLE
     -Length 14 -MinAge 30 -MaxAge 42
    Set the minium password length, minium age, maximum age for local accounts.
.EXAMPLE
    PS C:> Set-MiniumPasswordRequirements.ps1 -Length 14 -Age 42
    Set the minium password length and age for local accounts.
.OUTPUTS
    None
.NOTES
    Minimum OS Architecture Supported: Windows 10, Windows Server 2016
    Release Notes:
    Initial Release
By using this script, you indicate your acceptance of the following legal terms as well as our Terms of Use at https://www.ninjaone.com/terms-of-use.
    Ownership Rights: NinjaOne owns and will continue to own all right, title, and interest in and to the script (including the copyright). NinjaOne is giving you a limited license to use the script in accordance with these legal terms. 
    Use Limitation: You may only use the script for your legitimate personal or internal business purposes, and you may not share the script with another party. 
    Republication Prohibition: Under no circumstances are you permitted to re-publish the script in any script library or website belonging to or under the control of any other software provider. 
    Warranty Disclaimer: The script is provided “as is” and “as available”, without warranty of any kind. NinjaOne makes no promise or guarantee that the script will be free from defects or that it will meet your specific needs or expectations. 
    Assumption of Risk: Your use of the script is at your own risk. You acknowledge that there are certain inherent risks in using the script, and you understand and assume each of those risks. 
    Waiver and Release: You will not hold NinjaOne responsible for any adverse or unintended consequences resulting from your use of the script, and you waive any legal or equitable rights or remedies you may have against NinjaOne relating to your use of the script. 
    EULA: If you are a NinjaOne customer, your use of the script is subject to the End User License Agreement applicable to you (EULA).
.COMPONENT
    LocalUserAccountManagement
#>

[CmdletBinding()]
param (
    [Parameter()]
    [ValidateRange(0, 14)]
    [int]
    $Length,
    [Parameter()]
    [ValidateRange(0, 998)]
    [int]
    $MinAge,
    [Parameter()]
    [ValidateRange(0, 999)]
    [int]
    $MaxAge
)

begin {
    function Test-IsElevated {
        $id = [System.Security.Principal.WindowsIdentity]::GetCurrent()
        $p = New-Object System.Security.Principal.WindowsPrincipal($id)
        if ($p.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator))
        { Write-Output $true }
        else
        { Write-Output $false }
    }
    function Get-LocalPasswordPolicy {
        param ()
        $Result = [PSCustomObject]@{
            MinimumLength = 0
            MaximumAge    = 0
            MinimumAge    = 0
        }
        $(net.exe accounts) -split "n" | ForEach-Object {
            $Line = $_ -split ":"
            if ($_ -like "Minimum password length*") {
                $Result.MinimumLength = "$($Line[1])".Trim(' ')
            }
            if ($_ -like "Maximum password age (days)*") {
                $Result.MaximumAge = "$($Line[1])".Trim(' ')
            }
            if ($_ -like "Minimum password age (days)*") {
                $Result.MinimumAge = "$($Line[1])".Trim(' ')
            }
        }
        $Result
    }

    $NetExeError = $false
}
process {
    if (-not (Test-IsElevated)) {
        Write-Error -Message "Access Denied. Please run with Administrator privileges."
        exit 1
    }
    # Get Current localhost password policy settings
    $CurrentSettings = Get-LocalPasswordPolicy
    
    if ($PSBoundParameters.ContainsKey("Length") -and -not ($CurrentSettings.MinimumLength -like $NewSettings.MinimumLength -or $CurrentSettings.MinimumLength -eq $NewSettings.MinimumLength)) {
        Write-Host "Changing Minimum Password Length from $($CurrentSettings.MinimumLength) to $Length"
        net.exe accounts /minpwlen:$Length
    }
    if ($PSBoundParameters.ContainsKey("MaxAge") -and
        -not (
            $(if ($CurrentSettings.MaximumAge -like "unlimited") { 0 }else { $CurrentSettings.MaximumAge }) -like
            $(if ($NewSettings.MaximumAge -like "unlimited") { 0 }else { $NewSettings.MaximumAge })
        )) {
        Write-Host "Changing Maximum Password Age from $($CurrentSettings.MaximumAge) to $MaxAge"
        if ($MaxAge -gt 0) {
            net.exe accounts /maxpwage:$MaxAge
        }
        else {
            net.exe accounts /maxpwage:unlimited
        }
    }
    if ($PSBoundParameters.ContainsKey("MinAge") -and -not ($CurrentSettings.MinimumAge -like $NewSettings.MinimumAge -or $CurrentSettings.MinimumAge -eq $NewSettings.MinimumAge)) {
        Write-Host "Changing Minimum Password Age from $($CurrentSettings.MinimumAge) to $MinAge"
        net.exe accounts /minpwage:$MinAge
    }

    # Get New localhost password policy settings and check if anything changed
    $NewSettings = Get-LocalPasswordPolicy
    
    if ($PSBoundParameters.ContainsKey("Length") -and ($PSBoundParameters['Length'] -notlike $NewSettings.MinimumLength)) {
        $NetExeError = $true
        Write-Host "Minimum Length was not set correctly."
    }
    if ($PSBoundParameters.ContainsKey("MaxAge") -and ($PSBoundParameters['MaxAge'] -notlike $(if ($NewSettings.MaximumAge -like "unlimited") { 0 }else { $NewSettings.MaximumAge }))) {
        $NetExeError = $true
        Write-Host "Maximum Age was not set correctly."
    }
    if ($PSBoundParameters.ContainsKey("MinAge") -and ($PSBoundParameters['MinAge'] -notlike $NewSettings.MinimumAge)) {
        $NetExeError = $true
        Write-Host "Minimum Age was not set correctly."
    }
    if ($NetExeError) {
        exit 1
    }
}
end {}

 

Accede a más de 300 scripts en el Dojo de NinjaOne

Obtén acceso

Análisis detallado del script para establecer la longitud mínima de una contraseña y su antigüedad

El script que vamos a analizar emplea las capacidades de PowerShell para establecer la longitud mínima de una contraseña:

  • Cmdlet Binding: el script comienza vinculándolo al cmdlet, lo que le permite aceptar parámetros como Length, MinAge y MaxAge.
  • Test-IsElevated: una función que garantiza que el script se ejecuta con privilegios elevados.
  • Get-LocalPasswordPolicy: esta función obtiene la política de contraseñas local actual. Utiliza el comando ‘net.exe’ para reunir los atributos de la política de contraseñas y los devuelve.
  • Bloque de proceso: aquí es donde reside la lógica central. El script compara las políticas existentes con los nuevos parámetros. Si existen diferencias, emplea comandos “net.exe” para ajustar las políticas.
  • Validación: tras realizar los cambios, el script obtiene las políticas de contraseñas actualizadas y las verifica con los parámetros para garantizar una configuración correcta.

Posibles casos de uso

Estudio de caso: imagina a un profesional de TI, Juan, que trabaja en una empresa emergente de rápido crecimiento. Tras una auditoría de ciberseguridad, Juan se da cuenta de que muchas cuentas locales tienen políticas de contraseñas débiles. En lugar de actualizar manualmente cada sistema, Juan despliega este script para establecer la longitud mínima de una contraseña en todas las estaciones de trabajo, asegurándose de que todos los dispositivos se adhieren ahora a la longitud y antigüedad de contraseña recomendada.

Comparaciones

Aunque la configuración manual a través de la configuración de Windows o las políticas de grupo es una opción, lleva mucho tiempo, es propensa a errores y no es adecuada para entornos grandes. Las herramientas de terceros ofrecen funcionalidades similares, pero pueden introducir complejidades o costes. El script proporcionado para establecer la longitud mínima de una contraseña ofrece un enfoque sencillo, rentable y escalable.

FAQ

  • ¿En qué versiones de Windows funciona el script? 
    El script es compatible con Windows 10 y Windows Server 2016 en adelante.
  • ¿Necesito derechos de administrador para ejecutar el script? 
    Sí, el script requiere privilegios elevados para modificar las políticas de contraseñas.

Implicaciones

Las políticas de contraseñas inadecuadas pueden dar lugar a accesos no autorizados, filtraciones de datos e infracciones de la normativa. Al garantizar unos requisitos de contraseña coherentes y sólidos, las organizaciones pueden reducir drásticamente estos riesgos, reforzando sus posturas de seguridad informática.

Recomendaciones

  • Revisa y actualiza periódicamente las políticas de contraseñas para adelantarte a la evolución de las amenazas.
  • Asegúrate de realizar copias de seguridad antes de aplicar cambios en un gran número de dispositivos.
  • Combina este script para establecer la longitud mínima de una contraseña con otras herramientas de automatización para una gestión de TI completa.

Reflexiones finales

En un panorama en el que las medidas de seguridad sólidas son una necesidad, las herramientas que facilitan los requisitos de cambiar la política de contraseñas de Windows adquieren un valor incalculable. Para las empresas que buscan un enfoque racionalizado en la gestión de sus activos y configuraciones de TI, plataformas como NinjaOne pueden proporcionar soluciones integrales. Al integrar estos scripts en plataformas como NinjaOne, las organizaciones pueden garantizar políticas de contraseñas óptimas, lo que se traduce en una mayor seguridad y eficiencia operativa.

Categorías:

Quizá también te interese…

×

¡Vean a NinjaOne en acción!

Al enviar este formulario, acepto la política de privacidad de NinjaOne.

Términos y condiciones de NinjaOne

Al hacer clic en el botón “Acepto” que aparece a continuación, estás aceptando los siguientes términos legales, así como nuestras Condiciones de uso:

  • Derechos de propiedad: NinjaOne posee y seguirá poseyendo todos los derechos, títulos e intereses sobre el script (incluidos los derechos de autor). NinjaOne concede al usuario una licencia limitada para utilizar el script de acuerdo con estos términos legales.
  • Limitación de uso: solo podrás utilizar el script para tus legítimos fines personales o comerciales internos, y no podrás compartirlo con terceros.
  • Prohibición de republicación: bajo ninguna circunstancia está permitido volver a publicar el script en ninguna biblioteca de scripts que pertenezca o esté bajo el control de cualquier otro proveedor de software.
  • Exclusión de garantía: el script se proporciona “tal cual” y “según disponibilidad”, sin garantía de ningún tipo. NinjaOne no promete ni garantiza que el script esté libre de defectos o que satisfaga las necesidades o expectativas específicas del usuario.
  • Asunción de riesgos: el uso que el usuario haga del script corre por su cuenta y riesgo. El usuario reconoce que existen ciertos riesgos inherentes al uso del script, y entiende y asume cada uno de esos riesgos.
  • Renuncia y exención: el usuario no hará responsable a NinjaOne de cualquier consecuencia adversa o no deseada que resulte del uso del script y renuncia a cualquier derecho o recurso legal o equitativo que pueda tener contra NinjaOne en relación con su uso del script.
  • CLUF: si el usuario es cliente de NinjaOne, su uso del script está sujeto al Contrato de Licencia para el Usuario Final (CLUF).