es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Sin valor de retorno en PowerShell después de agregar el comando nslookup.

Después de agregar el código:

$ip = (nslookup $pcName | Select-String Address | Where-Object LineNumber -eq 5).ToString().Split(' ')[-1]

No dará ningún resultado cuando el usuario no tenga asignado un nombre de PC a su ID de usuario. El script no se ejecutará y dará un resultado en blanco. Funciona cuando el usuario tiene un nombre de PC asignado a su ID de usuario.

Lo mismo ocurre cuando no se puede encontrar el ID de usuario debido a un error de escritura o algo más. Quiero solicitar al usuario que ingrese el ID de usuario correcto y reiniciar el script. Estoy tratando de averiguar cómo se puede hacer, pero no encuentro la forma correcta de hacerlo.

¡Gracias de antemano por tu ayuda!

$csv = Import-CSV 'C:\Users\ADMIN\Desktop\Powershells\Computers in a specific workgroup or domain.csv'
$ADprops = @(
    'DisplayName'
    'Mail'
    'LastBadPasswordAttempt'
    'AccountExpirationDate'
    'PasswordLastSet'
)

$filter = @(
    $ADprops
    @{ 
        Name = 'Password Changeable'
        Expression = { $changeable }
    }, @{
        Name = 'Password Expires'
        Expression = { $expires }
    }, @{
        Name = 'Last logon'
        Expression = { $lastlogon }
    }, @{
        Name = 'PC Name'
        Expression = { $pcName }
    }, @{   
        Name = 'Address'
        Expression = { $ip }
    }

)

Clear-Host
do
{
    Write-Host "Ingrese el ID de usuario:" -ForegroundColor Cyan -NoNewline
    $UserName = Read-Host
    Write-Host ""

    $pcName = $csv.Where({ $_."User ID" -match $Username })."PC Name"
    $ip = (nslookup $pcName | Select-String Address | Where-Object LineNumber -eq 5).ToString().Split(' ')[-1]
    $expires, $changeable = net user $Username /domain |
    Select-String -Pattern 'Password Changeable|Password Expires|Last logon'|
    ForEach-Object { ($_ -split '\s{2,}')[1] }
    Get-ADUser -Identity $Username -Properties $ADprops |
    Select-Object $filter

} while ($Username -notcontains $Processes)
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución

    Para manejar la situación cuando no se pueda encontrar el ID de usuario o sea inválido, puedes agregar un mecanismo de manejo de errores utilizando un bloque try-catch. Dentro del bloque try, puedes incluir tu código existente para obtener el nombre de PC y la dirección IP. Si ocurre un error, como cuando no se encuentra el nombre de PC en el archivo CSV, puedes pedir al usuario que ingrese el ID de usuario correcto y continuar con el script.

    Aquí tienes un ejemplo de cómo puedes modificar el código:

    $csv = Import-CSV 'C:\Users\ADMIN\Desktop\Powershells\Computers in a specific workgroup or domain.csv'
    $ADprops = @(
        'DisplayName'
        'Mail'
        'LastBadPasswordAttempt'
        'AccountExpirationDate'
        'PasswordLastSet'
    )
    
    $filter = @(
        $ADprops
        @{ 
            Name = 'Cambiabilidad de la contraseña'
            Expression = { $changeable }
        }, @{
            Name = 'Expiración de la contraseña'
            Expression = { $expires }
        }, @{
            Name = 'Último inicio de sesión'
            Expression = { $lastlogon }
        }, @{
            Name = 'Nombre de PC'
            Expression = { $pcName }
        }, @{   
            Name = 'Dirección'
            Expression = { $ip }
        }
    
    )
    
    Clear-Host
    
    do {
        Write-Host "Ingrese el ID de usuario: " -ForegroundColor Cyan -NoNewline
        $Username = Read-Host
        Write-Host ""
    
        Try {
            $pcName = $csv.Where({ $_."ID de usuario" -match $Username })."Nombre de PC"
            $ip = (nslookup $pcName | Select-String Address | Where-Object LineNumber -eq 5).ToString().Split(' ')[-1]
            $expires, $changeable = net user $Username /domain |
            Select-String -Pattern 'Cambiabilidad de la contraseña|Expiración de la contraseña|Último inicio de sesión'|
            ForEach-Object { ($_ -split '\s{2,}')[1] }
            Get-ADUser -Identity $Username -Properties $ADprops |
            Select-Object $filter
        }
        Catch {
            Write-Host "No se encontró el ID de usuario o ocurrió un error al recuperar el nombre de PC y la dirección IP. Por favor, ingrese un ID de usuario válido." -ForegroundColor Red
            Continue
        }
    
    } while ($Username -notcontains $Processes)
    

    En el ejemplo anterior, el código dentro del bloque try intenta obtener el nombre de PC y la dirección IP como antes. Si ocurre un error, como cuando no se encuentra el nombre de PC o el comando nslookup no devuelve ningún resultado, se ejecuta el bloque catch. Dentro del bloque catch, se muestra un mensaje al usuario pidiéndole que ingrese un ID de usuario válido. La instrucción Continue hace que el bucle se reinicie, pidiendo al usuario un nuevo ID de usuario.

    Este mecanismo de manejo de errores debería ayudarte a manejar situaciones en las que no se puede encontrar el ID de usuario o el nombre de PC, y solicitar al usuario ingresar la información correcta para continuar con el script.

Comments are closed.