2

C++ (VS2008) を使用して、現在のマシン上のすべての共有フォルダーを列挙し、ローカル名とリモート名を取得または構築できる必要があります。

これを使用NetShareEnumしてかなり成功していますが、権限の低いユーザー アカウントで実行する必要があるという問題に遭遇しました。

を使用してローカル パスをNetShareEnum取得するには、少なくともSHARE_INFO_2構造を取得する必要がありますが、それには「管理者、パワー ユーザー、印刷オペレーター、またはサーバー オペレーターのグループ メンバーシップ」が必要です。

WNetOpenEnum代わりにandを使用しようとしましたがWNetEnumResource、共有のローカル名も取得していないようです。AFAICSでは、外部の観点からのみ株式を列挙しています。

そのため、私がどこで間違っているWNetEnumResourceのか、またはこれを行う別の方法についての提案が必要です。どんな提案でも大歓迎です。

4

2 に答える 2

0

スコープを指定しているように聞こえますがRESOURCE_GLOBALNET、コードを見ずに何が問題なのかを判断するのは困難です。

何を試し、何を得たかを知らずに助けることは困難です。たとえば、期待しているローカル名と返されるものは何ですか? SHARE_INFO_503 で NetShareEnum を試しましたか?

于 2010-05-04T12:25:01.000 に答える
0

ローカル パスが何かわかっている場合は、テストして力ずくで実行できます: (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);
}
于 2016-03-25T17:38:02.023 に答える