--- mkpasswd.c.cvs Sat Oct 20 09:56:09 2001 +++ mkpasswd.c Tue Nov 20 21:43:14 2001 @@ -19,6 +19,7 @@ #include #include #include +#include SID_IDENTIFIER_AUTHORITY sid_world_auth = {SECURITY_WORLD_SID_AUTHORITY}; SID_IDENTIFIER_AUTHORITY sid_nt_auth = {SECURITY_NT_AUTHORITY}; @@ -27,6 +28,7 @@ NET_API_STATUS WINAPI (*netapibufferfree NET_API_STATUS WINAPI (*netuserenum)(LPWSTR,DWORD,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD); NET_API_STATUS WINAPI (*netlocalgroupenum)(LPWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD); NET_API_STATUS WINAPI (*netgetdcname)(LPWSTR,LPWSTR,PBYTE*); +NET_API_STATUS WINAPI (*netusergetinfo)(LPWSTR,LPWSTR,DWORD,PBYTE*); #ifndef min #define min(a,b) (((a)<(b))?(a):(b)) @@ -48,6 +50,8 @@ load_netapi () return FALSE; if (!(netgetdcname = (void *) GetProcAddress (h, "NetGetDCName"))) return FALSE; + if (!(netusergetinfo = (void *) GetProcAddress (h, "NetUserGetInfo"))) + return FALSE; return TRUE; } @@ -104,7 +108,7 @@ uni2ansi (LPWSTR wcs, char *mbs, int siz int enum_users (LPWSTR servername, int print_sids, int print_cygpath, - const char * passed_home_path, int id_offset) + const char * passed_home_path, int id_offset, char *disp_username) { USER_INFO_3 *buffer; DWORD entriesread = 0; @@ -112,6 +116,7 @@ enum_users (LPWSTR servername, int print DWORD resume_handle = 0; DWORD rc; char ansi_srvname[256]; + WCHAR uni_name[512]; if (servername) uni2ansi (servername, ansi_srvname, sizeof (ansi_srvname)); @@ -120,6 +125,12 @@ enum_users (LPWSTR servername, int print { DWORD i; + if (disp_username != NULL) { + MultiByteToWideChar (CP_ACP, 0, disp_username, -1, uni_name, 512 ); + rc = netusergetinfo(servername, (LPWSTR) & uni_name, 3, (LPBYTE *) &buffer ); + entriesread=1; + } + else rc = netuserenum (servername, 3, FILTER_NORMAL_ACCOUNT, (LPBYTE *) & buffer, 1024, &entriesread, &totalentries, &resume_handle); @@ -134,7 +145,9 @@ enum_users (LPWSTR servername, int print break; default: - fprintf (stderr, "NetUserEnum() failed with %ld\n", rc); + fprintf (stderr, "NetUserEnum() failed with error %ld.\n", rc); + if ( rc == NERR_UserNotFound ) + fprintf (stderr, "That user doesn't exist.\n"); exit (1); } @@ -381,6 +394,7 @@ usage () fprintf (stderr, " (this affects ntsec)\n"); fprintf (stderr, " -p,--path-to-home path if user account has no home dir, use\n"); fprintf (stderr, " path instead of /home/\n"); + fprintf (stderr, " -u,--username username only return information for the specified user\n"); fprintf (stderr, " -?,--help displays this message\n\n"); fprintf (stderr, "One of `-l', `-d' or `-g' must be given on NT/W2K.\n"); return 1; @@ -394,11 +408,12 @@ struct option longopts[] = { {"no-mount", no_argument, NULL, 'm'}, {"no-sids", no_argument, NULL, 's'}, {"path-to-home",required_argument, NULL, 'p'}, + {"username",required_argument, NULL, 'u'}, {"help", no_argument, NULL, 'h'}, {0, no_argument, NULL, 0} }; -char opts[] = "ldo:gsmhp:"; +char opts[] = "ldo:gsmhpu:"; int main (int argc, char **argv) @@ -414,6 +429,7 @@ main (int argc, char **argv) int print_cygpath = 1; int id_offset = 10000; int i; + char *disp_username = NULL; char name[256], passed_home_path[MAX_PATH]; DWORD len; @@ -459,6 +475,9 @@ main (int argc, char **argv) if (optarg[strlen (optarg)-1] != '/') strcat (passed_home_path, "/"); break; + case 'u': + disp_username = optarg; + break; case 'h': return usage (); default: @@ -513,6 +532,7 @@ main (int argc, char **argv) /* * Get `Everyone' group */ + if ( disp_username == NULL ) { print_special (print_sids, &sid_world_auth, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0); /* * Get `system' group @@ -526,6 +546,7 @@ main (int argc, char **argv) if (print_local_groups) enum_local_groups (print_sids); + } if (print_domain) { @@ -541,11 +562,11 @@ main (int argc, char **argv) exit (1); } - enum_users (servername, print_sids, print_cygpath, passed_home_path, id_offset); + enum_users (servername, print_sids, print_cygpath, passed_home_path, id_offset, disp_username); } if (print_local) - enum_users (NULL, print_sids, print_cygpath, passed_home_path, 0); + enum_users (NULL, print_sids, print_cygpath, passed_home_path, 0, disp_username); if (servername) netapibufferfree (servername);