private static List<ShareInfo> GetShareInfoNT(string serverName, IList<ShareType> shareTypes)
{
int level = 2;
int entriesRead, totalEntries, nRet, hResume = 0;
IntPtr pBuffer = IntPtr.Zero;
List<ShareInfo> shareInfoList = new List<ShareInfo>();
try
{
nRet = NetShareEnum(serverName, level, out pBuffer, -1, out entriesRead, out totalEntries, ref hResume);
if (nRet == ERROR_ACCESS_DENIED)
{
//Need admin for level 2, drop to level 1
level = 1;
nRet = NetShareEnum(serverName, level, out pBuffer, -1, out entriesRead, out totalEntries, ref hResume);
}
if (nRet == NO_ERROR && entriesRead > 0)
{
Type t = (level == 2) ? typeof(SHARE_INFO_2) : typeof(SHARE_INFO_1);
int offset = Marshal.SizeOf(t);
for (int i = 0, lpItem = pBuffer.ToInt32(); i < entriesRead; i++, lpItem += offset)
{
IntPtr pItem = new IntPtr(lpItem);
if (level == 1)
{
SHARE_INFO_1 shareInfo = (SHARE_INFO_1)Marshal.PtrToStructure(pItem, t);
if (shareTypes.Contains(shareInfo.ShareType))
{
shareInfoList.Add(new ShareInfo(serverName, shareInfo.NetName, string.Empty, shareInfo.ShareType, shareInfo.Remark));
}
}
else
{
SHARE_INFO_2 shareInfo = (SHARE_INFO_2)Marshal.PtrToStructure(pItem, t);
if (shareTypes.Contains(shareInfo.ShareType))
{
shareInfoList.Add(new ShareInfo(serverName, shareInfo.NetName, shareInfo.Path, shareInfo.ShareType, shareInfo.Remark));
}
}
}
}
}
finally
{
// Clean up buffer allocated by system
if (IntPtr.Zero != pBuffer)
{
NetApiBufferFree(pBuffer);
}
}
return shareInfoList;
}