在Windows上枚举具有低权限的共享文件夹

时间:2010-05-04 12:17:18

标签: c++ windows shared-directory

3 个答案:

答案 0 :(得分:0)

听起来你正在为范围指定RESOURCE_GLOBALNET,但如果没有看到你的代码就很难分辨出错误。

如果不知道你尝试了什么以及你得到了什么,很难提供帮助。例如,您期望的是什么本地名称以及返回的内容?您是否使用SHARE_INFO_503尝试NetShareEnum?

答案 1 :(得分:0)

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

答案 2 :(得分:0)

如果你知道本地路径是什么,你可以通过测试来强制它:( TODO:make everything 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);
}