Перечислите машину с ОС Windows в локальной сети

Я хочу перечислить все машины на базе 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 = %s\n", 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;
}

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]