Windows 获取当前系统所有共享目录及名称

1. 命令行方式

net share命令

在这里插入图片描述

2. Win32Api NetShareEnum方式

MSDN链接: https://docs.microsoft.com/zh-cn/windows/desktop/api/lmshare/nf-lmshare-netshareenum

#include <lm.h>
#include <vector>
#include <tchar.h>
#pragma comment(lib, "Netapi32.lib")

typedef struct
{
	DWORD dwType;
	TCHAR szShareName[512];
	TCHAR szSharePath[512];
} STSHAREDICPAIR, *PSTSHAREDICPAIR;

BOOL GetShareDir(_Out_ std::vector<STSHAREDICPAIR> &vecSharePaitList)
{

	LPSHARE_INFO_2 BufPtr;
	NET_API_STATUS res = NERR_Success;
	DWORD dwCount = 0;
	DWORD dwTotal = 0;
	DWORD dwResumeHandle = 0;

	do
	{
		res = NetShareEnum(NULL, 2, (LPBYTE*)& BufPtr, MAX_PREFERRED_LENGTH, &dwCount, &dwTotal, &dwResumeHandle);
		if (ERROR_SUCCESS != res && ERROR_MORE_DATA != res)
		{
			break;
		}

		for (DWORD dwIndex = 0; dwIndex < dwCount; ++dwIndex)
		{
			STSHAREDICPAIR stShareDir = { 0 };
			_tcscpy_s(stShareDir.szShareName, 512, BufPtr[dwIndex].shi2_netname);
			_tcscpy_s(stShareDir.szSharePath, 512, BufPtr[dwIndex].shi2_path);
			stShareDir.dwType = BufPtr[dwIndex].shi2_type;
			vecSharePaitList.push_back(stShareDir);
		}

		NetApiBufferFree(BufPtr);

	} while (ERROR_MORE_DATA == res);
	
	return ERROR_SUCCESS == res;
}


int _tmain(_In_ int _Argc, _In_count_(_Argc) _Pre_z_ TCHAR ** _Argv, _In_z_ TCHAR ** _Env)
{
	std::vector<STSHAREDICPAIR> vecShareList;
	BOOL bError = GetShareDir(vecShareList);
	if (FALSE == bError)
	{
		//获取失败
		return -1;
	}
	
	//获取成功
	for (auto iter = vecShareList.begin(); iter != vecShareList.end(); ++iter)
	{
		_tprintf(_T("Type: %d ------ ShareName: %s ------ SharePath: %s\n"), iter->dwType, iter->szShareName, iter->szSharePath);
	}

	system("pause");
	return 0;
}

结果:

在这里插入图片描述

注意点:
  1. NetShareEnum执行一次可能拿不到所有的共享,当出现这个情况时,返回值为ERROR_MORE_DATA
  2. NetShareEnum调用拿完了所有的共享时,返回值为ERROR_SUCCESS(也就是微软文档描述的NERR_Success)
  3. NetShareEnum通过最后一个参数resume_handle来标记当前以及获取到哪些共享了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值