mirror of
https://github.com/reactos/reactos.git
synced 2025-08-02 20:36:26 +00:00
Implement removal of a user from a user group.
svn path=/trunk/; revision=34312
This commit is contained in:
parent
3ac7447b97
commit
2e377cc99a
5 changed files with 223 additions and 15 deletions
|
@ -60,6 +60,84 @@ GetTextSid(PSID pSid,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static VOID
|
||||||
|
RemoveUserFromGroup(HWND hwndDlg,
|
||||||
|
PGENERAL_GROUP_DATA pGroupData)
|
||||||
|
{
|
||||||
|
TCHAR szUserName[UNLEN];
|
||||||
|
TCHAR szText[256];
|
||||||
|
LOCALGROUP_MEMBERS_INFO_3 memberInfo;
|
||||||
|
HWND hwndLV;
|
||||||
|
INT nItem;
|
||||||
|
NET_API_STATUS status;
|
||||||
|
|
||||||
|
hwndLV = GetDlgItem(hwndDlg, IDC_GROUP_GENERAL_MEMBERS);
|
||||||
|
nItem = ListView_GetNextItem(hwndLV, -1, LVNI_SELECTED);
|
||||||
|
if (nItem == -1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Get the new user name */
|
||||||
|
ListView_GetItemText(hwndLV,
|
||||||
|
nItem, 0,
|
||||||
|
szUserName,
|
||||||
|
UNLEN);
|
||||||
|
|
||||||
|
/* Display a warning message because the remove operation cannot be reverted */
|
||||||
|
wsprintf(szText, TEXT("Do you really want to remove the user \"%s\" from the group \"%s\"?"),
|
||||||
|
szUserName, pGroupData->szGroupName);
|
||||||
|
if (MessageBox(NULL, szText, TEXT("User Accounts"), MB_ICONWARNING | MB_YESNO) == IDNO)
|
||||||
|
return;
|
||||||
|
|
||||||
|
memberInfo.lgrmi3_domainandname = szUserName;
|
||||||
|
|
||||||
|
status = NetLocalGroupDelMembers(NULL, pGroupData->szGroupName,
|
||||||
|
3, (LPBYTE)&memberInfo, 1);
|
||||||
|
if (status != NERR_Success)
|
||||||
|
{
|
||||||
|
TCHAR szText[256];
|
||||||
|
wsprintf(szText, TEXT("Error: %u"), status);
|
||||||
|
MessageBox(NULL, szText, TEXT("NetLocalGroupDelMembers"), MB_ICONERROR | MB_OK);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
(void)ListView_DeleteItem(hwndLV, nItem);
|
||||||
|
|
||||||
|
if (ListView_GetItemCount(hwndLV) == 0)
|
||||||
|
EnableWindow(GetDlgItem(hwndDlg, IDC_GROUP_GENERAL_REMOVE), FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static BOOL
|
||||||
|
OnNotify(HWND hwndDlg,
|
||||||
|
PGENERAL_GROUP_DATA pGroupData,
|
||||||
|
LPARAM lParam)
|
||||||
|
{
|
||||||
|
LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)lParam;
|
||||||
|
|
||||||
|
switch (((LPNMHDR)lParam)->idFrom)
|
||||||
|
{
|
||||||
|
case IDC_GROUP_GENERAL_MEMBERS:
|
||||||
|
switch (((LPNMHDR)lParam)->code)
|
||||||
|
{
|
||||||
|
case NM_CLICK:
|
||||||
|
EnableWindow(GetDlgItem(hwndDlg, IDC_GROUP_GENERAL_REMOVE), (lpnmlv->iItem != -1));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LVN_KEYDOWN:
|
||||||
|
if (((LPNMLVKEYDOWN)lParam)->wVKey == VK_DELETE)
|
||||||
|
{
|
||||||
|
RemoveUserFromGroup(hwndDlg, pGroupData);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static VOID
|
static VOID
|
||||||
GetGeneralGroupData(HWND hwndDlg,
|
GetGeneralGroupData(HWND hwndDlg,
|
||||||
PGENERAL_GROUP_DATA pGroupData)
|
PGENERAL_GROUP_DATA pGroupData)
|
||||||
|
@ -216,6 +294,10 @@ GroupGeneralPageProc(HWND hwndDlg,
|
||||||
if (HIWORD(wParam) == EN_CHANGE)
|
if (HIWORD(wParam) == EN_CHANGE)
|
||||||
PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
|
PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case IDC_GROUP_GENERAL_REMOVE:
|
||||||
|
RemoveUserFromGroup(hwndDlg, pGroupData);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -225,6 +307,10 @@ GroupGeneralPageProc(HWND hwndDlg,
|
||||||
SetGeneralGroupData(hwndDlg, pGroupData);
|
SetGeneralGroupData(hwndDlg, pGroupData);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return OnNotify(hwndDlg, pGroupData, lParam);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_DESTROY:
|
case WM_DESTROY:
|
||||||
|
|
|
@ -62,6 +62,8 @@ BEGIN
|
||||||
LTEXT "Member of:", -1, 7, 7, 56, 8
|
LTEXT "Member of:", -1, 7, 7, 56, 8
|
||||||
CONTROL "", IDC_USER_MEMBERSHIP_LIST, "SysListView32", LVS_REPORT | LVS_NOCOLUMNHEADER | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP,
|
CONTROL "", IDC_USER_MEMBERSHIP_LIST, "SysListView32", LVS_REPORT | LVS_NOCOLUMNHEADER | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP,
|
||||||
7, 18, 238, 173, WS_EX_CLIENTEDGE
|
7, 18, 238, 173, WS_EX_CLIENTEDGE
|
||||||
|
PUSHBUTTON "Add...", IDC_USER_MEMBERSHIP_ADD, 7, 197, 50, 14, WS_DISABLED
|
||||||
|
PUSHBUTTON "Remove", IDC_USER_MEMBERSHIP_REMOVE, 61, 197, 50, 14, WS_DISABLED
|
||||||
END
|
END
|
||||||
|
|
||||||
|
|
||||||
|
@ -97,6 +99,8 @@ BEGIN
|
||||||
LTEXT "Members:", -1, 7, 63, 45, 8
|
LTEXT "Members:", -1, 7, 63, 45, 8
|
||||||
CONTROL "", IDC_GROUP_GENERAL_MEMBERS, "SysListView32", LVS_REPORT | LVS_NOCOLUMNHEADER | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP,
|
CONTROL "", IDC_GROUP_GENERAL_MEMBERS, "SysListView32", LVS_REPORT | LVS_NOCOLUMNHEADER | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP,
|
||||||
7, 74, 238, 117, WS_EX_CLIENTEDGE
|
7, 74, 238, 117, WS_EX_CLIENTEDGE
|
||||||
|
PUSHBUTTON "Add...", IDC_GROUP_GENERAL_ADD, 7, 197, 50, 14, WS_DISABLED
|
||||||
|
PUSHBUTTON "Remove", IDC_GROUP_GENERAL_REMOVE, 61, 197, 50, 14, WS_DISABLED
|
||||||
END
|
END
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -49,7 +49,8 @@
|
||||||
#define IDC_GROUP_GENERAL_NAME 341
|
#define IDC_GROUP_GENERAL_NAME 341
|
||||||
#define IDC_GROUP_GENERAL_DESCRIPTION 342
|
#define IDC_GROUP_GENERAL_DESCRIPTION 342
|
||||||
#define IDC_GROUP_GENERAL_MEMBERS 343
|
#define IDC_GROUP_GENERAL_MEMBERS 343
|
||||||
|
#define IDC_GROUP_GENERAL_ADD 344
|
||||||
|
#define IDC_GROUP_GENERAL_REMOVE 345
|
||||||
|
|
||||||
#define IDD_CHANGE_PASSWORD 350
|
#define IDD_CHANGE_PASSWORD 350
|
||||||
#define IDC_EDIT_PASSWORD1 351
|
#define IDC_EDIT_PASSWORD1 351
|
||||||
|
@ -67,8 +68,10 @@
|
||||||
#define IDC_USER_NEW_NEVER_EXPIRES 368
|
#define IDC_USER_NEW_NEVER_EXPIRES 368
|
||||||
#define IDC_USER_NEW_DISABLED 369
|
#define IDC_USER_NEW_DISABLED 369
|
||||||
|
|
||||||
#define IDD_USER_MEMBERSHIP 370
|
#define IDD_USER_MEMBERSHIP 370
|
||||||
#define IDC_USER_MEMBERSHIP_LIST 371
|
#define IDC_USER_MEMBERSHIP_LIST 371
|
||||||
|
#define IDC_USER_MEMBERSHIP_ADD 372
|
||||||
|
#define IDC_USER_MEMBERSHIP_REMOVE 373
|
||||||
|
|
||||||
#define IDD_USER_PROFILE 380
|
#define IDD_USER_PROFILE 380
|
||||||
#define IDC_USER_PROFILE_PATH 381
|
#define IDC_USER_PROFILE_PATH 381
|
||||||
|
|
|
@ -23,6 +23,12 @@ typedef struct _PROFILE_USER_DATA
|
||||||
TCHAR szUserName[1];
|
TCHAR szUserName[1];
|
||||||
} PROFILE_USER_DATA, *PPROFILE_USER_DATA;
|
} PROFILE_USER_DATA, *PPROFILE_USER_DATA;
|
||||||
|
|
||||||
|
typedef struct _MEMBERSHIP_USER_DATA
|
||||||
|
{
|
||||||
|
PLOCALGROUP_USERS_INFO_0 pGroupData;
|
||||||
|
DWORD dwGroupCount;
|
||||||
|
TCHAR szUserName[1];
|
||||||
|
} MEMBERSHIP_USER_DATA, *PMEMBERSHIP_USER_DATA;
|
||||||
|
|
||||||
|
|
||||||
static VOID
|
static VOID
|
||||||
|
@ -258,11 +264,9 @@ UserProfilePageProc(HWND hwndDlg,
|
||||||
|
|
||||||
|
|
||||||
static VOID
|
static VOID
|
||||||
GetMembershipData(HWND hwndDlg, LPTSTR lpUserName)
|
GetUserMembershipData(HWND hwndDlg, PMEMBERSHIP_USER_DATA pUserData)
|
||||||
{
|
{
|
||||||
PLOCALGROUP_USERS_INFO_0 usersInfo = NULL;
|
|
||||||
NET_API_STATUS status;
|
NET_API_STATUS status;
|
||||||
DWORD dwRead;
|
|
||||||
DWORD dwTotal;
|
DWORD dwTotal;
|
||||||
DWORD i;
|
DWORD i;
|
||||||
HIMAGELIST hImgList;
|
HIMAGELIST hImgList;
|
||||||
|
@ -293,28 +297,102 @@ GetMembershipData(HWND hwndDlg, LPTSTR lpUserName)
|
||||||
(void)ListView_InsertColumn(hwndLV, 0, &column);
|
(void)ListView_InsertColumn(hwndLV, 0, &column);
|
||||||
|
|
||||||
|
|
||||||
status = NetUserGetLocalGroups(NULL, lpUserName, 0, 0,
|
status = NetUserGetLocalGroups(NULL, pUserData->szUserName, 0, 0,
|
||||||
(LPBYTE*)&usersInfo,
|
(LPBYTE*)&pUserData->pGroupData,
|
||||||
MAX_PREFERRED_LENGTH,
|
MAX_PREFERRED_LENGTH,
|
||||||
&dwRead,
|
&pUserData->dwGroupCount,
|
||||||
&dwTotal);
|
&dwTotal);
|
||||||
if (status != NERR_Success)
|
if (status != NERR_Success)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (i = 0; i < dwRead; i++)
|
for (i = 0; i < pUserData->dwGroupCount; i++)
|
||||||
{
|
{
|
||||||
ZeroMemory(&lvi, sizeof(lvi));
|
ZeroMemory(&lvi, sizeof(lvi));
|
||||||
lvi.mask = LVIF_TEXT | LVIF_STATE | LVIF_IMAGE;
|
lvi.mask = LVIF_TEXT | LVIF_STATE | LVIF_IMAGE;
|
||||||
lvi.pszText = usersInfo[i].lgrui0_name;
|
lvi.pszText = pUserData->pGroupData[i].lgrui0_name;
|
||||||
lvi.state = 0;
|
lvi.state = 0;
|
||||||
lvi.iImage = 0;
|
lvi.iImage = 0;
|
||||||
|
|
||||||
(void)ListView_InsertItem(hwndLV, &lvi);
|
(void)ListView_InsertItem(hwndLV, &lvi);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
NetApiBufferFree(usersInfo);
|
static VOID
|
||||||
|
RemoveGroupFromUser(HWND hwndDlg,
|
||||||
|
PMEMBERSHIP_USER_DATA pUserData)
|
||||||
|
{
|
||||||
|
TCHAR szGroupName[UNLEN];
|
||||||
|
TCHAR szText[256];
|
||||||
|
LOCALGROUP_MEMBERS_INFO_3 memberInfo;
|
||||||
|
HWND hwndLV;
|
||||||
|
INT nItem;
|
||||||
|
NET_API_STATUS status;
|
||||||
|
|
||||||
|
hwndLV = GetDlgItem(hwndDlg, IDC_USER_MEMBERSHIP_LIST);
|
||||||
|
nItem = ListView_GetNextItem(hwndLV, -1, LVNI_SELECTED);
|
||||||
|
if (nItem == -1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Get the new user name */
|
||||||
|
ListView_GetItemText(hwndLV,
|
||||||
|
nItem, 0,
|
||||||
|
szGroupName,
|
||||||
|
UNLEN);
|
||||||
|
|
||||||
|
/* Display a warning message because the remove operation cannot be reverted */
|
||||||
|
wsprintf(szText, TEXT("Do you really want to remove the user \"%s\" from the group \"%s\"?"),
|
||||||
|
pUserData->szUserName, szGroupName);
|
||||||
|
if (MessageBox(NULL, szText, TEXT("User Accounts"), MB_ICONWARNING | MB_YESNO) == IDNO)
|
||||||
|
return;
|
||||||
|
|
||||||
|
memberInfo.lgrmi3_domainandname = pUserData->szUserName;
|
||||||
|
|
||||||
|
status = NetLocalGroupDelMembers(NULL, szGroupName,
|
||||||
|
3, (LPBYTE)&memberInfo, 1);
|
||||||
|
if (status != NERR_Success)
|
||||||
|
{
|
||||||
|
TCHAR szText[256];
|
||||||
|
wsprintf(szText, TEXT("Error: %u"), status);
|
||||||
|
MessageBox(NULL, szText, TEXT("NetLocalGroupDelMembers"), MB_ICONERROR | MB_OK);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
(void)ListView_DeleteItem(hwndLV, nItem);
|
||||||
|
|
||||||
|
if (ListView_GetItemCount(hwndLV) == 0)
|
||||||
|
EnableWindow(GetDlgItem(hwndDlg, IDC_USER_MEMBERSHIP_REMOVE), FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static BOOL
|
||||||
|
OnNotify(HWND hwndDlg,
|
||||||
|
PMEMBERSHIP_USER_DATA pUserData,
|
||||||
|
LPARAM lParam)
|
||||||
|
{
|
||||||
|
LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)lParam;
|
||||||
|
|
||||||
|
switch (((LPNMHDR)lParam)->idFrom)
|
||||||
|
{
|
||||||
|
case IDC_USER_MEMBERSHIP_LIST:
|
||||||
|
switch (((LPNMHDR)lParam)->code)
|
||||||
|
{
|
||||||
|
case NM_CLICK:
|
||||||
|
EnableWindow(GetDlgItem(hwndDlg, IDC_USER_MEMBERSHIP_REMOVE), (lpnmlv->iItem != -1));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LVN_KEYDOWN:
|
||||||
|
if (((LPNMLVKEYDOWN)lParam)->wVKey == VK_DELETE)
|
||||||
|
{
|
||||||
|
RemoveGroupFromUser(hwndDlg, pUserData);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -324,18 +402,55 @@ UserMembershipPageProc(HWND hwndDlg,
|
||||||
WPARAM wParam,
|
WPARAM wParam,
|
||||||
LPARAM lParam)
|
LPARAM lParam)
|
||||||
{
|
{
|
||||||
|
PMEMBERSHIP_USER_DATA pUserData;
|
||||||
|
|
||||||
UNREFERENCED_PARAMETER(lParam);
|
UNREFERENCED_PARAMETER(lParam);
|
||||||
UNREFERENCED_PARAMETER(wParam);
|
UNREFERENCED_PARAMETER(wParam);
|
||||||
UNREFERENCED_PARAMETER(hwndDlg);
|
UNREFERENCED_PARAMETER(hwndDlg);
|
||||||
|
|
||||||
|
pUserData= (PMEMBERSHIP_USER_DATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
|
||||||
|
|
||||||
switch (uMsg)
|
switch (uMsg)
|
||||||
{
|
{
|
||||||
case WM_INITDIALOG:
|
case WM_INITDIALOG:
|
||||||
GetMembershipData(hwndDlg,
|
pUserData = (PMEMBERSHIP_USER_DATA)HeapAlloc(GetProcessHeap(),
|
||||||
(LPTSTR)((PROPSHEETPAGE *)lParam)->lParam);
|
HEAP_ZERO_MEMORY,
|
||||||
|
sizeof(MEMBERSHIP_USER_DATA) +
|
||||||
|
lstrlen((LPTSTR)((PROPSHEETPAGE *)lParam)->lParam) * sizeof(TCHAR));
|
||||||
|
lstrcpy(pUserData->szUserName, (LPTSTR)((PROPSHEETPAGE *)lParam)->lParam);
|
||||||
|
|
||||||
|
SetWindowLongPtr(hwndDlg, DWLP_USER, (INT_PTR)pUserData);
|
||||||
|
|
||||||
|
GetUserMembershipData(hwndDlg, pUserData);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case WM_COMMAND:
|
||||||
|
switch (LOWORD(wParam))
|
||||||
|
{
|
||||||
|
case IDC_USER_MEMBERSHIP_REMOVE:
|
||||||
|
RemoveGroupFromUser(hwndDlg, pUserData);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_NOTIFY:
|
||||||
|
if (((LPPSHNOTIFY)lParam)->hdr.code == PSN_APPLY)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return OnNotify(hwndDlg, pUserData, lParam);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
case WM_DESTROY:
|
||||||
|
if (pUserData->pGroupData)
|
||||||
|
NetApiBufferFree(pUserData->pGroupData);
|
||||||
|
|
||||||
|
HeapFree(GetProcessHeap(), 0, pUserData);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
|
@ -346,7 +346,7 @@ UserDelete(HWND hwndDlg)
|
||||||
UNLEN);
|
UNLEN);
|
||||||
|
|
||||||
/* Display a warning message because the delete operation cannot be reverted */
|
/* Display a warning message because the delete operation cannot be reverted */
|
||||||
wsprintf(szText, TEXT("Dou you really want to delete the user \"%s\"?"), szUserName);
|
wsprintf(szText, TEXT("Do you really want to delete the user \"%s\"?"), szUserName);
|
||||||
if (MessageBox(NULL, szText, TEXT("User Accounts"), MB_ICONWARNING | MB_YESNO) == IDNO)
|
if (MessageBox(NULL, szText, TEXT("User Accounts"), MB_ICONWARNING | MB_YESNO) == IDNO)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue