/// <summary> /// Enumerates the shares on Windows 9x /// </summary> /// <param name="server">The server name</param> /// <param name="shares">The ShareCollection</param> protected static void EnumerateShares9X(string server, ShareCollection shares) { var level = 50; var t = typeof(ShareInfo50); var size = Marshal.SizeOf(t); var cbBuffer = (ushort)(MaxSi50Entries * size); //On Win9x, must allocate buffer before calling API var pBuffer = Marshal.AllocHGlobal(cbBuffer); try { ushort entriesRead; ushort totalEntries; var nRet = NetShareEnum(server, level, pBuffer, cbBuffer, out entriesRead, out totalEntries); if (ErrorWrongLevel == nRet) { level = 1; t = typeof(ShareInfo1_9X); size = Marshal.SizeOf(t); nRet = NetShareEnum(server, level, pBuffer, cbBuffer, out entriesRead, out totalEntries); } if (NoError == nRet || ErrorMoreData == nRet) { for (int i = 0, lpItem = pBuffer.ToInt32(); i < entriesRead; i++, lpItem += size) { var pItem = new IntPtr(lpItem); if (1 == level) { var si = (ShareInfo1_9X)Marshal.PtrToStructure(pItem, t); shares.Add(si.NetName, string.Empty, si.ShareType, si.Remark); } else { var si = (ShareInfo50)Marshal.PtrToStructure(pItem, t); shares.Add(si.NetName, si.Path, si.ShareType, si.Remark); } } } else { Console.WriteLine(nRet); } } finally { //Clean up buffer Marshal.FreeHGlobal(pBuffer); } }
/// <summary> /// Enumerates the shares on Windows NT /// </summary> /// <param name="server">The server name</param> /// <param name="shares">The ShareCollection</param> protected static void EnumerateSharesNt(string server, ShareCollection shares) { var level = 2; var hResume = 0; var pBuffer = IntPtr.Zero; try { int entriesRead; int totalEntries; var nRet = NetShareEnum(server, level, out pBuffer, -1, out entriesRead, out totalEntries, ref hResume); if (ErrorAccessDenied == nRet) { //Need admin for level 2, drop to level 1 level = 1; nRet = NetShareEnum(server, level, out pBuffer, -1, out entriesRead, out totalEntries, ref hResume); } if (NoError == nRet && entriesRead > 0) { var t = 2 == level ? typeof(ShareInfo2) : typeof(ShareInfo1); var offset = Marshal.SizeOf(t); for (int i = 0, lpItem = pBuffer.ToInt32(); i < entriesRead; i++, lpItem += offset) { var pItem = new IntPtr(lpItem); if (1 == level) { var si = (ShareInfo1)Marshal.PtrToStructure(pItem, t); shares.Add(si.NetName, string.Empty, si.ShareType, si.Remark); } else { var si = (ShareInfo2)Marshal.PtrToStructure(pItem, t); shares.Add(si.NetName, si.Path, si.ShareType, si.Remark); } } } } finally { // Clean up buffer allocated by system if (IntPtr.Zero != pBuffer) { NetApiBufferFree(pBuffer); } } }
/// <summary> /// Enumerates the shares /// </summary> /// <param name="server">The server name</param> /// <param name="shares">The ShareCollection</param> protected static void EnumerateShares(string server, ShareCollection shares) { if (!string.IsNullOrEmpty(server) && !IsW2KUp) { server = server.ToUpper(); // On NT4, 9x and Me, server has to start with "\\" if (!('\\' == server[0] && '\\' == server[1])) { server = @"\\" + server; } } if (IsNt) { EnumerateSharesNt(server, shares); } else { EnumerateShares9X(server, shares); } }
/// <summary> /// The main entry point for the application. /// </summary> internal static void TestShares() { // Enumerate shares on local computer Console.WriteLine("\nShares on local computer:"); var shi = ShareCollection.LocalShares; if (shi != null) { foreach (Share si in shi) { Console.WriteLine("{0}: {1} [{2}]", si.ShareType, si, si.Path); // If this is a file-system share, try to // list the first five subfolders. // NB: If the share is on a removable device, // you could get "Not ready" or "Access denied" // exceptions. if (si.IsFileSystem) { try { var d = si.Root; var flds = d.GetDirectories(); for (var i = 0; i < flds.Length && i < 5; i++) { Console.WriteLine("\t{0} - {1}", i, flds[i].FullName); } Console.WriteLine(); } catch (Exception ex) { Console.WriteLine("\tError listing {0}:\n\t{1}\n", si, ex.Message); } } } } else { Console.WriteLine("Unable to enumerate the local shares."); } Console.WriteLine(); // Enumerate shares on a remote computer Console.Write("Enter the NetBios name of a server on your network: "); var server = Console.ReadLine(); if (server != null && server.Trim().Length > 0) { Console.WriteLine("\nShares on {0}:", server); shi = ShareCollection.GetShares(server); if (shi != null) { foreach (Share si in shi) { Console.WriteLine("{0}: {1} [{2}]", si.ShareType, si, si.Path); // If this is a file-system share, try to // list the first five subfolders. // NB: If the share is on a removable device, // you could get "Not ready" or "Access denied" // exceptions. // If you don't have permissions to the share, // you will get security exceptions. if (si.IsFileSystem) { try { var d = si.Root; var flds = d.GetDirectories(); for (var i = 0; i < flds.Length && i < 5; i++) { Console.WriteLine("\t{0} - {1}", i, flds[i].FullName); } Console.WriteLine(); } catch (Exception ex) { Console.WriteLine("\tError listing {0}:\n\t{1}\n", si, ex.Message); } } } } else { Console.WriteLine("Unable to enumerate the shares on {0}.\n" + "Make sure the machine exists, and that you have permission to access it.", server); } Console.WriteLine(); } // Resolve local paths to UNC paths. string fileName; do { Console.Write("Enter the path to a file, or \"Q\" to exit: "); fileName = Console.ReadLine(); if (string.IsNullOrEmpty(fileName)) { continue; } if (fileName.ToUpper() == "Q") { fileName = string.Empty; } else { Console.WriteLine("{0} = {1}", fileName, ShareCollection.PathToUnc(fileName)); } } while (!string.IsNullOrEmpty(fileName)); }