2010-04-01 10 views
14

मैं स्थानीय नेटवर्क कंप्यूटर की एक सूची प्राप्त करने की कोशिश कर रहा हूं। मैंने NetServerEnum और WNetOpenEnum एपीआई का उपयोग करने की कोशिश की, लेकिन दोनों एपीआई रिटर्न त्रुटि कोड 6118 (ERROR_NO_BROWSER_SERVERS_FOUND) दोनों। स्थानीय नेटवर्क में सक्रिय निर्देशिका का उपयोग नहीं किया जाता है।स्थानीय नेटवर्क कंप्यूटर की सूची कैसे प्राप्त करें?

सबसे अजीब विंडोज एक्सप्लोरर बिना किसी समस्या के सभी स्थानीय कंप्यूटर दिखाता है।

LAN में कंप्यूटर की सूची प्राप्त करने के अन्य तरीके हैं?

+0

यह वही प्रश्न मूल रूप से है का उपयोग करता है: [http://stackoverflow.com/ प्रश्न/105,676/प्राप्त एक सूची के- सभी कंप्यूटर-ऑन-ए-नेटवर्क-wo-dns] (http://stackoverflow.com/questions/105676/get-a-list-of-all-computers -ऑन-ए-नेटवर्क-डब्ल्यूओ-डीएनएस) – Avitus

+4

नं। एनएमएपी मेरे लिए उपयुक्त नहीं है। अन्य कार्यक्रम से पार्स आउटपुट बहुत अच्छा नहीं है – KindDragon

उत्तर

10

मुझे CSIDL_NETWORK के साथ इंटरफ़ेस IShellItem का उपयोग करके समाधान मिला। मुझे सभी नेटवर्क पीसी मिलते हैं।

सी ++: उपयोग विधि IShellFolder :: EnumObjects

सी #: आप Gong Solutions Shell Library

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(); 
     } 
    } 
+1

'CSIDL.NETWORK' का मान 18 है, है ना? 'Environment.SpecialFolder.NetworkShortcuts' के समान, है ना? तो मैं सीधे इसका उपयोग कर सकता हूँ। इसके लिए, सही? – user34660

+0

@ user34660 हां, यदि आप केवल .NET 4.0 या उच्चतर का उपयोग करते हैं (3.5 इसका समर्थन नहीं करता है) – KindDragon

11

उपयोग कर सकते हैं 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"; 
     } 
    } 
} 

यह मेरे लिए काम किया ।

+4

हम्म यह प्रत्येक डोमेन-उपयोगकर्ता और डोमेन-समूह – LuckyLikey

+1

हाँ भी सूचीबद्ध करता है, 'कंप्यूटर .chemaClassName == "कंप्यूटर जोड़ने की आवश्यकता है "उस 'if' कथन में। अन्यथा, महान काम करता है! – vapcguy

5

मैंने इसमें से एक कार्य किया।

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(); 
    } 
+0

यह एक काम करता है। अनिवार्य रूप से इसकी रेखा 'जहां कंप्यूटर .chemaClassName == "कंप्यूटर" 'जो नेटवर्क में प्रत्येक समूह और उपयोगकर्ता को फ़िल्टर करता है, जो अभी भी @Cynfeal के एवर में सूचीबद्ध होगा, जब तक कि यह मधुमक्खी बदल नहीं जाता है। – LuckyLikey

1

toddmo के जवाब देने के लिए एक छोटा सा विस्तार हो गया है यहाँ एक संपत्ति है कि एक 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; 
     } 
    } 
1

: यदि आप वास्तव में LINQ क्वेरी शैली वाक्य रचना पसंद नहीं है और यह भी एक विकल्प के रूप कार्य समूहों में शामिल करना चाहते 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; 
    } 
संबंधित मुद्दे

 संबंधित मुद्दे