Как получить MAC-адрес удаленного компьютера
У меня есть конкретная ситуация. Я хочу получить MAC-адрес с удаленного компьютера, которого нет в домене. Я знаю имя хоста и IP-адрес удаленного компьютера. IP-адрес моего компьютера - 192.168.2.40, а IP-адрес удаленного компьютера - 192.168.2.41.
Я пробовал:
arp -a <remote IP Address>
No ARP entries found.
nbtstat -n <remote hostname>
Host not found.
getmac /s <remote IP Address>
ERROR: The RPC server is unavailable.
Можно ли получить MAC-адрес удаленной системы из командной строки, powershell или как-то еще? Какие условия должны быть установлены? Спасибо.
11 ответов
Nmap вернет MAC-адрес, а также все, что вы хотели бы знать.
Если у вас есть доступ администратора к машине, powershell и wmi очень полезны для удаленной диагностики. Они оба имеют обширную документацию на technet.microsoft.com
редактировать: это предполагает Windows-машину, которая, судя по всему, может и не быть.
MAC-адреса - это вещи Ethernet, а не интернет. Компьютер не должен даже иметь MAC-адрес. Единственный способ получить MAC-адрес - подключить какой-либо компьютер к той же локальной сети, что и этот компьютер, и сообщить его вам. И у вас не было бы возможности узнать, что это дает вам правильную информацию.
Если вы оба находитесь в одной локальной сети Ethernet, вы можете просто ping
компьютер, а затем посмотрите в таблицу ARP. В противном случае вам придется попросить компьютер в той же локальной сети Etherent/Wifi.
Вы можете получить его из WMI, и любой язык, который может читать WMI, сможет получить к нему доступ. VBScript, JScript, Perl, Python и Powershell могут быть использованы для доступа к нему.
Поскольку вы спрашивали конкретно о Powershell, вот пример с http://www.neolisk.com/techblog/powershell-getmacaddressofanyremoteip:
param ( $Computer , $Credential )
#to make it work without parameters
if($Computer -eq $null) { $Computer = $env:COMPUTERNAME }
#program logic
$hostIp = [System.Net.Dns]::GetHostByName($Computer).AddressList[0].IpAddressToString
if($Credential) {
$Credential = Get-Credential $Credential
$wmi = gwmi -Class Win32_NetworkAdapterConfiguration -Credential $Credential -ComputerName $Computer
} else {
$wmi = gwmi -Class Win32_NetworkAdapterConfiguration -ComputerName $Computer
}
return ($wmi | where { $_.IpAddress -eq $hostIp }).MACAddress
Если вы знаете имя компьютера easyies, способ будет:
$strComputer ="ComuterName"
$colItems = Get-WmiObject -Class "Win32_NetworkAdapterConfiguration" -ComputerName $strComputer -Filter "IpEnabled = TRUE"
ForEach ($objItem in $colItems)
{
write-host "IP Address: " $objItem.IpAddress[0] "Mac: " $objItem.MacAddress
}
Более продвинутый скрипт, который может занять любую машину по IP или имени хоста:
$device = "192.168.106.123"
if ( $device | ? { $_ -match "[0-9].[0-9].[0-9].[0-9]" } )
{
echo "Searching MAC by IP"
$ip = $device
}
else
{
echo "Searching MAC by host"
$ip = [System.Net.Dns]::GetHostByName($device).AddressList[0].IpAddressToString
}
$ping = ( new-object System.Net.NetworkInformation.Ping ).Send($ip);
if($ping){
$mac = arp -a $ip;
( $mac | ? { $_ -match $ip } ) -match "([0-9A-F]{2}([:-][0-9A-F]{2}){5})" | out-null;
if ( $matches )
{
$matches[0];
} else
{
echo "MAC Not Found"
}
}
Ага. Самый простой способ - просто выполнить пинг, а затем проверить таблицу ARP.
Если вас больше интересует факт инвентаризации и отчетности, я бы посоветовал взглянуть на бесплатное программное обеспечение от Spiceworks ( http://www.spiceworks.com/), чтобы настроить постоянный мониторинг upp и всегда иметь доступ к вашей информации, доступной обо всем enivorenment.
Я использовал его в течение многих лет, и он отлично работает в локальной сети.
У него действительно есть некоторые проблемы с отправкой инвентаризации на удаленные сайты, хотя, на самом деле, еще не выяснили, почему, но кроме этого, я настоятельно рекомендую это.
Хотя то, что описано выше, немного сложнее, но если после пинга у вас нет записей, вам нужно включить маршрутизацию и удаленный доступ в сервисах, возможно, он отключен. Затем перейдите в командную строку и введите arp -a
чтобы увидеть ваш кеш, используйте arp -a <IP>
для этой машины MAC-адрес.
MAC - это OSI Layer 2 - вы не сможете получить его напрямую, если между ними есть какой-либо переход уровня 3 - и по соображениям безопасности все протоколы для запроса таких данных не должны быть разрешены ни в чем за пределами локальной сети...
Вы можете попробовать это:
nbtstat -A 192.168.2.41
Вы получите удаленный mac-адрес в (довольно многословном) сгенерированном ответе.
Я знаю, что это был вопрос ни для одной доменной системы, но для тех, кто может наткнуться на это, поиск примеров доменных компьютеров ниже - это быстрый и простой способ сделать это.
в окнах вы можете просто сделать следующее
$c = "computername"
Invoke-Command -ComputerName $c -ScriptBlock {
getmac
}
просто запускает базовую команду командной строки в удаленной системе и возвращает данные.
"nmap -v -A [имя хоста /IP-адрес]" может быть вашим лучшим выбором; ОС UNIX для клиента может иметь его изначально доступным; но nmap также доступен для клиентов Windows...
Предположим, что у вас есть входной файл со списком компьютеров или IP-адресов, вы можете попробовать использовать командный файл:
@echo off
Set "Copyright=by Hackoo 2021"
Title Get IP and MAC address for remote PCs over the network using batch %Copyright%
Mode con cols=90 lines=12
cls & color 0A & echo.
echo ********************************************************************************
echo Get IP and MAC address for remote PCs over the network %Copyright%
echo ********************************************************************************
echo(
if _%1_==_Main_ goto :Main
:getadmin
echo %~nx0 : self elevating
set vbs=%temp%\getadmin.vbs
(
echo Set UAC = CreateObject^("Shell.Application"^)
echo UAC.ShellExecute "%~s0", "Main %~sdp0 %*", "", "runas", 1
)> "%vbs%"
"%temp%\getadmin.vbs"
del "%temp%\getadmin.vbs"
goto :eof
::-------------------------------------------------------------------------------------
:Main
set "InputFile=%~dp0Hosts.txt"
set "OutPutFile=%~dp0IP-MAC.txt"
If Exist "%OutPutFile%" Del "%OutPutFile%"
If Not Exist "%InputFile%" (
color 0C & echo "%InputFile%" does not exist. Please check it first !
Timeout /T 8 /NoBreak>nul & Exit
)
Netsh interface ip delete arpcache >nul 2>&1
@for /f "tokens=* delims=" %%H in ('Type "%InputFile%"') do (
Ping -n 1 %%H>nul
@for /f "tokens=2" %%M in ('arp -a %%H ^| find "%%H"') do (
echo %%H : %%M
echo %%H : %%M>>"%OutPutFile%"
)
)
If Exist "%OutPutFile%" Start "" "%OutPutFile%" & Timeout /T 1 /NoBreak>nul & Exit
::-------------------------------------------------------------------------------------