.Net Framework には、ネットワーク上のコンピュータの共有フォルダの一覧を作成するための機能がないため、Windows API を使う必要があった。

[DllImport("Netapi32.dll", CharSet = CharSet.Unicode)]
private static extern int NetShareEnum(
	String ServerName,
	int level, 
	ref IntPtr bufPtr,
	uint prefmaxlen,
	ref int entriesread,
	ref int totalentries,
	ref int resume_handle
);

[DllImport("Netapi32.dll", SetLastError = true)]
static extern int NetApiBufferFree(IntPtr Buffer);

public enum SHARE_TYPE : uint
{
	STYPE_DISKTREE = 0,	
	STYPE_PRINTQ = 1,
	STYPE_DEVICE = 2,
	STYPE_IPC = 3,
	STYPE_CLUSTER_FS = 0x02000000,
	STYPE_CLUSTER_SOFS = 0x04000000,
	STYPE_CLUSTER_DFS = 0x08000000,
	STYPE_TEMPORARY = 0x40000000,
	STYPE_SPECIAL = 0x80000000,
}

public struct SHARE_INFO_2
{
	[MarshalAs(UnmanagedType.LPWStr)]
	public string shi2_netname;
	public SHARE_TYPE shi2_type;
	[MarshalAs(UnmanagedType.LPWStr)]
	public string shi2_remark;
	public Int32 shi2_permissions;
	public Int32 shi2_max_uses;
	public Int32 shi2_current_uses;
	[MarshalAs(UnmanagedType.LPWStr)]
	public string shi2_path;
	[MarshalAs(UnmanagedType.LPWStr)]
	public string shi2_passwd;
}

private List<string> getSharedDirectories(string servername)
{
	var sharedDirectories = new List<string>();

	int level = 2;
	uint prefmaxlen = 368880;
	int entriesread = 0;
	int totalentries = 0;
	int resume_handle = 0;
	IntPtr bufPtr = IntPtr.Zero;

	int ret = NetShareEnum(servername, level, ref bufPtr, prefmaxlen, ref entriesread, ref totalentries, ref resume_handle);
	if (ret != 0)
	{
		return sharedDirectories;
	}

	IntPtr currentPtr = bufPtr;
	int nStructSize = Marshal.SizeOf(typeof(SHARE_INFO_2));

	for (int i = 0; i < entriesread; i++)
	{
		SHARE_INFO_2 shio = (SHARE_INFO_2)Marshal.PtrToStructure(currentPtr, typeof(SHARE_INFO_2));
		if (shio.shi2_type == SHARE_TYPE.STYPE_DISKTREE)
		{
			// Disk driveのみ追加
			sharedDirectories.Add(@"\\" + path + @"\" + shio.shi2_netname + @"\");
		}
		currentPtr = new IntPtr(currentPtr.ToInt32() + nStructSize);
	}

	NetApiBufferFree(bufPtr);

	return sharedDirectories;
}

以上です。