windows-nt/Source/XPSP1/NT/ds/netapi/access/dumpdb.c
2020-09-26 16:20:57 +08:00

477 lines
9.4 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" );
}
}