Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获取本地网络计算机的列表?_C#_C++_Winapi_Networking - Fatal编程技术网

C# 如何获取本地网络计算机的列表?

C# 如何获取本地网络计算机的列表?,c#,c++,winapi,networking,C#,C++,Winapi,Networking,我正在尝试获取本地网络计算机的列表。我尝试使用NetServerEnum和WNetOpenEnum API,但这两个API都返回错误代码6118 error\u NO\u BROWSER\u SERVERS\u FOUND。未使用本地网络中的Active Directory 大多数奇怪的Windows资源管理器显示所有本地计算机,没有任何问题 还有其他方法可以获取局域网中的计算机列表吗?我找到了使用IShellItem接口和CSIDL\u网络的解决方案。我得到所有的网络PC C++:使用方法IS

我正在尝试获取本地网络计算机的列表。我尝试使用NetServerEnum和WNetOpenEnum API,但这两个API都返回错误代码6118 error\u NO\u BROWSER\u SERVERS\u FOUND。未使用本地网络中的Active Directory

大多数奇怪的Windows资源管理器显示所有本地计算机,没有任何问题


还有其他方法可以获取局域网中的计算机列表吗?

我找到了使用IShellItem接口和CSIDL\u网络的解决方案。我得到所有的网络PC

C++:使用方法IShellFolder::EnumObjects

C:你可以用


您需要使用System.DirectoryServices命名空间并尝试以下操作:

DirectoryEntry root = new DirectoryEntry("WinNT:");

foreach (DirectoryEntry computers in root.Children)
{
    foreach (DirectoryEntry computer in computers.Children)
    {
        if (computer.Name != "Schema")
        {
             textBox1.Text += computer.Name + "\r\n";
        }
    }
}

它对我有用。

我用它做了一个函数。SchemaClassName必须是计算机


如果您不太喜欢LINQ查询样式的语法,并且还希望将工作组作为一个选项包括在内,那么这是对toddmo答案的一个小扩展:

public IEnumerable<string> VisibleComputers(bool workgroupOnly = false) {
        Func<string, IEnumerable<DirectoryEntry>> immediateChildren = key => new DirectoryEntry("WinNT:" + key)
                .Children
                .Cast<DirectoryEntry>();
        Func<IEnumerable<DirectoryEntry>, IEnumerable<string>> qualifyAndSelect = entries => entries.Where(c => c.SchemaClassName == "Computer")
                .Select(c => c.Name);
        return (
            !workgroupOnly ?
                qualifyAndSelect(immediateChildren(String.Empty)
                    .SelectMany(d => d.Children.Cast<DirectoryEntry>())) 
                :
                qualifyAndSelect(immediateChildren("//WORKGROUP"))
        ).ToArray();
    }

这里是一个使用LINQ查询的属性

private List<string> NetworkHosts
    {
        get
        {
            var result = new List<string>();

            var root = new DirectoryEntry("WinNT:");
            foreach (DirectoryEntry computers in root.Children)
            {
                result.AddRange(from DirectoryEntry computer in computers.Children where computer.Name != "Schema" select computer.Name);
            }
            return result;
        }
    }

具有LINQ lambda语法和非托管资源解析程序的解决方案

 public List<String> GetNetworkHostNames()
 {
        using (var directoryEntry = new DirectoryEntry("WinNT:"))
        {
            return directoryEntry
                     .Children
                     .Cast<DirectoryEntry>()
                     .SelectMany(x=>x.Children.Cast<DirectoryEntry>())
                     .Where(c => c.SchemaClassName == "Computer")
                     .Select(c => c.Name)
                     .ToList();
        }
 }

这基本上是同一个问题:不,Nmap不适合我。解析其他程序的输出不是很好。它也列出了每个域用户和域组。是的,需要在if语句中添加computer.SchemaClassName==computer。否则,效果很好!我没有得到计算机的列表,我得到了用户的列表,知道吗?必须打开网络发现才能工作。当我尝试它时,没有列出非windows计算机这一个有效。本质上是Computer.SchemaClassName==Computer这一行,它会过滤掉网络中的每个组和用户,这些组和用户仍然会列在@Cynfeal的anwer中,直到它被更改。CSIDL.network的值是18,对吗?与Environment.SpecialFolder.NetworkShortcuts相同,对吗?因此,我可以使用straight.Net进行此操作,对吗?@user34660是的,如果您仅使用.Net 4.0或更高版本,则3.5不支持此包。此包可通过NuGet?@Suit Boy Apps获得:单击链接,下载,解压缩并添加DLL作为参考。谢谢。我在拔头发。在2021年仍然运行良好!
private List<string> NetworkHosts
    {
        get
        {
            var result = new List<string>();

            var root = new DirectoryEntry("WinNT:");
            foreach (DirectoryEntry computers in root.Children)
            {
                result.AddRange(from DirectoryEntry computer in computers.Children where computer.Name != "Schema" select computer.Name);
            }
            return result;
        }
    }
 public List<String> GetNetworkHostNames()
 {
        using (var directoryEntry = new DirectoryEntry("WinNT:"))
        {
            return directoryEntry
                     .Children
                     .Cast<DirectoryEntry>()
                     .SelectMany(x=>x.Children.Cast<DirectoryEntry>())
                     .Where(c => c.SchemaClassName == "Computer")
                     .Select(c => c.Name)
                     .ToList();
        }
 }