• Ir a navegación principal
  • Ir al contenido principal
  • Ir a la barra lateral primaria

ITadmins

Para administradores de sistemas

  • Windows Server
  • Microsoft Exchange
  • Skype for Business
  • Office 365
  • Azure
    • Facebook
    • LinkedIn
    • Twitter

PowerShell Scripting: Comprobación de DNI

12/12/2019 By Aarón Vázquez Dejar un comentario

El siguiente script verifica el formato de un DNI y comprueba que la letra sea válida, según el cálculo de control establecido oficialmente.

Se define como una función y se implementa fácilmente en scripts de creación de usuarios.

# Declaramos la función que va a realizar las comprobaciones
function CompruebaDNI {
    # Si no cumple con el regex especificado, devuelve un fallo por formato incorrecto. Los DNIs tienen 8 dígitos y una letra al final. El primer dígito también puede ser una X, Y o Z en lugar de un número.
    if ($DNI -notmatch "^[0-9XYZ]{1}[0-9]{7}[a-zA-Z]{1}$") { 
        # Se escribe un mensaje de advertencia si el formato no es válido.
        Write-Warning "El DNI introducido '$DNI' no tiene el formato correcto."
        # Y establecemos una variable con el estado de error. Es global para poder acceder a ella desde fuera de la función.
        $global:DNIFormato = "KO"
    }
    else {
        # Si el formato es correcto establecemos la variable como OK.
         $global:DNIFormato = "OK"
    }
     
    # Ya dado por bueno el formato, comprobamos que la letra cumpla con las normas establecidas.
    if ($global:DNIFormato -eq "OK") {
        # Cogemos la letra, que es el último dígito del string.
        $DNILetra = $DNI.Substring($DNI.length - 1)
        # Si el primer carácter es una X, Y o Z la convertimos en un '0'.
        $DNInumeros= $DNI -replace ("X","0") -replace ("Y","1") -replace ("X","2") 
        # Ahora que todo son números cogemos los 8 primeros para hacer el cálculo.
        $DNInumeros= $DNInumeros.Substring(0,8)
        # Se calcula el resto de dividirlo entre 23.
        $DNIresto= $DNInumeros%23
        # Según el valor del resto establecemos cual es la letra para ese número de DNI.
        if ($DNIresto -eq 0) {$LetraDNI = "T"}
        if ($DNIresto -eq 1) {$LetraDNI = "R"}
        if ($DNIresto -eq 2) {$LetraDNI = "W"}
        if ($DNIresto -eq 3) {$LetraDNI = "A"}
        if ($DNIresto -eq 4) {$LetraDNI = "G"}
        if ($DNIresto -eq 5) {$LetraDNI = "M"}
        if ($DNIresto -eq 6) {$LetraDNI = "Y"}
        if ($DNIresto -eq 7) {$LetraDNI = "F"}
        if ($DNIresto -eq 8) {$LetraDNI = "P"}
        if ($DNIresto -eq 9) {$LetraDNI = "D"}
        if ($DNIresto -eq 10) {$LetraDNI = "X"}
        if ($DNIresto -eq 11) {$LetraDNI = "B"}
        if ($DNIresto -eq 12) {$LetraDNI = "N"}
        if ($DNIresto -eq 13) {$LetraDNI = "J"}
        if ($DNIresto -eq 14) {$LetraDNI = "Z"}
        if ($DNIresto -eq 15) {$LetraDNI = "S"}
        if ($DNIresto -eq 16) {$LetraDNI = "Q"}
        if ($DNIresto -eq 17) {$LetraDNI = "V"}
        if ($DNIresto -eq 18) {$LetraDNI = "H"}
        if ($DNIresto -eq 19) {$LetraDNI = "L"}
        if ($DNIresto -eq 20) {$LetraDNI = "C"}
        if ($DNIresto -eq 21) {$LetraDNI = "K"}
        if ($DNIresto -eq 22) {$LetraDNI = "E"}
        
        # Si la letra que hemos indicado coincide con la que se ha calculado, entonces lo damos por bueno.
        if ($DNILetra -eq $LetraDNI) {
            $global:DNILetraCheck = "OK"
        } 
        # De lo contrario lo damos por incorrecto y devolvemos un mensaje de aviso.
        else {
            $global:DNILetraCheck = "KO"
            Write-Warning "ERROR: La letra del DNI no es correcta, debería de ser $LetraDNI." 
        }
    }
}
 
# Ya fuera de la función empieza el script, pidiendo al usuario que introduzca un DNI.
$DNI = Read-Host "Introduce el DNI"
 
# Llamamos a la función para comprobarlo.
CompruebaDNI   
# Si el formato o la letra son incorrectas, volvemos a pedirlo.
if ($DNIFormato -eq "KO" -or $global:DNILetraCheck -eq "KO") {
    # Y lo seguimos pidiendo indefinidamente hasta que sea correcto.
     do { 
        $DNI = Read-Host "Introduce un DNI válido para este usuario"
        CompruebaDNI
    } until (($DNIFormato -eq "OK") -and ($DNILetraCheck -eq "OK"))
}
# Y ya cuando es correcto devolvemos un mensaje indicando que es válido y termina el script.
Write-Host "DNI '$DNI' válido!!" -ForegroundColor "Green"

#############
#### FIN #### 
#############


¡Espero que le encontréis utilidad! Un saludo!

Archivado en:Windows Server Etiquetado con:PowerShell, script

Interacciones con los lectores

Deja una respuesta Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Barra lateral primaria

LinkedIn
Share
Twitter
Follow Me
Tweet
Facebook
fb-share-icon

Últimos Artículos

  • Listar Recursos en un Resource Group en Azure
    Por Juan Otero
  • Agregar Conexiones Viva para el escritorio de Microsoft Teams
    Por Raul Soler
  • PowerShell 7
    Por Juan Otero
  • Conceptos AD: Replicación I
    Por José Ramón Maseda Lozano
  • Networking III: Capturando el tráfico
    Por José Ramón Maseda Lozano

Saber más de…

Active Directory ADCS Azure Azure AD Certificados cluster Conceptos AD Content Index Database Exchange Online FSMO Group Policy Guía Hub Hyper-V IIS Journaling Loopback Lync Microsoft Exchange Migracion NAT Networking Office 365 OWA Password PKI PowerShell Router script Servicio de Transporte Servicio Front-End Sharepoint SharePoint Online Skype Skype For Business STOREDRV Switch Teams Virtual Directory WDS Windows 10 Windows Server Windows Server 2012 R2 Windows Server 2016
  • Inicio
  • Sobre Nosotros
  • Windows Server
  • Microsoft Exchange
  • Skype for Business
  • Office 365
  • Azure
    • Facebook
    • LinkedIn
    • Twitter

Copyright © 2023 ITadmins.es