Description
In this article, I am going to write C# code examples to find and list network shares and share folder’s local path in C# using WMI and enumerates network shares without WMI through Registry and Directory Entry in C#.
Summary
- Find and List network shares in C# using WMI
- Find and List network shares and share’s local path in C# using WMI
- Find and List network shares and share’s local path in C# without WMI though Registry
- Find and List network shares in C# using DirectoryEntry
Find and List Network Shares in C# using WMI
You can get or lists network shares or share folders in C# using WMI API functions, to use WMI API functions, we need to add reference System.Management.
using System.Collections.Generic;
using System.Management;
using System;
namespace EnumerateShares
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Enter Server Name:");
string serverName = Console.ReadLine();
Console.WriteLine("-------------");
List<string> shares = GetNetworkShareFoldersList(serverName);
foreach (string share in shares)
{
Console.WriteLine(share);
Console.WriteLine("-------------");
}
Console.ReadLine();
}
public static List<string> GetNetworkShareFoldersList(string serverName)
{
List<string> shares = new List<string>();
// do not use ConnectionOptions to get shares from local machine
ConnectionOptions connectionOptions = new ConnectionOptions();
//connectionOptions.Username = @"DomainAdministrator";
//connectionOptions.Password = "password";
//connectionOptions.Impersonation = ImpersonationLevel.Impersonate;
ManagementScope scope = new ManagementScope("\" + serverName + "rootCIMV2",
connectionOptions);
scope.Connect();
ManagementObjectSearcher worker = new ManagementObjectSearcher(scope,
new ObjectQuery("select Name from win32_share"));
foreach (ManagementObject share in worker.Get())
{
shares.Add(share["Name"].ToString());
}
return shares;
}
}
}
Find and Lists Network Shares and Share’s Local Path in C# using WMI
You can also enumerates or lists network shares and share folder’s local path (ex: C path: C:SharesFinanceShare) using WMI API functions, to use WMI API functions, we need to add reference System.Management.
using System.Collections.Generic;
using System.Management;
using System;
namespace EnumerateShares
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Enter Server Name:");
string serverName = Console.ReadLine();
Console.WriteLine("-------------");
Dictionary<string,string> shares = GetNetworkShareDetailUsingWMI(serverName);
foreach (KeyValuePair<string,string> share in shares)
{
Console.WriteLine(share.Key + ": " + share.Value);
Console.WriteLine("-------------");
}
Console.ReadLine();
}
public static Dictionary<string, string> GetNetworkShareDetailUsingWMI(string serverName)
{
Dictionary<string, string> shares = new Dictionary<string, string>();
// do not use ConnectionOptions to get shares from local machine
ConnectionOptions connectionOptions = new ConnectionOptions();
//connectionOptions.Username = @"DomainAdministrator";
//connectionOptions.Password = "password";
//connectionOptions.Impersonation = ImpersonationLevel.Impersonate;
ManagementScope scope = new ManagementScope("\" + serverName + "rootCIMV2",
connectionOptions);
scope.Connect();
ManagementObjectSearcher worker = new ManagementObjectSearcher(scope,
new ObjectQuery("select Name,Path from win32_share"));
foreach (ManagementObject share in worker.Get())
{
shares.Add(share["Name"].ToString(), share["Path"].ToString());
}
return shares;
}
}
}
Enumerates or Lists Network Shares in C# without WMI though Registry
The network share folders information are stored in Registry in the following registry path: HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesLanmanServerShares. So you can also enumerates or lists network shares and share folder’s local path through Registry in C#.
using System.Collections.Generic;
using System;
using System.Linq;
using Microsoft.Win32;
namespace EnumerateShares
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Enter Server Name:");
string serverName = Console.ReadLine();
Console.WriteLine("-------------");
Dictionary<string,string> shares = GetNetworkShareDetailUsingRegistry(serverName);
foreach (KeyValuePair<string,string> share in shares)
{
Console.WriteLine(share.Key + ": " + share.Value);
Console.WriteLine("-------------");
}
Console.ReadLine();
}
public static Dictionary<string, string> GetNetworkShareDetailUsingRegistry(string serverName)
{
Dictionary<string, string> shares = new Dictionary<string, string>();
using (RegistryKey reg = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, serverName))
{
using (RegistryKey key = reg.OpenSubKey(@"SYSTEMCurrentControlSetservicesLanmanServerShares"))
{
foreach (string shareName in key.GetValueNames())
{
// Network share local path
List<string> keyValues=((string[])key.GetValue(shareName)).ToList();
string shareLocalPath =
keyValues.Where(a => a.StartsWith("Path=")).FirstOrDefault().Substring(5);
shares.Add(shareName, shareLocalPath);
}
}
}
return shares;
}
}
}
Find and List Network Shares in C# using DirectoryEntry
You can also enumerates or lists network shares using DirectoryEntry and IADsFileShare API in C#. To use DirectoryEntry, you need to add reference System.DirectoryServices from .NET library(tab) and to use IADsFileShare, you need to reference ActiveDs from Com library.
Note: You can’t get share folder’s local path by this method.
using System;
using System.Collections.Generic;
using System.DirectoryServices;
using System.Linq;
using ActiveDs;
namespace EnumerateShares
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Enter Server Name:");
string serverName = Console.ReadLine();
Console.WriteLine("-------------");
List<string> shares = GetNetworkSharesUsingActiveDSLib(serverName);
foreach (string share in shares)
{
Console.WriteLine(share);
Console.WriteLine("-------------");
}
Console.ReadLine();
}
public static List<string> GetNetworkSharesUsingActiveDSLib(string serverName)
{
List<string> shares = new List<string>();
DirectoryEntry dirEntry = new DirectoryEntry("WinNT://" + serverName + "/LanmanServer");
IADsContainer service = (IADsContainer)dirEntry.NativeObject;
foreach (var info in service)
{
IADsFileShare shareInfo = (IADsFileShare)info;
if (shareInfo.Class == "FileShare")
{
shares.Add(shareInfo.Name);
}
}
return shares;
}
}
}
Thanks,
Morgan
Software Developer
Tha