首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用c# wpf获取网络上所有已连接设备的操作系统名称

使用C# WPF获取网络上所有已连接设备的操作系统名称可以通过以下步骤实现:

  1. 获取本地网络的IP地址范围:可以使用System.Net.NetworkInformation命名空间下的NetworkInterface类和IPAddress类,通过遍历本地网络接口获取本地IP地址范围。
  2. 扫描IP地址范围内的设备:使用System.Net.NetworkInformation.Ping类,向每个IP地址发送Ping请求,通过判断是否有响应来确定设备是否在线。
  3. 获取在线设备的操作系统名称:可以通过使用System.Management命名空间下的ManagementObjectSearcherManagementObject类,利用WMI(Windows Management Instrumentation)查询操作系统相关信息。具体可以通过查询Win32_OperatingSystem类的Caption属性来获取操作系统名称。

以下是一种实现方式的示例代码:

代码语言:txt
复制
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.NetworkInformation;
using System.Management;

namespace GetConnectedDevicesOS
{
    public class DeviceInfo
    {
        public string IpAddress { get; set; }
        public string OsName { get; set; }
    }

    public class DeviceScanner
    {
        public List<DeviceInfo> GetConnectedDevicesOS()
        {
            List<DeviceInfo> connectedDevices = new List<DeviceInfo>();

            // 获取本地网络的IP地址范围
            List<IPAddress> localIpAddresses = GetLocalIpAddresses();
            foreach (IPAddress localIpAddress in localIpAddresses)
            {
                // 扫描IP地址范围内的设备
                List<IPAddress> connectedIpAddresses = GetConnectedIpAddresses(localIpAddress);
                foreach (IPAddress connectedIpAddress in connectedIpAddresses)
                {
                    // 获取在线设备的操作系统名称
                    string osName = GetDeviceOsName(connectedIpAddress);

                    // 构造设备信息对象
                    DeviceInfo deviceInfo = new DeviceInfo
                    {
                        IpAddress = connectedIpAddress.ToString(),
                        OsName = osName
                    };

                    connectedDevices.Add(deviceInfo);
                }
            }

            return connectedDevices;
        }

        private List<IPAddress> GetLocalIpAddresses()
        {
            List<IPAddress> localIpAddresses = new List<IPAddress>();

            NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
            foreach (NetworkInterface networkInterface in networkInterfaces)
            {
                if (networkInterface.NetworkInterfaceType == NetworkInterfaceType.Ethernet ||
                    networkInterface.NetworkInterfaceType == NetworkInterfaceType.Wireless80211)
                {
                    IPInterfaceProperties ipProperties = networkInterface.GetIPProperties();
                    foreach (IPAddressInformation ipInformation in ipProperties.UnicastAddresses)
                    {
                        if (ipInformation.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                        {
                            localIpAddresses.Add(ipInformation.Address);
                        }
                    }
                }
            }

            return localIpAddresses;
        }

        private List<IPAddress> GetConnectedIpAddresses(IPAddress localIpAddress)
        {
            List<IPAddress> connectedIpAddresses = new List<IPAddress>();

            Ping pingSender = new Ping();
            string baseIpAddress = localIpAddress.ToString();
            baseIpAddress = baseIpAddress.Substring(0, baseIpAddress.LastIndexOf('.') + 1);

            for (int i = 1; i < 255; i++)
            {
                string ipAddress = baseIpAddress + i.ToString();
                PingReply reply = pingSender.Send(ipAddress, 200);

                if (reply.Status == IPStatus.Success)
                {
                    connectedIpAddresses.Add(IPAddress.Parse(ipAddress));
                }
            }

            return connectedIpAddresses;
        }

        private string GetDeviceOsName(IPAddress ipAddress)
        {
            string osName = string.Empty;

            try
            {
                ConnectionOptions connectionOptions = new ConnectionOptions();
                ManagementScope managementScope = new ManagementScope($"\\\\{ipAddress}\\root\\CIMv2", connectionOptions);
                ObjectQuery objectQuery = new ObjectQuery("SELECT Caption FROM Win32_OperatingSystem");
                ManagementObjectSearcher managementObjectSearcher = new ManagementObjectSearcher(managementScope, objectQuery);
                ManagementObjectCollection managementObjectCollection = managementObjectSearcher.Get();

                foreach (ManagementObject managementObject in managementObjectCollection)
                {
                    osName = managementObject["Caption"].ToString();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            return osName;
        }
    }
}

这是一个简单的C# WPF应用程序,通过调用GetConnectedDevicesOS方法可以获取所有已连接设备的IP地址和操作系统名称。注意,该示例代码中未涉及腾讯云的产品和链接地址,如需添加相关推荐,可以根据实际需求自行添加。

相关搜索:使用iOS应用程序获取所有已连接的mac设备信息使用RxAndroidBle从已连接的设备获取订阅如何使用libimobiledevice获取已连接设备的ECID?如何在Android上获取本地网络所有设备的IP地址和名称如何获取配对(在移动设置中已连接)蓝牙设备的名称?Xamarin形成了如何获取设备所连接的wi-fi网络的名称如何使用C++显示连接到网络的设备的名称和IP地址如何使用Flutter获取设备上已安装应用程序的大小?如何使用PowerShell获取所有已安装的Windows更新、名称和KB号?如何使用C#在xamarin.forms中获取所有已启用的键盘如何使用Python ScriptEngine获取C#中的所有局部变量名称和值?iOS 14:如何延迟“[应用程序名称]想要查找并连接到本地网络上的设备”通知?您是否可以使用macOS“日志流”或“日志显示”从已连接的iOS设备获取消息?使用C# Datastax CassandraCSharpDriver.Graph获取连接到已知折点的所有未知折点此递归函数用于返回所有已连接节点的列表,其中给定了使用python的网络图中的某个节点从C应用程序(Linux)获取已连接的USB摄像头(网络摄像头)的v4l2设备号如何在没有互联网连接的情况下在CN1设备上获取网络提供的日期和时间?是否可以使用adb命令通过wifi连接到同一网络上的任何android设备?在Windows Vista上获取我使用C#.Net连接的无线网络的SSID从2个不同的服务器上的2个不同的数据库中获取数据,并使用C#连接它们
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券