using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management;
using System.Runtime.InteropServices;
namespace ConsoleApplication1
{
class Class1
{
#region Get remote share folder name, use Windows API NetShareEnum
[DllImport("Netapi32.dll", CharSet = CharSet.Unicode)]
private static extern NET_API_STATUS NetShareEnum(
StringBuilder serverName,
int level,
ref IntPtr bufPtr,
uint prefMaxLen,
ref int entriesRead,
ref int totalEntries,
ref int resumeHandle
);
[DllImport("Netapi32.dll", SetLastError = true)]
static extern int NetApiBufferFree(IntPtr Buffer);
public enum NET_API_STATUS : uint
{
NERR_Success = 0,
NERR_InvalidComputer = 2351,
NERR_NotPrimary = 2226,
NERR_SpeGroupOp = 2234,
NERR_LastAdmin = 2452,
NERR_BadPassword = 2203,
NERR_PasswordTooShort = 2245,
NERR_UserNotFound = 2221,
ERROR_ACCESS_DENIED = 5,
ERROR_NOT_ENOUGH_MEMORY = 8,
ERROR_INVALID_PARAMETER = 87,
ERROR_INVALID_NAME = 123,
ERROR_INVALID_LEVEL = 124,
ERROR_MORE_DATA = 234,
ERROR_SESSION_CREDENTIAL_CONFLICT = 1219
}
[StructLayoutAttribute(LayoutKind.Sequential)]
public struct _SHARE_INFO_0
{
[MarshalAsAttribute(UnmanagedType.LPWStr)]
public string shi0_netname;
}
public static void EnumNetShares(string remoteMachineName)
{
StringBuilder serverName = new StringBuilder(remoteMachineName);
int level = 0;
IntPtr bufPtr = IntPtr.Zero;
uint prefMaxLen = 0xFFFFFFFF;
int entriesRead = 0;
int totalEntries = 0;
int resumeHandle = 0;
int structSize = Marshal.SizeOf(typeof(_SHARE_INFO_0));
NET_API_STATUS result = NetShareEnum(serverName, level, ref bufPtr, prefMaxLen, ref entriesRead, ref totalEntries, ref resumeHandle);
if (result == NET_API_STATUS.NERR_Success)
{
IntPtr current = bufPtr;
for (int i = 0; i < entriesRead; i++)
{
_SHARE_INFO_0 shareInfo = (_SHARE_INFO_0)Marshal.PtrToStructure(current, typeof(_SHARE_INFO_0));
Console.WriteLine(shareInfo.shi0_netname);
current = new IntPtr(current.ToInt32() + structSize);
}
}
else if (result == NET_API_STATUS.ERROR_MORE_DATA)
{
NetApiBufferFree(bufPtr);
}
else
{
// Something else.
}
}
#endregion
#region Get remote share folder name, use WMI
private static void DisplayShareFolders(string computerName, string userName, string password)
{
string queryStr = "select * from Win32_Share";
ConnectionOptions co = new ConnectionOptions();
co.Username = userName;
co.Password = password;
ManagementScope ms = new ManagementScope(string.Format(@"\\{0}\root\cimv2", computerName), co);
ms.Connect();
if (ms.IsConnected)
{
ObjectQuery query = new ObjectQuery(queryStr);
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(ms, query))
{
using (ManagementObjectCollection searchResult = searcher.Get())
{
foreach (ManagementObject mo in searchResult)
{
foreach (PropertyData property in mo.Properties)
{
Console.WriteLine("Name:{0}\tPath:{1}", mo.Properties["Name"].Value.ToString(), mo.Properties["Path"].Value.ToString());
}
}
}
}
}
}
#endregion
}
}