📄 mkgroup.c
字号:
/* mkgroup.c: Copyright 1997, 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. This file is part of Cygwin. This software is a copyrighted work licensed under the terms of the Cygwin license. Please consult the file "CYGWIN_LICENSE" for details. */#include <ctype.h>#include <stdlib.h>#include <wchar.h>#include <stdio.h>#include <windows.h>#include <sys/cygwin.h>#include <getopt.h>#include <lmaccess.h>#include <lmapibuf.h>#include <ntsecapi.h>#include <ntdef.h>static const char version[] = "$Revision: 1.10 $";SID_IDENTIFIER_AUTHORITY sid_world_auth = {SECURITY_WORLD_SID_AUTHORITY};SID_IDENTIFIER_AUTHORITY sid_nt_auth = {SECURITY_NT_AUTHORITY};NET_API_STATUS WINAPI (*netapibufferfree)(PVOID);NET_API_STATUS WINAPI (*netgroupenum)(LPWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD);NET_API_STATUS WINAPI (*netlocalgroupenum)(LPWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD);NET_API_STATUS WINAPI (*netlocalgroupgetmembers)(LPWSTR,LPWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD);NET_API_STATUS WINAPI (*netgetdcname)(LPWSTR,LPWSTR,PBYTE*);NET_API_STATUS WINAPI (*netgroupgetusers)(LPWSTR,LPWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD);NTSTATUS NTAPI (*lsaclose)(LSA_HANDLE);NTSTATUS NTAPI (*lsaopenpolicy)(PLSA_UNICODE_STRING,PLSA_OBJECT_ATTRIBUTES,ACCESS_MASK,PLSA_HANDLE);NTSTATUS NTAPI (*lsaqueryinformationpolicy)(LSA_HANDLE,POLICY_INFORMATION_CLASS,PVOID*);NTSTATUS NTAPI (*lsafreememory)(PVOID);#ifndef min#define min(a,b) (((a)<(b))?(a):(b))#endifBOOLload_netapi (){ HANDLE h = LoadLibrary ("netapi32.dll"); if (!h) return FALSE; if (!(netapibufferfree = (void *) GetProcAddress (h, "NetApiBufferFree"))) return FALSE; if (!(netgroupenum = (void *) GetProcAddress (h, "NetGroupEnum"))) return FALSE; if (!(netgroupgetusers = (void *) GetProcAddress (h, "NetGroupGetUsers"))) return FALSE; if (!(netlocalgroupenum = (void *) GetProcAddress (h, "NetLocalGroupEnum"))) return FALSE; if (!(netlocalgroupgetmembers = (void *) GetProcAddress (h, "NetLocalGroupGetMembers"))) return FALSE; if (!(netgetdcname = (void *) GetProcAddress (h, "NetGetDCName"))) return FALSE; if (!(h = LoadLibrary ("advapi32.dll"))) return FALSE; if (!(lsaclose = (void *) GetProcAddress (h, "LsaClose"))) return FALSE; if (!(lsaopenpolicy = (void *) GetProcAddress (h, "LsaOpenPolicy"))) return FALSE; if (!(lsaqueryinformationpolicy = (void *) GetProcAddress (h, "LsaQueryInformationPolicy"))) return FALSE; if (!(lsafreememory = (void *) GetProcAddress (h, "LsaFreeMemory"))) return FALSE; return TRUE;}char *put_sid (PSID sid){ static char s[512]; char t[32]; DWORD i; strcpy (s, "S-1-"); sprintf(t, "%u", GetSidIdentifierAuthority (sid)->Value[5]); strcat (s, t); for (i = 0; i < *GetSidSubAuthorityCount (sid); ++i) { sprintf(t, "-%lu", *GetSidSubAuthority (sid, i)); strcat (s, t); } return s;}voidpsx_dir (char *in, char *out){ if (isalpha (in[0]) && in[1] == ':') { sprintf (out, "/cygdrive/%c", in[0]); in += 2; out += strlen (out); } while (*in) { if (*in == '\\') *out = '/'; else *out = *in; in++; out++; } *out = '\0';}voiduni2ansi (LPWSTR wcs, char *mbs, int size){ if (wcs) WideCharToMultiByte (CP_ACP, 0, wcs, -1, mbs, size, NULL, NULL); else *mbs = '\0';}voidenum_local_users (LPWSTR groupname){ LOCALGROUP_MEMBERS_INFO_1 *buf1; DWORD entries = 0; DWORD total = 0; DWORD reshdl = 0; if (!netlocalgroupgetmembers (NULL, groupname, 1, (LPBYTE *) &buf1, MAX_PREFERRED_LENGTH, &entries, &total, &reshdl)) { unsigned i, first = 1; for (i = 0; i < entries; ++i) if (buf1[i].lgrmi1_sidusage == SidTypeUser) { char user[256]; if (!first) printf (","); first = 0; uni2ansi (buf1[i].lgrmi1_name, user, sizeof (user)); printf ("%s", user); } netapibufferfree (buf1); }}intenum_local_groups (int print_sids, int print_users){ LOCALGROUP_INFO_0 *buffer; DWORD entriesread = 0; DWORD totalentries = 0; DWORD resume_handle = 0; DWORD rc; do { DWORD i; rc = netlocalgroupenum (NULL, 0, (LPBYTE *) &buffer, 1024, &entriesread, &totalentries, &resume_handle); switch (rc) { case ERROR_ACCESS_DENIED: fprintf (stderr, "Access denied\n"); exit (1); case ERROR_MORE_DATA: case ERROR_SUCCESS: break; default: fprintf (stderr, "NetLocalGroupEnum() failed with %ld\n", rc); exit (1); } for (i = 0; i < entriesread; i++) { char localgroup_name[100]; char domain_name[100]; DWORD domname_len = 100; char psid_buffer[1024]; PSID psid = (PSID) psid_buffer; DWORD sid_length = 1024; DWORD gid; SID_NAME_USE acc_type; uni2ansi (buffer[i].lgrpi0_name, localgroup_name, sizeof (localgroup_name)); if (!LookupAccountName (NULL, localgroup_name, psid, &sid_length, domain_name, &domname_len, &acc_type)) { fprintf (stderr, "LookupAccountName(%s) failed with %ld\n", localgroup_name, GetLastError ()); continue; } else if (acc_type == SidTypeDomain) { char domname[356]; strcpy (domname, domain_name); strcat (domname, "\\"); strcat (domname, localgroup_name); sid_length = 1024; domname_len = 100; if (!LookupAccountName (NULL, domname, psid, &sid_length, domain_name, &domname_len, &acc_type)) { fprintf (stderr, "LookupAccountName(%s) failed with error %ld\n", localgroup_name, GetLastError ()); continue; } } gid = *GetSidSubAuthority (psid, *GetSidSubAuthorityCount(psid) - 1); printf ("%s:%s:%ld:", localgroup_name, print_sids ? put_sid (psid) : "", gid); if (print_users) enum_local_users (buffer[i].lgrpi0_name); printf ("\n"); } netapibufferfree (buffer); } while (rc == ERROR_MORE_DATA); return 0;}voidenum_users (LPWSTR servername, LPWSTR groupname){ GROUP_USERS_INFO_0 *buf1; DWORD entries = 0; DWORD total = 0; DWORD reshdl = 0; if (!netgroupgetusers (servername, groupname, 0, (LPBYTE *) &buf1, MAX_PREFERRED_LENGTH, &entries, &total, &reshdl)) { unsigned i, first = 1; for (i = 0; i < entries; ++i) { char user[256]; if (!first) printf (","); first = 0; uni2ansi (buf1[i].grui0_name, user, sizeof (user)); printf ("%s", user); } netapibufferfree (buf1); }}voidenum_groups (LPWSTR servername, int print_sids, int print_users, int id_offset){ GROUP_INFO_2 *buffer; DWORD entriesread = 0; DWORD totalentries = 0; DWORD resume_handle = 0; DWORD rc; char ansi_srvname[256]; if (servername) uni2ansi (servername, ansi_srvname, sizeof (ansi_srvname)); do { DWORD i; rc = netgroupenum (servername, 2, (LPBYTE *) & buffer, 1024, &entriesread, &totalentries, &resume_handle); switch (rc) { case ERROR_ACCESS_DENIED: fprintf (stderr, "Access denied\n"); exit (1); case ERROR_MORE_DATA: case ERROR_SUCCESS: break; default: fprintf (stderr, "NetGroupEnum() failed with %ld\n", rc); exit (1); } for (i = 0; i < entriesread; i++) { char groupname[100]; char domain_name[100]; DWORD domname_len = 100; char psid_buffer[1024]; PSID psid = (PSID) psid_buffer; DWORD sid_length = 1024; SID_NAME_USE acc_type; int gid = buffer[i].grpi2_group_id; uni2ansi (buffer[i].grpi2_name, groupname, sizeof (groupname)); if (print_sids) { if (!LookupAccountName (servername ? ansi_srvname : NULL,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -