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

我正在尝试获取本地网络计算机的列表。 我尝试使用NetServerEnumWNetOpenEnum API,但两个API都返回错误代码6118 (ERROR_NO_BROWSER_SERVERS_FOUND) 。 不使用本地网络中的Active Directory。

最奇怪的Windows资源管理器显示所有本地计算机没有任何问

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

使用System.DirectoryService命名空间并尝试以下操作

 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"; } } } 

它对我有用。

我找到了使用接口IShellItem和CSIDL_NETWORK的解决方案。 我得到了所有的网络电脑。

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

C#:您可以使用Gong Solutions Shell Library

 using System.Collections; using System.Collections.Generic; using GongSolutions.Shell; using GongSolutions.Shell.Interop; public sealed class ShellNetworkComputers : IEnumerable { public IEnumerator GetEnumerator() { ShellItem folder = new ShellItem((Environment.SpecialFolder)CSIDL.NETWORK); IEnumerator e = folder.GetEnumerator(SHCONTF.FOLDERS); while (e.MoveNext()) { Debug.Print(e.Current.ParsingName); yield return e.Current.ParsingName; } } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } 

我用它做了一个function。 SchemaClassName必须是Computer

  public List NetworkComputers() { return ( from Computers in (new DirectoryEntry("WinNT:")).Children from Computer in Computers.Children where Computer.SchemaClassName == "Computer" orderby Computer.Name select Computer.Name).ToList; } 

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

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

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

 private List NetworkHosts { get { var result = new List(); 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; } }