以低权限枚举Windows上的共享文件夹

使用C ++(VS2008)我需要能够枚举当前机器上的所有共享文件夹,并获取或构build本地和远程名称。

我们一直在使用NetShareEnum ,但是却遇到了一个问题,那就是我们需要使用低权限的用户帐号来运行。

要使用NetShareEnum获取本地path,我们需要至less检索SHARE_INFO_2结构 – 但需要“ pipe理员,超级用户,打印操作员或服务器操作员组成员资格 ”。

我一直试图使用WNetOpenEnumWNetEnumResource来代替,但我似乎并没有得到这个股份的本地名称。 AFAICS仅从外部angular度列举了股票。

所以我要么喜欢WNetEnumResource出错的WNetEnumResource ,要么提供另一种方式的build议。 任何build议,非常感谢。

这听起来像是为作用域指定了RESOURCE_GLOBALNET ,但是在没有看到代码的情况下很难说出错。

如果不知道你试过的是什么,以及你回来了什么,这很难提供帮助。 例如,你期待什么地方名称,什么是返回? 您是否使用SHARE_INFO_503尝试了NetShareEnum?

在这个链接中你可以找到一个例子http://msdn.microsoft.com/en-us/library/aa385334(v=VS.85).aspx

如果你有一个想法是什么本地路径,你可以通过测试蛮力:(TODO:使一切Unicode)

 // Helper function to make a name unique. std::string computername() { static std::string name = []() { WCHAR buf[MAX_COMPUTERNAME_LENGTH]; DWORD len = MAX_COMPUTERNAME_LENGTH; GetComputerNameEx(ComputerNameNetBIOS, buf, &len); return std::string(buf, buf + len); }(); return name; } int main() { std::string dir = "C:\\FindThisShare\\"; // First, create marker std::string testfile = computername() + " 038D2B86-7459-417B-9179-90CEECC6EC9D.txt"; std::ofstream test(dir + testfile); test << "This directory holds files from " << computername() << std::endl; test.close(); // Next, find the UNC path holding it. BYTE* buf; DWORD numEntries; NetShareEnum(nullptr, 1, &buf, MAX_PREFERRED_LENGTH, &numEntries, &numEntries, nullptr); auto data = reinterpret_cast<SHARE_INFO_1*>(buf); std::string retval; for (int i = 0; i != numEntries; ++i) { auto const& entry = data[i]; std::wstring tmp(entry.shi1_netname); std::string share(tmp.begin(), tmp.end()); std::string uncdir = "\\\\" + computername() + "\\" + share + "\\"; if (PathFileExistsA((uncdir + testfile).c_str())) { printf("Exists"); } } remove((dir + testfile).c_str()); NetApiBufferFree(buf); }