С роутерами просто, а вот с L2 сложнее.
Программный способ:
Для нормальных управляемых коммутаторов можно на базе CDP/LLDP построить граф соседства. Я даже когда-то нашёл скрипт под CDP, который генерил граф для graphviz, и адаптировал под свои задачи и свой алгоритм discovery других свитчей, в том числе не только под Cisco, но и под Juniper.
Также можно LLDP-клиент на конечные машины поставить, для Linux это linuxlldpd, для винды наверное можно поискать. Я когда-то наваял скрипт для cdp под питон для винды, который правда почему-то только на XP не падал и я тогда не разобрался почему. В этом направлении можно собрать инфу и по конечным машинам. А дальше уже разбираться с тем, что не распозналось нормально. Например, 5 машин висят на одном порту - как пить дать там неуправляемый свитч по дороге...
Ручной способ для управляемых свитчей:
Смотреть мак-адреса на портах, потом по макам выявлять, что это такое. Всё записывать в файлик.
Механический способ:
Взять две рации, послать человека выдёргивать провода по одному, на своей стороне смотреть, какой порт гаснет. Всё записывать.