2010-05-04 165 views
2

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

我们一直在使用NetShareEnum这个相当成功,但遇到了问题,我们需要使用低权限的用户帐户运行。

要获得使用NetShareEnum我们需要检索至少SHARE_INFO_2结构的本地路径 - 但是这需要“管理员,高级用户,打印操作员或服务器操作员组成员”。

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

因此,我要么喜欢帮助我在哪里出错WNetEnumResource,或者对另一种方式的建议。任何建议,非常感谢。

回答

0

这听起来像你指定RESOURCE_GLOBALNET的范围,但很难说没有看到你的代码有什么问题。

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

+0

我尝试了WNetOpenEnum的第一个参数的标志的所有组合,但只有RESOURCE_GLOBALNET似乎让我枚举共享。如果你知道不同,我会很乐意尝试。我刚刚使用http://msdn.microsoft.com/en-us/library/aa385341(VS.85).aspx中的示例代码,并以几种不同的方式破解了它 - 其中没有一个非常高效,所以我没有发布代码。 – philsquared 2010-05-04 12:35:19

+0

您链接的示例代码是递归的,因此它枚举整个网络。你是说你不知道如何让它不递归?只需传入与本地计算机相对应的NETRESOURCE即可。 – Gabe 2010-05-04 12:53:43

+0

从我所看到的那里没有办法在本地机器上获得NETRESOURCE而没有可能迭代整个网络来获得它 - 是否有快捷方式? – philsquared 2010-05-04 13:19:18

0

如果你有一个想法的本地路径是什么,你可以蛮力它通过测试:(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); 
}