Anuncio

Colapsar
No hay anuncio todavía.

[TIP] Script para averiguar la IP de una maquina virtual cuando el aadministrador de Hyper-V no informa de ella

Colapsar
X
 
  • Filtrar
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes

  • [TIP] Script para averiguar la IP de una maquina virtual cuando el aadministrador de Hyper-V no informa de ella

    Hay en ciertas maquinas virtuales (sobre todo Linux) que el administrador de Hyper-V no nos informa de la IP. Si no lo hace el administrador de Hyper-V tampoco nos lo devolverá ningun comando powershell.

    Como tenia este problema le he echado imaginacion: vemos, ¿podemos obtener la MAC de la virtual? Pues si, ya que la MAC se lo da el Hyper-V y podemos recuperarla. ¿como con ella podemos sacar la IP?... pues si la maquina está arrancda, habrá echo un arp a la maquina host... por lo tanto estará en las tablas de arp de la anfitrion. Localizando en dichas tablas obtendremos la IP.

    (recordemos, que cualquier maquina al encenderse, antes de asignarse su IP si es estatica, o bien de solicitar una IP si es dinamioca, mediante protocolo arp intenta averguar si la IP está asignada en la red. Al enviar esa investigacion meditne protocolo arp, se quedará identificado en las tablas ARP de la maquina anfitrion)

    El scripo ionferior espera como parametro el nombre que hemos asignado en la virtual en el Hyper-V y nos devuelva la IP (el nombre no debe contener espacios)

    Código:
    @echo off
    cd /d "%~dp0"
    if NOT "%cd%"=="%cd: =%" (
       echo El directorio actual contine espacios en el path.
       echo Este comando debe estar en un path que no contenga espacios.
       rundll32.exe cmdext.dll,MessageBeepStub  
       echo.
    goto :EOF
    )
    
    if {%1} EQU {[adm]} goto :data
    REG QUERY HKU\S-1-5-19\Environment >NUL 2>&1 && goto :data
    
    set command="""%~f0""" [adm] %*
    setlocal enabledelayedexpansion
    set "command=!command:'=''!"
    
    powershell -NoProfile Start-Process -FilePath '%COMSPEC%' ^
    -ArgumentList '/c """!command!"""' -Verb RunAs 2>NUL
    goto :EOF
    
    :data
    set adm=%1
    setlocal enabledelayedexpansion
    if {%1} EQU {[adm]} (shift)
    if not exist "%temp%" md "%temp%"
    set a=
    for /f "usebackq tokens=1 delims= " %%m in (`powershell -command "(Get-VMNetworkAdapter -VMName '%1').MacAddress"`) do set a=%%m
    set mac=%a:~0,2%-%a:~2,2%-%a:~4,2%-%a:~6,2%-%a:~8,2%-%a:~10,2%
    echo %mac%
    for /f "usebackq tokens=1 delims= " %%m in (`powershell -command "(get-vm -name '%1').State"`) do set a=%%m
    if {!a!} NEQ {Running} (
    echo Maquina virtual no operativa
    echo.
    rundll32.exe cmdext.dll,MessageBeepStub
    )
    set ip=
    for /f "usebackq tokens=1,2 delims= " %%a in (`arp -a`) do if /i {%%b} EQU {%mac%} set ip=%%a
    echo IP: !ip!
    echo.
    
    :fin
    if {%adm%} EQU {[adm]} (
       echo Pulse 0 para salir
      choice /c 0 /n
    )

  • #2
    Probado y funciona correctamente para las vm que no tienen espacios en el nombre. Con las que lo tienen no va, aunque lo encierres entre comillas.

    Comentario


    • #3
      Originalmente publicado por jquilezl Ver Mensaje
      Probado y funciona correctamente para las vm que no tienen espacios en el nombre. Con las que lo tienen no va, aunque lo encierres entre comillas.
      Si tienen espacio en blanco hay que modifiar el script... ya que cada espacio se considera un parametro. Es mas complejo...

      Comentario


      • #4
        Originalmente publicado por jmtella Ver Mensaje

        Si tienen espacio en blanco hay que modifiar el script... ya que cada espacio se considera un parametro. Es mas complejo...
        Lo bueno del script es la idea de uasr las tablas ARP de la maquina host...

        Comentario


        • #5
          Ya, cuesta menos cambiar el nombre de las virtuales, quitándoles los espacios. Efectivamente, la idea es buena y sencilla en su concepto.

          Comentario

          Trabajando...
          X