【问题标题】:Enumerate shared folders on Windows with low privileges以低权限枚举 Windows 上的共享文件夹
【发布时间】:2010-05-04 12:17:18
【问题描述】:

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

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

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

我一直在尝试使用 WNetOpenEnumWNetEnumResource 代替,但我似乎也没有为共享取回本地名称。 AFAICS 它只从外部角度列举份额。

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

【问题讨论】:

    标签: c++ windows shared-directory


    【解决方案1】:

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

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

    【讨论】:

    • 我尝试了 WNetOpenEnum 的第一个参数的所有标志组合,但似乎只有 RESOURCE_GLOBALNET 允许我枚举共享。如果您知道不同,我很乐意尝试一下。我刚刚使用了来自 msdn.microsoft.com/en-us/library/aa385341(VS.85).aspx 的示例代码,并以几种不同的方式对其进行了破解 - 没有一种方法非常有效,所以我没有发布代码。
    • 您链接到的示例代码是递归的,因此它会枚举整个网络。你是说你不知道如何使它不递归?传入本机对应的NETRESOURCE即可。
    • 据我所见,没有办法在不遍历整个网络的情况下获取本地计算机的 NETRESOURCE - 是否有捷径?
    • TBH 我没有花太多时间看这个,因为我更关心本地名称无论如何都会返回为 NULL 的事实。有什么想法吗?我可以再看一下“全网”部分。
    • 好的,我已经编辑了我的问题以关注“本地名称”部分。我仍然不确定如何在不必先枚举其他机器的情况下到达本地机器(当然,我不必枚举这些机器上的共享。
    【解决方案2】:

    如果您知道本地路径是什么,您可以通过测试来暴力破解它:(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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-22
      • 2011-03-12
      • 2010-09-12
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多