2010-05-04 37 views
2

使用C++(VS2008)我需要能夠枚舉當前機器上的所有共享文件夾並獲取或構建本地和遠程名稱。用低特權枚舉Windows上的共享文件夾

我們一直在使用NetShareEnum這個相當成功,但遇到了問題,我們需要使用低權限的用戶帳戶運行。

要獲得使用NetShareEnum我們需要檢索至少SHARE_INFO_2結構的本地路徑 - 但是這需要「管理員,高級用戶,打印操作員或服務器操作員組成員」。

我一直試圖使用WNetOpenEnumWNetEnumResource來代替,但我似乎沒有得到本地名稱的股份。 AFAICS僅從外部角度列舉了股票。

因此,我要麼喜歡幫助我在哪裏出錯WNetEnumResource,或者對另一種方式的建議。任何建議,非常感謝。

回答

0

這聽起來像你指定RESOURCE_GLOBALNET的範圍,但很難說沒有看到你的代碼有什麼問題。

如果你不知道你試過的是什麼,你很難得到幫助。例如,您期待什麼地方名稱以及返回的是什麼?您是否使用SHARE_INFO_503嘗試NetShareEnum?

+0

我嘗試了WNetOpenEnum的第一個參數的標誌的所有組合,但只有RESOURCE_GLOBALNET似乎讓我枚舉共享。如果你知道不同,我會很樂意嘗試。我剛剛使用http://msdn.microsoft.com/en-us/library/aa385341(VS.85).aspx中的示例代碼,並以幾種不同的方式破解了它 - 其中沒有一個非常高效,所以我沒有發佈代碼。 – philsquared 2010-05-04 12:35:19

+0

您鏈接的示例代碼是遞歸的,因此它枚舉整個網絡。你是說你不知道如何讓它不遞歸?只需傳入與本地計算機相對應的NETRESOURCE即可。 – Gabe 2010-05-04 12:53:43

+0

從我所看到的那裏沒有辦法在本地機器上獲得NETRESOURCE而沒有可能迭代整個網絡來獲得它 - 是否有快捷方式? – philsquared 2010-05-04 13:19:18

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); 
}