Перечислять общие папки в Windows с низкими привилегиями - PullRequest
2 голосов
/ 04 мая 2010

Использование C ++ (VS2008) Мне нужно иметь возможность перечислять все общие папки на текущем компьютере и получать или создавать локальные и удаленные имена.

Мы довольно успешно использовали NetShareEnum, но столкнулись с проблемой, когда нам нужно работать с учетной записью пользователя с низкими привилегиями.

Чтобы получить локальный путь, используя NetShareEnum, нам нужно получить как минимум SHARE_INFO_2 структур - но для этого требуется " Администратор, Опытный пользователь, Оператор печати или Член группы оператора сервера ».

Я пытался использовать WNetOpenEnum и WNetEnumResource вместо этого, но я, похоже, не получаю местное имя для этого также для акций. AFAICS перечисляет акции только с внешней точки зрения.

Так что я хотел бы либо получить справку о том, где я ошибаюсь с WNetEnumResource, либо предложить другой способ сделать это. Любые предложения приветствуются.

Ответы [ 3 ]

0 голосов
/ 25 сентября 2011

в этой ссылке вы можете найти пример http://msdn.microsoft.com/en-us/library/aa385334(v=VS.85).aspx

0 голосов
/ 25 марта 2016

Если у вас есть представление о том, каким будет локальный путь, вы можете перебрать его, протестировав: (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);
}
0 голосов
/ 04 мая 2010

Звучит так, как будто вы указываете RESOURCE_GLOBALNET для области видимости, но трудно понять, что не так, не видя ваш код.

Трудно помочь, не зная, что ты попробовал и что получил. Например, какое локальное имя вы ожидаете и что возвращается? Вы пробовали NetShareEnum с SHARE_INFO_503?

...