/*++ 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #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" ); } }