Как получить список компьютеров локальной сети? - PullRequest
18 голосов
/ 01 апреля 2010

Я пытаюсь получить список компьютеров локальной сети. Я пытался использовать NetServerEnum и WNetOpenEnum API, но оба API возвращают код ошибки 6118 (ERROR_NO_BROWSER_SERVERS_FOUND). Active Directory в локальной сети не используется.

Самый странный Windows Explorer показывает все локальные компьютеры без проблем.

Существуют ли другие способы получения списка компьютеров в локальной сети?

Ответы [ 5 ]

14 голосов
/ 27 января 2014

Вам нужно будет использовать пространство имен 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";
        }
    }
}

Это сработало для меня.

11 голосов
/ 01 апреля 2010

Я нашел решение, используя интерфейс IShellItem с CSIDL_NETWORK. Я получаю все сетевые ПК.

C ++: использовать метод IShellFolder :: EnumObjects

C #: вы можете использовать Библиотека Gong Solutions Shell

using System.Collections;
using System.Collections.Generic;
using GongSolutions.Shell;
using GongSolutions.Shell.Interop;

    public sealed class ShellNetworkComputers : IEnumerable<string>
    {
        public IEnumerator<string> GetEnumerator()
        {
            ShellItem folder = new ShellItem((Environment.SpecialFolder)CSIDL.NETWORK);
            IEnumerator<ShellItem> e = folder.GetEnumerator(SHCONTF.FOLDERS);

            while (e.MoveNext())
            {
                Debug.Print(e.Current.ParsingName);
                yield return e.Current.ParsingName;
            }
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
    }
6 голосов
/ 07 февраля 2015

Я сделал функцию из этого.SchemaClassName должно быть Компьютер

    public List<string> 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;
    }
2 голосов
/ 25 августа 2016

Здесь свойство, которое использует запрос 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;
        }
    }
2 голосов
/ 21 ноября 2015

Незначительное расширение ответа toddmo, если вам не очень нравится синтаксис стиля запросов LINQ и вы хотите также включить рабочие группы в качестве опции:

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();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...