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