Red de conocimiento informático - Conocimiento del nombre de dominio - Cómo obtener la información de todos los usuarios en WINDOWS, usando C++, por favor dame ideas. Lo mejor sería tener un código de referencia.

Cómo obtener la información de todos los usuarios en WINDOWS, usando C++, por favor dame ideas. Lo mejor sería tener un código de referencia.

Utilice las funciones de la API: NetUserEnum para enumerar usuarios; NetUserGetInfo para obtener información del usuario.

La idea debería ser así.

El siguiente es el código para enumerar toda la información del usuario en la aplicación Windows Conlse (nombre de la cuenta, estado de la cuenta, si se requiere una contraseña (el juicio aquí puede ser inexacto), hora del último inicio de sesión, si la contraseña puede cambiarse, tiempo de vencimiento de la contraseña):

#include "iostream"

#include "windows.h"

#include "lm.h"

#include "assert.h"

#include "string"

#include "time.h"

usando el espacio de nombres std;

#pragma comment(lib,"netapi32.lib")

cadena Prev(DWORD n)//Permisos de cuenta

{

cambiar(n )

{

caso 0:

devolver "Invitado";

romper;

caso 1:

devuelve "Usuario";

descanso;

caso 2:

devuelve "Administrador";

romper;

predeterminado:

devolver "Desconocido";

romper;

}

}

cadena LastLogon(DWORD n)//Última hora de inicio de sesión

{

if(n==0)

return " Hora del último inicio de sesión desconocida.";

else

{

time_t last_logon_time;

last_logon_time = n;

return ctime(&last_logon_time);

}

}

cadena ExpiredTime(unsigned long n)//Tiempo de vencimiento de la contraseña

{

if(n==0||n==NULL)

return "Nunca caducó.";

else

{

p>

time_t actual;

current=n;

return ctime(¤t);

}

}

//Determine el estado de la cuenta: los significados correspondientes de cada valor en la matriz son los siguientes

/*

Ejecución del script de inicio de sesión UF_SCRIPT 1

Cuenta de usuario UF_ACCOUNTDISABLE No disponible 2

UF_HOMEDIR_REQUIRED Requiere directorio de usuario 8

UF_LOCKOUT Cuenta bloqueada 16

UF_PASSWD_NOTREQD No requiere contraseña de usuario 32

UF_PASSWD_CANT_CHANGE no se puede cambiar Contraseña 64

Los siguientes son tipos de cuentas:

UF_TEMP_DUPLICATE_ACCOUNT Cuenta de usuario de dominio 256

UF_NORMAL_ACCOUNT Cuenta ordinaria 512

UF_INTERDOMAIN_TRUST

_ACCOUNT Cuenta de confianza en el dominio 2048

UF_WORKSTATION_TRUST_ACCOUNT Cuenta de confianza del grupo de trabajo 4096

UF_SERVER_TRUST_ACCOUNT Cuenta de controlador de dominio de respaldo 8192

UF_DONT_EXPIRE_PASSWD La contraseña no caduca 65536

*/

int ToBinary(long n,int k)

{

int num[17];

int i= 16;

//La contraseña nunca caduca

long m=n;

if(k>17||k<1)

k=1;

mientras(m!=0)

{

num[i]=m%2;

m=m/2;

i--;

}

num[i]='\0';

regresar num[17-k];

}

int GetAllUser()

