]> sourceware.org Git - newlib-cygwin.git/blob - winsup/utils/mkgroup.c
This commit was generated by cvs2svn to track changes on a CVS vendor
[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
86 do
87 {
88 DWORD i;
89 DWORD rc = NetLocalGroupEnum (NULL, 0, (LPBYTE *) & buffer, 1024,
90 &entriesread, &totalentries, &resume_handle);
91
92 switch (rc)
93 {
94 case ERROR_ACCESS_DENIED:
95 fprintf (stderr, "Access denied\n");
96 exit (1);
97
98 case ERROR_MORE_DATA:
99 case ERROR_SUCCESS:
100 break;
101
102 default:
103 fprintf (stderr, "NetUserEnum() failed with %ld\n", rc);
104 exit (1);
105 }
106
107 for (i = 0; i < entriesread; i++)
108 {
109 char localgroup_name[100];
110 char domain_name[100];
111 DWORD domname_len = 100;
112 char psid_buffer[1024];
113 PSID psid = (PSID) psid_buffer;
114 DWORD sid_length = 1024;
115 DWORD gid;
116 SID_NAME_USE acc_type;
117 uni2ansi (buffer[i].lgrpi0_name, localgroup_name);
118
119 if (!LookupAccountName (NULL, localgroup_name, psid,
120 &sid_length, domain_name, &domname_len,
121 &acc_type))
122 {
123 fprintf (stderr, "LookupAccountName(%s) failed with %ld\n",
124 localgroup_name, GetLastError ());
125 continue;
126 }
127 else if (acc_type == SidTypeDomain)
128 {
129 char domname[356];
130
131 strcpy (domname, domain_name);
132 strcat (domname, "\\");
133 strcat (domname, localgroup_name);
134 sid_length = 1024;
135 domname_len = 100;
136 if (!LookupAccountName (NULL, domname,
137 psid, &sid_length,
138 domain_name, &domname_len,
139 &acc_type))
140 {
141 fprintf (stderr,
142 "LookupAccountName(%s) failed with error %ld\n",
143 localgroup_name, GetLastError ());
144 continue;
145 }
146 }
147
148 gid = *GetSidSubAuthority (psid, *GetSidSubAuthorityCount(psid) - 1);
149
150 printf ("%s:%s:%ld:\n", localgroup_name,
151 print_sids ? put_sid (psid) : "",
152 gid);
153 }
154
155 NetApiBufferFree (buffer);
156
157 }
158 while (entriesread < totalentries);
159
160 return 0;
161 }
162
163 void
164 enum_groups (LPWSTR servername, int print_sids)
165 {
166 GROUP_INFO_2 *buffer;
167 DWORD entriesread = 0;
168 DWORD totalentries = 0;
169 DWORD resume_handle = 0;
170 char ansi_srvname[256];
171
172 if (servername)
173 uni2ansi (servername, ansi_srvname);
174
175 do
176 {
177 DWORD i;
178 DWORD rc = NetGroupEnum (servername, 2, (LPBYTE *) & buffer, 1024,
179 &entriesread, &totalentries, &resume_handle);
180
181 switch (rc)
182 {
183 case ERROR_ACCESS_DENIED:
184 fprintf (stderr, "Access denied\n");
185 exit (1);
186
187 case ERROR_MORE_DATA:
188 case ERROR_SUCCESS:
189 break;
190
191 default:
192 fprintf (stderr, "NetUserEnum() failed with %ld\n", rc);
193 exit (1);
194 }
195
196 for (i = 0; i < entriesread; i++)
197 {
198 char groupname[100];
199 char domain_name[100];
200 DWORD domname_len = 100;
201 char psid_buffer[1024];
202 PSID psid = (PSID) psid_buffer;
203 DWORD sid_length = 1024;
204 SID_NAME_USE acc_type;
205
206 int gid = buffer[i].grpi2_group_id;
207 uni2ansi (buffer[i].grpi2_name, groupname);
208 if (print_sids)
209 {
210 if (!LookupAccountName (servername ? ansi_srvname : NULL,
211 groupname,
212 psid, &sid_length,
213 domain_name, &domname_len,
214 &acc_type))
215 {
216 fprintf (stderr,
217 "LookupAccountName (%s, %s) failed with error %ld\n",
218 servername ? ansi_srvname : "NULL",
219 groupname,
220 GetLastError ());
221 continue;
222 }
223 else if (acc_type == SidTypeDomain)
224 {
225 char domname[356];
226
227 strcpy (domname, domain_name);
228 strcat (domname, "\\");
229 strcat (domname, groupname);
230 sid_length = 1024;
231 domname_len = 100;
232 if (!LookupAccountName (servername ? ansi_srvname : NULL,
233 domname,
234 psid, &sid_length,
235 domain_name, &domname_len,
236 &acc_type))
237 {
238 fprintf (stderr,
239 "LookupAccountName(%s,%s) failed with error %ld\n",
240 servername ? ansi_srvname : "NULL",
241 domname,
242 GetLastError ());
243 continue;
244 }
245 }
246 }
247 printf ("%s:%s:%d:\n", groupname,
248 print_sids ? put_sid (psid) : "",
249 gid);
250 }
251
252 NetApiBufferFree (buffer);
253
254 }
255 while (entriesread < totalentries);
256
257 if (servername)
258 NetApiBufferFree (servername);
259 }
260
261 void
262 usage ()
263 {
264 fprintf (stderr, "\n");
265 fprintf (stderr, "usage: mkgroup <options> [domain]\n\n");
266 fprintf (stderr, "This program prints group information to stdout\n\n");
267 fprintf (stderr, "Options:\n");
268 fprintf (stderr, " -l,--local print pseudo group information if there is\n");
269 fprintf (stderr, " no domain\n");
270 fprintf (stderr, " -d,--domain print global group information from the domain\n");
271 fprintf (stderr, " specified (or from the current domain if there is\n");
272 fprintf (stderr, " no domain specified)\n");
273 fprintf (stderr, " -s,--no-sids don't print SIDs in pwd field\n");
274 fprintf (stderr, " (this affects NT security)\n");
275 fprintf (stderr, " -?,--help print this message\n\n");
276 exit (1);
277 }
278
279 int
280 main (int argc, char **argv)
281 {
282 LPWSTR servername;
283 DWORD rc = ERROR_SUCCESS;
284 WCHAR domain_name[100];
285 int print_local = 0;
286 int print_domain = 0;
287 int print_sids = 1;
288 int domain_specified = 0;
289 int i;
290
291 char name[256], dom[256];
292 DWORD len, len2;
293 PSID sid, csid;
294 SID_NAME_USE use;
295
296 if (argc == 1)
297 usage ();
298
299 else
300 {
301 for (i = 1; i < argc; i++)
302 {
303 if (!strcmp (argv[i], "-l") || !strcmp (argv[i], "--local"))
304 print_local = 1;
305
306 else if (!strcmp (argv[i], "-d") || !strcmp (argv[i], "--domain"))
307 print_domain = 1;
308
309 else if (!strcmp (argv[i], "-s") || !strcmp (argv[i], "--no-sids"))
310 print_sids = 0;
311
312 else if (!strcmp (argv[i], "-?") || !strcmp (argv[i], "--help"))
313 usage ();
314
315 else
316 {
317 mbstowcs (domain_name, argv[i], strlen (argv[i]) + 1);
318 domain_specified = 1;
319 }
320 }
321 }
322
323 /*
324 * Get `Everyone' group
325 */
326 if (AllocateAndInitializeSid (&sid_world_auth, 1, SECURITY_WORLD_RID,
327 0, 0, 0, 0, 0, 0, 0, &sid))
328 {
329 if (LookupAccountSid (NULL, sid,
330 name, (len = 256, &len),
331 dom, (len2 = 256, &len),
332 &use))
333 printf ("%s:%s:%ld:\n", name,
334 print_sids ? put_sid (sid) : "",
335 SECURITY_WORLD_RID);
336 FreeSid (sid);
337 }
338
339 /*
340 * Get `system' group
341 */
342 if (AllocateAndInitializeSid (&sid_nt_auth, 1, SECURITY_LOCAL_SYSTEM_RID,
343 0, 0, 0, 0, 0, 0, 0, &sid))
344 {
345 if (LookupAccountSid (NULL, sid,
346 name, (len = 256, &len),
347 dom, (len2 = 256, &len),
348 &use))
349 printf ("%s:%s:%ld:\n", name,
350 print_sids ? put_sid (sid) : "",
351 SECURITY_LOCAL_SYSTEM_RID);
352 FreeSid (sid);
353 }
354
355 if (print_local)
356 {
357 /*
358 * Get `None' group
359 */
360 GetComputerName (name, (len = 256, &len));
361 csid = (PSID) malloc (1024);
362 LookupAccountName (NULL, name,
363 csid, (len = 1024, &len),
364 dom, (len2 = 256, &len),
365 &use);
366 if (AllocateAndInitializeSid (GetSidIdentifierAuthority (csid),
367 5,
368 *GetSidSubAuthority (csid, 0),
369 *GetSidSubAuthority (csid, 1),
370 *GetSidSubAuthority (csid, 2),
371 *GetSidSubAuthority (csid, 3),
372 513,
373 0,
374 0,
375 0,
376 &sid))
377 {
378 if (LookupAccountSid (NULL, sid,
379 name, (len = 256, &len),
380 dom, (len2 = 256, &len),
381 &use))
382 printf ("%s:%s:513:\n", name,
383 print_sids ? put_sid (sid) : "");
384 FreeSid (sid);
385 }
386 free (csid);
387 }
388
389 if (print_domain)
390 {
391 if (domain_specified)
392 rc = NetGetDCName (NULL, domain_name, (LPBYTE *) & servername);
393
394 else
395 rc = NetGetDCName (NULL, NULL, (LPBYTE *) & servername);
396
397 if (rc != ERROR_SUCCESS)
398 {
399 fprintf (stderr, "Cannot get PDC, code = %ld\n", rc);
400 exit (1);
401 }
402
403 enum_groups (servername, print_sids);
404 }
405
406 if (print_local)
407 enum_local_groups (print_sids);
408
409 return 0;
410 }
This page took 0.051331 seconds and 6 git commands to generate.