2009-05-29 9 views
1

現在のすべてのLANマシンをリストする必要があるアプリケーションを開発しています。NetServerEnum()でC#の問題

LAN上のすべてのワークステーションを一覧表示するために、NetServerEnum()をインポート後に使用しています。

プログラムの実行時に問題なく動作していたようです。 2台の既存マシンが正しく検出されました。 しかし、必要なときにリストをリフレッシュしたい(リフレッシュボタンの一部)。だから、私はスイッチから他のコンピュータのワイヤを切り離し、LAN上の1台のコンピュータだけをレンダリングしました。 今、私はプログラムを走らせても、まだ切断されたマシンをリストアップしています。

これを解決するにはどうすればよいですか?次のように

コードは次のとおりです。

namespace LanIpAddresses 
{ 
    class NetApi 
    { 
     [DllImport ("Netapi32.dll", EntryPoint = "NetServerEnum")] 
     public static extern Int32 NetServerEnum (
      [MarshalAs (UnmanagedType.LPWStr)] String serverName, 
      Int32 level, 
      out IntPtr bufferPtr, 
      UInt32 prefMaxLen, 
      ref Int32 entriesRead, 
      ref Int32 totalEntries, 
      UInt32 serverType, 
      [MarshalAs (UnmanagedType.LPWStr)] String domain, 
      IntPtr handle); 

     [DllImport ("Netapi32.dll", EntryPoint = "NetApiBufferFree")] 
     public static extern UInt32 NetApiBufferFree (IntPtr buffer); 
    } 


    class EnumerateLanMachines 
    { 
     public const UInt32 SUCCESS = 0; 
     public const UInt32 FAIL = 234; 
     public const UInt32 MAX_PREFERRED_LENGTH = 0xFFFFFFFF; 
     //public ArrayList machines = new ArrayList (); 

     enum ServerTypes : uint 
     { 
      WorkStation = 0x00000001, 
      Server = 0x00000002 
     } 

     [StructLayout (LayoutKind.Sequential, CharSet = CharSet.Auto)] 
     public struct MachineInfo 
     { 
      [MarshalAs (UnmanagedType.U4)] 
      public UInt32 platformId; 

      [MarshalAs (UnmanagedType.LPWStr)] 
      public String serverName; 
     } 

     public enum Platform 
     { 
      PLATFORM_ID_DOS = 300, 
      PLATFORM_ID_OS2 = 400, 
      PLATFORM_ID_NT = 500, 
      PLATFORM_ID_OSF = 600, 
      PLATFORM_ID_VMS = 700 
     } 

     public void enumerateMachines () 
     { 
      IntPtr buffer = new IntPtr(); 
      int totalEntries = 0; 
      int entriesRead = 0; 
      int result; 

      result = NetApi.NetServerEnum (null, 100, out buffer, MAX_PREFERRED_LENGTH, ref entriesRead, ref totalEntries, (uint) ServerTypes.WorkStation, null, IntPtr.Zero); 

      MachineInfo machineInfo; 

      if (result != FAIL) 
      { 
       Console.WriteLine ("Succeeded!"); 
       Console.WriteLine (entriesRead); 
       for (int i = 0; i < entriesRead; ++i) 
       { 
        machineInfo = (MachineInfo) Marshal.PtrToStructure (buffer, typeof (MachineInfo)); 

        //machines.Add (machineInfo); 
        Console.WriteLine (machineInfo.serverName); 

        buffer = (IntPtr) ((ulong) buffer + (ulong) Marshal.SizeOf (machineInfo)); 
       } 

       NetApi.NetApiBufferFree (buffer); 
      } 
     } 
    } 
} 
namespace LanIpAddresses 
{ 
    class Program 
    { 
     private static IPHostEntry ipHost; 
     static ArrayList ipList; 

     static void Main (string[ ] args) 
     { 
      EnumerateLanMachines enumerate = new EnumerateLanMachines (); 

      enumerate.enumerateMachines (); 

      /*foreach (EnumerateLanMachines.MachineInfo o in enumerate.machines) 
      { 
       Console.WriteLine (o.platformId + " " + o.serverName); 
      }*/ 

      Console.ReadLine (); 
     } 
    } 
} 

答えて

0

私はこの問題を解決することができませんでした。しかし、私は別の方法を選択しました - すべてのIP範囲をpingしてマシンに接続すること。 NetServerEnumを使用している場合

しかし、私は、1つは、Windows Browserサービスを使用しているこのまだ長引く質問:)

1

上の任意の答えを歓迎します。マスターブラウザは、ネットワーク内のコンピュータのリストを管理します。コンピュータがネットワーク上で自分のことをアナウンスしてから電源を切ると、マスターブラウザはそのコンピュータをそのリストに保持します。

http://support.microsoft.com/kb/188001

あなたの代わりに、ネットワーク内のコンピュータに関するActive Directoryを尋ねた場合、あなたも登録コンピュータのリストを得るでしょうが、これは、リスト内のすべてのコンピュータがオンラインであるという意味ではありません。