Find and List network shares in C# using WMI, Registry and DirectoryEntry
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 Entryin 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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
| 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 = @"Domain\Administrator"; //connectionOptions.Password = "password"; //connectionOptions.Impersonation = ImpersonationLevel.Impersonate; ManagementScope scope = new ManagementScope( "\\\\" + serverName + "\\root\\CIMV2" , 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:\Shares\FinanceShare) using WMI API functions, to use WMI API functions, we need to add reference System.Management.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
| 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 = @"Domain\Administrator"; //connectionOptions.Password = "password"; //connectionOptions.Impersonation = ImpersonationLevel.Impersonate; ManagementScope scope = new ManagementScope( "\\\\" + serverName + "\\root\\CIMV2" , 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_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Shares. So you can also enumerates or lists network shares and share folder's local path through Registry in C#.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
| 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( @"SYSTEM\CurrentControlSet\services\LanmanServer\Shares" )) { 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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
| 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 >(); IADsContainer service = (IADsContainer)dirEntry.NativeObject; foreach (var info in service) { IADsFileShare shareInfo = (IADsFileShare)info; if (shareInfo.Class == "FileShare" ) { shares.Add(shareInfo.Name); } } return shares; } } } |
No comments:
Post a Comment
Note: only a member of this blog may post a comment.