Я пишу программу для Windows, которая перечисляет все сетевые адаптеры и деактивирует все, кроме выбранного. Я знаю, как модифицировать сетевые адаптеры с помощью netsh, но проблема в том, что я не могу получить соответствующую информацию из класса NetworkInterface.
Класс NetworkInterface имеет методы getName() и getDisplayName(), но они, похоже, выдают только нерелевантные данные.
Я взял пример непосредственно из оракула:
http://docs.oracle.com/javase/tutorial/networking/nifs/listing.html
public class ListNets {
public static void main(String args[]) throws SocketException {
Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces();
for (NetworkInterface netint : Collections.list(nets))
displayInterfaceInformation(netint);
}
static void displayInterfaceInformation(NetworkInterface netint) throws SocketException {
out.printf("Display name: %s\n", netint.getDisplayName());
out.printf("Name: %s\n", netint.getName());
Enumeration<InetAddress> inetAddresses = netint.getInetAddresses();
for (InetAddress inetAddress : Collections.list(inetAddresses)) {
out.printf("InetAddress: %s\n", inetAddress);
}
out.printf("\n");
}
}
Этот пример производит такой вывод:
Display name: Intel(R) Ethernet Connection (2) I219-V Name: eth4 InetAddress: /10.0.0.4 InetAddress: /fe80:0:0:0:cc75:ed6:3089:bd61%eth4
Но я не могу использовать эту информацию, потому что netsh требует имя адаптера, а именно Ethernet 1
, а не Intel(R) Ethernet Connection (2) I219-V
или eth4
.
На мой взгляд, getName() должен возвращать имя, специфичное для ОС, с использованием в самой ОС. Есть ли возможность получить настоящее имя адаптера с другими стандартными классами Java?
На данный момент моим единственным решением было бы getmac /fo csv /v
получить правильную информацию и проанализировать ее. Из-за того, что я не хочу писать свою собственную оболочку, которая обращается к функции С++ GetAdaptersAddresses
, потому что мне нужно будет ее изучить.