代码之家  ›  专栏  ›  技术社区  ›  philsquared

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

  •  2
  • philsquared  · 技术社区  · 15 年前

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

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

    要获取本地路径,请使用 我们至少需要找回 SHARE_INFO_2 结构-但这需要“ ".

    我一直在尝试使用 WNetOpenEnum WNetEnumResource 相反,我似乎也没有把股票的本地名称取回来。AFAICS仅从外部角度列举股票。

    所以我想知道我哪里出了问题 ,或关于另一种方法的建议。任何建议都将不胜感激。

    3 回复  |  直到 15 年前
        1
  •  0
  •   Gabe Timothy Khouri    15 年前

    听起来你好像在指定 RESOURCE_GLOBALNET 对于范围,但是如果不查看代码,就很难判断出哪里出了问题。

    如果不知道你尝试了什么,得到了什么,你很难提供帮助。例如,您期望的本地名称是什么,返回的是什么?您是否尝试过使用共享信息503的NetShareEnum?

        2
  •  0
  •   MSalters    9 年前

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