]> sourceware.org Git - newlib-cygwin.git/blob - winsup/utils/mkgroup.c
* mkpasswd.c (main): Use GetDCName instead of GetAnyDCName.
[newlib-cygwin.git] / winsup / utils / mkgroup.c
1 /* mkgroup.c:
2
3 Copyright 1997, 1998 Cygnus Solutions.
4
5 This file is part of Cygwin.
6
7 This software is a copyrighted work licensed under the terms of the
8 Cygwin license. Please consult the file "CYGWIN_LICENSE" for
9 details. */
10
11 #include <ctype.h>
12 #include <stdlib.h>
13 #include <wchar.h>
14 #include <stdio.h>
15 #include <sys/cygwin.h>
16 #include <windows.h>
17 #include <lmaccess.h>
18 #include <lmapibuf.h>
19
20 SID_IDENTIFIER_AUTHORITY sid_world_auth = {SECURITY_WORLD_SID_AUTHORITY};
21 SID_IDENTIFIER_AUTHORITY sid_nt_auth = {SECURITY_NT_AUTHORITY};
22
23 #ifndef min
24 #define min(a,b) (((a)<(b))?(a):(b))
25 #endif
26
27 char *
28 put_sid (PSID sid)
29 {
30 static char s[512];
31 char t[32];
32 DWORD i;
33
34 strcpy (s, "S-1-");
35 sprintf(t, "%u", GetSidIdentifierAuthority (sid)->Value[5]);
36 strcat (s, t);
37 for (i = 0; i < *GetSidSubAuthorityCount (sid); ++i)
38 {
39 sprintf(t, "-%lu", *GetSidSubAuthority (sid, i));
40 strcat (s, t);
41 }
42 return s;
43 }
44
45 void
46 psx_dir (char *in, char *out)
47 {
48 if (isalpha (in[0]) && in[1] == ':')
49 {
50 sprintf (out, "/cygdrive/%c", in[0]);
51 in += 2;
52 out += strlen (out);
53 }
54
55 while (*in)
56 {
57 if (*in == '\\')
58 *out = '/';
59 else
60 *out = *in;
61 in++;
62 out++;
63 }
64
65 *out = '\0';
66 }
67
68 void
69 uni2ansi (LPWSTR wcs, char *mbs)
70 {
71 if (wcs)
72 wcstombs (mbs, wcs, (wcslen (wcs) + 1) * sizeof (WCHAR));
73
74 else
75 *mbs = '\0';
76 }
77
78 int
79 enum_local_groups (int print_sids)
80 {
81 LOCALGROUP_INFO_0 *buffer;
82 DWORD entriesread = 0;
83 DWORD totalentries = 0;
84 DWORD resume_handle = 0;
85 DWORD rc;
86
87 do
88 {
89 DWORD i;
90
91 rc = NetLocalGroupEnum (NULL, 0, (LPBYTE *) & buffer, 1024,
92 &entriesread, &totalentries, &resume_handle);
93 switch (rc)
94 {
95 case ERROR_ACCESS_DENIED:
96 fprintf (stderr, "Access denied\n");
97 exit (1);
98
99 case ERROR_MORE_DATA:
100 case ERROR_SUCCESS:
101 break;
102
103 default:
104 fprintf (stderr, "NetUserEnum() failed with %ld\n", rc);
105 exit (1);
106 }
107
108 for (i = 0; i < entriesread; i++)
109 {
110 char localgroup_name[100];
111 char domain_name[100];
112 DWORD domname_len = 100;
113 char psid_buffer[1024];
114 PSID psid = (PSID) psid_buffer;
115 DWORD sid_length = 1024;
116 DWORD gid;
117 SID_NAME_USE acc_type;
118 uni2ansi (buffer[i].lgrpi0_name, localgroup_name);
119
120 if (!LookupAccountName (NULL, localgroup_name, psid,
121 &sid_length, domain_name, &domname_len,
122 &acc_type))
123 {
124 fprintf (stderr, "LookupAccountName(%s) failed with %ld\n",
125 localgroup_name, GetLastError ());
126 continue;
127 }
128 else if (acc_type == SidTypeDomain)
129 {
130 char domname[356];
131
132 strcpy (domname, domain_name);
133 strcat (domname, "\\");
134 strcat (domname, localgroup_name);
135 sid_length = 1024;
136 domname_len = 100;
137 if (!LookupAccountName (NULL, domname,
138 psid, &sid_length,
139 domain_name, &domname_len,
140 &acc_type))
141 {
142 fprintf (stderr,
143 "LookupAccountName(%s) failed with error %ld\n",
144 localgroup_name, GetLastError ());
145 continue;
146 }
147 }
148
149 gid = *GetSidSubAuthority (psid, *GetSidSubAuthorityCount(psid) - 1);
150
151 printf ("%s:%s:%ld:\n", localgroup_name,
152 print_sids ? put_sid (psid) : "",
153 gid);
154 }
155
156 NetApiBufferFree (buffer);
157
158 }
159 while (rc == ERROR_MORE_DATA);
160
161 return 0;
162 }
163
164 void
165 enum_groups (LPWSTR servername, int print_sids)
166 {
167 GROUP_INFO_2 *buffer;
168 DWORD entriesread = 0;
169 DWORD totalentries = 0;
170 DWORD resume_handle = 0;
171 DWORD rc;
172 char ansi_srvname[256];
173
174 if (servername)
175 uni2ansi (servername, ansi_srvname);
176
177 do
178 {
179 DWORD i;
180
181 rc = NetGroupEnum (servername, 2, (LPBYTE *) & buffer, 1024,
182 &entriesread, &totalentries, &resume_handle);
183 switch (rc)
184 {
185 case ERROR_ACCESS_DENIED:
186 fprintf (stderr, "Access denied\n");
187 exit (1);
188
189 case ERROR_MORE_DATA:
190 case ERROR_SUCCESS:
191 break;
192
193 default:
194 fprintf (stderr, "NetUserEnum() failed with %ld\n", rc);
195 exit (1);
196 }
197
198 for (i = 0; i < entriesread; i++)
199 {
200 char groupname[100];
201 char domain_name[100];
202 DWORD domname_len = 100;
203 char psid_buffer[1024];
204 PSID psid = (PSID) psid_buffer;
205 DWORD sid_length = 1024;
206 SID_NAME_USE acc_type;
207
208 int gid = buffer[i].grpi2_group_id;
209 uni2ansi (buffer[i].grpi2_name, groupname);
210 if (print_sids)
211 {
212 if (!LookupAccountName (servername ? ansi_srvname : NULL,
213 groupname,
214 psid, &sid_length,
215 domain_name, &domname_len,
216 &acc_type))
217 {
218 fprintf (stderr,
219 "LookupAccountName (%s, %s) failed with error %ld\n",
220 servername ? ansi_srvname : "NULL",
221 groupname,
222 GetLastError ());
223 continue;
224 }
225 else if (acc_type == SidTypeDomain)
226 {
227 char domname[356];
228
229 strcpy (domname, domain_name);
230 strcat (domname, "\\");
231 strcat (domname, groupname);
232 sid_length = 1024;
233 domname_len = 100;
234 if (!LookupAccountName (servername ? ansi_srvname : NULL,
235 domname,
236 psid, &sid_length,
237 domain_name, &domname_len,
238 &acc_type))
239 {
240 fprintf (stderr,
241 "LookupAccountName(%s,%s) failed with error %ld\n",
242 servername ? ansi_srvname : "NULL",
243 domname,
244 GetLastError ());
245 continue;
246 }
247 }
248 }
249 printf ("%s:%s:%d:\n", groupname,
250 print_sids ? put_sid (psid) : "",
251 gid);
252 }
253
254 NetApiBufferFree (buffer);
255
256 }
257 while (rc == ERROR_MORE_DATA);
258
259 if (servername)
260 NetApiBufferFree (servername);
261 }
262
263 void
264 usage ()
265 {
266 fprintf (stderr, "\n");
267 fprintf (stderr, "usage: mkgroup <options> [domain]\n\n");
268 fprintf (stderr, "This program prints group information to stdout\n\n");
269 fprintf (stderr, "Options:\n");
270 fprintf (stderr, " -l,--local print pseudo group information if there is\n");
271 fprintf (stderr, " no domain\n");
272 fprintf (stderr, " -d,--domain print global group information from the domain\n");
273 fprintf (stderr, " specified (or from the current domain if there is\n");
274 fprintf (stderr, " no domain specified)\n");
275 fprintf (stderr, " -s,--no-sids don't print SIDs in pwd field\n");
276 fprintf (stderr, " (this affects ntsec)\n");
277 fprintf (stderr, " -?,--help print this message\n\n");
278 exit (1);
279 }
280
281 int
282 main (int argc, char **argv)
283 {
284 LPWSTR servername;
285 DWORD rc = ERROR_SUCCESS;
286 WCHAR domain_name[100];
287 int print_local = 0;
288 int print_domain = 0;
289 int print_sids = 1;
290 int domain_specified = 0;
291 int i;
292
293 char name[256], dom[256];
294 DWORD len, len2;
295 PSID sid, csid;
296 SID_NAME_USE use;
297
298 if (argc == 1)
299 usage ();
300
301 else
302 {
303 for (i = 1; i < argc; i++)
304 {
305 if (!strcmp (argv[i], "-l") || !strcmp (argv[i], "--local"))
306 print_local = 1;
307
308 else if (!strcmp (argv[i], "-d") || !strcmp (argv[i], "--domain"))
309 print_domain = 1;
310
311 else if (!strcmp (argv[i], "-s") || !strcmp (argv[i], "--no-sids"))
312 print_sids = 0;
313
314 else if (!strcmp (argv[i], "-?") || !strcmp (argv[i], "--help"))
315 usage ();
316
317 else
318 {
319 mbstowcs (domain_name, argv[i], strlen (argv[i]) + 1);
320 domain_specified = 1;
321 }
322 }
323 }
324
325 /*
326 * Get `Everyone' group
327 */
328 if (AllocateAndInitializeSid (&sid_world_auth, 1, SECURITY_WORLD_RID,
329 0, 0, 0, 0, 0, 0, 0, &sid))
330 {
331 if (LookupAccountSid (NULL, sid,
332 name, (len = 256, &len),
333 dom, (len2 = 256, &len),
334 &use))
335 printf ("%s:%s:%ld:\n", name,
336 print_sids ? put_sid (sid) : "",
337 SECURITY_WORLD_RID);
338 FreeSid (sid);
339 }
340
341 /*
342 * Get `system' group
343 */
344 if (AllocateAndInitializeSid (&sid_nt_auth, 1, SECURITY_LOCAL_SYSTEM_RID,
345 0, 0, 0, 0, 0, 0, 0, &sid))
346 {
347 if (LookupAccountSid (NULL, sid,
348 name, (len = 256, &len),
349 dom, (len2 = 256, &len),
350 &use))
351 printf ("%s:%s:%ld:\n", name,
352 print_sids ? put_sid (sid) : "",
353 SECURITY_LOCAL_SYSTEM_RID);
354 FreeSid (sid);
355 }
356
357 if (print_local)
358 {
359 /*
360 * Get `None' group
361 */
362 GetComputerName (name, (len = 256, &len));
363 csid = (PSID) malloc (1024);
364 LookupAccountName (NULL, name,
365 csid, (len = 1024, &len),
366 dom, (len2 = 256, &len),
367 &use);
368 if (AllocateAndInitializeSid (GetSidIdentifierAuthority (csid),
369 5,
370 *GetSidSubAuthority (csid, 0),
371 *GetSidSubAuthority (csid, 1),
372 *GetSidSubAuthority (csid, 2),
373 *GetSidSubAuthority (csid, 3),
374 513,
375 0,
376 0,
377 0,
378 &sid))
379 {
380 if (LookupAccountSid (NULL, sid,
381 name, (len = 256, &len),
382 dom, (len2 = 256, &len),
383 &use))
384 printf ("%s:%s:513:\n", name,
385 print_sids ? put_sid (sid) : "");
386 FreeSid (sid);
387 }
388 free (csid);
389 }
390
391 if (print_domain)
392 {
393 if (domain_specified)
394 rc = NetGetDCName (NULL, domain_name, (LPBYTE *) & servername);
395
396 else
397 rc = NetGetDCName (NULL, NULL, (LPBYTE *) & servername);
398
399 if (rc != ERROR_SUCCESS)
400 {
401 fprintf (stderr, "Cannot get PDC, code = %ld\n", rc);
402 exit (1);
403 }
404
405 enum_groups (servername, print_sids);
406 }
407
408 if (print_local)
409 enum_local_groups (print_sids);
410
411 return 0;
412 }
This page took 0.053925 seconds and 6 git commands to generate.