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)
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
)
Comentario