⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mkgroup.c

📁 cygwin, 著名的在win32下模拟unix操作系统的东东
💻 C
📖 第 1 页 / 共 2 页
字号:
/* 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 + -