枚举LAN中具有Windows操作系统的计算机

Enumerate machine with Windows OS in LAN

本文关键字:操作系统 计算机 Windows LAN 枚举      更新时间:2023-10-16

我想枚举工作组中网络中所有基于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来说,这是一个问题。

相关文章: