2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS User Manager Control Panel
4 * FILE: dll/cpl/usrmgr/userprops.c
5 * PURPOSE: User property sheet
7 * PROGRAMMERS: Eric Kohl
12 typedef struct _GENERAL_USER_DATA
15 DWORD dwPasswordExpired
;
17 } GENERAL_USER_DATA
, *PGENERAL_USER_DATA
;
19 #define VALID_GENERAL_FLAGS (UF_PASSWD_CANT_CHANGE | UF_DONT_EXPIRE_PASSWD | UF_ACCOUNTDISABLE | UF_LOCKOUT)
21 typedef struct _PROFILE_USER_DATA
24 } PROFILE_USER_DATA
, *PPROFILE_USER_DATA
;
26 typedef struct _MEMBERSHIP_USER_DATA
28 PLOCALGROUP_USERS_INFO_0 pGroupData
;
31 } MEMBERSHIP_USER_DATA
, *PMEMBERSHIP_USER_DATA
;
35 GetUserProfileData(HWND hwndDlg
,
36 PPROFILE_USER_DATA pUserData
)
38 PUSER_INFO_3 userInfo
= NULL
;
39 NET_API_STATUS status
;
45 status
= NetUserGetInfo(NULL
, pUserData
->szUserName
, 3, (LPBYTE
*)&userInfo
);
46 if (status
!= NERR_Success
)
49 SetDlgItemText(hwndDlg
, IDC_USER_PROFILE_PATH
, userInfo
->usri3_profile
);
50 SetDlgItemText(hwndDlg
, IDC_USER_PROFILE_SCRIPT
, userInfo
->usri3_script_path
);
53 bLocal
= (userInfo
->usri3_home_dir_drive
== NULL
) ||
54 (_tcslen(userInfo
->usri3_home_dir_drive
) == 0);
55 CheckRadioButton(hwndDlg
, IDC_USER_PROFILE_LOCAL
, IDC_USER_PROFILE_REMOTE
,
56 bLocal
? IDC_USER_PROFILE_LOCAL
: IDC_USER_PROFILE_REMOTE
);
58 for (i
= 0; i
< 26; i
++)
60 wsprintf(szDrive
, _T("%c:"), (TCHAR
)('A' + i
));
61 nSel
= SendMessage(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_DRIVE
),
62 CB_INSERTSTRING
, -1, (LPARAM
)szDrive
);
67 SetDlgItemText(hwndDlg
, IDC_USER_PROFILE_LOCAL_PATH
, userInfo
->usri3_home_dir
);
68 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_DRIVE
), FALSE
);
69 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_REMOTE_PATH
), FALSE
);
73 SetDlgItemText(hwndDlg
, IDC_USER_PROFILE_REMOTE_PATH
, userInfo
->usri3_home_dir
);
74 nSel
= SendMessage(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_DRIVE
),
75 CB_FINDSTRINGEXACT
, -1, (LPARAM
)userInfo
->usri3_home_dir_drive
);
78 SendMessage(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_DRIVE
),
79 CB_SETCURSEL
, nSel
, 0);
81 NetApiBufferFree(userInfo
);
86 SetUserProfileData(HWND hwndDlg
,
87 PPROFILE_USER_DATA pUserData
)
89 PUSER_INFO_3 pUserInfo
= NULL
;
90 NET_API_STATUS status
;
94 NetUserGetInfo(NULL
, pUserData
->szUserName
, 3, (LPBYTE
*)&pUserInfo
);
96 /* Get the profile path */
97 pUserInfo
->usri3_profile
= GetDlgItemTextAlloc(hwndDlg
, IDC_USER_PROFILE_PATH
);
99 /* Get the script path */
100 pUserInfo
->usri3_script_path
= GetDlgItemTextAlloc(hwndDlg
, IDC_USER_PROFILE_SCRIPT
);
102 if (IsDlgButtonChecked(hwndDlg
, IDC_USER_PROFILE_LOCAL
) == BST_CHECKED
)
104 /* Local home directory */
105 pUserInfo
->usri3_home_dir
= GetDlgItemTextAlloc(hwndDlg
, IDC_USER_PROFILE_LOCAL_PATH
);
109 /* Remote home directory */
110 pUserInfo
->usri3_home_dir
= GetDlgItemTextAlloc(hwndDlg
, IDC_USER_PROFILE_REMOTE_PATH
);
112 nIndex
= SendMessage(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_DRIVE
), CB_GETCURSEL
, 0, 0);
113 if (nIndex
!= CB_ERR
)
115 pUserInfo
->usri3_home_dir_drive
=
116 GetComboBoxLBTextAlloc(hwndDlg
, IDC_USER_PROFILE_DRIVE
, nIndex
);
120 pUserInfo
->usri3_home_dir_drive
=
121 HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(TCHAR
));
125 status
= NetUserSetInfo(NULL
, pUserData
->szUserName
, 3, (LPBYTE
)pUserInfo
, &dwIndex
);
126 if (status
!= NERR_Success
)
128 ERR("NetUserSetInfo failed. Status: %lu Index: %lu", status
, dwIndex
);
131 HeapFree(GetProcessHeap(), 0, pUserInfo
->usri3_profile
);
132 HeapFree(GetProcessHeap(), 0, pUserInfo
->usri3_script_path
);
133 HeapFree(GetProcessHeap(), 0, pUserInfo
->usri3_home_dir
);
134 HeapFree(GetProcessHeap(), 0, pUserInfo
->usri3_home_dir_drive
);
136 NetApiBufferFree(pUserInfo
);
138 return (status
== NERR_Success
);
143 UserProfilePageProc(HWND hwndDlg
,
148 PPROFILE_USER_DATA pUserData
;
150 UNREFERENCED_PARAMETER(lParam
);
151 UNREFERENCED_PARAMETER(wParam
);
152 UNREFERENCED_PARAMETER(hwndDlg
);
154 pUserData
= (PPROFILE_USER_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
159 pUserData
= (PPROFILE_USER_DATA
)HeapAlloc(GetProcessHeap(),
161 sizeof(PROFILE_USER_DATA
) +
162 lstrlen((LPTSTR
)((PROPSHEETPAGE
*)lParam
)->lParam
) * sizeof(TCHAR
));
163 lstrcpy(pUserData
->szUserName
, (LPTSTR
)((PROPSHEETPAGE
*)lParam
)->lParam
);
165 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (INT_PTR
)pUserData
);
167 GetUserProfileData(hwndDlg
,
172 switch (LOWORD(wParam
))
174 case IDC_USER_PROFILE_PATH
:
175 case IDC_USER_PROFILE_SCRIPT
:
176 if (HIWORD(wParam
) == EN_CHANGE
)
177 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
180 case IDC_USER_PROFILE_LOCAL
:
181 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_LOCAL_PATH
), TRUE
);
182 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_DRIVE
), FALSE
);
183 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_REMOTE_PATH
), FALSE
);
186 case IDC_USER_PROFILE_REMOTE
:
187 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_LOCAL_PATH
), FALSE
);
188 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_DRIVE
), TRUE
);
189 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_REMOTE_PATH
), TRUE
);
195 HeapFree(GetProcessHeap(), 0, pUserData
);
199 if (((LPPSHNOTIFY
)lParam
)->hdr
.code
== PSN_APPLY
)
201 SetUserProfileData(hwndDlg
, pUserData
);
212 GetUserMembershipData(HWND hwndDlg
, PMEMBERSHIP_USER_DATA pUserData
)
214 NET_API_STATUS status
;
225 hwndLV
= GetDlgItem(hwndDlg
, IDC_USER_MEMBERSHIP_LIST
);
227 /* Create the image list */
228 hImgList
= ImageList_Create(16, 16, ILC_COLOR32
| ILC_MASK
, 5, 5);
229 hIcon
= LoadImage(hApplet
, MAKEINTRESOURCE(IDI_GROUP
), IMAGE_ICON
, 16, 16, LR_DEFAULTCOLOR
);
230 ImageList_AddIcon(hImgList
, hIcon
);
232 (void)ListView_SetImageList(hwndLV
, hImgList
, LVSIL_SMALL
);
234 /* Set the list column */
235 GetClientRect(hwndLV
, &rect
);
237 memset(&column
, 0x00, sizeof(column
));
238 column
.mask
= LVCF_FMT
| LVCF_WIDTH
| LVCF_SUBITEM
;
239 column
.fmt
= LVCFMT_LEFT
;
240 column
.cx
= (INT
)(rect
.right
- rect
.left
);
242 (void)ListView_InsertColumn(hwndLV
, 0, &column
);
245 status
= NetUserGetLocalGroups(NULL
, pUserData
->szUserName
, 0, 0,
246 (LPBYTE
*)&pUserData
->pGroupData
,
247 MAX_PREFERRED_LENGTH
,
248 &pUserData
->dwGroupCount
,
250 if (status
!= NERR_Success
)
253 for (i
= 0; i
< pUserData
->dwGroupCount
; i
++)
255 ZeroMemory(&lvi
, sizeof(lvi
));
256 lvi
.mask
= LVIF_TEXT
| LVIF_STATE
| LVIF_IMAGE
;
257 lvi
.pszText
= pUserData
->pGroupData
[i
].lgrui0_name
;
261 (void)ListView_InsertItem(hwndLV
, &lvi
);
267 RemoveGroupFromUser(HWND hwndDlg
,
268 PMEMBERSHIP_USER_DATA pUserData
)
270 TCHAR szGroupName
[UNLEN
+ 1];
272 LOCALGROUP_MEMBERS_INFO_3 memberInfo
;
275 NET_API_STATUS status
;
277 hwndLV
= GetDlgItem(hwndDlg
, IDC_USER_MEMBERSHIP_LIST
);
278 nItem
= ListView_GetNextItem(hwndLV
, -1, LVNI_SELECTED
);
282 /* Get the new user name */
283 ListView_GetItemText(hwndLV
,
288 /* Display a warning message because the remove operation cannot be reverted */
289 wsprintf(szText
, TEXT("Do you really want to remove the user \"%s\" from the group \"%s\"?"),
290 pUserData
->szUserName
, szGroupName
);
291 if (MessageBox(NULL
, szText
, TEXT("User Accounts"), MB_ICONWARNING
| MB_YESNO
) == IDNO
)
294 memberInfo
.lgrmi3_domainandname
= pUserData
->szUserName
;
296 status
= NetLocalGroupDelMembers(NULL
, szGroupName
,
297 3, (LPBYTE
)&memberInfo
, 1);
298 if (status
!= NERR_Success
)
301 wsprintf(szText
, TEXT("Error: %u"), status
);
302 MessageBox(NULL
, szText
, TEXT("NetLocalGroupDelMembers"), MB_ICONERROR
| MB_OK
);
306 (void)ListView_DeleteItem(hwndLV
, nItem
);
308 if (ListView_GetItemCount(hwndLV
) == 0)
309 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_MEMBERSHIP_REMOVE
), FALSE
);
314 InitUserGroupsList(HWND hwndDlg
)
321 NET_API_STATUS netStatus
;
322 PLOCALGROUP_INFO_1 pBuffer
;
325 DWORD_PTR resume_handle
= 0;
333 hwndLV
= GetDlgItem(hwndDlg
, IDC_USER_ADD_MEMBERSHIP_LIST
);
334 GetClientRect(hwndLV
, &rect
);
336 hImgList
= ImageList_Create(16, 16, ILC_COLOR32
| ILC_MASK
, 5, 5);
337 hIcon
= LoadImage(hApplet
, MAKEINTRESOURCE(IDI_GROUP
), IMAGE_ICON
, 16, 16, LR_DEFAULTCOLOR
);
338 ImageList_AddIcon(hImgList
, hIcon
);
341 (void)ListView_SetImageList(hwndLV
, hImgList
, LVSIL_SMALL
);
342 (void)ListView_SetExtendedListViewStyle(hwndLV
, LVS_EX_FULLROWSELECT
);
344 memset(&column
, 0x00, sizeof(column
));
345 column
.mask
= LVCF_FMT
| LVCF_WIDTH
| LVCF_SUBITEM
| LVCF_TEXT
;
346 column
.fmt
= LVCFMT_LEFT
;
347 column
.cx
= (INT
)((rect
.right
- rect
.left
) * 0.40);
349 LoadString(hApplet
, IDS_NAME
, szStr
, sizeof(szStr
) / sizeof(szStr
[0]));
350 column
.pszText
= szStr
;
351 (void)ListView_InsertColumn(hwndLV
, 0, &column
);
353 column
.cx
= (INT
)((rect
.right
- rect
.left
) * 0.60);
355 LoadString(hApplet
, IDS_DESCRIPTION
, szStr
, sizeof(szStr
) / sizeof(szStr
[0]));
356 column
.pszText
= szStr
;
357 (void)ListView_InsertColumn(hwndLV
, 1, &column
);
361 netStatus
= NetLocalGroupEnum(NULL
, 1, (LPBYTE
*)&pBuffer
,
363 &totalentries
, &resume_handle
);
364 if (netStatus
!= NERR_Success
&& netStatus
!= ERROR_MORE_DATA
)
367 for (i
= 0; i
< entriesread
; i
++)
369 memset(&lvi
, 0x00, sizeof(lvi
));
370 lvi
.mask
= LVIF_TEXT
| LVIF_STATE
| LVIF_IMAGE
;
371 lvi
.pszText
= pBuffer
[i
].lgrpi1_name
;
374 iItem
= ListView_InsertItem(hwndLV
, &lvi
);
376 ListView_SetItemText(hwndLV
, iItem
, 1,
377 pBuffer
[i
].lgrpi1_comment
);
380 NetApiBufferFree(pBuffer
);
382 /* No more data left */
383 if (netStatus
!= ERROR_MORE_DATA
)
390 AddSelectedGroupsToUser(HWND hwndDlg
,
391 PMEMBERSHIP_USER_DATA pUserData
)
395 TCHAR szGroupName
[UNLEN
+ 1];
396 BOOL bResult
= FALSE
;
399 LOCALGROUP_MEMBERS_INFO_3 memberInfo
;
400 NET_API_STATUS status
;
402 hwndLV
= GetDlgItem(hwndDlg
, IDC_USER_ADD_MEMBERSHIP_LIST
);
404 if (ListView_GetSelectedCount(hwndLV
) > 0)
406 nItem
= ListView_GetNextItem(hwndLV
, -1, LVNI_SELECTED
);
409 /* Get the new user name */
410 ListView_GetItemText(hwndLV
,
416 for (i
= 0; i
< pUserData
->dwGroupCount
; i
++)
418 if (_tcscmp(pUserData
->pGroupData
[i
].lgrui0_name
, szGroupName
) == 0)
424 memberInfo
.lgrmi3_domainandname
= pUserData
->szUserName
;
426 status
= NetLocalGroupAddMembers(NULL
, szGroupName
, 3,
427 (LPBYTE
)&memberInfo
, 1);
428 if (status
== NERR_Success
)
430 TRACE("Selected group: %s", dbgstrx(szGroupName
));
436 wsprintf(szText
, TEXT("Error: %u"), status
);
437 MessageBox(NULL
, szText
, TEXT("NetLocalGroupAddMembers"), MB_ICONERROR
| MB_OK
);
441 nItem
= ListView_GetNextItem(hwndLV
, nItem
, LVNI_SELECTED
);
450 AddGroupToUserDlgProc(HWND hwndDlg
,
455 PMEMBERSHIP_USER_DATA pUserData
;
457 UNREFERENCED_PARAMETER(wParam
);
459 pUserData
= (PMEMBERSHIP_USER_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
464 pUserData
= (PMEMBERSHIP_USER_DATA
)lParam
;
465 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (INT_PTR
)pUserData
);
466 InitUserGroupsList(hwndDlg
);
470 switch (LOWORD(wParam
))
473 if (AddSelectedGroupsToUser(hwndDlg
, pUserData
))
474 EndDialog(hwndDlg
, IDOK
);
476 EndDialog(hwndDlg
, IDCANCEL
);
480 EndDialog(hwndDlg
, IDCANCEL
);
494 AddGroupToUser(HWND hwndDlg
,
495 PMEMBERSHIP_USER_DATA pUserData
)
498 NET_API_STATUS status
;
503 if (DialogBoxParam(hApplet
,
504 MAKEINTRESOURCE(IDD_USER_ADD_MEMBERSHIP
),
506 AddGroupToUserDlgProc
,
507 (LPARAM
)pUserData
) == IDOK
)
509 // TODO: Update Membership list!
510 hwndLV
= GetDlgItem(hwndDlg
, IDC_USER_MEMBERSHIP_LIST
);
512 if (pUserData
->pGroupData
)
513 NetApiBufferFree(pUserData
->pGroupData
);
515 (void)ListView_DeleteAllItems(hwndLV
);
517 status
= NetUserGetLocalGroups(NULL
, pUserData
->szUserName
, 0, 0,
518 (LPBYTE
*)&pUserData
->pGroupData
,
519 MAX_PREFERRED_LENGTH
,
520 &pUserData
->dwGroupCount
,
522 if (status
!= NERR_Success
)
525 for (i
= 0; i
< pUserData
->dwGroupCount
; i
++)
527 ZeroMemory(&lvi
, sizeof(lvi
));
528 lvi
.mask
= LVIF_TEXT
| LVIF_STATE
| LVIF_IMAGE
;
529 lvi
.pszText
= pUserData
->pGroupData
[i
].lgrui0_name
;
533 (void)ListView_InsertItem(hwndLV
, &lvi
);
540 OnUserPropSheetNotify(HWND hwndDlg
,
541 PMEMBERSHIP_USER_DATA pUserData
,
544 LPNMLISTVIEW lpnmlv
= (LPNMLISTVIEW
)lParam
;
546 switch (((LPNMHDR
)lParam
)->idFrom
)
548 case IDC_USER_MEMBERSHIP_LIST
:
549 switch (((LPNMHDR
)lParam
)->code
)
552 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_MEMBERSHIP_REMOVE
), (lpnmlv
->iItem
!= -1));
556 if (((LPNMLVKEYDOWN
)lParam
)->wVKey
== VK_DELETE
)
558 RemoveGroupFromUser(hwndDlg
, pUserData
);
571 UserMembershipPageProc(HWND hwndDlg
,
576 PMEMBERSHIP_USER_DATA pUserData
;
578 UNREFERENCED_PARAMETER(lParam
);
579 UNREFERENCED_PARAMETER(wParam
);
580 UNREFERENCED_PARAMETER(hwndDlg
);
582 pUserData
= (PMEMBERSHIP_USER_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
587 pUserData
= (PMEMBERSHIP_USER_DATA
)HeapAlloc(GetProcessHeap(),
589 sizeof(MEMBERSHIP_USER_DATA
) +
590 lstrlen((LPTSTR
)((PROPSHEETPAGE
*)lParam
)->lParam
) * sizeof(TCHAR
));
591 lstrcpy(pUserData
->szUserName
, (LPTSTR
)((PROPSHEETPAGE
*)lParam
)->lParam
);
593 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (INT_PTR
)pUserData
);
595 GetUserMembershipData(hwndDlg
, pUserData
);
599 switch (LOWORD(wParam
))
601 case IDC_USER_MEMBERSHIP_ADD
:
602 AddGroupToUser(hwndDlg
, pUserData
);
605 case IDC_USER_MEMBERSHIP_REMOVE
:
606 RemoveGroupFromUser(hwndDlg
, pUserData
);
612 if (((LPPSHNOTIFY
)lParam
)->hdr
.code
== PSN_APPLY
)
618 return OnUserPropSheetNotify(hwndDlg
, pUserData
, lParam
);
624 if (pUserData
->pGroupData
)
625 NetApiBufferFree(pUserData
->pGroupData
);
627 HeapFree(GetProcessHeap(), 0, pUserData
);
636 UpdateUserOptions(HWND hwndDlg
,
637 PGENERAL_USER_DATA pUserData
,
640 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_GENERAL_CANNOT_CHANGE
),
641 !pUserData
->dwPasswordExpired
);
642 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_GENERAL_NEVER_EXPIRES
),
643 !pUserData
->dwPasswordExpired
);
644 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_GENERAL_FORCE_CHANGE
),
645 (pUserData
->dwFlags
& (UF_PASSWD_CANT_CHANGE
| UF_DONT_EXPIRE_PASSWD
)) == 0);
647 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_GENERAL_LOCKED
),
648 (pUserData
->dwFlags
& UF_LOCKOUT
) != 0);
652 CheckDlgButton(hwndDlg
, IDC_USER_GENERAL_FORCE_CHANGE
,
653 pUserData
->dwPasswordExpired
? BST_CHECKED
: BST_UNCHECKED
);
655 CheckDlgButton(hwndDlg
, IDC_USER_GENERAL_CANNOT_CHANGE
,
656 (pUserData
->dwFlags
& UF_PASSWD_CANT_CHANGE
) ? BST_CHECKED
: BST_UNCHECKED
);
658 CheckDlgButton(hwndDlg
, IDC_USER_GENERAL_NEVER_EXPIRES
,
659 (pUserData
->dwFlags
& UF_DONT_EXPIRE_PASSWD
) ? BST_CHECKED
: BST_UNCHECKED
);
661 CheckDlgButton(hwndDlg
, IDC_USER_GENERAL_DISABLED
,
662 (pUserData
->dwFlags
& UF_ACCOUNTDISABLE
) ? BST_CHECKED
: BST_UNCHECKED
);
664 CheckDlgButton(hwndDlg
, IDC_USER_GENERAL_LOCKED
,
665 (pUserData
->dwFlags
& UF_LOCKOUT
) ? BST_CHECKED
: BST_UNCHECKED
);
671 GetUserGeneralData(HWND hwndDlg
,
672 PGENERAL_USER_DATA pUserData
)
674 PUSER_INFO_3 pUserInfo
= NULL
;
676 SetDlgItemText(hwndDlg
, IDC_USER_GENERAL_NAME
, pUserData
->szUserName
);
678 NetUserGetInfo(NULL
, pUserData
->szUserName
, 3, (LPBYTE
*)&pUserInfo
);
680 SetDlgItemText(hwndDlg
, IDC_USER_GENERAL_FULL_NAME
, pUserInfo
->usri3_full_name
);
681 SetDlgItemText(hwndDlg
, IDC_USER_GENERAL_DESCRIPTION
, pUserInfo
->usri3_comment
);
683 pUserData
->dwFlags
= pUserInfo
->usri3_flags
;
684 pUserData
->dwPasswordExpired
= pUserInfo
->usri3_password_expired
;
686 NetApiBufferFree(pUserInfo
);
688 UpdateUserOptions(hwndDlg
, pUserData
, TRUE
);
693 SetUserGeneralData(HWND hwndDlg
,
694 PGENERAL_USER_DATA pUserData
)
696 PUSER_INFO_3 pUserInfo
= NULL
;
697 NET_API_STATUS status
;
700 NetUserGetInfo(NULL
, pUserData
->szUserName
, 3, (LPBYTE
*)&pUserInfo
);
702 pUserInfo
->usri3_flags
=
703 (pUserData
->dwFlags
& VALID_GENERAL_FLAGS
) |
704 (pUserInfo
->usri3_flags
& ~VALID_GENERAL_FLAGS
);
706 pUserInfo
->usri3_password_expired
= pUserData
->dwPasswordExpired
;
709 pUserInfo
->usri3_full_name
= GetDlgItemTextAlloc(hwndDlg
, IDC_USER_GENERAL_FULL_NAME
);
712 pUserInfo
->usri3_comment
= GetDlgItemTextAlloc(hwndDlg
, IDC_USER_GENERAL_DESCRIPTION
);
714 status
= NetUserSetInfo(NULL
, pUserData
->szUserName
, 3, (LPBYTE
)pUserInfo
, &dwIndex
);
715 if (status
!= NERR_Success
)
717 ERR("NetUserSetInfo failed. Status: %lu Index: %lu", status
, dwIndex
);
720 HeapFree(GetProcessHeap(), 0, pUserInfo
->usri3_full_name
);
721 HeapFree(GetProcessHeap(), 0, pUserInfo
->usri3_comment
);
723 NetApiBufferFree(pUserInfo
);
725 return (status
== NERR_Success
);
730 UserGeneralPageProc(HWND hwndDlg
,
735 PGENERAL_USER_DATA pUserData
;
737 UNREFERENCED_PARAMETER(lParam
);
738 UNREFERENCED_PARAMETER(wParam
);
739 UNREFERENCED_PARAMETER(hwndDlg
);
741 pUserData
= (PGENERAL_USER_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
746 pUserData
= (PGENERAL_USER_DATA
)HeapAlloc(GetProcessHeap(),
748 sizeof(GENERAL_USER_DATA
) +
749 lstrlen((LPTSTR
)((PROPSHEETPAGE
*)lParam
)->lParam
) * sizeof(TCHAR
));
750 lstrcpy(pUserData
->szUserName
, (LPTSTR
)((PROPSHEETPAGE
*)lParam
)->lParam
);
752 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (INT_PTR
)pUserData
);
754 GetUserGeneralData(hwndDlg
,
759 switch (LOWORD(wParam
))
761 case IDC_USER_GENERAL_FULL_NAME
:
762 case IDC_USER_GENERAL_DESCRIPTION
:
763 if (HIWORD(wParam
) == EN_CHANGE
)
764 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
767 case IDC_USER_GENERAL_FORCE_CHANGE
:
768 pUserData
->dwPasswordExpired
= !pUserData
->dwPasswordExpired
;
769 UpdateUserOptions(hwndDlg
, pUserData
, FALSE
);
770 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
773 case IDC_USER_GENERAL_CANNOT_CHANGE
:
774 pUserData
->dwFlags
^= UF_PASSWD_CANT_CHANGE
;
775 UpdateUserOptions(hwndDlg
, pUserData
, FALSE
);
776 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
779 case IDC_USER_GENERAL_NEVER_EXPIRES
:
780 pUserData
->dwFlags
^= UF_DONT_EXPIRE_PASSWD
;
781 UpdateUserOptions(hwndDlg
, pUserData
, FALSE
);
782 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
785 case IDC_USER_GENERAL_DISABLED
:
786 pUserData
->dwFlags
^= UF_ACCOUNTDISABLE
;
787 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
790 case IDC_USER_GENERAL_LOCKED
:
791 pUserData
->dwFlags
^= UF_LOCKOUT
;
792 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
798 if (((LPPSHNOTIFY
)lParam
)->hdr
.code
== PSN_APPLY
)
800 SetUserGeneralData(hwndDlg
, pUserData
);
806 HeapFree(GetProcessHeap(), 0, pUserData
);
815 InitUserPropSheetPage(PROPSHEETPAGE
*psp
, WORD idDlg
, DLGPROC DlgProc
, LPTSTR pszUser
)
817 ZeroMemory(psp
, sizeof(PROPSHEETPAGE
));
818 psp
->dwSize
= sizeof(PROPSHEETPAGE
);
819 psp
->dwFlags
= PSP_DEFAULT
;
820 psp
->hInstance
= hApplet
;
821 psp
->pszTemplate
= MAKEINTRESOURCE(idDlg
);
822 psp
->pfnDlgProc
= DlgProc
;
823 psp
->lParam
= (LPARAM
)pszUser
;
828 UserProperties(HWND hwndDlg
)
830 PROPSHEETPAGE psp
[3];
832 TCHAR szUserName
[UNLEN
+ 1];
836 hwndLV
= GetDlgItem(hwndDlg
, IDC_USERS_LIST
);
837 nItem
= ListView_GetNextItem(hwndLV
, -1, LVNI_SELECTED
);
841 /* Get the new user name */
842 ListView_GetItemText(hwndLV
,
847 ZeroMemory(&psh
, sizeof(PROPSHEETHEADER
));
848 psh
.dwSize
= sizeof(PROPSHEETHEADER
);
849 psh
.dwFlags
= PSH_PROPSHEETPAGE
| PSH_PROPTITLE
;
850 psh
.hwndParent
= hwndDlg
;
851 psh
.hInstance
= hApplet
;
853 psh
.pszCaption
= szUserName
;
854 psh
.nPages
= sizeof(psp
) / sizeof(PROPSHEETPAGE
);
858 InitUserPropSheetPage(&psp
[0], IDD_USER_GENERAL
, UserGeneralPageProc
, szUserName
);
859 InitUserPropSheetPage(&psp
[1], IDD_USER_MEMBERSHIP
, UserMembershipPageProc
, szUserName
);
860 InitUserPropSheetPage(&psp
[2], IDD_USER_PROFILE
, UserProfilePageProc
, szUserName
);
862 return (PropertySheet(&psh
) == IDOK
);