Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*TODO: Make a dynamic load of Advapi and Netapi*/
- #define _CRT_SECURE_NO_WARNINGS
- #include "libs.h"
- //Global variables
- LSA_HANDLE g_PolicyHandle = NULL;
- WCHAR g_SystemName[] = L"DESKTOP-Alexander";
- HMODULE hmAdvModule;
- HMODULE hmNetModule;
- LSA_HANDLE ReceivePolicyHandle()
- {
- //LSA_UNICODE_STRING as a name of target system to receive a pointer to policy handle
- LSA_UNICODE_STRING lusSystemName;
- LSA_OBJECT_ATTRIBUTES ObjectAttr;
- NTSTATUS ErrorStatus;
- LSA_HANDLE Buffer;
- lusSystemName.Buffer = g_SystemName;
- lusSystemName.Length = wcslen(g_SystemName) * sizeof(WCHAR);
- lusSystemName.MaximumLength = (wcslen(g_SystemName) + 1) * sizeof(WCHAR);
- LsaOpenPolicy_t myLsaOpenPolicy = (LsaOpenPolicy_t)GetProcAddress(hmAdvModule, "LsaOpenPolicy");
- //Initializing objectattr to zeroes
- ZeroMemory(&ObjectAttr, sizeof(ObjectAttr));
- ErrorStatus = myLsaOpenPolicy(
- NULL,
- &ObjectAttr,
- POLICY_ALL_ACCESS | POLICY_LOOKUP_NAMES,
- &Buffer
- );
- /*ErrorStatus 0xC0000022 - STATUS_ACCESS_DENIED
- it must be executed using powershell in sudo*/
- if (ErrorStatus != 0)
- {
- printf("%x", ErrorStatus);
- exit(1);
- }
- else
- printf("PolicyHandle was successfully received.\n");
- return Buffer;
- }
- void PrintInterface()
- {
- puts("Next commands are available:");
- puts("/------------------------------------------------------/");
- puts("1 - Display information about system users");
- puts("2 - Display information about local system groups");
- puts("3 - Display information about global system groups");
- puts("4 - Create a user");
- puts("5 - Delete a user");
- puts("6 - Create a group");
- puts("7 - Delete a group");
- puts("8 - Add privilege to a user");
- puts("9 - Delete user's privilege");
- puts("10 - Add privilege to a group");
- puts("11 - Delete group's privilege");
- puts("/------------------------------------------------------/");
- }
- void ShowUsersInfo()
- {
- printf("Information about users: \n");
- NET_API_STATUS ErrorStatus = NULL;
- LPUSER_INFO_3 InfoBuffer = NULL;
- LPUSER_INFO_23 TempBuffer = NULL;
- DWORD dwEntriesRead = 0;
- DWORD dwTotalEntries = 0;
- DWORD dwResumeHandle = 0;
- NetUserEnum_t myNetUserEnum = (NetUserEnum_t)GetProcAddress(hmNetModule, "NetUserEnum");
- NetUserGetInfo_t myNetUserGetInfo = (NetUserGetInfo_t)GetProcAddress(hmNetModule, "NetUserGetInfo");
- ConvertSidToStringSidA_t myConvertSidToStringSidA = (ConvertSidToStringSidA_t)GetProcAddress(hmAdvModule, "ConvertSidToStringSidA");
- NetUserGetLocalGroups_t myNetUserGetLocalGroups = (NetUserGetLocalGroups_t)GetProcAddress(hmNetModule, "NetUserGetLocalGroups");
- LsaEnumerateAccountRights_t myLsaEnumerateAccountRights = (LsaEnumerateAccountRights_t)GetProcAddress(hmAdvModule, "LsaEnumerateAccountRights");
- while (1) {
- ErrorStatus = myNetUserEnum(
- NULL,
- 3,
- FILTER_NORMAL_ACCOUNT,
- (BYTE**)&InfoBuffer,
- MAX_PREFERRED_LENGTH,
- &dwEntriesRead,
- &dwTotalEntries,
- &dwResumeHandle);
- if (ErrorStatus == NERR_Success)
- {
- if (InfoBuffer != NULL)
- {
- for (DWORD i = 0; i < dwEntriesRead; i++, InfoBuffer++)
- {
- printf("\t\t\t%ld\nUser's name: ", i);
- _putws(InfoBuffer->usri3_name);
- /*
- By some reason user's password is NULL
- so it can't be printed
- */
- //printf("User's password: "); _putws(InfoBuffer->usri3_password);
- printf("User's SID: ");
- myNetUserGetInfo(NULL, InfoBuffer->usri3_name, 23, (BYTE**)&TempBuffer);
- char *SidString = (char*)calloc(40, sizeof(char));
- myConvertSidToStringSidA(TempBuffer->usri23_user_sid, &SidString);
- printf("%s\n", SidString);
- free (SidString);
- if(InfoBuffer->usri3_priv == 0)
- printf("User's level of privilege: USER_PRIV_GUEST - Guest\n");
- else if(InfoBuffer->usri3_priv == 1)
- printf("User's level of privilege: USER_PRIV_USER - User\n");
- else if(InfoBuffer->usri3_priv == 2)
- printf("User's level of privilege: USER_PRIV_ADMIN - Administrator\n");
- printf("User's privilegies: ");
- PLSA_UNICODE_STRING RightsList = NULL;
- ULONG RightsCounter = 0;
- myLsaEnumerateAccountRights(g_PolicyHandle, TempBuffer->usri23_user_sid, &RightsList, &RightsCounter);
- if ((DWORD)RightsCounter == 0)
- printf("NULL\n");
- else
- {
- for (DWORD i = 0; i < (DWORD)RightsCounter; i++)
- {
- wprintf(L"%s ", RightsList[i].Buffer);
- }
- printf("\n");
- }
- printf("User's comment: ");
- _putws(InfoBuffer->usri3_comment);
- printf("User's local groups: ");
- LPLOCALGROUP_USERS_INFO_0 GroupsBuffer = NULL;
- DWORD dwEntriesReadGroups = 0;
- DWORD dwTotalEntriesGroups = 0;
- myNetUserGetLocalGroups(
- NULL,
- InfoBuffer->usri3_name,
- 0,
- LG_INCLUDE_INDIRECT,
- (BYTE**)&GroupsBuffer,
- MAX_PREFERRED_LENGTH,
- &dwEntriesReadGroups,
- &dwTotalEntriesGroups
- );
- if (GroupsBuffer != NULL)
- {
- for (DWORD i = 0; i < dwEntriesReadGroups; i++, GroupsBuffer++)
- {
- wprintf(L"%s\n", GroupsBuffer[i].lgrui0_name);
- }
- }
- else
- printf("NULL\n");
- }
- }
- }
- printf("\n");
- break;
- }
- //NetApiBufferFree(InfoBuffer);
- //NetApiBufferFree(TempBuffer);
- }
- void ShowLocalGroups()
- {
- LPLOCALGROUP_INFO_1 InfoBuffer;
- DWORD dwEntriesRead = 0;
- DWORD dwTotalEntries = 0;
- DWORD dwResumeHandle = 0;
- NET_API_STATUS ErrorStatus;
- NetLocalGroupEnum_t myNetLocalGroupEnum = (NetLocalGroupEnum_t)GetProcAddress(hmNetModule, "NetLocalGroupEnum");
- ConvertSidToStringSidA_t myConvertSidToStringSidA = (ConvertSidToStringSidA_t)GetProcAddress(hmAdvModule, "ConvertSidToStringSidA");
- LsaEnumerateAccountRights_t myLsaEnumerateAccountRights = (LsaEnumerateAccountRights_t)GetProcAddress(hmAdvModule, "LsaEnumerateAccountRights");
- LookupAccountNameW_t myLookuppAccountNameW = (LookupAccountNameW_t)GetProcAddress(hmAdvModule, "LookupAccountNameW");
- printf("Information about local groups: \n");
- while (1)
- {
- ErrorStatus = myNetLocalGroupEnum(NULL, 1, (BYTE**)&InfoBuffer, MAX_PREFERRED_LENGTH, &dwEntriesRead, &dwTotalEntries, &dwResumeHandle);
- for (DWORD i = 0; i < dwEntriesRead; i++, InfoBuffer++)
- {
- printf("\t\t\t%ld\nGroup's name: ", i);
- _putws(InfoBuffer->lgrpi1_name);
- printf("Group's SID: ");
- DWORD SIDSize = 0;
- SID_NAME_USE peUse;
- LPWSTR ReferencedDomainName;
- DWORD cchReferencedDomainName = 0;
- ErrorStatus = LookupAccountNameW(NULL, InfoBuffer->lgrpi1_name, NULL, &SIDSize, NULL, &cchReferencedDomainName, &peUse);
- /*if(ErrorStatus == 0)
- printf("0x%x", GetLastError());*/
- PSID GroupSID = (PSID)malloc(SIDSize);
- ReferencedDomainName = (LPWSTR)malloc(cchReferencedDomainName);
- ErrorStatus = LookupAccountNameW(NULL, InfoBuffer->lgrpi1_name, GroupSID, &SIDSize, ReferencedDomainName, &cchReferencedDomainName, &peUse);
- char *SIDString = (char*)calloc(40, sizeof(char));
- myConvertSidToStringSidA(GroupSID, &SIDString);
- printf("%s\n", SIDString);
- printf("Group's privilegies: ");
- PLSA_UNICODE_STRING RightsList;
- ULONG RightsCounter = 0;
- myLsaEnumerateAccountRights(g_PolicyHandle, GroupSID, &RightsList, &RightsCounter);
- if (RightsCounter == 0)
- printf("NULL\n");
- else
- {
- for (DWORD i = 0; i < (DWORD)RightsCounter; i++)
- {
- wprintf(L"%s ", RightsList[i].Buffer);
- }
- printf("\n");
- }
- printf("Group's comment: %S\n", InfoBuffer->lgrpi1_comment);
- //free(GroupSID);
- //free(ReferencedDomainName);
- }
- printf("\n");
- break;
- }
- //NetApiBufferFree(&InfoBuffer);
- }
- void ShowGlobalGroups()
- {
- printf("Information about global groups: \n");
- GROUP_INFO_2 *InfoBuffer = NULL;
- NET_API_STATUS ErrorStatus;
- DWORD dwEntriesRead = 0;
- DWORD dwTotalEntries = 0;
- DWORD dwResumeHandle = 0;
- ConvertSidToStringSidA_t myConvertSidToStringSidA = (ConvertSidToStringSidA_t)GetProcAddress(hmAdvModule, "ConvertSidToStringSidA");
- LsaEnumerateAccountRights_t myLsaEnumerateAccountRights = (LsaEnumerateAccountRights_t)GetProcAddress(hmAdvModule, "LsaEnumerateAccountRights");
- NetGroupEnum_t myNetGroupEnum = (NetGroupEnum_t)GetProcAddress(hmNetModule, "NetGroupEnum");
- NetGroupGetInfo_t myNetGroupGetInfo = (NetGroupGetInfo_t)GetProcAddress(hmNetModule, "NetGroupGetInfo");
- while (1)
- {
- ErrorStatus = myNetGroupEnum(NULL, 2, (BYTE**)&InfoBuffer, MAX_PREFERRED_LENGTH, &dwEntriesRead, &dwTotalEntries, &dwResumeHandle);
- /*if (ErrorStatus != 0)
- printf("0x%x", ErrorStatus);
- if (ErrorStatus == ERROR_MORE_DATA)
- return;
- else if (ErrorStatus == NERR_InvalidComputer)
- {
- return;
- }
- else if (ErrorStatus == ERROR_ACCESS_DENIED)
- {
- return;
- }*/
- for (DWORD i = 0; i < dwEntriesRead; i++, InfoBuffer++)
- {
- printf("\t\t\t%ld\nGroup's name: ", i);
- _putws(InfoBuffer->grpi2_name);
- printf("Group's SID: ");
- GROUP_INFO_3 *TempBuffer = NULL;
- ErrorStatus = myNetGroupGetInfo(NULL, InfoBuffer->grpi2_name, 3, (LPBYTE*)&TempBuffer);
- char *SIDString = (char*)calloc(60, sizeof(char));
- myConvertSidToStringSidA(TempBuffer->grpi3_group_sid, &SIDString);
- printf("%s\n", SIDString);
- printf("Group's privilgies: ");
- PLSA_UNICODE_STRING RightsList;
- ULONG RightsCounter = 0;
- myLsaEnumerateAccountRights(g_PolicyHandle, TempBuffer->grpi3_group_sid, &RightsList, &RightsCounter);
- if (RightsCounter == 0)
- printf("NULL\n");
- else
- {
- for (DWORD i = 0; i < (DWORD)RightsCounter; i++)
- {
- wprintf(L"%s ", RightsList[i].Buffer);
- }
- printf("\n");
- }
- printf("Group's comment: %S\n", TempBuffer->grpi3_comment);
- }
- printf("\n");
- break;
- }
- }
- void CreateUser()
- {
- USER_INFO_1 UserInfo;
- NET_API_STATUS ErrorStatus;
- WCHAR *password = (WCHAR*)malloc(20 * sizeof(WCHAR));
- WCHAR *login = (WCHAR*)malloc(20 * sizeof(WCHAR));
- DWORD inform_level = 1;
- LPDWORD error_info = 0;
- printf("Enter user's login: ");
- _tscanf("%S", login);
- printf("Enter user's password: ");
- _tscanf("%S", password);
- //Filling in all information about user
- UserInfo.usri1_name = login;
- UserInfo.usri1_password = password;
- UserInfo.usri1_priv = USER_PRIV_USER;
- UserInfo.usri1_comment = L"A new user";
- UserInfo.usri1_flags = UF_SCRIPT;
- UserInfo.usri1_home_dir = NULL;
- UserInfo.usri1_script_path = NULL;
- NetUserAdd_t myNetUserAdd = (NetUserAdd_t)GetProcAddress(hmNetModule, "NetUserAdd");
- ErrorStatus = myNetUserAdd(NULL, inform_level, (LPBYTE)&UserInfo, error_info);
- if (ErrorStatus == NERR_Success)
- {
- printf("Successfully created a new user.\n");
- }
- else
- {
- printf("Something went wrong: %x\n", ErrorStatus);
- }
- printf("\n");
- }
- void DeleteUser()
- {
- WCHAR *login = (WCHAR*)malloc(20 * sizeof(WCHAR));
- NET_API_STATUS ErrorStatus;
- printf("Enter user's name: ");
- _tscanf("%S", login);
- NetUserDel_t myNetUserDel = (NetUserDel_t)GetProcAddress(hmNetModule, "NetUserDel");
- ErrorStatus = myNetUserDel(NULL, login);
- if (ErrorStatus == NERR_Success)
- {
- printf("Successfully deleted a user.\n");
- }
- else
- {
- printf("Something went wrong: %x\n", ErrorStatus);
- }
- printf("\n");
- }
- void CreateGroup()
- {
- NET_API_STATUS ErrorStatus;
- WCHAR *name = (WCHAR*)malloc(20 * sizeof(WCHAR));
- WCHAR *comment = (WCHAR*)malloc(20 * sizeof(WCHAR));
- GROUP_INFO_1 GroupInfo;
- LPDWORD ErrorInfo= 0;
- printf("Enter group's name: ");
- _tscanf("%S", name);
- printf("Enter group's comment: ");
- _tscanf("%S", comment);
- GroupInfo.grpi1_name = name;
- GroupInfo.grpi1_comment = comment;
- NetLocalGroupAdd_t myNetLocalGroupAdd = (NetLocalGroupAdd_t)GetProcAddress(hmNetModule, "NetLocalGroupAdd");
- ErrorStatus = myNetLocalGroupAdd(NULL, 1, (BYTE*)&GroupInfo, ErrorInfo);
- if (ErrorStatus == NERR_Success)
- printf("Successfully created a group.\n");
- else
- printf("Something went wrong: %x\n", ErrorStatus);
- printf("\n");
- }
- void DeleteGroup()
- {
- NET_API_STATUS ErrorStatus;
- WCHAR *name = (WCHAR*)malloc(20 * sizeof(WCHAR));
- printf("Enter group's name: ");
- _tscanf("%S", name);
- NetLocalGroupDel_t myNetLocalGroupDel = (NetLocalGroupDel_t)GetProcAddress(hmNetModule, "NetLocalGroupDel");
- ErrorStatus = myNetLocalGroupDel(NULL, name);
- if (ErrorStatus == NERR_Success)
- printf("Successfully deleted a group.\n");
- else
- printf("Something went wrong: %x\n", ErrorStatus);
- printf("\n");
- }
- void AddUserPrivilege()
- {
- NET_API_STATUS ErrorStatus;
- NTSTATUS ntStatus;
- LPUSER_INFO_23 InfoBuffer;
- WCHAR *user = (WCHAR *)malloc(40 * sizeof(WCHAR));
- WCHAR *priv = (WCHAR *)malloc(40 * sizeof(WCHAR));
- printf("Enter user's name: ");
- _tscanf("%S", user);
- printf("Enter new privilege: ");
- _tscanf("%S", priv);
- NetUserGetInfo_t myNetUserGetInfo = (NetUserGetInfo_t)GetProcAddress(hmNetModule, "NetUserGetInfo");
- LsaAddAccountRights_t myLsaAddAccountRights = (LsaAddAccountRights_t)GetProcAddress(hmAdvModule, "LsaAddAccountRights");
- ErrorStatus = myNetUserGetInfo(NULL, user, 23, (BYTE**)&InfoBuffer);
- LSA_UNICODE_STRING RightsList;
- RightsList.Buffer = priv;
- RightsList.Length = wcslen(priv) * sizeof(WCHAR);
- RightsList.MaximumLength = (wcslen(priv) + 1) * sizeof(WCHAR);
- ULONG RightsCounter = 1;
- ntStatus = myLsaAddAccountRights(g_PolicyHandle, InfoBuffer->usri23_user_sid, &RightsList, RightsCounter);
- if (ntStatus == 0)
- {
- printf("Successfully added a new privilege.\n");
- }
- else
- {
- printf("Something went wrong: %x\n", ntStatus);
- }
- printf("\n");
- free(user);
- free(priv);
- }
- void DeleteUserPrivilege()
- {
- NET_API_STATUS ErrorStatus;
- NTSTATUS ntStatus;
- LPUSER_INFO_23 InfoBuffer;
- WCHAR *user = (WCHAR *)malloc(40 * sizeof(WCHAR));
- WCHAR *priv = (WCHAR *)malloc(40 * sizeof(WCHAR));
- printf("Enter user's name: ");
- _tscanf("%S", user);
- printf("Enter privilege to be deleted: ");
- _tscanf("%S", priv);
- NetUserGetInfo_t myNetUserGetInfo = (NetUserGetInfo_t)GetProcAddress(hmNetModule, "NetUserGetInfo");
- LsaRemoveAccountRights_t myLsaRemoveAccountRights = (LsaRemoveAccountRights_t)GetProcAddress(hmAdvModule, "LsaRemoveAccountRights");
- ErrorStatus = myNetUserGetInfo(NULL, user, 23, (BYTE**)&InfoBuffer);
- LSA_UNICODE_STRING RightsList;
- RightsList.Buffer = priv;
- RightsList.Length = wcslen(priv) * sizeof(WCHAR);
- RightsList.MaximumLength = (wcslen(priv) + 1) * sizeof(WCHAR);
- ULONG RightsCounter = 1;
- ntStatus = myLsaRemoveAccountRights(g_PolicyHandle, InfoBuffer->usri23_user_sid, FALSE, &RightsList, RightsCounter);
- if (ntStatus == 0)
- {
- printf("Successfully deleted a privilege.\n");
- }
- else
- {
- printf("Something went wrong: %x\n", ntStatus);
- }
- printf("\n");
- free(user);
- free(priv);
- }
- void AddGroupPrivilege()
- {
- NET_API_STATUS ErrorStatus;
- NTSTATUS ntStatus;
- CHAR *group_name = (CHAR *)malloc(60 * sizeof(CHAR));
- WCHAR *priv = (WCHAR *)malloc(40 * sizeof(WCHAR));
- printf("Enter group's name: ");
- scanf("%s", group_name);
- printf("Enter new privilege: ");
- _tscanf("%S", priv);
- PSID pSid;
- DWORD cbSid = 0;
- SID_NAME_USE peUse;
- DWORD cchReferencedDomainName = 0;
- LPTSTR ReferencedDomainName;
- LookupAccountNameA_t myLookupAccountNameA = (LookupAccountNameA_t)GetProcAddress(hmAdvModule, "LookupAccountNameA");
- LsaAddAccountRights_t myLsaAddAccountRights = (LsaAddAccountRights_t)GetProcAddress(hmAdvModule, "LsaAddAccountRights");
- myLookupAccountNameA(NULL, group_name, NULL, &cbSid, NULL, &cchReferencedDomainName, &peUse);
- pSid = (PSID)malloc(cbSid);
- ReferencedDomainName = (LPTSTR)malloc(cchReferencedDomainName);
- myLookupAccountNameA(NULL, (LPCSTR)group_name, pSid, &cbSid, ReferencedDomainName, &cchReferencedDomainName, &peUse);
- LSA_UNICODE_STRING RightsList;
- RightsList.Buffer = priv;
- RightsList.Length = wcslen(priv) * sizeof(WCHAR);
- RightsList.MaximumLength = (wcslen(priv) + 1) * sizeof(WCHAR);
- ULONG RightsCounter = 1;
- ntStatus = myLsaAddAccountRights(g_PolicyHandle, pSid, &RightsList, RightsCounter);
- if (ntStatus == 0)
- {
- printf("Successfully added a new privilege.\n");
- }
- else
- {
- printf("Something went wrong: %x\n", ntStatus);
- }
- printf("\n");
- free(group_name);
- free(priv);
- }
- void DeleteGroupPrivilege()
- {
- NTSTATUS ntStatus;
- CHAR *group_name = (CHAR *)malloc(60 * sizeof(CHAR));
- WCHAR *priv = (WCHAR *)malloc(40 * sizeof(WCHAR));
- printf("Enter group's name: ");
- scanf("%s", group_name);
- printf("Enter new privilege: ");
- _tscanf("%S", priv);
- PSID pSid;
- DWORD cbSid = 0;
- SID_NAME_USE peUse;
- DWORD cchReferencedDomainName = 0;
- LPTSTR ReferencedDomainName;
- LookupAccountNameA_t myLookupAccountNameA = (LookupAccountNameA_t)GetProcAddress(hmAdvModule, "LookupAccountNameA");
- LsaRemoveAccountRights_t myLsaRemoveAccountRights = (LsaRemoveAccountRights_t)GetProcAddress(hmAdvModule, "LsaRemoveAccountRights");
- myLookupAccountNameA(NULL, group_name, NULL, &cbSid, NULL, &cchReferencedDomainName, &peUse);
- pSid = (PSID)malloc(cbSid);
- ReferencedDomainName = (LPTSTR)malloc(cchReferencedDomainName);
- myLookupAccountNameA(NULL, (LPCSTR)group_name, pSid, &cbSid, ReferencedDomainName, &cchReferencedDomainName, &peUse);
- LSA_UNICODE_STRING RightsList;
- RightsList.Buffer = priv;
- RightsList.Length = wcslen(priv) * sizeof(WCHAR);
- RightsList.MaximumLength = (wcslen(priv) + 1) * sizeof(WCHAR);
- ULONG RightsCounter = 1;
- ntStatus = myLsaRemoveAccountRights(g_PolicyHandle, pSid, FALSE, &RightsList, RightsCounter);
- if (ntStatus == 0)
- {
- printf("Successfully deleted a privilege.\n");
- }
- else
- {
- printf("Something went wrong: %x\n", ntStatus);
- }
- printf("\n");
- free(group_name);
- free(priv);
- }
- int main(int argc, char *argv[])
- {
- hmAdvModule = LoadLibrary("Advapi32.dll");
- hmNetModule = LoadLibrary("NetApi32.dll");
- int InputChoice = 0;
- g_PolicyHandle = ReceivePolicyHandle();
- setlocale(LC_ALL, "Russian");
- while (1)
- {
- PrintInterface();
- printf("Enter command:");
- std::cin >> InputChoice;
- std::cin.ignore(32767, '\n');
- switch (InputChoice)
- {
- case 1:
- {
- ShowUsersInfo();
- break;
- }
- case 2:
- {
- ShowLocalGroups();
- break;
- }
- case 3:
- {
- ShowGlobalGroups();
- break;
- }
- case 4:
- {
- CreateUser();
- break;
- }
- case 5:
- {
- DeleteUser();
- break;
- }
- case 6:
- {
- CreateGroup();
- break;
- }
- case 7:
- {
- DeleteGroup();
- break;
- }
- case 8:
- {
- AddUserPrivilege();
- break;
- }
- case 9:
- {
- DeleteUserPrivilege();
- break;
- }
- case 10:
- {
- AddGroupPrivilege();
- break;
- }
- case 11:
- {
- DeleteGroupPrivilege();
- break;
- }
- case 12:
- {
- }
- default:
- printf("Wrong commang, try again...");
- break;
- }
- }
- LsaClose(g_PolicyHandle);
- FreeLibrary(hmAdvModule);
- FreeLibrary(hmNetModule);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement