Windows NT/2000/XP: Следующий пример демонстрирует, как получить информацию о текущих соединениях при помощи функции NetSessionEnum. Пример вызывает NetSessionEnum, указывая информационный уровень 10 (b>SESSION_INFO_10). #ifndef UNICODE #define UNICODE #endif
#include <stdio.h> #include <assert.h> #include <windows.h> #include <lm.h>
int wmain(int argc, wchar_t *argv[]) { LPSESSION_INFO_10 pBuf = NULL; LPSESSION_INFO_10 pTmpBuf; DWORD dwLevel = 10; DWORD dwPrefMaxLen = -1; DWORD dwEntriesRead = 0; DWORD dwTotalEntries = 0; DWORD dwResumeHandle = 0; DWORD i; DWORD dwTotalCount = 0; LPTSTR pszServerName = NULL; LPTSTR pszClientName = NULL; LPTSTR pszUserName = NULL; NET_API_STATUS nStatus; // // Проверяем аргументы командной строки. // if (argc > 4) { wprintf(L"Usage: %s [\\\\ServerName] [\\\\ClientName] [UserName]\n", argv[0]); exit(1); }
if (argc >= 2) pszServerName = argv[1];
if (argc >= 3) pszClientName = argv[2];
if (argc == 4) pszUserName = argv[3]; // // Вызываем NetSessionEnum, указывая уровень 10. // do // начало do { nStatus = NetSessionEnum(pszServerName, pszClientName, pszUserName, dwLevel, (LPBYTE*)&pBuf, dwPrefMaxLen, &dwEntriesRead, &dwTotalEntries, &dwResumeHandle); // // Если вызов функции был удачен, // if ((nStatus == NERR_Success) || (nStatus == ERROR_MORE_DATA)) { if ((pTmpBuf = pBuf) != NULL) { // // Получение результатов в цикле. // for (i = 0; (i < dwEntriesRead); i++) { assert(pTmpBuf != NULL);
if (pTmpBuf == NULL) { fprintf(stderr, "An access violation has occurred\n"); break; } // // Распечатываем полученные данные. // wprintf(L"\n\tClient: %s\n", pTmpBuf->sesi10_cname); wprintf(L"\tUser: %s\n", pTmpBuf->sesi10_username); printf("\tActive: %d\n", pTmpBuf->sesi10_time); printf("\tIdle: %d\n", pTmpBuf->sesi10_idle_time);
pTmpBuf++; dwTotalCount++; } } } // // Иначе, выводим сообщение об ошибке. // else fprintf(stderr, "A system error has occurred: %d\n", nStatus); // // Освобождаем выделенную память. // if (pBuf != NULL) { NetApiBufferFree(pBuf); pBuf = NULL; } } // // Продолжаем вызывать NetSessionEnum до тех пор пока есть ещё данные. // // while (nStatus == ERROR_MORE_DATA); // end do
// Снова проверяем выделенный буфер. // if (pBuf != NULL) NetApiBufferFree(pBuf); // // Отображаем окончательное количество сессий. // fprintf(stderr, "\nTotal of %d entries enumerated\n", dwTotalCount);
return 0; } |