20. FAQ o Win API |
Q> How to learn what users is on mine (or not mine) the machine?
A>
#define STRICT
#include <windows.h>
#include <lm.h>
#include <iostream.h>
#include <tchar.h>
void UserEnum ()
{
BOOL keepGoing = TRUE;
DWORD entriesRead, totalEntries;
USER_INFO_2 * pInfo = NULL;
DWORD resumeHandle = 0;//must be 0 to start with
char nameBuf [UNLEN + 1];//constants defined in LMCONS.H
char commentBuf [MAXCOMMENTSZ + 1];
WCHAR serverName [100];
lstrcpyW (serverName, L "\\\\PDC");
while (keepGoing)
{
NET_API_STATUS ret = NetUserEnum (
serverName,
2,
0,
(LPBYTE *) &pInfo,//Important: ADDRESS of POINTER
sizeof (USER_INFO_2) * 100,//requested buffer size;
&entriesRead,
&totalEntries,
&resumeHandle);
keepGoing = (ret == ERROR_MORE_DATA);
if (ret == 0 || ret == ERROR_MORE_DATA)
{
DWORD i;
for (i = 0; i <entriesRead; i ++)
{
//Note that strings in the INFO structures
//will ALWAYS be Unicode, regardless of
//your settings! Even though they're declared
//as LPTSTR, they're always LPWSTR.
//I'm compiling for non-Unicode, so I
//convert them to ANSI strings...
//Check for NULL pointers in the INFO structure
LPWSTR pName = (LPWSTR) pInfo [i].usri2_name;
LPWSTR pComm = (LPWSTR) pInfo [i].usri2_comment;
if (pName == NULL)
{
lstrcpy (nameBuf, "(no name!)");
}
else if (lstrlenW (pName) == 0)
{
lstrcpy (nameBuf, "(empty name!)");
}
else
{
WideCharToMultiByte (CP_OEMCP, 0,
pName,-1,
nameBuf, UNLEN,
NULL, NULL);
}
if (pComm == NULL)
{
lstrcpy (commentBuf, "(no comment!)");
}
else if (lstrlenW (pComm) == 0)
{
lstrcpy (commentBuf, "(empty comment!)");
}
else
{
WideCharToMultiByte (CP_OEMCP, 0,
pComm,-1,
commentBuf, MAXCOMMENTSZ,
NULL, NULL);
}
cout <<nameBuf <<":" <<commentBuf <<endl;
}
}
else
{
cout <<"NetUserEnum error" <<ret <<endl;
}
if (pInfo)
{
NetApiBufferFree (pInfo);
pInfo = NULL;
}
}
}
|
2000 (c) DM