Advertisement
Guest User

Untitled

a guest
Mar 5th, 2019
180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 24.20 KB | None | 0 0
  1. #include <SDKDDKVer.h>
  2. #include <stdio.h>
  3. #include <tchar.h>
  4. #include <windows.h>
  5. #include <lm.h>
  6. #include <sddl.h>
  7. #include <iostream>
  8. #include <Ntsecapi.h>
  9. #include <ntstatus.h>
  10. #include <lmcons.h>
  11. #include <lmaccess.h>
  12. #include <lmerr.h>
  13. #include <lmapibuf.h>
  14. #include <ntsecapi.h>
  15.  
  16. using namespace std;
  17.  
  18. typedef NET_API_STATUS(_stdcall *_NetUserEnumT)(
  19.     _In_    LPCWSTR servername,
  20.     _In_    DWORD   level,
  21.     _In_    DWORD   filter,
  22.     _Out_   LPBYTE  *bufptr,
  23.     _In_    DWORD   prefmaxlen,
  24.     _Out_   LPDWORD entriesread,
  25.     _Out_   LPDWORD totalentries,
  26.     _Inout_ LPDWORD resume_handle
  27.     );
  28.  
  29. typedef NET_API_STATUS(_stdcall *_NetApiBufferFreeT)(
  30.     _In_ LPVOID Buffer
  31.     );
  32.  
  33. typedef NET_API_STATUS(_stdcall *_NetUserGetLocalGroupsT)(
  34.     _In_  LPCWSTR servername,
  35.     _In_  LPCWSTR username,
  36.     _In_  DWORD   level,
  37.     _In_  DWORD   flags,
  38.     _Out_ LPBYTE  *bufptr,
  39.     _In_  DWORD   prefmaxlen,
  40.     _Out_ LPDWORD entriesread,
  41.     _Out_ LPDWORD totalentries
  42.     );
  43.  
  44. typedef NET_API_STATUS(_stdcall *_NetUserGetGroupsT)(
  45.     _In_  LPCWSTR servername,
  46.     _In_  LPCWSTR username,
  47.     _In_  DWORD   level,
  48.     _Out_ LPBYTE  *bufptr,
  49.     _In_  DWORD   prefmaxlen,
  50.     _Out_ LPDWORD entriesread,
  51.     _Out_ LPDWORD totalentries
  52.     );
  53.  
  54. typedef NET_API_STATUS(_stdcall *_NetUserAddT)(
  55.     _In_  LMSTR   servername,
  56.     _In_  DWORD   level,
  57.     _In_  LPBYTE  buf,
  58.     _Out_ LPDWORD parm_err
  59.     );
  60.  
  61. typedef NET_API_STATUS(_stdcall *_NetUserDelT)(
  62.     _In_ LPCWSTR servername,
  63.     _In_ LPCWSTR username
  64.     );
  65.  
  66.  
  67. typedef NET_API_STATUS(_stdcall *_NetLocalGroupAddMembersT)(
  68.     _In_ LPCWSTR servername,
  69.     _In_ LPCWSTR groupname,
  70.     _In_ DWORD   level,
  71.     _In_ LPBYTE  buf,
  72.     _In_ DWORD   totalentries
  73.     );
  74.  
  75. typedef NET_API_STATUS(_stdcall *_NetLocalGroupDelMembersT)(
  76.     _In_ LPCWSTR servername,
  77.     _In_ LPCWSTR groupname,
  78.     _In_ DWORD   level,
  79.     _In_ LPBYTE  buf,
  80.     _In_ DWORD   totalentries
  81.     );
  82.  
  83. typedef NET_API_STATUS(_stdcall *_NetLocalGroupAddT)(
  84.     _In_  LPCWSTR servername,
  85.     _In_  DWORD   level,
  86.     _In_  LPBYTE  buf,
  87.     _Out_ LPDWORD parm_err
  88.     );
  89.  
  90. typedef NET_API_STATUS(_stdcall *_NetLocalGroupDelT)(
  91.     _In_ LPCWSTR servername,
  92.     _In_ LPCWSTR groupname
  93.     );
  94.  
  95. typedef NET_API_STATUS(NET_API_FUNCTION *_NetUserSetInfoT)(
  96.     LPCWSTR servername,
  97.     LPCWSTR username,
  98.     DWORD   level,
  99.     LPBYTE  buf,
  100.     LPDWORD parm_err
  101.     );
  102.  
  103. typedef BOOL(WINAPI *_ConvertSidToStringSidT)(
  104.     _In_  PSID   Sid,
  105.     _Out_ LPTSTR *StringSid
  106.     );
  107.  
  108. typedef BOOL(WINAPI *_LookupAccountNameT)(
  109.     _In_opt_  LPCTSTR       lpSystemName,
  110.     _In_      LPCTSTR       lpAccountName,
  111.     _Out_opt_ PSID          Sid,
  112.     _Inout_   LPDWORD       cbSid,
  113.     _Out_opt_ LPTSTR        ReferencedDomainName,
  114.     _Inout_   LPDWORD       cchReferencedDomainName,
  115.     _Out_     PSID_NAME_USE peUse
  116.     );
  117.  
  118. typedef BOOL(WINAPI *_AdjustTokenPrivilegesT)(
  119.     _In_      HANDLE            TokenHandle,
  120.     _In_      BOOL              DisableAllPrivileges,
  121.     _In_opt_  PTOKEN_PRIVILEGES NewState,
  122.     _In_      DWORD             BufferLength,
  123.     _Out_opt_ PTOKEN_PRIVILEGES PreviousState,
  124.     _Out_opt_ PDWORD            ReturnLength
  125.     );
  126.  
  127. typedef NTSTATUS(_stdcall *_LsaAddAccountRightsT)(
  128.     _In_ LSA_HANDLE          PolicyHandle,
  129.     _In_ PSID                AccountSid,
  130.     _In_ PLSA_UNICODE_STRING UserRights,
  131.     _In_ ULONG               CountOfRights
  132.     );
  133.  
  134. typedef NTSTATUS(_stdcall *_LsaRemoveAccountRightsT)(
  135.     _In_ LSA_HANDLE          PolicyHandle,
  136.     _In_ PSID                AccountSid,
  137.     _In_ BOOLEAN             AllRights,
  138.     _In_ PLSA_UNICODE_STRING UserRights,
  139.     _In_ ULONG               CountOfRights
  140.     );
  141.  
  142. typedef ULONG(_stdcall *_LsaNtStatusToWinErrorT)(
  143.     _In_ NTSTATUS Status
  144.     );
  145.  
  146. typedef NTSTATUS(_stdcall *_LsaOpenPolicyT)(
  147.     _In_    PLSA_UNICODE_STRING    SystemName,
  148.     _In_    PLSA_OBJECT_ATTRIBUTES ObjectAttributes,
  149.     _In_    ACCESS_MASK            DesiredAccess,
  150.     _Inout_ PLSA_HANDLE            PolicyHandle
  151.     );
  152.  
  153. typedef NTSTATUS(_stdcall *_LsaEnumerateAccountRightsT)(
  154.     _In_  LSA_HANDLE          PolicyHandle,
  155.     _In_  PSID                AccountSid,
  156.     _Out_ PLSA_UNICODE_STRING *UserRights,
  157.     _Out_ PULONG              CountOfRights
  158.     );
  159.  
  160. HINSTANCE hNetapi32Dll = NULL;
  161. HINSTANCE hAdvapi32Dll = NULL;
  162.  
  163. _NetUserEnumT                NetUserEnumPtr;
  164. _NetApiBufferFreeT           NetApiBufferFreePtr;
  165. _NetUserGetLocalGroupsT      NetUserGetLocalGroupsPtr;
  166. _NetUserGetGroupsT           NetUserGetGroupsPtr;
  167. _NetUserAddT                 NetUserAddPtr;
  168. _NetUserDelT                 NetUserDelPtr;
  169. _NetLocalGroupAddMembersT    NetLocalGroupAddMembersPtr;
  170. _NetLocalGroupDelMembersT    NetLocalGroupDelMembersPtr;
  171. _NetLocalGroupAddT           NetLocalGroupAddPtr;
  172. _NetLocalGroupDelT           NetLocalGroupDelPtr;
  173. _NetUserSetInfoT             NetUserSetInfoPtr;
  174. _ConvertSidToStringSidT      ConvertSidToStringSidPtr;
  175. _LookupAccountNameT          LookupAccountNamePtr;
  176. _AdjustTokenPrivilegesT      AdjustTokenPrivilegesPtr;
  177. _LsaAddAccountRightsT        LsaAddAccountRightsPtr;
  178. _LsaRemoveAccountRightsT     LsaRemoveAccountRightsPtr;
  179. _LsaNtStatusToWinErrorT      LsaNtStatusToWinErrorPtr;
  180. _LsaOpenPolicyT              LsaOpenPolicyPtr;
  181. _LsaEnumerateAccountRightsT  LsaEnumerateAccountRightsPtr;
  182.  
  183. void Load_Dll(void)
  184. {
  185.     hNetapi32Dll = LoadLibrary(TEXT("netapi32.dll"));
  186.     NetUserEnumPtr = (_NetUserEnumT)GetProcAddress(hNetapi32Dll, "NetUserEnum");
  187.     NetApiBufferFreePtr = (_NetApiBufferFreeT)GetProcAddress(hNetapi32Dll, "NetApiBufferFree");  
  188.     NetUserGetLocalGroupsPtr = (_NetUserGetLocalGroupsT)GetProcAddress(hNetapi32Dll, "NetUserGetLocalGroups");        
  189.     NetUserGetGroupsPtr = (_NetUserGetGroupsT)GetProcAddress(hNetapi32Dll, "NetUserGetGroups");  
  190.     NetUserAddPtr = (_NetUserAddT)GetProcAddress(hNetapi32Dll, "NetUserAdd");
  191.     NetUserDelPtr = (_NetUserDelT)GetProcAddress(hNetapi32Dll, "NetUserDel");
  192.     NetLocalGroupAddMembersPtr = (_NetLocalGroupAddMembersT)GetProcAddress(hNetapi32Dll, "NetLocalGroupAddMembers");
  193.     NetLocalGroupDelMembersPtr = (_NetLocalGroupDelMembersT)GetProcAddress(hNetapi32Dll, "NetLocalGroupDelMembers");
  194.     NetLocalGroupAddPtr = (_NetLocalGroupAddT)GetProcAddress(hNetapi32Dll, "NetLocalGroupAdd");
  195.     NetLocalGroupDelPtr = (_NetLocalGroupDelT)GetProcAddress(hNetapi32Dll, "NetLocalGroupDel");
  196.     NetUserSetInfoPtr = (_NetUserSetInfoT)GetProcAddress(hNetapi32Dll, "NetUserSetInfo");
  197.     hAdvapi32Dll = LoadLibrary(TEXT("Advapi32.dll"));
  198.     ConvertSidToStringSidPtr = (_ConvertSidToStringSidT)GetProcAddress(hAdvapi32Dll, "ConvertSidToStringSidW");
  199.     LookupAccountNamePtr = (_LookupAccountNameT)GetProcAddress(hAdvapi32Dll, "LookupAccountNameW");
  200.     AdjustTokenPrivilegesPtr = (_AdjustTokenPrivilegesT)GetProcAddress(hAdvapi32Dll, "AdjustTokenPrivileges");
  201.     LsaAddAccountRightsPtr = (_LsaAddAccountRightsT)GetProcAddress(hAdvapi32Dll, "LsaAddAccountRights");
  202.     LsaRemoveAccountRightsPtr = (_LsaRemoveAccountRightsT)GetProcAddress(hAdvapi32Dll, "LsaRemoveAccountRights");
  203.     LsaNtStatusToWinErrorPtr = (_LsaNtStatusToWinErrorT)GetProcAddress(hAdvapi32Dll, "LsaNtStatusToWinError");
  204.     LsaOpenPolicyPtr = (_LsaOpenPolicyT)GetProcAddress(hAdvapi32Dll, "LsaOpenPolicy");
  205.     LsaEnumerateAccountRightsPtr = (_LsaEnumerateAccountRightsT)GetProcAddress(hAdvapi32Dll, "LsaEnumerateAccountRights");
  206. }
  207.  
  208. void Unload_Dll(void)
  209. {
  210.     FreeLibrary(hNetapi32Dll);
  211.     FreeLibrary(hAdvapi32Dll);
  212. }
  213.  
  214. LSA_HANDLE GetPolicyHandle()
  215. {
  216.     LSA_OBJECT_ATTRIBUTES ObjectAttributes;
  217.     NTSTATUS ntsResult;
  218.     LSA_HANDLE lsahPolicyHandle;
  219.     ZeroMemory(&ObjectAttributes, sizeof(ObjectAttributes));
  220.     ntsResult = LsaOpenPolicyPtr(
  221.         NULL,
  222.         &ObjectAttributes,
  223.         POLICY_ALL_ACCESS | POLICY_LOOKUP_NAMES | POLICY_CREATE_ACCOUNT,
  224.         &lsahPolicyHandle
  225.     );
  226.  
  227.     if (ntsResult != STATUS_SUCCESS)
  228.     {
  229.         wprintf(L"OpenPolicy returned %lu\n", LsaNtStatusToWinErrorPtr(ntsResult));
  230.         return NULL;
  231.     }
  232.     return lsahPolicyHandle;
  233. }
  234.  
  235. void Show_Privileges(LPTSTR _user_name)
  236. {
  237.     DWORD dwUserBuf = 256;
  238.     PSID userSID = NULL;
  239.     DWORD dwSID, dwDomainNameSize = 0;
  240.     BYTE bySidBuffer[1024];
  241.     LPTSTR chSID = NULL;
  242.     TCHAR  chDomainName[256];
  243.     SID_NAME_USE snu;
  244.     LSA_HANDLE policy_handle = NULL;
  245.     PLSA_UNICODE_STRING pp_user_rights;
  246.     ULONG count_of_rights = 0;
  247.  
  248.     userSID = (PSID)bySidBuffer;
  249.     dwSID = sizeof(bySidBuffer);
  250.     dwDomainNameSize = sizeof(chDomainName);
  251.  
  252.     if (!LookupAccountNamePtr(NULL, (LPWSTR)_user_name, (PSID)userSID, (LPDWORD)&dwSID, (LPTSTR)chDomainName, (LPDWORD)&dwDomainNameSize, (PSID_NAME_USE)&snu))
  253.     {
  254.         wprintf(L"can't LookupAccountName\n");
  255.         return;
  256.     }
  257.     policy_handle = GetPolicyHandle();
  258.     if (!policy_handle)
  259.     {
  260.         wprintf(L"err\n");
  261.         return;
  262.     }
  263.  
  264.     LsaEnumerateAccountRightsPtr(policy_handle, userSID, &pp_user_rights, &count_of_rights);
  265.     wprintf(L" Privileges:\n");
  266.     for (size_t i = 0; i < count_of_rights; i++)
  267.     {
  268.         wprintf(L"  %s\n", pp_user_rights[i].Buffer);
  269.     }
  270. }
  271.  
  272. void Get_User_Sid(LPTSTR _user_name)
  273. {
  274.     DWORD dwUserBuf = 256;
  275.     PSID userSID = NULL;
  276.     DWORD dwSID, dwDomainNameSize = 0;
  277.     BYTE bySidBuffer[1024];
  278.     LPTSTR chSID = NULL;
  279.     TCHAR  chDomainName[256];
  280.     SID_NAME_USE snu;
  281.  
  282.     userSID = (PSID)bySidBuffer;
  283.     dwSID = sizeof(bySidBuffer);
  284.     dwDomainNameSize = sizeof(chDomainName);
  285.  
  286.     if (!LookupAccountNamePtr(NULL, (LPWSTR)_user_name, (PSID)userSID, (LPDWORD)&dwSID, (LPTSTR)chDomainName, (LPDWORD)&dwDomainNameSize, (PSID_NAME_USE)&snu))
  287.     {
  288.         wprintf(L"can't LookupAccountName\n");
  289.     }
  290.  
  291.     ConvertSidToStringSidPtr(userSID, &chSID);
  292.     wprintf(L" SID:  %s\n", chSID);
  293.     LocalFree((HLOCAL)chSID);
  294. }
  295.  
  296. void Show_Users(LPTSTR _server_name)
  297. {
  298.     LPUSER_INFO_0 pBuf = NULL;
  299.     LPUSER_INFO_0 pTmpBuf;
  300.     DWORD dwLevel = 0;
  301.     DWORD dwPrefMaxLen = MAX_PREFERRED_LENGTH;
  302.     DWORD dwEntriesRead = 0;
  303.     DWORD dwTotalEntries = 0;
  304.     DWORD dwResumeHandle = 0;
  305.     DWORD i;
  306.     DWORD dwTotalCount = 0;
  307.     NET_API_STATUS nStatus;
  308.     LPTSTR pszServerName = _server_name;
  309.     do
  310.     {
  311.         nStatus = NetUserEnumPtr((LPCWSTR)pszServerName,
  312.             dwLevel,
  313.             FILTER_NORMAL_ACCOUNT,
  314.             (LPBYTE*)&pBuf,
  315.             dwPrefMaxLen,
  316.             &dwEntriesRead,
  317.             &dwTotalEntries,
  318.             &dwResumeHandle);
  319.         if ((nStatus == NERR_Success) || (nStatus == ERROR_MORE_DATA))
  320.         {
  321.             if ((pTmpBuf = pBuf) != NULL)
  322.             {
  323.                 for (i = 0; (i < dwEntriesRead); i++)
  324.                 {
  325.                     wprintf(L"\nUsername: %s\n", pTmpBuf->usri0_name);
  326.                     Get_User_Sid(pTmpBuf->usri0_name);
  327.                     Show_Groups(pTmpBuf->usri0_name);
  328.                     Show_Privileges(pTmpBuf->usri0_name);
  329.                     pTmpBuf++;
  330.                     dwTotalCount++;
  331.                 }
  332.             }
  333.         }
  334.         else printf("err1: %d\n", nStatus);
  335.  
  336.         if (pBuf != NULL)
  337.         {
  338.             NetApiBufferFreePtr(pBuf);
  339.             pBuf = NULL;
  340.         }
  341.     } while (nStatus == ERROR_MORE_DATA);
  342.     if (pBuf != NULL) NetApiBufferFreePtr(pBuf);
  343. }
  344.  
  345.  
  346. void Show_Groups(LPWSTR _user_name)
  347. {
  348.     LPBYTE buffer;
  349.     DWORD entries;
  350.     DWORD total_entries;
  351.     LOCALGROUP_USERS_INFO_0 *groups;
  352.  
  353.     printf(" local groups: \n");
  354.     NetUserGetLocalGroupsPtr(NULL, _user_name, 0, LG_INCLUDE_INDIRECT, &buffer, MAX_PREFERRED_LENGTH, &entries, &total_entries);
  355.     groups = (LOCALGROUP_USERS_INFO_0*)buffer;
  356.     for (int i = 0; i < entries; i++)
  357.     {
  358.         printf("  %S\n", groups[i].lgrui0_name);
  359.     }
  360.     NetApiBufferFreePtr(buffer);
  361.     printf(" global groups: \n");
  362.     NetUserGetGroupsPtr(NULL, _user_name, 0, &buffer, MAX_PREFERRED_LENGTH, &entries, &total_entries);
  363.     GROUP_USERS_INFO_0 *ggroups = (GROUP_USERS_INFO_0*)buffer;
  364.     for (int i = 0; i < entries; i++)
  365.     {
  366.         printf("  %S\n", ggroups[i].grui0_name);
  367.     }
  368.     NetApiBufferFreePtr(buffer);
  369. }
  370.  
  371. extern HINSTANCE hNetapi32Dll;
  372. extern HINSTANCE hAdvapi32Dll;
  373.  
  374. extern _NetUserEnumT                NetUserEnumPtr;
  375. extern _NetApiBufferFreeT           NetApiBufferFreePtr;
  376. extern _NetUserGetLocalGroupsT      NetUserGetLocalGroupsPtr;
  377. extern _NetUserGetGroupsT           NetUserGetGroupsPtr;
  378. extern _NetUserAddT                 NetUserAddPtr;
  379. extern _NetUserDelT                 NetUserDelPtr;
  380. extern _NetLocalGroupAddMembersT    NetLocalGroupAddMembersPtr;
  381. extern _NetLocalGroupDelMembersT    NetLocalGroupDelMembersPtr;
  382. extern _NetLocalGroupAddT           NetLocalGroupAddPtr;
  383. extern _NetLocalGroupDelT           NetLocalGroupDelPtr;
  384. extern _NetUserSetInfoT             NetUserSetInfoPtr;
  385.  
  386. extern _ConvertSidToStringSidT      ConvertSidToStringSidPtr;
  387. extern _LookupAccountNameT          LookupAccountNamePtr;
  388. extern _AdjustTokenPrivilegesT      AdjustTokenPrivilegesPtr;
  389. extern _LsaAddAccountRightsT        LsaAddAccountRightsPtr;
  390. extern _LsaRemoveAccountRightsT     LsaRemoveAccountRightsPtr;
  391. extern _LsaNtStatusToWinErrorT      LsaNtStatusToWinErrorPtr;
  392. extern _LsaOpenPolicyT              LsaOpenPolicyPtr;
  393. extern _LsaEnumerateAccountRightsT  LsaEnumerateAccountRightsPtr;
  394.  
  395. struct PrivilegeConststruct
  396. {
  397.     LPWSTR PrivilegeStr;
  398. };
  399.  
  400. PrivilegeConststruct _privileges__lpwstr_array[] =
  401. {
  402.     {(LPWSTR)L"SeAssignPrimaryTokenPrivilege"},
  403.     {(LPWSTR)L"SeAuditPrivilege"},
  404.     {(LPWSTR)L"SeBackupPrivilege"},
  405.     {(LPWSTR)L"SeChangeNotifyPrivilege"},
  406.     {(LPWSTR)L"SeCreateGlobalPrivilege"},
  407.     {(LPWSTR)L"SeCreatePagefilePrivilege"},
  408.     {(LPWSTR)L"SeCreatePermanentPrivilege"},
  409.     {(LPWSTR)L"SeCreateSymbolicLinkPrivilege"},
  410.     {(LPWSTR)L"SeCreateTokenPrivilege"},
  411.     {(LPWSTR)L"SeDebugPrivilege"},
  412.     {(LPWSTR)L"SeEnableDelegationPrivilege"},
  413.     {(LPWSTR)L"SeImpersonatePrivilege"},
  414.     {(LPWSTR)L"SeIncreaseBasePriorityPrivilege"},
  415.     {(LPWSTR)L"SeIncreaseQuotaPrivilege"},
  416.     {(LPWSTR)L"SeIncreaseWorkingSetPrivilege"},
  417.     {(LPWSTR)L"SeLoadDriverPrivilege"},
  418.     {(LPWSTR)L"SeLockMemoryPrivilege"},
  419.     {(LPWSTR)L"SeMachineAccountPrivilege"},
  420.     {(LPWSTR)L"SeManageVolumePrivilege"},
  421.     {(LPWSTR)L"SeProfileSingleProcessPrivilege"},
  422.     {(LPWSTR)L"SeRelabelPrivilege"},
  423.     {(LPWSTR)L"SeRemoteShutdownPrivilege"},
  424.     {(LPWSTR)L"SeRestorePrivilege"},
  425.     {(LPWSTR)L"SeSecurityPrivilege"},
  426.     {(LPWSTR)L"SeShutdownPrivilege"},
  427.     {(LPWSTR)L"SeSyncAgentPrivilege"},
  428.     {(LPWSTR)L"SeSystemEnvironmentPrivilege"},
  429.     {(LPWSTR)L"SeSystemProfilePrivilege"},
  430.     {(LPWSTR)L"SeSystemtimePrivilege"},
  431.     {(LPWSTR)L"SeTakeOwnershipPrivilege"},
  432.     {(LPWSTR)L"SeTcbPrivilege"},
  433.     {(LPWSTR)L"SeTimeZonePrivilege"},
  434.     {(LPWSTR)L"SeTrustedCredManAccessPrivilege"},
  435.     {(LPWSTR)L"SeUndockPrivilege"}
  436. };
  437.  
  438. int Add_User(LPWSTR lpszUser, LPWSTR lpszPassword)
  439. {
  440.     USER_INFO_1 user_info;
  441.     LOCALGROUP_MEMBERS_INFO_3 localgroup_members;
  442.     NET_API_STATUS nStatus = 0;
  443.     DWORD parm_err = 0;
  444.  
  445.     user_info.usri1_name = lpszUser;
  446.     user_info.usri1_password = lpszPassword;
  447.     user_info.usri1_priv = USER_PRIV_USER;
  448.     user_info.usri1_home_dir = (LPWSTR)TEXT("");
  449.     user_info.usri1_comment = (LPWSTR)TEXT("Sample User");
  450.     user_info.usri1_flags = UF_SCRIPT;
  451.     user_info.usri1_script_path = (LPWSTR)TEXT("");
  452.  
  453.     nStatus = NetUserAddPtr(NULL,
  454.         1,
  455.         (LPBYTE)&user_info,
  456.         &parm_err);
  457.  
  458.     switch (nStatus)
  459.     {
  460.     case 0:
  461.         printf("Success\n");
  462.         break;
  463.     case NERR_UserExists:
  464.         printf("User already exists.\n");
  465.         nStatus = 0;
  466.         break;
  467.     case ERROR_INVALID_PARAMETER:
  468.         printf("err1 : %d\n", nStatus);
  469.         return(nStatus);
  470.     default:
  471.         printf("err2: %d\n", nStatus);
  472.         return(nStatus);
  473.     }
  474.  
  475.     return(nStatus);
  476. }
  477.  
  478. BOOL SetPrivilege(
  479.     HANDLE hToken,  
  480.     LPCTSTR lpszPrivilege,
  481.     BOOL bEnablePrivilege
  482. )
  483. {
  484.     TOKEN_PRIVILEGES tp;
  485.     LUID luid;
  486.  
  487.     if (!LookupPrivilegeValue(
  488.         NULL,
  489.         lpszPrivilege,
  490.         &luid))
  491.     {
  492.         printf("LookupPrivilegeValue error: %u\n", GetLastError());
  493.         return FALSE;
  494.     }
  495.  
  496.     tp.PrivilegeCount = 1;
  497.     tp.Privileges[0].Luid = luid;
  498.     if (bEnablePrivilege) tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  499.     else tp.Privileges[0].Attributes = 0;
  500.  
  501.     if (!AdjustTokenPrivilegesPtr(
  502.         hToken,
  503.         FALSE,
  504.         &tp,
  505.         sizeof(TOKEN_PRIVILEGES),
  506.         (PTOKEN_PRIVILEGES)NULL,
  507.         (PDWORD)NULL))
  508.     {
  509.         printf("AdjustTokenPrivileges error: %u\n", GetLastError());
  510.         return 0;
  511.     }
  512.  
  513.     if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
  514.     {
  515.         printf("The token does not have the specified privilege. \n");
  516.         return 0;
  517.     }
  518.  
  519.     return 1;
  520. }
  521.  
  522. bool InitLsaString(
  523.     PLSA_UNICODE_STRING pLsaString,
  524.     LPCWSTR pwszString
  525. )
  526. {
  527.     DWORD dwLen = 0;
  528.  
  529.     if (NULL == pLsaString)
  530.         return 0;
  531.  
  532.     if (NULL != pwszString)
  533.     {
  534.         dwLen = wcslen(pwszString);
  535.         if (dwLen > 0x7ffe)
  536.             return 0;
  537.     }
  538.     pLsaString->Buffer = (WCHAR *)pwszString;
  539.     pLsaString->Length = (USHORT)dwLen * sizeof(WCHAR);
  540.     pLsaString->MaximumLength = (USHORT)(dwLen + 1) * sizeof(WCHAR);
  541.  
  542.     return 1;
  543. }
  544.  
  545. int Set_User_Privileges(LPWSTR lpszUser, DWORD _privilege_index)
  546. {
  547.     DWORD dwUserBuf = 256;
  548.     PSID userSID = NULL;
  549.     DWORD dwSID, dwDomainNameSize = 0;
  550.     BYTE bySidBuffer[1024];
  551.     LPTSTR chSID = NULL;
  552.     TCHAR  chDomainName[256];
  553.     SID_NAME_USE snu;
  554.     LSA_HANDLE policy_handle = NULL;
  555.     PLSA_UNICODE_STRING pp_user_rights;
  556.     ULONG count_of_rights = 0;
  557.     NET_API_STATUS nStatus = 0;
  558.     userSID = (PSID)bySidBuffer;
  559.     dwSID = sizeof(bySidBuffer);
  560.     dwDomainNameSize = sizeof(chDomainName);
  561.  
  562.     if (!LookupAccountNamePtr(NULL, (LPWSTR)lpszUser, (PSID)userSID, (LPDWORD)&dwSID, (LPTSTR)chDomainName, (LPDWORD)&dwDomainNameSize, (PSID_NAME_USE)&snu))
  563.     {
  564.         wprintf(L"can't LookupAccountName\n");
  565.         return 0;
  566.     }
  567.     policy_handle = GetPolicyHandle();
  568.     if (!policy_handle)
  569.     {
  570.         wprintf(L"err\n");
  571.         return 0;
  572.     }
  573.     LSA_UNICODE_STRING UserRights;
  574.     InitLsaString(&UserRights, _privileges__lpwstr_array[_privilege_index].PrivilegeStr);
  575.     nStatus = LsaAddAccountRightsPtr(policy_handle, userSID, &UserRights, 1);
  576.     DWORD err = LsaNtStatusToWinErrorPtr(nStatus);
  577.     return 0;
  578. }
  579.  
  580. int Clear_User_Privileges(LPWSTR lpszUser, DWORD _privilege_index)
  581. {
  582.     DWORD dwUserBuf = 256;
  583.     PSID userSID = NULL;
  584.     DWORD dwSID, dwDomainNameSize = 0;
  585.     BYTE bySidBuffer[1024];
  586.     LPTSTR chSID = NULL;
  587.     TCHAR  chDomainName[256];
  588.     SID_NAME_USE snu;
  589.     LSA_HANDLE policy_handle = NULL;
  590.     PLSA_UNICODE_STRING pp_user_rights;
  591.     ULONG count_of_rights = 0;
  592.     NET_API_STATUS            nStatus = 0;
  593.  
  594.     userSID = (PSID)bySidBuffer;
  595.     dwSID = sizeof(bySidBuffer);
  596.     dwDomainNameSize = sizeof(chDomainName);
  597.  
  598.     if (!LookupAccountNamePtr(NULL, (LPWSTR)lpszUser, (PSID)userSID, (LPDWORD)&dwSID, (LPTSTR)chDomainName, (LPDWORD)&dwDomainNameSize, (PSID_NAME_USE)&snu))
  599.     {
  600.         wprintf(L"can't LookupAccountName\n");
  601.         return 0;
  602.     }
  603.     policy_handle = GetPolicyHandle();
  604.     if (!policy_handle)
  605.     {
  606.         wprintf(L"err\n");
  607.         return 0;
  608.     }
  609.  
  610.     LSA_UNICODE_STRING UserRights;
  611.     InitLsaString(&UserRights, _privileges__lpwstr_array[_privilege_index].PrivilegeStr);
  612.     LsaRemoveAccountRightsPtr(policy_handle, userSID, FALSE, &UserRights, 1);
  613.     DWORD err = LsaNtStatusToWinErrorPtr(nStatus);
  614.     return 0;
  615. }
  616.  
  617. int Assign_User_To_Group(LPWSTR lpszUser, LPWSTR lpszLocalGroup)
  618. {
  619.     LOCALGROUP_MEMBERS_INFO_3 localgroup_members;
  620.     NET_API_STATUS            nStatus = 0;
  621.     DWORD                     parm_err = 0;
  622.  
  623.     localgroup_members.lgrmi3_domainandname = lpszUser;
  624.  
  625.     nStatus = NetLocalGroupAddMembersPtr(NULL,
  626.         lpszLocalGroup,
  627.         3,
  628.         (LPBYTE)&localgroup_members,
  629.         1);
  630.  
  631.     switch (nStatus)
  632.     {
  633.     case 0:
  634.         printf("Success\n");
  635.         break;
  636.     case ERROR_MEMBER_IN_ALIAS:
  637.         printf("User already in local group.\n");
  638.         nStatus = 0;
  639.         break;
  640.     default:
  641.         printf("err1: %d\n", nStatus);
  642.         break;
  643.     }
  644.     return(nStatus);
  645. }
  646.  
  647. int Exclude_User_From_Group(LPWSTR lpszUser, LPWSTR lpszLocalGroup)
  648. {
  649.     LOCALGROUP_MEMBERS_INFO_3 localgroup_members;
  650.     NET_API_STATUS            nStatus = 0;
  651.     DWORD                     parm_err = 0;
  652.  
  653.     localgroup_members.lgrmi3_domainandname = lpszUser;
  654.  
  655.     nStatus = NetLocalGroupDelMembersPtr(NULL,
  656.         lpszLocalGroup,
  657.         3,
  658.         (LPBYTE)&localgroup_members,
  659.         1);
  660.  
  661.     switch (nStatus)
  662.     {
  663.     case 0:
  664.         printf("Success\n");
  665.         break;
  666.     case ERROR_MEMBER_IN_ALIAS:
  667.         printf("err1\n");
  668.         nStatus = 0;
  669.         break;
  670.     default:
  671.         printf("err2: %d\n", nStatus);
  672.         break;
  673.     }
  674.     return(nStatus);
  675. }
  676.  
  677. int Add_Group(LPWSTR lpszLocalGroup)
  678. {
  679.     NET_API_STATUS            nStatus = 0;
  680.     DWORD                     parm_err = 0;
  681.     LOCALGROUP_INFO_1         localgroup_info;
  682.  
  683.     localgroup_info.lgrpi1_name = lpszLocalGroup;
  684.     localgroup_info.lgrpi1_comment = (LPWSTR)TEXT("Sample local group.");
  685.  
  686.     nStatus = NetLocalGroupAddPtr(NULL, 1, (LPBYTE)&localgroup_info, &parm_err);
  687.  
  688.     switch (nStatus)
  689.     {
  690.     case 0:
  691.         printf("Success\n");
  692.         break;
  693.     case ERROR_ALIAS_EXISTS:
  694.         printf("Local group already exists.\n");
  695.         nStatus = 0;
  696.         break;
  697.     case ERROR_INVALID_PARAMETER:
  698.         printf("err1: %d\n", nStatus);
  699.         return(nStatus);
  700.     default:
  701.         printf("err2: %d\n", nStatus);
  702.         return(nStatus);
  703.     }
  704.     return(nStatus);
  705. }
  706.  
  707. BOOL Change_Username(LPWSTR wName, LPWSTR wNewName, LPWSTR wPassword)
  708. {
  709.     DWORD len = MAX_COMPUTERNAME_LENGTH;
  710.     TCHAR pszServerName[MAX_COMPUTERNAME_LENGTH];
  711.     GetComputerName(pszServerName, &len);
  712.  
  713.     LPUSER_INFO_0 uiName = new USER_INFO_0;
  714.     LPUSER_INFO_1003 uiPass = new USER_INFO_1003;
  715.     uiName->usri0_name = wNewName;
  716.     uiPass->usri1003_password = wPassword;
  717.  
  718.     NET_API_STATUS nStatus;
  719.  
  720.     nStatus = NetUserSetInfoPtr(0, wName, 0, (LPBYTE)uiName, 0);
  721.     if (nStatus != NERR_Success)
  722.     {
  723.         printf("err1: %i", nStatus);
  724.         SetLastError(nStatus);
  725.         return 0;
  726.     }
  727.  
  728.     nStatus = NetUserSetInfoPtr(0, wNewName, 1003, (LPBYTE)uiPass, 0);
  729.     if (nStatus != NERR_Success)
  730.     {
  731.         printf("err2: %i", nStatus);
  732.         SetLastError(nStatus);
  733.         return 0;
  734.     }
  735.     return 1;
  736. }
  737.  
  738. int wmain()
  739. {
  740.     setlocale(LC_ALL, "Russian");
  741.     Load_Dll();
  742.     TCHAR user_name[100] = { 0 };
  743.     TCHAR group_name[100] = { 0 };
  744.     TCHAR user_password[100] = { 0 };
  745.     DWORD privilege_index = 0;
  746.  
  747.     int comand;
  748.     while (1)
  749.     {
  750.         wprintf((LPWSTR)L"\n"
  751.             "1: show users\n"
  752.             "2: add user\n"
  753.             "3: change user\n"
  754.             "4: remove user\n"
  755.             "5: add group\n"
  756.             "6: remove group\n"
  757.             "7: add privilege to user\n"
  758.             "8: remove user privilege\n"
  759.             "9: join to group\n"
  760.             "10: leave group\n"
  761.             "0: exit\n"
  762.             "\n";);
  763.         wcout << "Please, enter num of comand: ";
  764.         cin >> comand;
  765.  
  766.         if (comand == 0) // выйти из программы
  767.         {
  768.             break;
  769.         }
  770.         else if (comand == 1) // показать список
  771.         {
  772.             Show_Users(NULL);
  773.         }
  774.         else if (comand == 2) // добавить пользователя
  775.         {
  776.             wcout << "Please, enter username: ";
  777.             wcin >> user_name;
  778.             wcout << "Please, enter password: ";
  779.             wcin >> user_password;
  780.             Add_User((LPWSTR)user_name, (LPWSTR)user_password);
  781.         }
  782.         else if (comand == 3) // изменить пользователя
  783.         {
  784.             cout << "Please, enter username: ";
  785.             wcin >> user_name;
  786.             WCHAR newusername[32];
  787.             cout << "Please, enter new username: ";
  788.             wcin >> newusername;
  789.             WCHAR newpassword[32];
  790.             cout << "Please, enter new password: ";
  791.             wcin >> newpassword;
  792.  
  793.             if (Change_Username(user_name, newusername, newpassword) == TRUE)
  794.             {
  795.                 cout << "Success\n";
  796.             }
  797.         }
  798.         else if (comand == 4) // удалить пользователя
  799.         {
  800.             wcout << "Please, enter username: ";
  801.             wcin >> user_name;
  802.             NetUserDelPtr(NULL, (LPWSTR)user_name);
  803.         }
  804.         else if (comand == 5) // добавить группу
  805.         {
  806.             wcout << "Please, enter group name: ";
  807.             wcin >> group_name;
  808.             Add_Group((LPWSTR)group_name);
  809.         }
  810.         else if (comand == 6) // удалить группу
  811.         {
  812.             wcout << "Please, enter group name: ";
  813.             wcin >> group_name;
  814.             NetLocalGroupDelPtr(NULL, (LPWSTR)group_name);
  815.         }
  816.         else if (comand == 7) // добавить привилегию пользователю (включить)
  817.         {
  818.             wcout << "Please, enter username: ";
  819.             wcin >> user_name;
  820.             for (size_t i = 0; i < sizeof(_privileges__lpwstr_array) / sizeof(PrivilegeConststruct); i++) wprintf(L"%d: %s\n", i, _privileges__lpwstr_array[i].PrivilegeStr);
  821.             wcout << "Please, enter privilege index: ";
  822.             wcin >> privilege_index;
  823.             Set_User_Privileges((LPWSTR)user_name, privilege_index);
  824.         }
  825.         else if (comand == 8) // удалить привилегию пользователя (выключить)
  826.         {
  827.             wcout << "Please, enter username: ";
  828.             wcin >> user_name;
  829.             for (size_t i = 0; i < sizeof(_privileges__lpwstr_array) / sizeof(PrivilegeConststruct); i++) wprintf(L"%d: %s\n", i, _privileges__lpwstr_array[i].PrivilegeStr);
  830.             wcout << "Please, enter privilege index: ";
  831.             wcin >> privilege_index;
  832.             Clear_User_Privileges((LPWSTR)user_name, privilege_index);
  833.         }
  834.         else if (comand == 9) // добавить пользователя в группу
  835.         {
  836.             wcout << "Please, enter username: ";
  837.             wcin >> user_name;
  838.             wcout << "Please, enter group name: ";
  839.             wcin >> group_name;
  840.             Assign_User_To_Group((LPWSTR)user_name, (LPWSTR)group_name);
  841.         }
  842.         else if (comand == 10) // удалить пользователя из группы
  843.         {
  844.             wcout << "Please, enter username: ";
  845.             wcin >> user_name;
  846.             wcout << "Please, enter group name: ";
  847.             wcin >> group_name;
  848.             Exclude_User_From_Group((LPWSTR)user_name, (LPWSTR)group_name);
  849.         }
  850.         else
  851.         {
  852.             cout << "Sorry, incorrect enter.";
  853.         }
  854.     }
  855.     Unload_Dll();
  856.     return 0;
  857. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement