477 lines
9.9 KiB
C
477 lines
9.9 KiB
C
/*++
|
|
|
|
Copyright (c) 1991 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
repltest.c
|
|
|
|
Abstract:
|
|
|
|
List user objects from SAM database. Used to verify SAM
|
|
replication.
|
|
|
|
Author:
|
|
|
|
Cliff Van Dyke (cliffv) 26-Mar-1991
|
|
|
|
Environment:
|
|
|
|
User mode only.
|
|
Contains NT-specific code.
|
|
Requires ANSI C extensions: slash-slash comments, long external names.
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include <nt.h>
|
|
#include <ntrtl.h>
|
|
#include <nturtl.h>
|
|
#include <windef.h>
|
|
#include <winbase.h>
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <lmcons.h>
|
|
#include <lmapibuf.h>
|
|
#include <netlib.h>
|
|
#include <netdebug.h>
|
|
#include <lmaccess.h>
|
|
#include <lmerr.h>
|
|
#include <ntsam.h>
|
|
|
|
#include "accessp.h"
|
|
#include "netlogon.h"
|
|
#include "logonp.h"
|
|
|
|
|
|
NET_API_STATUS
|
|
Print_UserInfo3(
|
|
LPWSTR UserName
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
|
|
Prints out the user information at level 3.
|
|
|
|
Arguments:
|
|
|
|
UserName : Name of the user.
|
|
|
|
Return Value:
|
|
|
|
Net access API error code.
|
|
|
|
--*/
|
|
{
|
|
|
|
NET_API_STATUS NetStatus;
|
|
PUSER_INFO_3 UserInfo3;
|
|
|
|
//
|
|
// get user info
|
|
//
|
|
|
|
NetStatus = NetUserGetInfo(
|
|
NULL,
|
|
UserName,
|
|
3,
|
|
(LPBYTE *)&UserInfo3
|
|
);
|
|
|
|
if( NetStatus != NERR_Success ) {
|
|
|
|
return( NetStatus );
|
|
}
|
|
|
|
//
|
|
// print out user info
|
|
//
|
|
|
|
printf( "name : %ws \n", UserInfo3->usri3_name);
|
|
// printf( "password : %ws \n", UserInfo3->usri3_password);
|
|
printf( "password_age : %d \n", UserInfo3->usri3_password_age);
|
|
printf( "priv : %d \n", UserInfo3->usri3_priv);
|
|
printf( "home_dir : %ws \n", UserInfo3->usri3_home_dir);
|
|
printf( "comment : %ws \n", UserInfo3->usri3_comment);
|
|
printf( "flags : %d \n", UserInfo3->usri3_flags);
|
|
printf( "script_path : %ws \n", UserInfo3->usri3_script_path);
|
|
printf( "auth_flags : %d \n", UserInfo3->usri3_auth_flags);
|
|
printf( "full_name : %ws \n", UserInfo3->usri3_full_name);
|
|
printf( "usr_comment : %ws \n", UserInfo3->usri3_usr_comment);
|
|
printf( "parms : %ws \n", UserInfo3->usri3_parms);
|
|
printf( "workstations : %ws \n", UserInfo3->usri3_workstations);
|
|
printf( "last_logon : %d \n", UserInfo3->usri3_last_logon);
|
|
printf( "last_logoff : %d \n", UserInfo3->usri3_last_logoff);
|
|
printf( "acct_expires : %d \n", UserInfo3->usri3_acct_expires);
|
|
printf( "max_storage : %d \n", UserInfo3->usri3_max_storage);
|
|
printf( "units_per_week : %d \n", UserInfo3->usri3_units_per_week);
|
|
printf( "logon_hours : %ws \n", UserInfo3->usri3_logon_hours);
|
|
printf( "bad_pw_count : %d \n", UserInfo3->usri3_bad_pw_count);
|
|
printf( "num_logons : %d \n", UserInfo3->usri3_num_logons);
|
|
printf( "logon_server : %ws \n", UserInfo3->usri3_logon_server);
|
|
printf( "country_code : %d \n", UserInfo3->usri3_country_code);
|
|
printf( "code_page : %d \n", UserInfo3->usri3_code_page);
|
|
printf( "user_id : %d \n", UserInfo3->usri3_user_id);
|
|
printf( "primary_group_i: %d \n", UserInfo3->usri3_primary_group_id);
|
|
printf( "profile : %ws \n", UserInfo3->usri3_profile);
|
|
printf( "home_dir_drive : %ws \n", UserInfo3->usri3_home_dir_drive);
|
|
|
|
(VOID) NetApiBufferFree( UserInfo3 );
|
|
|
|
return( NetStatus );
|
|
|
|
}
|
|
|
|
NET_API_STATUS
|
|
Print_GroupInfo2(
|
|
LPWSTR GroupName
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
|
|
Prints out the group information at level 2.
|
|
|
|
Arguments:
|
|
|
|
GroupName : Name of the group.
|
|
|
|
Return Value:
|
|
|
|
Net access API error code.
|
|
|
|
--*/
|
|
{
|
|
NET_API_STATUS NetStatus;
|
|
PGROUP_INFO_2 GroupInfo2;
|
|
|
|
//
|
|
// get group info
|
|
//
|
|
|
|
NetStatus = NetGroupGetInfo(
|
|
NULL,
|
|
GroupName,
|
|
2,
|
|
(LPBYTE *)&GroupInfo2
|
|
);
|
|
|
|
if( NetStatus != NERR_Success ) {
|
|
|
|
return( NetStatus );
|
|
}
|
|
|
|
printf( "name : %ws \n", GroupInfo2->grpi2_name);
|
|
printf( "comment : %ws \n", GroupInfo2->grpi2_comment);
|
|
printf( "group_id : %d \n", GroupInfo2->grpi2_group_id);
|
|
printf( "attributes : %d \n", GroupInfo2->grpi2_attributes);
|
|
|
|
(VOID) NetApiBufferFree( GroupInfo2 );
|
|
|
|
return( NetStatus );
|
|
}
|
|
|
|
NET_API_STATUS
|
|
Print_ModalsInfo(
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
|
|
Prints out the modals information.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
Net access API error code.
|
|
|
|
--*/
|
|
{
|
|
|
|
NET_API_STATUS NetStatus;
|
|
PUSER_MODALS_INFO_0 ModalsInfo0;
|
|
PUSER_MODALS_INFO_1 ModalsInfo1;
|
|
PUSER_MODALS_INFO_2 ModalsInfo2;
|
|
|
|
|
|
//
|
|
// get modals info 0
|
|
//
|
|
|
|
NetStatus = NetUserModalsGet(
|
|
NULL,
|
|
0,
|
|
(LPBYTE *)&ModalsInfo0
|
|
);
|
|
|
|
if( NetStatus != NERR_Success ) {
|
|
|
|
return( NetStatus );
|
|
}
|
|
|
|
printf( "Modals Info \n\n" );
|
|
printf( "min_passwd_len : %d \n", ModalsInfo0->usrmod0_min_passwd_len);
|
|
printf( "max_passwd_age : %d \n", ModalsInfo0->usrmod0_max_passwd_age);
|
|
printf( "min_passwd_age : %d \n", ModalsInfo0->usrmod0_min_passwd_age);
|
|
printf( "force_logoff : %d \n", ModalsInfo0->usrmod0_force_logoff);
|
|
printf( "password_hist_len: %d \n", ModalsInfo0->usrmod0_password_hist_len);
|
|
|
|
//
|
|
// get modals info 1
|
|
//
|
|
|
|
NetStatus = NetUserModalsGet(
|
|
NULL,
|
|
1,
|
|
(LPBYTE *)&ModalsInfo1
|
|
);
|
|
|
|
if( NetStatus != NERR_Success ) {
|
|
|
|
return( NetStatus );
|
|
}
|
|
|
|
printf( "role : %d \n", ModalsInfo1->usrmod1_role);
|
|
printf( "primary : %ws \n", ModalsInfo1->usrmod1_primary);
|
|
|
|
//
|
|
// get modals info 2
|
|
//
|
|
|
|
NetStatus = NetUserModalsGet(
|
|
NULL,
|
|
2,
|
|
(LPBYTE *)&ModalsInfo2
|
|
);
|
|
|
|
if( NetStatus != NERR_Success ) {
|
|
|
|
return( NetStatus );
|
|
}
|
|
|
|
printf( "domain_name : %ws \n", ModalsInfo2->usrmod2_domain_name);
|
|
printf( "domain_id : %d \n", ModalsInfo2->usrmod2_domain_id);
|
|
printf("--------------------------------\n\n");
|
|
|
|
(VOID) NetApiBufferFree( ModalsInfo0 );
|
|
(VOID) NetApiBufferFree( ModalsInfo1 );
|
|
(VOID) NetApiBufferFree( ModalsInfo2 );
|
|
|
|
return( NetStatus );
|
|
}
|
|
|
|
NET_API_STATUS
|
|
Print_Users(
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
|
|
Enumurates user accounts.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
Net access API error code.
|
|
|
|
--*/
|
|
{
|
|
|
|
NET_API_STATUS NetStatus;
|
|
|
|
PUSER_INFO_0 UserEnum0;
|
|
DWORD EntriesRead;
|
|
DWORD TotalEnties;
|
|
DWORD ResumeHandle = 0;
|
|
DWORD i;
|
|
|
|
//
|
|
// Enum users
|
|
//
|
|
|
|
NetStatus = NetUserEnum(
|
|
NULL,
|
|
0,
|
|
FILTER_TEMP_DUPLICATE_ACCOUNT |
|
|
FILTER_NORMAL_ACCOUNT |
|
|
FILTER_PROXY_ACCOUNT |
|
|
FILTER_INTERDOMAIN_TRUST_ACCOUNT |
|
|
FILTER_WORKSTATION_TRUST_ACCOUNT|
|
|
FILTER_SERVER_TRUST_ACCOUNT,
|
|
(LPBYTE *)&UserEnum0,
|
|
0x10000,
|
|
&EntriesRead,
|
|
&TotalEnties,
|
|
&ResumeHandle );
|
|
|
|
if( NetStatus != NERR_Success ) {
|
|
|
|
return( NetStatus );
|
|
}
|
|
|
|
//
|
|
// ?? implement resume
|
|
//
|
|
|
|
//
|
|
// get info of users
|
|
//
|
|
|
|
for( i = 0; i < EntriesRead; i++ ) {
|
|
|
|
printf("UserInfo, Count : %d \n\n", i+1 );
|
|
|
|
NetStatus = Print_UserInfo3( UserEnum0[i].usri0_name );
|
|
|
|
if( NetStatus != NERR_Success ) {
|
|
|
|
return( NetStatus );
|
|
}
|
|
|
|
printf("--------------------------------\n\n");
|
|
}
|
|
|
|
(VOID) NetApiBufferFree( UserEnum0 );
|
|
|
|
return( NetStatus );
|
|
}
|
|
|
|
|
|
NET_API_STATUS
|
|
Print_Groups(
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
|
|
Enumurates group accounts.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
Net access API error code.
|
|
|
|
--*/
|
|
{
|
|
|
|
NET_API_STATUS NetStatus;
|
|
|
|
PGROUP_INFO_0 GroupEnum0;
|
|
DWORD EntriesRead;
|
|
DWORD TotalEnties;
|
|
DWORD ResumeHandle = 0;
|
|
DWORD i;
|
|
|
|
//
|
|
// Enum groups
|
|
//
|
|
|
|
NetStatus = NetGroupEnum(
|
|
NULL,
|
|
0,
|
|
(LPBYTE *)&GroupEnum0,
|
|
0x10000,
|
|
&EntriesRead,
|
|
&TotalEnties,
|
|
&ResumeHandle );
|
|
|
|
if( NetStatus != NERR_Success ) {
|
|
|
|
return( NetStatus );
|
|
}
|
|
|
|
//
|
|
// ?? implement resume
|
|
//
|
|
|
|
//
|
|
// get info of groups
|
|
//
|
|
|
|
for( i = 0; i < EntriesRead; i++ ) {
|
|
|
|
printf("GroupInfo, Count : %d \n\n", i+1 );
|
|
|
|
NetStatus = Print_GroupInfo2( GroupEnum0[i].grpi0_name );
|
|
|
|
if( NetStatus != NERR_Success ) {
|
|
|
|
return( NetStatus );
|
|
}
|
|
|
|
printf("--------------------------------\n\n");
|
|
}
|
|
|
|
(VOID) NetApiBufferFree( GroupEnum0 );
|
|
|
|
return( NetStatus );
|
|
}
|
|
|
|
|
|
void
|
|
main(
|
|
DWORD argc,
|
|
LPSTR *argv
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
|
|
main function to dump user database.
|
|
|
|
Arguments:
|
|
|
|
argc : argument count.
|
|
|
|
argv : argument vector.
|
|
|
|
Return Value:
|
|
|
|
none
|
|
|
|
--*/
|
|
{
|
|
|
|
NET_API_STATUS NetStatus;
|
|
|
|
|
|
NetStatus = Print_ModalsInfo();
|
|
|
|
if( NetStatus != NERR_Success ) {
|
|
|
|
goto Cleanup;
|
|
}
|
|
|
|
NetStatus = Print_Users();
|
|
|
|
if( NetStatus != NERR_Success ) {
|
|
|
|
goto Cleanup;
|
|
}
|
|
|
|
NetStatus = Print_Groups();
|
|
|
|
if( NetStatus != NERR_Success ) {
|
|
|
|
goto Cleanup;
|
|
}
|
|
|
|
Cleanup:
|
|
|
|
if( NetStatus != NERR_Success ) {
|
|
|
|
printf( "DumpDB : Unsuccessful, Error code %d \n", NetStatus );
|
|
}
|
|
else {
|
|
|
|
printf( "DumpDB : Successful \n" );
|
|
}
|
|
}
|