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 LPTSTR pszProfilePath
= NULL
;
91 LPTSTR pszScriptPath
= NULL
;
92 LPTSTR pszHomeDir
= NULL
;
93 LPTSTR pszHomeDrive
= NULL
;
94 NET_API_STATUS status
;
99 NetUserGetInfo(NULL
, pUserData
->szUserName
, 3, (LPBYTE
*)&pUserInfo
);
101 /* Get the profile path */
102 nLength
= GetWindowTextLength(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_PATH
));
105 pUserInfo
->usri3_profile
= NULL
;
109 pszProfilePath
= HeapAlloc(GetProcessHeap(), 0, (nLength
+ 1) * sizeof(TCHAR
));
110 GetDlgItemText(hwndDlg
, IDC_USER_PROFILE_PATH
, pszProfilePath
, nLength
+ 1);
111 pUserInfo
->usri3_profile
= pszProfilePath
;
114 /* Get the script path */
115 nLength
= GetWindowTextLength(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_SCRIPT
));
118 pUserInfo
->usri3_script_path
= NULL
;
122 pszScriptPath
= HeapAlloc(GetProcessHeap(), 0, (nLength
+ 1) * sizeof(TCHAR
));
123 GetDlgItemText(hwndDlg
, IDC_USER_PROFILE_SCRIPT
, pszScriptPath
, nLength
+ 1);
124 pUserInfo
->usri3_script_path
= pszScriptPath
;
127 if (IsDlgButtonChecked(hwndDlg
, IDC_USER_PROFILE_LOCAL
) == BST_CHECKED
)
129 /* Local home directory */
130 nLength
= GetWindowTextLength(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_LOCAL_PATH
));
133 pUserInfo
->usri3_home_dir
= NULL
;
137 pszHomeDir
= HeapAlloc(GetProcessHeap(), 0, (nLength
+ 1) * sizeof(TCHAR
));
138 GetDlgItemText(hwndDlg
, IDC_USER_PROFILE_LOCAL_PATH
, pszHomeDir
, nLength
+ 1);
139 pUserInfo
->usri3_home_dir
= pszHomeDir
;
144 /* Remote home directory */
145 nLength
= GetWindowTextLength(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_REMOTE_PATH
));
148 pUserInfo
->usri3_home_dir
= NULL
;
152 pszHomeDir
= HeapAlloc(GetProcessHeap(), 0, (nLength
+ 1) * sizeof(TCHAR
));
153 GetDlgItemText(hwndDlg
, IDC_USER_PROFILE_REMOTE_PATH
, pszHomeDir
, nLength
+ 1);
154 pUserInfo
->usri3_home_dir
= pszHomeDir
;
157 nIndex
= SendMessage(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_DRIVE
), CB_GETCURSEL
, 0, 0);
158 if (nIndex
!= CB_ERR
)
160 nLength
= SendMessage(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_DRIVE
), CB_GETLBTEXTLEN
, nIndex
, 0);
161 pszHomeDrive
= HeapAlloc(GetProcessHeap(), 0, (nLength
+ 1) * sizeof(TCHAR
));
162 SendMessage(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_DRIVE
), CB_GETLBTEXT
, nIndex
, (LPARAM
)pszHomeDrive
);
163 pUserInfo
->usri3_home_dir_drive
= pszHomeDrive
;
167 status
= NetUserSetInfo(NULL
, pUserData
->szUserName
, 3, (LPBYTE
)pUserInfo
, &dwIndex
);
168 if (status
!= NERR_Success
)
170 DebugPrintf(_T("Status: %lu Index: %lu"), status
, dwIndex
);
174 HeapFree(GetProcessHeap(), 0, pszProfilePath
);
177 HeapFree(GetProcessHeap(), 0, pszScriptPath
);
180 HeapFree(GetProcessHeap(), 0, pszHomeDir
);
183 HeapFree(GetProcessHeap(), 0, pszHomeDrive
);
185 NetApiBufferFree(pUserInfo
);
187 return (status
== NERR_Success
);
192 UserProfilePageProc(HWND hwndDlg
,
197 PPROFILE_USER_DATA pUserData
;
199 UNREFERENCED_PARAMETER(lParam
);
200 UNREFERENCED_PARAMETER(wParam
);
201 UNREFERENCED_PARAMETER(hwndDlg
);
203 pUserData
= (PPROFILE_USER_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
208 pUserData
= (PPROFILE_USER_DATA
)HeapAlloc(GetProcessHeap(),
210 sizeof(PROFILE_USER_DATA
) +
211 lstrlen((LPTSTR
)((PROPSHEETPAGE
*)lParam
)->lParam
) * sizeof(TCHAR
));
212 lstrcpy(pUserData
->szUserName
, (LPTSTR
)((PROPSHEETPAGE
*)lParam
)->lParam
);
214 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (INT_PTR
)pUserData
);
216 GetUserProfileData(hwndDlg
,
221 switch (LOWORD(wParam
))
223 case IDC_USER_PROFILE_PATH
:
224 case IDC_USER_PROFILE_SCRIPT
:
225 if (HIWORD(wParam
) == EN_CHANGE
)
226 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
229 case IDC_USER_PROFILE_LOCAL
:
230 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_LOCAL_PATH
), TRUE
);
231 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_DRIVE
), FALSE
);
232 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_REMOTE_PATH
), FALSE
);
235 case IDC_USER_PROFILE_REMOTE
:
236 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_LOCAL_PATH
), FALSE
);
237 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_DRIVE
), TRUE
);
238 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_REMOTE_PATH
), TRUE
);
244 HeapFree(GetProcessHeap(), 0, pUserData
);
248 if (((LPPSHNOTIFY
)lParam
)->hdr
.code
== PSN_APPLY
)
250 SetUserProfileData(hwndDlg
, pUserData
);
261 GetUserMembershipData(HWND hwndDlg
, PMEMBERSHIP_USER_DATA pUserData
)
263 NET_API_STATUS status
;
274 hwndLV
= GetDlgItem(hwndDlg
, IDC_USER_MEMBERSHIP_LIST
);
276 /* Create the image list */
277 hImgList
= ImageList_Create(16, 16, ILC_COLOR32
| ILC_MASK
, 5, 5);
278 hIcon
= LoadImage(hApplet
, MAKEINTRESOURCE(IDI_GROUP
), IMAGE_ICON
, 16, 16, LR_DEFAULTCOLOR
);
279 ImageList_AddIcon(hImgList
, hIcon
);
281 (void)ListView_SetImageList(hwndLV
, hImgList
, LVSIL_SMALL
);
283 /* Set the list column */
284 GetClientRect(hwndLV
, &rect
);
286 memset(&column
, 0x00, sizeof(column
));
287 column
.mask
= LVCF_FMT
| LVCF_WIDTH
| LVCF_SUBITEM
;
288 column
.fmt
= LVCFMT_LEFT
;
289 column
.cx
= (INT
)(rect
.right
- rect
.left
);
291 (void)ListView_InsertColumn(hwndLV
, 0, &column
);
294 status
= NetUserGetLocalGroups(NULL
, pUserData
->szUserName
, 0, 0,
295 (LPBYTE
*)&pUserData
->pGroupData
,
296 MAX_PREFERRED_LENGTH
,
297 &pUserData
->dwGroupCount
,
299 if (status
!= NERR_Success
)
302 for (i
= 0; i
< pUserData
->dwGroupCount
; i
++)
304 ZeroMemory(&lvi
, sizeof(lvi
));
305 lvi
.mask
= LVIF_TEXT
| LVIF_STATE
| LVIF_IMAGE
;
306 lvi
.pszText
= pUserData
->pGroupData
[i
].lgrui0_name
;
310 (void)ListView_InsertItem(hwndLV
, &lvi
);
316 RemoveGroupFromUser(HWND hwndDlg
,
317 PMEMBERSHIP_USER_DATA pUserData
)
319 TCHAR szGroupName
[UNLEN
];
321 LOCALGROUP_MEMBERS_INFO_3 memberInfo
;
324 NET_API_STATUS status
;
326 hwndLV
= GetDlgItem(hwndDlg
, IDC_USER_MEMBERSHIP_LIST
);
327 nItem
= ListView_GetNextItem(hwndLV
, -1, LVNI_SELECTED
);
331 /* Get the new user name */
332 ListView_GetItemText(hwndLV
,
337 /* Display a warning message because the remove operation cannot be reverted */
338 wsprintf(szText
, TEXT("Do you really want to remove the user \"%s\" from the group \"%s\"?"),
339 pUserData
->szUserName
, szGroupName
);
340 if (MessageBox(NULL
, szText
, TEXT("User Accounts"), MB_ICONWARNING
| MB_YESNO
) == IDNO
)
343 memberInfo
.lgrmi3_domainandname
= pUserData
->szUserName
;
345 status
= NetLocalGroupDelMembers(NULL
, szGroupName
,
346 3, (LPBYTE
)&memberInfo
, 1);
347 if (status
!= NERR_Success
)
350 wsprintf(szText
, TEXT("Error: %u"), status
);
351 MessageBox(NULL
, szText
, TEXT("NetLocalGroupDelMembers"), MB_ICONERROR
| MB_OK
);
355 (void)ListView_DeleteItem(hwndLV
, nItem
);
357 if (ListView_GetItemCount(hwndLV
) == 0)
358 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_MEMBERSHIP_REMOVE
), FALSE
);
363 InitUserGroupsList(HWND hwndDlg
)
370 NET_API_STATUS netStatus
;
371 PLOCALGROUP_INFO_1 pBuffer
;
374 DWORD_PTR resume_handle
= 0;
382 hwndLV
= GetDlgItem(hwndDlg
, IDC_USER_ADD_MEMBERSHIP_LIST
);
383 GetClientRect(hwndLV
, &rect
);
385 hImgList
= ImageList_Create(16, 16, ILC_COLOR32
| ILC_MASK
, 5, 5);
386 hIcon
= LoadImage(hApplet
, MAKEINTRESOURCE(IDI_GROUP
), IMAGE_ICON
, 16, 16, LR_DEFAULTCOLOR
);
387 ImageList_AddIcon(hImgList
, hIcon
);
390 (void)ListView_SetImageList(hwndLV
, hImgList
, LVSIL_SMALL
);
391 (void)ListView_SetExtendedListViewStyle(hwndLV
, LVS_EX_FULLROWSELECT
);
393 memset(&column
, 0x00, sizeof(column
));
394 column
.mask
= LVCF_FMT
| LVCF_WIDTH
| LVCF_SUBITEM
| LVCF_TEXT
;
395 column
.fmt
= LVCFMT_LEFT
;
396 column
.cx
= (INT
)((rect
.right
- rect
.left
) * 0.40);
398 LoadString(hApplet
, IDS_NAME
, szStr
, sizeof(szStr
) / sizeof(szStr
[0]));
399 column
.pszText
= szStr
;
400 (void)ListView_InsertColumn(hwndLV
, 0, &column
);
402 column
.cx
= (INT
)((rect
.right
- rect
.left
) * 0.60);
404 LoadString(hApplet
, IDS_DESCRIPTION
, szStr
, sizeof(szStr
) / sizeof(szStr
[0]));
405 column
.pszText
= szStr
;
406 (void)ListView_InsertColumn(hwndLV
, 1, &column
);
410 netStatus
= NetLocalGroupEnum(NULL
, 1, (LPBYTE
*)&pBuffer
,
412 &totalentries
, &resume_handle
);
413 if (netStatus
!= NERR_Success
&& netStatus
!= ERROR_MORE_DATA
)
416 for (i
= 0; i
< entriesread
; i
++)
418 memset(&lvi
, 0x00, sizeof(lvi
));
419 lvi
.mask
= LVIF_TEXT
| LVIF_STATE
| LVIF_IMAGE
;
420 lvi
.pszText
= pBuffer
[i
].lgrpi1_name
;
423 iItem
= ListView_InsertItem(hwndLV
, &lvi
);
425 ListView_SetItemText(hwndLV
, iItem
, 1,
426 pBuffer
[i
].lgrpi1_comment
);
429 NetApiBufferFree(pBuffer
);
431 /* No more data left */
432 if (netStatus
!= ERROR_MORE_DATA
)
439 AddSelectedGroupsToUser(HWND hwndDlg
,
440 PMEMBERSHIP_USER_DATA pUserData
)
444 TCHAR szGroupName
[UNLEN
];
445 BOOL bResult
= FALSE
;
448 LOCALGROUP_MEMBERS_INFO_3 memberInfo
;
449 NET_API_STATUS status
;
451 hwndLV
= GetDlgItem(hwndDlg
, IDC_USER_ADD_MEMBERSHIP_LIST
);
453 if (ListView_GetSelectedCount(hwndLV
) > 0)
455 nItem
= ListView_GetNextItem(hwndLV
, -1, LVNI_SELECTED
);
458 /* Get the new user name */
459 ListView_GetItemText(hwndLV
,
465 for (i
= 0; i
< pUserData
->dwGroupCount
; i
++)
467 if (_tcscmp(pUserData
->pGroupData
[i
].lgrui0_name
, szGroupName
) == 0)
473 memberInfo
.lgrmi3_domainandname
= pUserData
->szUserName
;
475 status
= NetLocalGroupAddMembers(NULL
, szGroupName
, 3,
476 (LPBYTE
)&memberInfo
, 1);
477 if (status
== NERR_Success
)
479 DebugPrintf(_TEXT("Selected group: %s"), szGroupName
);
485 wsprintf(szText
, TEXT("Error: %u"), status
);
486 MessageBox(NULL
, szText
, TEXT("NetLocalGroupAddMembers"), MB_ICONERROR
| MB_OK
);
490 nItem
= ListView_GetNextItem(hwndLV
, nItem
, LVNI_SELECTED
);
499 AddGroupToUserDlgProc(HWND hwndDlg
,
504 PMEMBERSHIP_USER_DATA pUserData
;
506 UNREFERENCED_PARAMETER(wParam
);
508 pUserData
= (PMEMBERSHIP_USER_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
513 pUserData
= (PMEMBERSHIP_USER_DATA
)lParam
;
514 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (INT_PTR
)pUserData
);
515 InitUserGroupsList(hwndDlg
);
519 switch (LOWORD(wParam
))
522 if (AddSelectedGroupsToUser(hwndDlg
, pUserData
))
523 EndDialog(hwndDlg
, IDOK
);
525 EndDialog(hwndDlg
, IDCANCEL
);
529 EndDialog(hwndDlg
, IDCANCEL
);
543 AddGroupToUser(HWND hwndDlg
,
544 PMEMBERSHIP_USER_DATA pUserData
)
547 NET_API_STATUS status
;
552 if (DialogBoxParam(hApplet
,
553 MAKEINTRESOURCE(IDD_USER_ADD_MEMBERSHIP
),
555 AddGroupToUserDlgProc
,
556 (LPARAM
)pUserData
) == IDOK
)
558 // TODO: Update Membership list!
559 hwndLV
= GetDlgItem(hwndDlg
, IDC_USER_MEMBERSHIP_LIST
);
561 if (pUserData
->pGroupData
)
562 NetApiBufferFree(pUserData
->pGroupData
);
564 (void)ListView_DeleteAllItems(hwndLV
);
566 status
= NetUserGetLocalGroups(NULL
, pUserData
->szUserName
, 0, 0,
567 (LPBYTE
*)&pUserData
->pGroupData
,
568 MAX_PREFERRED_LENGTH
,
569 &pUserData
->dwGroupCount
,
571 if (status
!= NERR_Success
)
574 for (i
= 0; i
< pUserData
->dwGroupCount
; i
++)
576 ZeroMemory(&lvi
, sizeof(lvi
));
577 lvi
.mask
= LVIF_TEXT
| LVIF_STATE
| LVIF_IMAGE
;
578 lvi
.pszText
= pUserData
->pGroupData
[i
].lgrui0_name
;
582 (void)ListView_InsertItem(hwndLV
, &lvi
);
589 OnNotify(HWND hwndDlg
,
590 PMEMBERSHIP_USER_DATA pUserData
,
593 LPNMLISTVIEW lpnmlv
= (LPNMLISTVIEW
)lParam
;
595 switch (((LPNMHDR
)lParam
)->idFrom
)
597 case IDC_USER_MEMBERSHIP_LIST
:
598 switch (((LPNMHDR
)lParam
)->code
)
601 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_MEMBERSHIP_REMOVE
), (lpnmlv
->iItem
!= -1));
605 if (((LPNMLVKEYDOWN
)lParam
)->wVKey
== VK_DELETE
)
607 RemoveGroupFromUser(hwndDlg
, pUserData
);
620 UserMembershipPageProc(HWND hwndDlg
,
625 PMEMBERSHIP_USER_DATA pUserData
;
627 UNREFERENCED_PARAMETER(lParam
);
628 UNREFERENCED_PARAMETER(wParam
);
629 UNREFERENCED_PARAMETER(hwndDlg
);
631 pUserData
= (PMEMBERSHIP_USER_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
636 pUserData
= (PMEMBERSHIP_USER_DATA
)HeapAlloc(GetProcessHeap(),
638 sizeof(MEMBERSHIP_USER_DATA
) +
639 lstrlen((LPTSTR
)((PROPSHEETPAGE
*)lParam
)->lParam
) * sizeof(TCHAR
));
640 lstrcpy(pUserData
->szUserName
, (LPTSTR
)((PROPSHEETPAGE
*)lParam
)->lParam
);
642 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (INT_PTR
)pUserData
);
644 GetUserMembershipData(hwndDlg
, pUserData
);
648 switch (LOWORD(wParam
))
650 case IDC_USER_MEMBERSHIP_ADD
:
651 AddGroupToUser(hwndDlg
, pUserData
);
654 case IDC_USER_MEMBERSHIP_REMOVE
:
655 RemoveGroupFromUser(hwndDlg
, pUserData
);
661 if (((LPPSHNOTIFY
)lParam
)->hdr
.code
== PSN_APPLY
)
667 return OnNotify(hwndDlg
, pUserData
, lParam
);
673 if (pUserData
->pGroupData
)
674 NetApiBufferFree(pUserData
->pGroupData
);
676 HeapFree(GetProcessHeap(), 0, pUserData
);
685 UpdateUserOptions(HWND hwndDlg
,
686 PGENERAL_USER_DATA pUserData
,
689 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_GENERAL_CANNOT_CHANGE
),
690 !pUserData
->dwPasswordExpired
);
691 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_GENERAL_NEVER_EXPIRES
),
692 !pUserData
->dwPasswordExpired
);
693 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_GENERAL_FORCE_CHANGE
),
694 (pUserData
->dwFlags
& (UF_PASSWD_CANT_CHANGE
| UF_DONT_EXPIRE_PASSWD
)) == 0);
696 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_GENERAL_LOCKED
),
697 (pUserData
->dwFlags
& UF_LOCKOUT
) != 0);
701 CheckDlgButton(hwndDlg
, IDC_USER_GENERAL_FORCE_CHANGE
,
702 pUserData
->dwPasswordExpired
? BST_CHECKED
: BST_UNCHECKED
);
704 CheckDlgButton(hwndDlg
, IDC_USER_GENERAL_CANNOT_CHANGE
,
705 (pUserData
->dwFlags
& UF_PASSWD_CANT_CHANGE
) ? BST_CHECKED
: BST_UNCHECKED
);
707 CheckDlgButton(hwndDlg
, IDC_USER_GENERAL_NEVER_EXPIRES
,
708 (pUserData
->dwFlags
& UF_DONT_EXPIRE_PASSWD
) ? BST_CHECKED
: BST_UNCHECKED
);
710 CheckDlgButton(hwndDlg
, IDC_USER_GENERAL_DISABLED
,
711 (pUserData
->dwFlags
& UF_ACCOUNTDISABLE
) ? BST_CHECKED
: BST_UNCHECKED
);
713 CheckDlgButton(hwndDlg
, IDC_USER_GENERAL_LOCKED
,
714 (pUserData
->dwFlags
& UF_LOCKOUT
) ? BST_CHECKED
: BST_UNCHECKED
);
720 GetUserGeneralData(HWND hwndDlg
,
721 PGENERAL_USER_DATA pUserData
)
723 PUSER_INFO_3 pUserInfo
= NULL
;
725 SetDlgItemText(hwndDlg
, IDC_USER_GENERAL_NAME
, pUserData
->szUserName
);
727 NetUserGetInfo(NULL
, pUserData
->szUserName
, 3, (LPBYTE
*)&pUserInfo
);
729 SetDlgItemText(hwndDlg
, IDC_USER_GENERAL_FULL_NAME
, pUserInfo
->usri3_full_name
);
730 SetDlgItemText(hwndDlg
, IDC_USER_GENERAL_DESCRIPTION
, pUserInfo
->usri3_comment
);
732 pUserData
->dwFlags
= pUserInfo
->usri3_flags
;
733 pUserData
->dwPasswordExpired
= pUserInfo
->usri3_password_expired
;
735 NetApiBufferFree(pUserInfo
);
737 UpdateUserOptions(hwndDlg
, pUserData
, TRUE
);
742 SetUserGeneralData(HWND hwndDlg
,
743 PGENERAL_USER_DATA pUserData
)
745 PUSER_INFO_3 pUserInfo
= NULL
;
746 LPTSTR pszFullName
= NULL
;
747 LPTSTR pszComment
= NULL
;
748 NET_API_STATUS status
;
752 NetUserGetInfo(NULL
, pUserData
->szUserName
, 3, (LPBYTE
*)&pUserInfo
);
754 pUserInfo
->usri3_flags
=
755 (pUserData
->dwFlags
& VALID_GENERAL_FLAGS
) |
756 (pUserInfo
->usri3_flags
& ~VALID_GENERAL_FLAGS
);
758 pUserInfo
->usri3_password_expired
= pUserData
->dwPasswordExpired
;
760 nLength
= GetWindowTextLength(GetDlgItem(hwndDlg
, IDC_USER_GENERAL_FULL_NAME
));
763 pUserInfo
->usri3_full_name
= NULL
;
767 pszFullName
= HeapAlloc(GetProcessHeap(), 0, (nLength
+ 1) * sizeof(TCHAR
));
768 GetDlgItemText(hwndDlg
, IDC_USER_GENERAL_FULL_NAME
, pszFullName
, nLength
+ 1);
769 pUserInfo
->usri3_full_name
= pszFullName
;
772 nLength
= GetWindowTextLength(GetDlgItem(hwndDlg
, IDC_USER_GENERAL_DESCRIPTION
));
775 pUserInfo
->usri3_full_name
= NULL
;
779 pszComment
= HeapAlloc(GetProcessHeap(), 0, (nLength
+ 1) * sizeof(TCHAR
));
780 GetDlgItemText(hwndDlg
, IDC_USER_GENERAL_DESCRIPTION
, pszComment
, nLength
+ 1);
781 pUserInfo
->usri3_comment
= pszComment
;
784 status
= NetUserSetInfo(NULL
, pUserData
->szUserName
, 3, (LPBYTE
)pUserInfo
, &dwIndex
);
785 if (status
!= NERR_Success
)
787 DebugPrintf(_T("Status: %lu Index: %lu"), status
, dwIndex
);
791 HeapFree(GetProcessHeap(), 0, pszFullName
);
794 HeapFree(GetProcessHeap(), 0, pszComment
);
796 NetApiBufferFree(pUserInfo
);
798 return (status
== NERR_Success
);
803 UserGeneralPageProc(HWND hwndDlg
,
808 PGENERAL_USER_DATA pUserData
;
810 UNREFERENCED_PARAMETER(lParam
);
811 UNREFERENCED_PARAMETER(wParam
);
812 UNREFERENCED_PARAMETER(hwndDlg
);
814 pUserData
= (PGENERAL_USER_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
819 pUserData
= (PGENERAL_USER_DATA
)HeapAlloc(GetProcessHeap(),
821 sizeof(GENERAL_USER_DATA
) +
822 lstrlen((LPTSTR
)((PROPSHEETPAGE
*)lParam
)->lParam
) * sizeof(TCHAR
));
823 lstrcpy(pUserData
->szUserName
, (LPTSTR
)((PROPSHEETPAGE
*)lParam
)->lParam
);
825 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (INT_PTR
)pUserData
);
827 GetUserGeneralData(hwndDlg
,
832 switch (LOWORD(wParam
))
834 case IDC_USER_GENERAL_FULL_NAME
:
835 case IDC_USER_GENERAL_DESCRIPTION
:
836 if (HIWORD(wParam
) == EN_CHANGE
)
837 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
840 case IDC_USER_GENERAL_FORCE_CHANGE
:
841 pUserData
->dwPasswordExpired
= !pUserData
->dwPasswordExpired
;
842 UpdateUserOptions(hwndDlg
, pUserData
, FALSE
);
843 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
846 case IDC_USER_GENERAL_CANNOT_CHANGE
:
847 pUserData
->dwFlags
^= UF_PASSWD_CANT_CHANGE
;
848 UpdateUserOptions(hwndDlg
, pUserData
, FALSE
);
849 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
852 case IDC_USER_GENERAL_NEVER_EXPIRES
:
853 pUserData
->dwFlags
^= UF_DONT_EXPIRE_PASSWD
;
854 UpdateUserOptions(hwndDlg
, pUserData
, FALSE
);
855 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
858 case IDC_USER_GENERAL_DISABLED
:
859 pUserData
->dwFlags
^= UF_ACCOUNTDISABLE
;
860 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
863 case IDC_USER_GENERAL_LOCKED
:
864 pUserData
->dwFlags
^= UF_LOCKOUT
;
865 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
871 if (((LPPSHNOTIFY
)lParam
)->hdr
.code
== PSN_APPLY
)
873 SetUserGeneralData(hwndDlg
, pUserData
);
879 HeapFree(GetProcessHeap(), 0, pUserData
);
888 InitPropSheetPage(PROPSHEETPAGE
*psp
, WORD idDlg
, DLGPROC DlgProc
, LPTSTR pszUser
)
890 ZeroMemory(psp
, sizeof(PROPSHEETPAGE
));
891 psp
->dwSize
= sizeof(PROPSHEETPAGE
);
892 psp
->dwFlags
= PSP_DEFAULT
;
893 psp
->hInstance
= hApplet
;
894 psp
->pszTemplate
= MAKEINTRESOURCE(idDlg
);
895 psp
->pfnDlgProc
= DlgProc
;
896 psp
->lParam
= (LPARAM
)pszUser
;
901 UserProperties(HWND hwndDlg
)
903 PROPSHEETPAGE psp
[3];
905 TCHAR szUserName
[UNLEN
];
909 hwndLV
= GetDlgItem(hwndDlg
, IDC_USERS_LIST
);
910 nItem
= ListView_GetNextItem(hwndLV
, -1, LVNI_SELECTED
);
914 /* Get the new user name */
915 ListView_GetItemText(hwndLV
,
920 ZeroMemory(&psh
, sizeof(PROPSHEETHEADER
));
921 psh
.dwSize
= sizeof(PROPSHEETHEADER
);
922 psh
.dwFlags
= PSH_PROPSHEETPAGE
| PSH_PROPTITLE
;
923 psh
.hwndParent
= hwndDlg
;
924 psh
.hInstance
= hApplet
;
926 psh
.pszCaption
= szUserName
;
927 psh
.nPages
= sizeof(psp
) / sizeof(PROPSHEETPAGE
);
931 InitPropSheetPage(&psp
[0], IDD_USER_GENERAL
, (DLGPROC
)UserGeneralPageProc
, szUserName
);
932 InitPropSheetPage(&psp
[1], IDD_USER_MEMBERSHIP
, (DLGPROC
)UserMembershipPageProc
, szUserName
);
933 InitPropSheetPage(&psp
[2], IDD_USER_PROFILE
, (DLGPROC
)UserProfilePageProc
, szUserName
);
935 return (PropertySheet(&psh
) == IDOK
);