2

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

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

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

我一直在尝试使用WNetOpenEnumand ,WNetEnumResource但我似乎也没有为共享取回本地名称。AFAICS 它仅从外部角度列举股份。

因此,我想就我哪里出错的地方寻求帮助WNetEnumResource,或者就另一种方法提出建议。任何建议都非常感谢。

4

2 回答 2

0

听起来您正在指定RESOURCE_GLOBALNET范围,但是如果不查看您的代码,就很难判断出了什么问题。

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

于 2010-05-04T12:25:01.000 回答
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);
}
于 2016-03-25T17:38:02.023 回答