3 Copyright 1997, 1998, 1999, 2000 Cygnus Solutions.
5 This file is part of Cygwin.
7 This software is a copyrighted work licensed under the terms of the
8 Cygwin license. Please consult the file "CYGWIN_LICENSE" for
15 #include <sys/cygwin.h>
20 SID_IDENTIFIER_AUTHORITY sid_world_auth
= {SECURITY_WORLD_SID_AUTHORITY
};
21 SID_IDENTIFIER_AUTHORITY sid_nt_auth
= {SECURITY_NT_AUTHORITY
};
24 #define min(a,b) (((a)<(b))?(a):(b))
35 sprintf(t
, "%u", GetSidIdentifierAuthority (sid
)->Value
[5]);
37 for (i
= 0; i
< *GetSidSubAuthorityCount (sid
); ++i
)
39 sprintf(t
, "-%lu", *GetSidSubAuthority (sid
, i
));
46 psx_dir (char *in
, char *out
)
48 if (isalpha (in
[0]) && in
[1] == ':')
50 sprintf (out
, "/cygdrive/%c", in
[0]);
69 uni2ansi (LPWSTR wcs
, char *mbs
)
72 wcstombs (mbs
, wcs
, (wcslen (wcs
) + 1) * sizeof (WCHAR
));
79 enum_users (LPWSTR servername
, int print_sids
, int print_cygpath
)
82 DWORD entriesread
= 0;
83 DWORD totalentries
= 0;
84 DWORD resume_handle
= 0;
85 char ansi_srvname
[256];
88 uni2ansi (servername
, ansi_srvname
);
93 DWORD rc
= NetUserEnum (servername
, 3, FILTER_NORMAL_ACCOUNT
,
94 (LPBYTE
*) & buffer
, 1024,
95 &entriesread
, &totalentries
, &resume_handle
);
99 case ERROR_ACCESS_DENIED
:
100 fprintf (stderr
, "Access denied\n");
103 case ERROR_MORE_DATA
:
108 fprintf (stderr
, "NetUserEnum() failed with %ld\n", rc
);
112 for (i
= 0; i
< entriesread
; i
++)
116 char homedir_psx
[MAX_PATH
];
117 char homedir_w32
[MAX_PATH
];
118 char domain_name
[100];
119 DWORD domname_len
= 100;
120 char psid_buffer
[1024];
121 PSID psid
= (PSID
) psid_buffer
;
122 DWORD sid_length
= 1024;
123 SID_NAME_USE acc_type
;
125 int uid
= buffer
[i
].usri3_user_id
;
126 int gid
= buffer
[i
].usri3_primary_group_id
;
127 uni2ansi (buffer
[i
].usri3_name
, username
);
128 uni2ansi (buffer
[i
].usri3_full_name
, fullname
);
129 homedir_w32
[0] = homedir_psx
[0] = '\0';
130 uni2ansi (buffer
[i
].usri3_home_dir
, homedir_w32
);
132 cygwin_conv_to_posix_path (homedir_w32
, homedir_psx
);
134 psx_dir (homedir_w32
, homedir_psx
);
138 if (!LookupAccountName (servername
? ansi_srvname
: NULL
,
141 domain_name
, &domname_len
,
145 "LookupAccountName(%s,%s) failed with error %ld\n",
146 servername
? ansi_srvname
: "NULL",
151 else if (acc_type
== SidTypeDomain
)
155 strcpy (domname
, domain_name
);
156 strcat (domname
, "\\");
157 strcat (domname
, username
);
160 if (!LookupAccountName (servername
? ansi_srvname
: NULL
,
163 domain_name
, &domname_len
,
167 "LookupAccountName(%s,%s) failed with error %ld\n",
168 servername
? ansi_srvname
: "NULL",
175 printf ("%s::%d:%d:%s%s%s:%s:/bin/sh\n", username
, uid
, gid
,
177 print_sids
? "," : "",
178 print_sids
? put_sid (psid
) : "",
182 NetApiBufferFree (buffer
);
185 while (entriesread
< totalentries
);
188 NetApiBufferFree (servername
);
194 enum_local_groups (int print_sids
)
196 LOCALGROUP_INFO_0
*buffer
;
197 DWORD entriesread
= 0;
198 DWORD totalentries
= 0;
199 DWORD resume_handle
= 0;
204 DWORD rc
= NetLocalGroupEnum (NULL
, 0, (LPBYTE
*) & buffer
, 1024,
205 &entriesread
, &totalentries
, &resume_handle
);
209 case ERROR_ACCESS_DENIED
:
210 fprintf (stderr
, "Access denied\n");
213 case ERROR_MORE_DATA
:
218 fprintf (stderr
, "NetUserEnum() failed with %ld\n", rc
);
222 for (i
= 0; i
< entriesread
; i
++)
224 char localgroup_name
[100];
225 char domain_name
[100];
226 DWORD domname_len
= 100;
227 char psid_buffer
[1024];
228 PSID psid
= (PSID
) psid_buffer
;
229 DWORD sid_length
= 1024;
231 SID_NAME_USE acc_type
;
232 uni2ansi (buffer
[i
].lgrpi0_name
, localgroup_name
);
234 if (!LookupAccountName (NULL
, localgroup_name
, psid
,
235 &sid_length
, domain_name
, &domname_len
,
238 fprintf (stderr
, "LookupAccountName(%s) failed with %ld\n",
239 localgroup_name
, GetLastError ());
242 else if (acc_type
== SidTypeDomain
)
246 strcpy (domname
, domain_name
);
247 strcat (domname
, "\\");
248 strcat (domname
, localgroup_name
);
251 if (!LookupAccountName (NULL
, domname
,
253 domain_name
, &domname_len
,
257 "LookupAccountName(%s) failed with error %ld\n",
258 localgroup_name
, GetLastError ());
263 gid
= *GetSidSubAuthority (psid
, *GetSidSubAuthorityCount(psid
) - 1);
265 printf ("%s:*:%ld:%ld:%s%s::\n", localgroup_name
, gid
, gid
,
266 print_sids
? "," : "",
267 print_sids
? put_sid (psid
) : "");
270 NetApiBufferFree (buffer
);
273 while (entriesread
< totalentries
);
281 fprintf (stderr
, "\n");
282 fprintf (stderr
, "usage: mkpasswd [options] [domain]\n\n");
283 fprintf (stderr
, "This program prints a /etc/passwd file to stdout\n\n");
284 fprintf (stderr
, "Options are\n");
285 fprintf (stderr
, " -l,--local print local accounts\n");
286 fprintf (stderr
, " -d,--domain print domain accounts (from current domain\n");
287 fprintf (stderr
, " if no domain specified\n");
288 fprintf (stderr
, " -g,--local-groups print local group information too\n");
289 fprintf (stderr
, " -m,--no-mount don't use mount points for home dir\n");
290 fprintf (stderr
, " -s,--no-sids don't print SIDs in GCOS field\n");
291 fprintf (stderr
, " (this affects NT security)\n");
292 fprintf (stderr
, " -?,--help displays this message\n\n");
293 fprintf (stderr
, "This program does only work on Windows NT\n\n");
298 main (int argc
, char **argv
)
300 LPWSTR servername
= NULL
;
301 DWORD rc
= ERROR_SUCCESS
;
302 WCHAR domain_name
[200];
304 int print_domain
= 0;
305 int print_local_groups
= 0;
306 int domain_name_specified
= 0;
308 int print_cygpath
= 1;
311 char name
[256], dom
[256];
321 for (i
= 1; i
< argc
; i
++)
323 if (!strcmp (argv
[i
], "-l") || !strcmp (argv
[i
], "--local"))
326 else if (!strcmp (argv
[i
], "-d") || !strcmp (argv
[i
], "--domain"))
329 else if (!strcmp (argv
[i
], "-g") || !strcmp (argv
[i
], "--local-groups"))
330 print_local_groups
= 1;
332 else if (!strcmp (argv
[i
], "-s") || !strcmp (argv
[i
], "--no-sids"))
335 else if (!strcmp (argv
[i
], "-m") || !strcmp (argv
[i
], "--no-mount"))
338 else if (!strcmp (argv
[i
], "-?") || !strcmp (argv
[i
], "--help"))
343 mbstowcs (domain_name
, argv
[i
], (strlen (argv
[i
]) + 1));
344 domain_name_specified
= 1;
349 /* FIXME: this needs to take Windows 98 into account. */
350 if (GetVersion () >= 0x80000000)
352 fprintf (stderr
, "The required functionality is not supported by Windows 95. Sorry.\n");
357 * Get `Everyone' group
359 if (AllocateAndInitializeSid (&sid_world_auth
, 1, SECURITY_WORLD_RID
,
360 0, 0, 0, 0, 0, 0, 0, &sid
))
362 if (LookupAccountSid (NULL
, sid
,
363 name
, (len
= 256, &len
),
364 dom
, (len2
= 256, &len
),
366 printf ("%s:*:%ld:%ld:%s%s::\n", name
,
369 print_sids
? "," : "",
370 print_sids
? put_sid (sid
) : "");
377 if (AllocateAndInitializeSid (&sid_nt_auth
, 1, SECURITY_LOCAL_SYSTEM_RID
,
378 0, 0, 0, 0, 0, 0, 0, &sid
))
380 if (LookupAccountSid (NULL
, sid
,
381 name
, (len
= 256, &len
),
382 dom
, (len2
= 256, &len
),
384 printf ("%s:*:%ld:%ld:%s%s::\n", name
,
385 SECURITY_LOCAL_SYSTEM_RID
,
386 SECURITY_LOCAL_SYSTEM_RID
,
387 print_sids
? "," : "",
388 print_sids
? put_sid (sid
) : "");
393 * Get `administrators' group
395 if (AllocateAndInitializeSid (&sid_nt_auth
, 2, SECURITY_BUILTIN_DOMAIN_RID
,
396 DOMAIN_ALIAS_RID_ADMINS
,
397 0, 0, 0, 0, 0, 0, &sid
))
399 if (LookupAccountSid (NULL
, sid
,
400 name
, (len
= 256, &len
),
401 dom
, (len2
= 256, &len
),
403 printf ("%s:*:%ld:%ld:%s%s::\n", name
,
404 DOMAIN_ALIAS_RID_ADMINS
,
405 DOMAIN_ALIAS_RID_ADMINS
,
406 print_sids
? "," : "",
407 print_sids
? put_sid (sid
) : "");
411 if (print_local_groups
)
412 enum_local_groups (print_sids
);
416 if (domain_name_specified
)
417 rc
= NetGetAnyDCName (NULL
, domain_name
, (LPBYTE
*) & servername
);
420 rc
= NetGetAnyDCName (NULL
, NULL
, (LPBYTE
*) & servername
);
422 if (rc
!= ERROR_SUCCESS
)
424 fprintf (stderr
, "Cannot get DC, code = %ld\n", rc
);
428 enum_users (servername
, print_sids
, print_cygpath
);
432 enum_users (NULL
, print_sids
, print_cygpath
);
435 NetApiBufferFree (servername
);