You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NetShareEnum C++调用始终返回ACCESS_DENIED(0x05)错误的排查求助

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 08:47:57