//写这个程序,为了是显示局域网内的主机,然后通过用户点击选中的机器,检查是否该主机上安装有SQLSERVER,是为一个配置程序所写的  
  //这里提供CODE,给有需要的朋友  
   
  //设置DLL必须使用该命名空间  
  using   System.Runtime.InteropServices;  
   
      #region   动态链接库定义  
      [DllImport("mpr.dll",CharSet=CharSet.Auto)]   private   static   extern   int   WNetEnumResource(IntPtr   hEnum,   ref   int   lpcCount,IntPtr   lpBuffer,   ref   int   lpBufferSize   );  
      [DllImport("mpr.dll",CharSet=CharSet.Auto)]   private   static   extern   int   WNetOpenEnum(RESOURCE_SCOPE   dwScope,RESOURCE_TYPE   dwType,RESOURCE_USAGE   dwUsage,[MarshalAs(UnmanagedType.AsAny)][In]   Object   lpNetResource,out   IntPtr   lphEnum);  
      [DllImport("mpr.dll",CharSet=CharSet.Auto)]   private   static   extern   int   WNetCloseEnum(   IntPtr   hEnum   );  
      #endregion  
   
      #region   定义枚举常量  
      public   enum   RESOURCE_SCOPE  
      {  
        RESOURCE_CONNECTED   =   0x00000001,  
        RESOURCE_GLOBALNET   =   0x00000002,  
        RESOURCE_REMEMBERED   =   0x00000003,  
        RESOURCE_RECENT=   0x00000004,  
        RESOURCE_CONTEXT=   0x00000005  
      }  
   
      public   enum   RESOURCE_TYPE  
      {  
        RESOURCETYPE_ANY=   0x00000000,  
        RESOURCETYPE_DISK=   0x00000001,  
        RESOURCETYPE_PRINT   =   0x00000002,  
        RESOURCETYPE_RESERVED   =   0x00000008,  
      }  
   
      public   enum   RESOURCE_USAGE  
      {  
        RESOURCEUSAGE_CONNECTABLE   =0x00000001,  
        RESOURCEUSAGE_CONTAINER=0x00000002,  
        RESOURCEUSAGE_NOLOCALDEVICE   =0x00000004,  
        RESOURCEUSAGE_SIBLING=0x00000008,  
        RESOURCEUSAGE_ATTACHED=0x00000010,  
        RESOURCEUSAGE_ALL   =(RESOURCEUSAGE_CONNECTABLE   |   RESOURCEUSAGE_CONTAINER   |   RESOURCEUSAGE_ATTACHED),  
      }  
   
      public   enum   RESOURCE_DISPLAYTYPE  
      {  
        RESOURCEDISPLAYTYPE_GENERIC=   0x00000000,  
        RESOURCEDISPLAYTYPE_DOMAIN=   0x00000001,  
        RESOURCEDISPLAYTYPE_SERVER=   0x00000002,  
   
        RESOURCEDISPLAYTYPE_SHARE=   0x00000003,  
        RESOURCEDISPLAYTYPE_FILE   =   0x00000004,  
        RESOURCEDISPLAYTYPE_GROUP=   0x00000005,  
        RESOURCEDISPLAYTYPE_NETWORK=   0x00000006,  
        RESOURCEDISPLAYTYPE_ROOT   =   0x00000007,  
        RESOURCEDISPLAYTYPE_SHAREADMIN   =   0x00000008,  
        RESOURCEDISPLAYTYPE_DIRECTORY   =   0x00000009,  
        RESOURCEDISPLAYTYPE_TREE   =   0x0000000A,  
        RESOURCEDISPLAYTYPE_NDSCONTAINER   =   0x0000000B  
      }  
   
      public   struct   NETRESOURCE  
      {  
        public   RESOURCE_SCOPE   dwScope;  
        public   RESOURCE_TYPE   dwType;  
        public   RESOURCE_DISPLAYTYPE   dwDisplayType;  
        public   RESOURCE_USAGE   dwUsage;  
        [MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPTStr)]   public   string   lpLocalName;  
        [MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPTStr)]   public   string   lpRemoteName;  
        [MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPTStr)]   public   string   lpComment;  
        [MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPTStr)]   public   string   lpProvider;  
      }  
   
      public   enum   NERR  
      {  
        NERR_Success   =   0,/*   Success   */  
        ERROR_MORE_DATA   =   234,   //   dderror  
        ERROR_NO_BROWSER_SERVERS_FOUND   =   6118,  
        ERROR_INVALID_LEVEL   =   124,  
        ERROR_ACCESS_DENIED   =   5,  
        ERROR_INVALID_PARAMETER   =   87,  
        ERROR_NOT_ENOUGH_MEMORY   =   8,  
        ERROR_NETWORK_BUSY   =   54,  
        ERROR_BAD_NETPATH   =   53,  
        ERROR_NO_NETWORK   =   1222,  
        ERROR_INVALID_HANDLE_STATE   =   1609,  
        ERROR_EXTENDED_ERROR=   1208  
      }  
      #endregion  
   
   
      #region   开始列举网络函数  
      public   TreeNode   pNode1;  
      public   TreeNode   pNode2;  
      public   TreeNode   pNode3;  
      private   void   WNETOE(Object   o)  
      {  
        int   iRet;  
        IntPtr   ptrHandle   =   new   IntPtr();  
        try  
        {  
          iRet   =WNetOpenEnum(RESOURCE_SCOPE.RESOURCE_GLOBALNET,RESOURCE_TYPE.RESOURCETYPE_ANY,RESOURCE_USAGE.RESOURCEUSAGE_ALL,o,out   ptrHandle   );  
          if(   iRet   !=   0   )return;    
   
          int   entries;  
          int   buffer   =   16384;  
          IntPtr   ptrBuffer   =   Marshal.AllocHGlobal(buffer);  
          NETRESOURCE   nr;  
           
          for(;;)  
          {  
            entries   =   -1;  
            buffer   =   16384;  
            iRet   =WNetEnumResource(ptrHandle,ref   entries,ptrBuffer,ref   buffer);  
            if((iRet   !=   0)   ||   (entries<1))break;  
   
            Int32   ptr   =   ptrBuffer.ToInt32();  
            for(int   i=0;i<entries;i++   )  
            {  
              nr   =   (NETRESOURCE)Marshal.PtrToStructure(   new   IntPtr(ptr),   typeof(NETRESOURCE)   );  
              if(RESOURCE_USAGE.RESOURCEUSAGE_CONTAINER   ==   (nr.dwUsage   &   RESOURCE_USAGE.RESOURCEUSAGE_CONTAINER))  
              {  
                 
                ptr   +=   Marshal.SizeOf(   nr   );  
                if(nr.dwDisplayType   ==   RESOURCE_DISPLAYTYPE.RESOURCEDISPLAYTYPE_NETWORK)  
                {  
                  pNode1   =   tView.Nodes.Add(nr.lpRemoteName);//TreeView  
                  pNode1.ImageIndex   =   0;  
                  pNode1.SelectedImageIndex   =   0;  
                }  
                else   if(nr.dwDisplayType   ==   RESOURCE_DISPLAYTYPE.RESOURCEDISPLAYTYPE_DOMAIN)  
                {  
                  pNode2   =   pNode1.Nodes.Add(nr.lpRemoteName);  
                  pNode2.ImageIndex   =   1;  
                  pNode2.SelectedImageIndex   =1;  
                }  
                else   if(nr.dwDisplayType   ==   RESOURCE_DISPLAYTYPE.RESOURCEDISPLAYTYPE_SERVER)  
                {  
                  string   sPCName   =   nr.lpRemoteName;  
                  pNode3   =   pNode2.Nodes.Add(sPCName.Substring(2,sPCName.Length-2));\\此处为去处机器名称前的两个"\\"字符  
                  pNode3.ImageIndex   =   2;  
                  pNode3.SelectedImageIndex   =   2;  
                }  
   
                WNETOE(nr);  
              }  
               
            }  
          }  
          Marshal.FreeHGlobal(   ptrBuffer   );  
          iRet   =WNetCloseEnum(   ptrHandle   );  
        }  
        catch(Exception   ex)  
        {  
          MessageBox.Show("查找本地网络错误:"+ex.Message,"错误",MessageBoxButtons.OK,MessageBoxIcon.Error);  
        }  
      }  
   
      #endregion  
   
      //窗体LOAD事件中,使用函数  
      private   void   frmDBConnConfig_Load(object   sender,   System.EventArgs   e)  
      {  
        WNETOE(null);  
      }  
Posted on 2008-11-21 22:01  hesen  阅读(130)  评论(0)    收藏  举报