NetShareEnum C++调用始终返回ACCESS_DENIED(0x05)错误的排查求助
我现在在做一个从SMB服务器获取共享列表的个人项目,之前查MSDN文档后决定用NetShareEnum API,但调用它总是返回0x05(ACCESS_DENIED)错误。我谷歌了很久,找到一个C#实现相同功能的项目,那边的代码跑起来完全没问题,这让我特别困惑,已经卡了好几个小时,实在找不到问题出在哪,希望大家能帮我分析分析!
以下是我写的C++代码:
#include <windows.h> #include <lm.h> #include <iostream> #pragma comment(lib, "Netapi32.lib") int main() { LPBYTE buffer = nullptr; DWORD entriesRead = 0, totalEntries = 0, resumeHandle = 0; NET_API_STATUS status; // NULL means local machine; use L"\\\\RemoteMachine" for remote status = NetShareEnum("\\\\ServerAddress", 1, &buffer, MAX_PREFERRED_LENGTH, &entriesRead, &totalEntries, &resumeHandle); if (status == NERR_Success || status == ERROR_MORE_DATA) { SHARE_INFO_1* shareInfo = reinterpret_cast<SHARE_INFO_1*>(buffer); for (DWORD i = 0; i < entriesRead; ++i) { std::wcout << L"Share Name: " << shareInfo[i].shi1_netname << std::endl; std::wcout << L"Comment: " << (shareInfo[i].shi1_remark ? shareInfo[i].shi1_remark : L"(none)") << std::endl; std::wcout << L"-----------------------------" << std::endl; } } else { std::wcerr << L"NetShareEnum failed with error: " << status << std::endl; } if (buffer) { NetApiBufferFree(buffer); } return 0; }
这是我找到的能正常运行的C#代码(已做部分修改):
[DllImport("Netapi32.dll", CharSet = CharSet.Unicode)] private static extern int NetShareEnum(StringBuilder ServerName, int level, ref IntPtr bufPtr, uint prefmaxlen, ref int entriesread, ref int totalentries, ref int resume_handle); public static byte[] ToByteArray(LDAP_BERVAL berval) { byte[] bytes = new byte[berval.bv_len]; Marshal.Copy(berval.bv_val, bytes, 0, (int)berval.bv_len); return bytes; } public static SHARE_INFO_1[] EnumNetShares(string Server) { List<SHARE_INFO_1> ShareInfos = new List<SHARE_INFO_1>(); int entriesread = 0; int totalentries = 0; int resume_handle = 0; int nStructSize = Marshal.SizeOf(typeof(SHARE_INFO_1)); IntPtr bufPtr = IntPtr.Zero; StringBuilder server = new StringBuilder(Server); int ret = NetShareEnum(server, 1, ref bufPtr, MAX_PREFERRED_LENGTH, ref entriesread, ref totalentries, ref resume_handle); if (ret == NERR_Success) { IntPtr currentPtr = bufPtr; for (int i = 0; i < entriesread; i++) { SHARE_INFO_1 shi1 = (SHARE_INFO_1)Marshal.PtrToStructure(currentPtr, typeof(SHARE_INFO_1)); ShareInfos.Add(shi1); currentPtr += nStructSize; } NetApiBufferFree(bufPtr); return ShareInfos.ToArray(); } else { ShareInfos.Add(new SHARE_INFO_1("ERROR=" + ret.ToString(), 10, string.Empty)); return ShareInfos.ToArray(); } } static void Main(string[] args) { string dnsHostName = "ServerName"; SHARE_INFO_1[] shares = EnumNetShares(dnsHostName); Console.WriteLine($"[+] Identified network shares on: {dnsHostName}"); foreach (SHARE_INFO_1 share in shares) { String sharename = share.ToString(); string[] excluded_shares = { "IPC$", "ADMIN$", "C$", "SYSVOL", "NETLOGON" }; if (!excluded_shares.Contains(sharename)) { Console.WriteLine($"\t\\\\{dnsHostName}\\{sharename}"); } } }
内容来源于stack exchange
相关产品推荐
相关产品推荐

