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.

¿Por qué no puedo ejecutar un simple comando rasdial de Powershell en mi Runspace dentro de una aplicación WinForms en VB.NET?

He construido una aplicación que contiene un espacio de ejecución de PowerShell.
Funciona perfectamente para todo lo que le he presentado…. hasta hoy.

Una funcionalidad que he añadido detecta cuando el usuario intenta acceder a recursos corporativos y resaltará si su VPN se ha desconectado.
Utilizamos una VPN permanente con autenticación de certificado, por lo que no se requiere nombre de usuario/contraseña.

El espacio de ejecución y la aplicación en la que está contenido se ejecutan en el contexto del usuario.
He podido demostrar esto al mostrar el usuario de entorno actual desde el espacio de ejecución, que vuelve como yo (es decir, no como sistema o administrador o cualquier otro tonto).

Tengo un fragmento muy sencillo de PowerShell que intentará reconectar la VPN 4 veces antes de informar de un fallo, comprobando antes de cada reintento si ha tenido éxito.
Este código funciona perfectamente si lo ejecuto en el ISE (estándar, NO elevado), pero cuando paso este código para ser ejecutado obtengo un error devuelto por rasdial, que simplemente dice ‘los datos no son válidos’.

El PowerShell es lo suficientemente sencillo…

$myvpn = Get-VpnConnection | Where-Object {$_.ServerAddress -eq "vpn.example.com"}
$VPNStatus = ($myvpn).ConnectionStatus
if ($VPNStatus -eq "Connected")
{
    $output= 0
}
else
{
    $attempt = 0
    DO
    {
        Write-output "not connected"
        rasdial $myvpn.name
        $check = (Get-VpnConnection | Where-Object {$_.ServerAddress -eq "vpn.example.com"}).ConnectionStatus
        start-sleep -Seconds 4
        $attempt ++
    } Until ($attempt -gt 3 -or $check -eq "Connected")
    if ($check -eq "Connected")
    {
        $output= 0
    }
    else
    {
        $output= 1
    }
}

No tengo ni idea de por qué no funciona en el espacio de ejecución, pero sí funciona en PowerShell normal sin problemas. Mi primera sospecha fue el contexto, pero como dije, he demostrado que esa teoría es incorrecta.

He buscado el error hasta el cansancio y no encuentro resultados relacionados.
También he intentado solucionarlo, generando una sesión de PowerShell real (es decir, no en un espacio de ejecución) y pasando el comando, pero eso también falla cuando se ejecuta desde mi aplicación.

¿Alguien ha visto esto antes o un comportamiento similar al usar espacios de ejecución/tuberías, etc. en vb.net?

¿Hay algunas trampas de permisos extrañas que pueda haber pasado por alto?

Editado: Amplié el powershell para que sea totalmente inclusivo.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Problema con PowerShell Runspace y código de reconexión de VPN

    Como experto en IT especializado en vb.net, PowerShell, canalización, VPN y runspace, he creado una aplicación que contiene un runspace de PowerShell. La aplicación funcionaba bien en todo lo que he probado hasta que falló la funcionalidad de reconexión de VPN.

    El problema ocurre cuando el usuario intenta acceder a los recursos corporativos y el código detecta una VPN desconectada para resaltar el problema. La VPN utiliza autenticación mediante certificado y no se requiere nombre de usuario/contraseña para acceder.

    El runspace y la aplicación que contiene se ejecutan en el contexto del usuario. Para demostrar esto, imprimo la variable de entorno de usuario actual desde el runspace, que devuelve el usuario y no el sistema o el administrador.

    El código de PowerShell es simple y trata de reconectar la VPN cuatro veces antes de informar de un fallo, comprobando la conexión exitosa antes de cada reintento. El código funciona bien cuando se ejecuta utilizando el ISE (estándar, NO elevado), pero obtengo un error al pasar el código a ejecutar en el runspace. El mensaje de error de rasdial indica “los datos no son válidos”.

    He investigado este problema y he probado varias soluciones alternativas, incluyendo la generación de una sesión de PowerShell real, que también falló al generarse desde la aplicación. No estoy seguro de por qué no funciona en el runspace, pero he desmentido la teoría del contexto.

    Como posible solución, he ampliado el código de PowerShell para que sea totalmente inclusivo, de la siguiente manera:

    $vpn = Get-VpnConnection -AllUserConnection | Where-Object {$_.ServerAddress -eq "vpn.example.com" -and $_.Status -ne "Disconnected"}
    if (-not $vpn) {
        $rasphoneCommand = "rasphone -d `"VPN - vpn.example.com`""
        $process = Start-Process -FilePath "cmd.exe" -ArgumentList "/c $rasphoneCommand" -NoNewWindow -PassThru -WindowStyle Hidden
        if ($process.ExitCode -ne 0) {
            return 1
        }
        for ($i = 0; $i -lt 20; $i++) {
            sleep 1
            $vpn = Get-VpnConnection -AllUserConnection | Where-Object {$_.ServerAddress -eq "vpn.example.com" -and $_.Status -eq "Connected"}
            if ($vpn) {
                Write-Output "VPN reconectada correctamente"
                return 0
            }
        }
        Write-Output "Fallo en la reconexión de VPN"
        return 1
    }
    Write-Output "La VPN está conectada"
    return 0
    

    Aún necesito probar este código de reemplazo para determinar si funciona en el runspace o no. Pero, en general, el uso de rasphone y la creación de una conexión VPN real parece ser un método más confiable en comparación con el enfoque anterior.

    Si alguien ha experimentado este problema o un comportamiento similar utilizando runspaces o canalizaciones en vb.net, agradecería cualquier información o problemas de permisos extraños que pueda haber pasado por alto.

Comments are closed.