C# 如何获取本地网络计算机的列表?
我正在尝试获取本地网络计算机的列表。我尝试使用NetServerEnum和WNetOpenEnum API,但这两个API都返回错误代码6118 error\u NO\u BROWSER\u SERVERS\u FOUND。未使用本地网络中的Active Directory 大多数奇怪的Windows资源管理器显示所有本地计算机,没有任何问题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
还有其他方法可以获取局域网中的计算机列表吗?我找到了使用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();
}
}