确定计算机是否通过WiFi网络或Python中的以太网电缆连接到internet

确定计算机是否通过WiFi网络或Python中的以太网电缆连接到internet,python,windows,Python,Windows,我想知道如何让Python脚本确定计算机如何连接到网络。这是因为如果连接速度太慢,脚本就会出现问题,因此如果用户通过WiFi连接,我想显示一个警告 实际运行的Python可执行文件位于我公司的局域网上,因此这就是连接速度很重要的原因。此外,由于此可执行文件在没有连接的情况下无法运行,因此我不关心检查用户是否在线 我不知道Python是如何与这样的东西交互的(或者即使可能),所以如果有什么我可以澄清的,请告诉我。提前谢谢 我在Windows 7上使用的是Python 2.7.6 32位64位(不同

我想知道如何让Python脚本确定计算机如何连接到网络。这是因为如果连接速度太慢,脚本就会出现问题,因此如果用户通过WiFi连接,我想显示一个警告

实际运行的Python可执行文件位于我公司的局域网上,因此这就是连接速度很重要的原因。此外,由于此可执行文件在没有连接的情况下无法运行,因此我不关心检查用户是否在线

我不知道Python是如何与这样的东西交互的(或者即使可能),所以如果有什么我可以澄清的,请告诉我。提前谢谢


我在Windows 7上使用的是Python 2.7.6 32位64位(不同的位是因为pyEnchant)

在Windows上,此信息通过WMI提供

在.NET中(例如,使用IronPython),这很容易使用:

ni = Windows.Networking.Connectivity.NetworkInformation
profile = ni.GetInternetConnectionProfile()
if profile:
    interface = profile.NetworkAdapter.IanaInterfaceType
    if interface == 71:
        do WiFi stuff
    elif interface == 6:
        do Ethernet stuff
    else:
        do wtf stuff
IanaInterfaceType
是来自的数字。(我想您可以解析SNMP MIB。)注意,Windows可能会将一些不太常见/过时的适配器类型与以太网混为一谈,但您可能并不关心这一点


对于旧版本的Windows—我不确定Windows 7是否算作“旧版”和您想要的朋友,而不是上面链接的
MSFT\u NetworkAdapter
/
NetworkAdapter
,因此代码会有所不同

特别是,获取提供默认internet连接的适配器更难,但更灵活,而获取其类型更容易,但信息量较少。IIRC,至少在XP中,尽管Windows有一些“internet连接”的概念,但您无法通过WMI访问它,但您可以访问所有internet连接,或搜索/迭代您关心的连接。如果你有一个VPN,或者坐在一个DMZ上,或者一次激活多个NIC卡,等等,哪一个更好

因此,您要做的是搜索或迭代以找到哪个连接路由处理您实际要连接的IP地址,或者使用哪个NIC处理您要连接的地址。无论哪种方式,您都将获得一个
接口索引
,您可以使用该
接口索引
查找。那么它的
AdapterType
是一个很好的字符串,您只需检查
!=“无线”
。(我相信我从上一个VBscript示例中了解到了所有这些,然后自己将其移植到IronPython,但那是很久以前的事了,所以我可能记错了。无论如何,文档似乎比当时更完整,所以这应该是不必要的。)


如果没有.NET(例如,使用标准的CPython),则必须使用web服务接口,或与本机Win32 COM接口对话

理论上,您可以通过
ctypes
直接与COM接口通信,但这是一个可怕的想法;你几乎肯定会想要那样

而且,更好的是,我建议在PyPI上查找包装器,比如,而不是自己构建它。然后,代码应该和.NET一样简单


下面是一些使用上面链接的WMI库和上面描述的XP兼容源地址方法的pseudcode:

import wmi
MY_IP = '10.1.2.3'
w = wmi.WMI()
for nac in w.Win32_NetworkAdapterConfiguration():
    if MY_IP in nac.IPAddress:
        idx = nac.InterfaceIndex
        break
else:
    oops, do something, no NIC has that address
na = w.Win32_NetworkAdapter(InterfaceIndex=idx)
if not na:
    oops, unlikely race condition, NIC disabled right before we checked it
if na[0].AdapterType == 'Wireless':
    do WiFi stuff
elif na[0].AdapterType.startswith('Ethernet'):
    do Ethernet stuff
else:
    who's using LocalTalk in 2013?
应该可以搜索NetworkAddressConfiguration,但我不知道如何在
wmi
库中搜索“IPAddress包含我的IP”。使用
=
可能在那里有效,谁知道呢;通读这本书来找出答案

另一方面,按目标地址搜索应如下所示:

TARGET_IP = '10.10.10.10'
w = wmi.WMI()
rt = w.Win32_IP4RouteTable(Destination=TARGET_IP)
if not rt:
    oops, no route to host
idx = rt[0].InterfaceIndex
# same as above

在Windows上,此信息通过WMI提供

在.NET中(例如,使用IronPython),这很容易使用:

ni = Windows.Networking.Connectivity.NetworkInformation
profile = ni.GetInternetConnectionProfile()
if profile:
    interface = profile.NetworkAdapter.IanaInterfaceType
    if interface == 71:
        do WiFi stuff
    elif interface == 6:
        do Ethernet stuff
    else:
        do wtf stuff
IanaInterfaceType
是来自的数字。(我想您可以解析SNMP MIB。)注意,Windows可能会将一些不太常见/过时的适配器类型与以太网混为一谈,但您可能并不关心这一点


对于旧版本的Windows—我不确定Windows 7是否算作“旧版”和您想要的朋友,而不是上面链接的
MSFT\u NetworkAdapter
/
NetworkAdapter
,因此代码会有所不同

特别是,获取提供默认internet连接的适配器更难,但更灵活,而获取其类型更容易,但信息量较少。IIRC,至少在XP中,尽管Windows有一些“internet连接”的概念,但您无法通过WMI访问它,但您可以访问所有internet连接,或搜索/迭代您关心的连接。如果你有一个VPN,或者坐在一个DMZ上,或者一次激活多个NIC卡,等等,哪一个更好

因此,您要做的是搜索或迭代以找到哪个连接路由处理您实际要连接的IP地址,或者使用哪个NIC处理您要连接的地址。无论哪种方式,您都将获得一个
接口索引
,您可以使用该
接口索引
查找。那么它的
AdapterType
是一个很好的字符串,您只需检查
!=“无线”
。(我相信我从上一个VBscript示例中了解到了所有这些,然后自己将其移植到IronPython,但那是很久以前的事了,所以我可能记错了。无论如何,文档似乎比当时更完整,所以这应该是不必要的。)


如果没有.NET(例如,使用标准的CPython),则必须使用web服务接口,或与本机Win32 COM接口对话

理论上,您可以通过
ctypes
直接与COM接口通信,但这是一个可怕的想法;你几乎肯定会想要那样

而且,更好的是,我建议在PyPI上查找包装器,比如,而不是自己构建它。然后,代码应该和.NET一样简单


下面是一些pseudcode,它使用上面链接的WMI库和XP兼容的源地址me