Как получить 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
::-------------------------------------------------------------------------------------
Другие вопросы по тегам