如何解决没有 SMBv1 的 WINAPI 网络发现
我需要获取本地网络上可用共享文件夹的列表,它们在文件资源管理器的“网络”选项卡中的显示方式。早些时候,我使用 NetServerEnum/NetShareEnum 函数的组合来获取它,但它们使用的是 SMBv1 协议,现在 Windows 中默认禁用该协议,所以现在我从 NetServerEnum 收到错误 1231。但是文件资源管理器仍然可以获取此列表。我尝试使用 Process Monitor 来确定它使用哪个 API,但失败了。那么,有没有办法在不使用需要 SMBv1 的 API 的情况下获取本地网络中可用共享文件夹的列表?
解决方法
您可以使用windows shell api并使用FOLDERID_NetworkFolder
来获取“网络”的KNOWNFOLDERID。
以下示例可以获取“网络”文件夹中的文件夹、非文件夹和隐藏项。
#include <windows.h>
#include <Shobjidl.h>
#include <Shlobj.h>
#include <iostream>
void wmain(int argc,TCHAR* lpszArgv[])
{
IShellItem* pShellItem;
IEnumShellItems* pShellEnum = NULL;
HRESULT hr = S_OK;
hr = CoInitialize(NULL);
if (FAILED(hr))
{
printf("CoInitialize error,%x\n",hr);
return;
}
hr = SHGetKnownFolderItem(FOLDERID_NetworkFolder,KF_FLAG_DEFAULT,NULL,IID_PPV_ARGS(&pShellItem));
if (FAILED(hr))
{
printf("SHGetKnownFolderItem error,hr);
return;
}
hr = pShellItem->BindToHandler(nullptr,BHID_EnumItems,IID_PPV_ARGS(&pShellEnum));
if (FAILED(hr))
{
printf("BindToHandler error,hr);
return;
}
do {
IShellItem* pItem;
LPWSTR szName = NULL;
hr = pShellEnum->Next(1,&pItem,nullptr);
if (hr == S_OK && pItem)
{
HRESULT hres = pItem->GetDisplayName(SIGDN_NORMALDISPLAY,&szName);
std::wcout << szName << std::endl;
CoTaskMemFree(szName);
}
} while (hr == S_OK);
CoUninitialize();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。