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;
}
结果:
注意点:
NetShareEnum
执行一次可能拿不到所有的共享,当出现这个情况时,返回值为ERROR_MORE_DATA
- 当
NetShareEnum
调用拿完了所有的共享时,返回值为ERROR_SUCCESS
(也就是微软文档描述的NERR_Success
) NetShareEnum
通过最后一个参数resume_handle
来标记当前以及获取到哪些共享了