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;
91 rc
= NetLocalGroupEnum (NULL
, 0, (LPBYTE
*) & buffer
, 1024,
92 &entriesread
, &totalentries
, &resume_handle
);
95 case ERROR_ACCESS_DENIED
:
96 fprintf (stderr
, "Access denied\n");
104 fprintf (stderr
, "NetUserEnum() failed with %ld\n", rc
);
108 for (i
= 0; i
< entriesread
; i
++)
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;
117 SID_NAME_USE acc_type
;
118 uni2ansi (buffer
[i
].lgrpi0_name
, localgroup_name
);
120 if (!LookupAccountName (NULL
, localgroup_name
, psid
,
121 &sid_length
, domain_name
, &domname_len
,
124 fprintf (stderr
, "LookupAccountName(%s) failed with %ld\n",
125 localgroup_name
, GetLastError ());
128 else if (acc_type
== SidTypeDomain
)
132 strcpy (domname
, domain_name
);
133 strcat (domname
, "\\");
134 strcat (domname
, localgroup_name
);
137 if (!LookupAccountName (NULL
, domname
,
139 domain_name
, &domname_len
,
143 "LookupAccountName(%s) failed with error %ld\n",
144 localgroup_name
, GetLastError ());
149 gid
= *GetSidSubAuthority (psid
, *GetSidSubAuthorityCount(psid
) - 1);
151 printf ("%s:%s:%ld:\n", localgroup_name
,
152 print_sids
? put_sid (psid
) : "",
156 NetApiBufferFree (buffer
);
159 while (rc
== ERROR_MORE_DATA
);
165 enum_groups (LPWSTR servername
, int print_sids
)
167 GROUP_INFO_2
*buffer
;
168 DWORD entriesread
= 0;
169 DWORD totalentries
= 0;
170 DWORD resume_handle
= 0;
172 char ansi_srvname
[256];
175 uni2ansi (servername
, ansi_srvname
);
181 rc
= NetGroupEnum (servername
, 2, (LPBYTE
*) & buffer
, 1024,
182 &entriesread
, &totalentries
, &resume_handle
);
185 case ERROR_ACCESS_DENIED
:
186 fprintf (stderr
, "Access denied\n");
189 case ERROR_MORE_DATA
:
194 fprintf (stderr
, "NetUserEnum() failed with %ld\n", rc
);
198 for (i
= 0; i
< entriesread
; i
++)
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
;
208 int gid
= buffer
[i
].grpi2_group_id
;
209 uni2ansi (buffer
[i
].grpi2_name
, groupname
);
212 if (!LookupAccountName (servername
? ansi_srvname
: NULL
,
215 domain_name
, &domname_len
,
219 "LookupAccountName (%s, %s) failed with error %ld\n",
220 servername
? ansi_srvname
: "NULL",
225 else if (acc_type
== SidTypeDomain
)
229 strcpy (domname
, domain_name
);
230 strcat (domname
, "\\");
231 strcat (domname
, groupname
);
234 if (!LookupAccountName (servername
? ansi_srvname
: NULL
,
237 domain_name
, &domname_len
,
241 "LookupAccountName(%s,%s) failed with error %ld\n",
242 servername
? ansi_srvname
: "NULL",
249 printf ("%s:%s:%d:\n", groupname
,
250 print_sids
? put_sid (psid
) : "",
254 NetApiBufferFree (buffer
);
257 while (rc
== ERROR_MORE_DATA
);
260 NetApiBufferFree (servername
);
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");
282 main (int argc
, char **argv
)
285 DWORD rc
= ERROR_SUCCESS
;
286 WCHAR domain_name
[100];
288 int print_domain
= 0;
290 int domain_specified
= 0;
293 char name
[256], dom
[256];
303 for (i
= 1; i
< argc
; i
++)
305 if (!strcmp (argv
[i
], "-l") || !strcmp (argv
[i
], "--local"))
308 else if (!strcmp (argv
[i
], "-d") || !strcmp (argv
[i
], "--domain"))
311 else if (!strcmp (argv
[i
], "-s") || !strcmp (argv
[i
], "--no-sids"))
314 else if (!strcmp (argv
[i
], "-?") || !strcmp (argv
[i
], "--help"))
319 mbstowcs (domain_name
, argv
[i
], strlen (argv
[i
]) + 1);
320 domain_specified
= 1;
326 * Get `Everyone' group
328 if (AllocateAndInitializeSid (&sid_world_auth
, 1, SECURITY_WORLD_RID
,
329 0, 0, 0, 0, 0, 0, 0, &sid
))
331 if (LookupAccountSid (NULL
, sid
,
332 name
, (len
= 256, &len
),
333 dom
, (len2
= 256, &len
),
335 printf ("%s:%s:%ld:\n", name
,
336 print_sids
? put_sid (sid
) : "",
344 if (AllocateAndInitializeSid (&sid_nt_auth
, 1, SECURITY_LOCAL_SYSTEM_RID
,
345 0, 0, 0, 0, 0, 0, 0, &sid
))
347 if (LookupAccountSid (NULL
, sid
,
348 name
, (len
= 256, &len
),
349 dom
, (len2
= 256, &len
),
351 printf ("%s:%s:%ld:\n", name
,
352 print_sids
? put_sid (sid
) : "",
353 SECURITY_LOCAL_SYSTEM_RID
);
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
),
368 if (AllocateAndInitializeSid (GetSidIdentifierAuthority (csid
),
370 *GetSidSubAuthority (csid
, 0),
371 *GetSidSubAuthority (csid
, 1),
372 *GetSidSubAuthority (csid
, 2),
373 *GetSidSubAuthority (csid
, 3),
380 if (LookupAccountSid (NULL
, sid
,
381 name
, (len
= 256, &len
),
382 dom
, (len2
= 256, &len
),
384 printf ("%s:%s:513:\n", name
,
385 print_sids
? put_sid (sid
) : "");
393 if (domain_specified
)
394 rc
= NetGetDCName (NULL
, domain_name
, (LPBYTE
*) & servername
);
397 rc
= NetGetDCName (NULL
, NULL
, (LPBYTE
*) & servername
);
399 if (rc
!= ERROR_SUCCESS
)
401 fprintf (stderr
, "Cannot get PDC, code = %ld\n", rc
);
405 enum_groups (servername
, print_sids
);
409 enum_local_groups (print_sids
);