日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Win32 调用netapi32实现用户枚举

發(fā)布時間:2025/4/14 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Win32 调用netapi32实现用户枚举 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

netapi32.dll是Windows網(wǎng)絡(luò)應(yīng)用程序接口,用于支持訪問微軟網(wǎng)絡(luò)。

先看代碼;

#include <windows.h> #include <assert.h> #include <lm.h> #include "resource.h"//#pragma comment(lib,"Y:\\xxx\\cfreePrj\\userdemo2\\mingw5\\NETAPI32.LIB")LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); int ListUsers(LPWSTR, HDC );HINSTANCE hInst; TCHAR szClassName[] = TEXT("userDemo"); char errBuffer[100]; char szBuffer[100];int WINAPI WinMain (HINSTANCE hThisInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nFunsterStil) {HWND hwnd;MSG messages;WNDCLASSEX wincl;hInst = hThisInstance;wincl.hInstance = hThisInstance;wincl.lpszClassName = szClassName;wincl.lpfnWndProc = WindowProcedure;wincl.style = CS_DBLCLKS;wincl.cbSize = sizeof (WNDCLASSEX);wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);wincl.hCursor = LoadCursor (NULL, IDC_ARROW);wincl.lpszMenuName = MAKEINTRESOURCE (IDC_USERDEMO1);wincl.cbClsExtra = 0;wincl.cbWndExtra = 0;wincl.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);if (!RegisterClassEx (&wincl))return 0;hwnd = CreateWindowEx (0,szClassName,TEXT("userDemo"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,200,200,HWND_DESKTOP,NULL,hThisInstance,NULL);ShowWindow (hwnd, nFunsterStil);while (GetMessage (&messages, NULL, 0, 0)){TranslateMessage(&messages);DispatchMessage(&messages);}return messages.wParam; }LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {PAINTSTRUCT ps;HDC hdc;RECT rt;int ret;switch (message){case WM_COMMAND:switch (LOWORD(wParam)){case IDM_ABOUT:MessageBox (hwnd, TEXT ("userDemo v1.0\nCopyright (C) 2020\n by bo"),TEXT ("userDemo"), MB_OK | MB_ICONINFORMATION);break;case IDM_EXIT:DestroyWindow(hwnd);break;default:return DefWindowProc(hwnd, message, wParam, lParam); }break;case WM_PAINT:hdc = BeginPaint(hwnd, &ps); GetClientRect(hwnd, &rt); ret=ListUsers(NULL, hdc); EndPaint(hwnd, &ps);break;case WM_DESTROY:PostQuitMessage (0);break;default:return DefWindowProc (hwnd, message, wParam, lParam);}return 0; }/************************************* * 功能 列舉用戶 * 參數(shù) szServerName,主機名,如果為本機設(shè)置為NULL **************************************/ int ListUsers(LPWSTR pszServerName, HDC hdc) {LPUSER_INFO_0 pBuf = NULL;LPUSER_INFO_0 pTmpBuf;DWORD dwLevel = 0;DWORD dwPrefMaxLen = MAX_PREFERRED_LENGTH;DWORD dwEntriesRead = 0;DWORD dwTotalEntries = 0;DWORD dwResumeHandle = 0;DWORD i;DWORD dwTotalCount = 0;NET_API_STATUS nStatus;//pBuf=(LPUSER_INFO_0)VirtualAlloc(NULL,MAX_PREFERRED_LENGTH,MEM_COMMIT|MEM_RESERVE,PAGE_READWRITE);// 循環(huán),直到可以成功調(diào)用 NetUserEnumdo {// 調(diào)用NetUserEnum函數(shù)nStatus = NetUserEnum(pszServerName,dwLevel,// 這里設(shè)置為0,使用 LPUSER_INFO_0 返回結(jié)果FILTER_NORMAL_ACCOUNT, // 只列舉正常類型的用戶(LPBYTE*)&pBuf,// LPUSER_INFO_0 保存返回結(jié)果// MAX_PREFERRED_LENGTH,內(nèi)存由API分配,需要在之后調(diào)用NetApiBufferFree釋放dwPrefMaxLen,&dwEntriesRead,// 讀了的 Entries&dwTotalEntries,// 一共的 Entries&dwResumeHandle);if ((nStatus == NERR_Success) || (nStatus == ERROR_MORE_DATA)){if ((pTmpBuf = pBuf) != NULL){for (i = 0; (i < dwEntriesRead); i++)// 循環(huán)讀取用戶信息{assert(pTmpBuf != NULL);if (pTmpBuf == NULL){MessageBox(NULL,"An access violation has occurred\n",TEXT("列舉用戶"),0);break;}// 輸出wsprintf(szBuffer, "%s", pTmpBuf->usri0_name);TextOut(hdc, 20, 20+i*30, szBuffer, lstrlen(szBuffer));// 下一個pTmpBuf++;dwTotalCount++;}}}elsewsprintf(errBuffer, "A system error has occurred: %d\n",nStatus);MessageBox(NULL,errBuffer,TEXT("列舉用戶"),0);// 釋放內(nèi)存if (pBuf != NULL){NetApiBufferFree(pBuf);pBuf = NULL;}}while (nStatus == ERROR_MORE_DATA); // end do// 釋放內(nèi)存if (pBuf != NULL)NetApiBufferFree(pBuf);wsprintf(szBuffer, "總數(shù) of users:%d\n\n",dwTotalCount);MessageBox(NULL,szBuffer,TEXT("列舉用戶"),0);return 0; }

運行;

獲取到2個用戶;只輸出了用戶名第一個字母;

pBuf可能要預(yù)先分配內(nèi)存;

命令行用 net user 查看,用戶如下;代碼還有問題,有時間再看;

在CFree里,工程設(shè)置,如下圖,找到NETAPI32.lib,加入進(jìn)來;然后把路徑名和文件后綴,都去掉;才能構(gòu)建成功;

如果包含lib后綴名;會報類似如下;

[Error] C:\PROGRA~2\C-FREE~1\mingw\bin\ld.exe: cannot find -lNETAPI32.lib

這個好像是g++編譯器,不太認(rèn)識lib文件;

?

還不清楚lib和dll是拷貝到源碼或者構(gòu)建目錄,都拷一下;構(gòu)建出exe的目錄是mingw5;

沒有netapi32.dll和lib的話,網(wǎng)上單獨下;

為了在列舉函數(shù)里面在窗口上輸出,傳遞 HDC hdc 參數(shù)過來;

添加了資源后如下;

resource.h和.rc文件文件類似此文;

https://blog.csdn.net/bcbobo21cn/article/details/106143664

?

《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的Win32 调用netapi32实现用户枚举的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。