3 Copyright 1997, 1998 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_local_groups (int print_sids
)
81 LOCALGROUP_INFO_0
*buffer
;
82 DWORD entriesread
= 0;
83 DWORD totalentries
= 0;
84 DWORD resume_handle
= 0;
89 DWORD rc
= NetLocalGroupEnum (NULL
, 0, (LPBYTE
*) & buffer
, 1024,
90 &entriesread
, &totalentries
, &resume_handle
);
94 case ERROR_ACCESS_DENIED
:
95 fprintf (stderr
, "Access denied\n");
103 fprintf (stderr
, "NetUserEnum() failed with %ld\n", rc
);
107 for (i
= 0; i
< entriesread
; i
++)
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;
116 SID_NAME_USE acc_type
;
117 uni2ansi (buffer
[i
].lgrpi0_name
, localgroup_name
);
119 if (!LookupAccountName (NULL
, localgroup_name
, psid
,
120 &sid_length
, domain_name
, &domname_len
,
123 fprintf (stderr
, "LookupAccountName(%s) failed with %ld\n",
124 localgroup_name
, GetLastError ());
127 else if (acc_type
== SidTypeDomain
)
131 strcpy (domname
, domain_name
);
132 strcat (domname
, "\\");
133 strcat (domname
, localgroup_name
);
136 if (!LookupAccountName (NULL
, domname
,
138 domain_name
, &domname_len
,
142 "LookupAccountName(%s) failed with error %ld\n",
143 localgroup_name
, GetLastError ());
148 gid
= *GetSidSubAuthority (psid
, *GetSidSubAuthorityCount(psid
) - 1);
150 printf ("%s:%s:%ld:\n", localgroup_name
,
151 print_sids
? put_sid (psid
) : "",
155 NetApiBufferFree (buffer
);
158 while (entriesread
< totalentries
);
164 enum_groups (LPWSTR servername
, int print_sids
)
166 GROUP_INFO_2
*buffer
;
167 DWORD entriesread
= 0;
168 DWORD totalentries
= 0;
169 DWORD resume_handle
= 0;
170 char ansi_srvname
[256];
173 uni2ansi (servername
, ansi_srvname
);
178 DWORD rc
= NetGroupEnum (servername
, 2, (LPBYTE
*) & buffer
, 1024,
179 &entriesread
, &totalentries
, &resume_handle
);
183 case ERROR_ACCESS_DENIED
:
184 fprintf (stderr
, "Access denied\n");
187 case ERROR_MORE_DATA
:
192 fprintf (stderr
, "NetUserEnum() failed with %ld\n", rc
);
196 for (i
= 0; i
< entriesread
; i
++)
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
;
206 int gid
= buffer
[i
].grpi2_group_id
;
207 uni2ansi (buffer
[i
].grpi2_name
, groupname
);
210 if (!LookupAccountName (servername
? ansi_srvname
: NULL
,
213 domain_name
, &domname_len
,
217 "LookupAccountName (%s, %s) failed with error %ld\n",
218 servername
? ansi_srvname
: "NULL",
223 else if (acc_type
== SidTypeDomain
)
227 strcpy (domname
, domain_name
);
228 strcat (domname
, "\\");
229 strcat (domname
, groupname
);
232 if (!LookupAccountName (servername
? ansi_srvname
: NULL
,
235 domain_name
, &domname_len
,
239 "LookupAccountName(%s,%s) failed with error %ld\n",
240 servername
? ansi_srvname
: "NULL",
247 printf ("%s:%s:%d:\n", groupname
,
248 print_sids
? put_sid (psid
) : "",
252 NetApiBufferFree (buffer
);
255 while (entriesread
< totalentries
);
258 NetApiBufferFree (servername
);
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");
280 main (int argc
, char **argv
)
283 DWORD rc
= ERROR_SUCCESS
;
284 WCHAR domain_name
[100];
286 int print_domain
= 0;
288 int domain_specified
= 0;
291 char name
[256], dom
[256];
301 for (i
= 1; i
< argc
; i
++)
303 if (!strcmp (argv
[i
], "-l") || !strcmp (argv
[i
], "--local"))
306 else if (!strcmp (argv
[i
], "-d") || !strcmp (argv
[i
], "--domain"))
309 else if (!strcmp (argv
[i
], "-s") || !strcmp (argv
[i
], "--no-sids"))
312 else if (!strcmp (argv
[i
], "-?") || !strcmp (argv
[i
], "--help"))
317 mbstowcs (domain_name
, argv
[i
], strlen (argv
[i
]) + 1);
318 domain_specified
= 1;
324 * Get `Everyone' group
326 if (AllocateAndInitializeSid (&sid_world_auth
, 1, SECURITY_WORLD_RID
,
327 0, 0, 0, 0, 0, 0, 0, &sid
))
329 if (LookupAccountSid (NULL
, sid
,
330 name
, (len
= 256, &len
),
331 dom
, (len2
= 256, &len
),
333 printf ("%s:%s:%ld:\n", name
,
334 print_sids
? put_sid (sid
) : "",
342 if (AllocateAndInitializeSid (&sid_nt_auth
, 1, SECURITY_LOCAL_SYSTEM_RID
,
343 0, 0, 0, 0, 0, 0, 0, &sid
))
345 if (LookupAccountSid (NULL
, sid
,
346 name
, (len
= 256, &len
),
347 dom
, (len2
= 256, &len
),
349 printf ("%s:%s:%ld:\n", name
,
350 print_sids
? put_sid (sid
) : "",
351 SECURITY_LOCAL_SYSTEM_RID
);
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
),
366 if (AllocateAndInitializeSid (GetSidIdentifierAuthority (csid
),
368 *GetSidSubAuthority (csid
, 0),
369 *GetSidSubAuthority (csid
, 1),
370 *GetSidSubAuthority (csid
, 2),
371 *GetSidSubAuthority (csid
, 3),
378 if (LookupAccountSid (NULL
, sid
,
379 name
, (len
= 256, &len
),
380 dom
, (len2
= 256, &len
),
382 printf ("%s:%s:513:\n", name
,
383 print_sids
? put_sid (sid
) : "");
391 if (domain_specified
)
392 rc
= NetGetDCName (NULL
, domain_name
, (LPBYTE
*) & servername
);
395 rc
= NetGetDCName (NULL
, NULL
, (LPBYTE
*) & servername
);
397 if (rc
!= ERROR_SUCCESS
)
399 fprintf (stderr
, "Cannot get PDC, code = %ld\n", rc
);
403 enum_groups (servername
, print_sids
);
407 enum_local_groups (print_sids
);