枚举LAN中具有Windows操作系统的计算机
Enumerate machine with Windows OS in LAN
我想枚举工作组中网络中所有基于Windows的机器。为此,我使用NetApi32.dll函数。在我的网络中,我安装了windows、mac和linux操作系统。我们如何才能只筛选出Windows机器。下面给出的是我正在使用的代码。如果我犯了任何错误,或者有没有其他方法可以实现,请评论。
BOOLEAN
LocalEnumServers(const WCHAR *pcwszDomainName) {
DWORD dwCount;
DWORD dwLevel = 101;
NET_API_STATUS Status;
HRESULT hResult = S_OK;
DWORD dwEntriesRead = 0;
BOOLEAN bResult = FALSE;
DWORD dwTotalEntries = 0;
DWORD dwResumeHandle = 0;
LPSERVER_INFO_101 pTmpBuf;
LPSERVER_INFO_101 pBuf = NULL;
TCHAR szOSName[_MAX_PATH] = _T("");
DWORD dwServerType = SV_TYPE_SERVER;
DWORD dwPrefMaxLen = MAX_PREFERRED_LENGTH;
if (NULL == pcwszDomainName)
{
return FALSE;
}
pBuf = NULL;
Status = NetServerEnum(
NULL,
dwLevel,
(LPBYTE *)&pBuf,
dwPrefMaxLen,
&dwEntriesRead,
&dwTotalEntries,
dwServerType,
/*(LPCSTR)*/pcwszDomainName,
&dwResumeHandle
);
if ((NERR_Success == Status || Status == ERROR_MORE_DATA) && pBuf != NULL) {
pTmpBuf = (SERVER_INFO_101 *)pBuf;
for (dwCount = 0; dwCount < dwEntriesRead; dwCount++) {
wprintf(L"Server name = %15s, Server type = 0x%08X, Verson = (%u:%u), Comment = %sn", pTmpBuf[dwCount].sv101_name, pTmpBuf[dwCount].sv101_type, pTmpBuf[dwCount].sv101_version_major & MAJOR_VERSION_MASK, pTmpBuf[dwCount].sv101_version_minor, pTmpBuf[dwCount].sv101_comment);
//wprintf(L"Server name -> %s, Server type -> 0x%X, Platform ID -> 0x%X, Verson -> (%u:%u)n", pTmpBuf[dwCount].sv101_name, pTmpBuf[dwCount].sv101_type, pTmpBuf[dwCount].sv101_platform_id, pTmpBuf[dwCount].sv101_version_major & MAJOR_VERSION_MASK, pTmpBuf[dwCount].sv101_version_minor);
if (
SV_TYPE_WINDOWS != (SV_TYPE_WINDOWS & pTmpBuf[dwCount].sv101_type) &&
SV_TYPE_SERVER_NT != (SV_TYPE_SERVER_NT & pTmpBuf[dwCount].sv101_type) &&
SV_TYPE_NT != (SV_TYPE_NT & pTmpBuf[dwCount].sv101_type)
) {
wprintf(L"Flag check (%u, %u, %u)n", SV_TYPE_WINDOWS != (SV_TYPE_WINDOWS & pTmpBuf[dwCount].sv101_type),
SV_TYPE_SERVER_NT != (SV_TYPE_SERVER_NT & pTmpBuf[dwCount].sv101_type),
SV_TYPE_NT != (SV_TYPE_NT & pTmpBuf[dwCount].sv101_type));
continue;
}
}
}
else {
wprintf(L"NetServerEnum failed (Err -> %u)n", GetLastError());
}
if (pBuf != NULL) {
NetApiBufferFree(pBuf);
}
return TRUE;
}
int _tmain(int argc, _TCHAR* argv[]) {
LocalEnumServers(L"workgroup");
return 0;
}
对于UNIX类型的系统,您可以添加if条件,并使用UNIX系统和sv类型u r geting的预定义宏执行and。但对于MAC来说,这是一个问题。
相关文章:
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- 在C++中设置基于操作系统的文件路径
- 为什么我能够为阵列分配比计算机实际拥有的内存更多的内存
- 我可以使用任何好的逻辑来阻止计算机将 O 放在井字游戏中的现有 X 上
- C++ 计算机猜测用户数量在 7 次猜测以内
- 如何在工厂方法中返回指向基于基础操作系统的派生类的有效指针
- C++为什么我的编译器成功了,但我的计算机给出了调试错误?
- WideCharToMultiByte在英语操作系统上不转换日语
- 在 c++ 中连接字符串和整数,以便在 C++ 11 不支持计算机的情况下读取多个文件
- 如何在 Windows 操作系统中在 geany 中安装插件
- 我的 SDL2 程序需要哪些二进制文件,以便它在另一台未安装 SDL2 的计算机中工作
- 操作系统平台支持宏和提升库
- 从utsname找出Linux操作系统名称
- 将非常大的 int 转换为双倍,在某些计算机上会损失精度
- 如何在个人计算机和群集 (c++) 上生成相同的随机数
- 系统错误:程序无法启动,因为您的计算机中缺少MSVCP140D.DLL。尝试重新安装该程序以解决此问题
- 为什么 free() 函数不将内存返回给操作系统?
- 枚举LAN中具有Windows操作系统的计算机
- 如何用c++语言显示计算机的操作系统?