{

LPUSER_INFO_1 pBuf = NULL;

LPUSER_INFO_1 pTmpBuf;

DWORD dwLevel = 1;

DWORD dwPrefMaxLen = MAX_PREFERRED_LENGTH;

DWORD dwEntriesRead = 0;

DWORD dwTotalEntries = 0;

DWORD dwResumeHandle = 0;

DWORD i;

DWORD dwTotalCount = 0;

NET_API_STATUS nStatus ;

LPTSTR pszServerName = NULL;

do

{

nStatus = NetUserEnum(NULL,

dwLevel,

FILTER_NORMAL_ACCOUNT, // usuarios globales

(LPBYTE*)&pBuf,

dwPrefMaxLen,

&dwEntriesRead,

&dwTotalEntries ,

&dwResumeHandle);

//

// Si la llamada tiene éxito,

//

if ((nStatus == NERR_Success) || (nStatus == ERROR_MORE_DATA))

{

if ((pTmpBuf = pBuf) != NULL)

{

//

// Recorre las entradas.

//

for (i = 0; ( i < dwEntriesRead ); i++)

{

afirmar(pTmpBuf != NULL);

if (pTmpBuf == NULL)

<

p> {

fprintf(stderr, "Se ha producido una infracción de acceso\n");

break;

}

/ /

// Imprime el nombre de la cuenta de usuario.

//

/*

typedef struct _USER_INFO_1 {

LPWSTR usri1_name; //Nombre de usuario

LPWSTR usri1_password; //Contraseña de usuario

DWORD usri1_password_age //Tiempo de uso de contraseña actual (unidad: segundos)

DWORD usri1_priv; // Permisos de usuario 0 invitado; 1 usuario normal; 2 administrador.

LPWSTR usri1_home_dir; //

LPWSTR usri1_comment; //Observaciones, puede ser NULL

p>

DWORD usri1_flags; //

LPWSTR usri1_script_path; // Devuelve una cadena Unicode que contiene el script de inicio de sesión del usuario.

Puede ser NULL

}USER_INFO_1, *PUSER_INFO_1, *LPUSER_INFO_1;

*/

wprintf(L"Nº de cuenta%d\n",dwTotalCount+ 1 );

LPUSER_INFO_3 bufptr=NULL;

LPUSER_INFO_2 buf=NULL;

NET_API_STATUS t3,t2;

t3=NetUserGetInfo( 0 ,pTmpBuf->usri1_name,3,(LPBYTE*)&bufptr);

t2=NetUserGetInfo(0,pTmpBuf->usri1_name,2,(LPBYTE*)&buf);

/ /Nombre de cuenta:

wprintf(L"\t Nombre de cuenta: %s \n",bufptr->usri3_name);

//Última hora de inicio de sesión: unidad, segundos; El La hora de inicio del cálculo es a las 00:00 del 1 de enero de 1970

if(bufptr->usri3_last_logon==0)

cout<<"\t Hora del último inicio de sesión de la cuenta: "<< "Se desconoce la hora del último inicio de sesión"<

else

{

long m=bufptr->usri3_last_logon;

time_t last;

last = m;

cout<<"\t Hora del último inicio de sesión de la cuenta: "<

}

//Tiempo de vencimiento de la contraseña: unidad, segundos; la hora de inicio del cálculo es a las 00:00 del 1 de enero de 1970. Si es 0, significa que nunca caducará

if(bufptr ->usri3_password_expired==0||bufptr->usri3_password_expired==NULL)

cout<<"\t Hora de caducidad de la contraseña: "<<"La contraseña nunca caduca"<

else

{

long n=bufptr->usri3_password_expired;

time_t pwd;

pwd = n;

p>

cout<<"\t Hora de vencimiento de la contraseña: "<

}

//Juzga el tiempo de vencimiento de la cuenta: si caduca El tiempo es: 65536*65536-1, lo que significa que nunca caducará

/* if(buf->usri2_acct_expires==4294967295)

cout<<"\ t Hora de vencimiento de la cuenta:" <<"La cuenta nunca caduca"<

else

{

long k=buf->usri2_acct_expir

es;

time_t acct;

acct = k;

cout<<"\t Hora de vencimiento de la cuenta:"<

}

*/

//Determinar el estado de la cuenta usri2_flags:

/*

valor medio int

UF_SCRIPT Ejecución del script de inicio de sesión 1

UF_ACCOUNTDISABLE La cuenta de usuario no está disponible 2

UF_HOMEDIR_REQUIRED Requiere directorio de usuario 8

UF_LOCKOUT Cuenta bloqueada 16

UF_PASSWD_NOTREQD No se requiere contraseña de usuario 32

UF_PASSWD_CANT_CHANGE La contraseña no se puede cambiar 64

UF_DONT_EXPIRE_PASSWD La contraseña no caduca 65536

Las siguientes son tipos de cuenta:

UF_TEMP_DUPLICATE_ACCOUNT Cuenta de usuario de dominio 256

UF_NORMAL_ACCOUNT Cuenta normal 512

UF_INTERDOMAIN_TRUST_ACCOUNT Cuenta de confianza de dominio 2048

UF_WORKSTATION_TRUST_ACCOUNT Cuenta de confianza de grupo de trabajo 4096

UF_SERVER_TRUST_ACCOUNT Cuenta de controlador de dominio de respaldo 8192

*/

long n=buf->usri2_flags;

//Estado de la cuenta:

if(ToBinary(n,2))

cout<<"\t Estado de la cuenta: "<<"La cuenta no está habilitada"<

else

cout<<"\t Estado de la cuenta: "<<"La cuenta está habilitada"<

//Si se puede cambiar la contraseña:

if(ToBinary(n,7))

cout<<"\t Necesidad de contraseña: "<<"No se requiere contraseña"<

<<"\ t Cambio de contraseña: "<<"La contraseña no se puede cambiar"<

else

cout<<"\t Contraseña Nedd: "<<"Se requiere contraseña"<< endl

<<"\t Cambio de contraseña: "<<"La contraseña se puede cambiar"<

pTmpBuf++;

dwTotalCount++;

}

}

}

else{

fprintf(stderr, "Se ha producido un error del sistema: % d\n", nEstad

nosotros);

}

if (pBuf != NULL)

{

NetApiBufferFree(pBuf);

pBuf = NULL;

}

} while(nStatus == ERROR_MORE_DATA);

fprintf(stderr, "\nTotal de %d entradas enumeradas\ n", dwTotalCount);

devuelve 0;

}

void main()

{

GetAllUser();

cin.get();

}

// El código anterior se pasó bajo compilación de Visual C++ 6.0.

//Otro: la programación requiere paciencia. Si observa detenidamente las instrucciones de MSDN, sabrá que el código que proporcioné la última vez no se limita a enumerar nombres de usuarios.

//Si tienes alguna duda, echa un vistazo a las definiciones y valores correspondientes de NetUserGetInfo, _USER_INFO_2, _USER_INFO_3.