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
;
101 NetUserGetInfo(NULL
, pUserData
->szUserName
, 3, (LPBYTE
*)&pUserInfo
);
103 /* Get the profile path */
104 nLength
= GetWindowTextLength(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_PATH
));
107 pUserInfo
->usri3_profile
= NULL
;
111 pszProfilePath
= HeapAlloc(GetProcessHeap(), 0, (nLength
+ 1) * sizeof(TCHAR
));
112 GetDlgItemText(hwndDlg
, IDC_USER_PROFILE_PATH
, pszProfilePath
, nLength
+ 1);
113 pUserInfo
->usri3_profile
= pszProfilePath
;
116 /* Get the script path */
117 nLength
= GetWindowTextLength(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_SCRIPT
));
120 pUserInfo
->usri3_script_path
= NULL
;
124 pszScriptPath
= HeapAlloc(GetProcessHeap(), 0, (nLength
+ 1) * sizeof(TCHAR
));
125 GetDlgItemText(hwndDlg
, IDC_USER_PROFILE_SCRIPT
, pszScriptPath
, nLength
+ 1);
126 pUserInfo
->usri3_script_path
= pszScriptPath
;
129 if (IsDlgButtonChecked(hwndDlg
, IDC_USER_PROFILE_LOCAL
) == BST_CHECKED
)
131 /* Local home directory */
132 nLength
= GetWindowTextLength(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_LOCAL_PATH
));
135 pUserInfo
->usri3_home_dir
= NULL
;
139 pszHomeDir
= HeapAlloc(GetProcessHeap(), 0, (nLength
+ 1) * sizeof(TCHAR
));
140 GetDlgItemText(hwndDlg
, IDC_USER_PROFILE_LOCAL_PATH
, pszHomeDir
, nLength
+ 1);
141 pUserInfo
->usri3_home_dir
= pszHomeDir
;
146 /* Remote home directory */
147 nLength
= GetWindowTextLength(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_REMOTE_PATH
));
150 pUserInfo
->usri3_home_dir
= NULL
;
154 pszHomeDir
= HeapAlloc(GetProcessHeap(), 0, (nLength
+ 1) * sizeof(TCHAR
));
155 GetDlgItemText(hwndDlg
, IDC_USER_PROFILE_REMOTE_PATH
, pszHomeDir
, nLength
+ 1);
156 pUserInfo
->usri3_home_dir
= pszHomeDir
;
159 nIndex
= SendMessage(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_DRIVE
), CB_GETCURSEL
, 0, 0);
160 if (nIndex
!= CB_ERR
)
162 nLength
= SendMessage(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_DRIVE
), CB_GETLBTEXTLEN
, nIndex
, 0);
163 pszHomeDrive
= HeapAlloc(GetProcessHeap(), 0, (nLength
+ 1) * sizeof(TCHAR
));
164 SendMessage(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_DRIVE
), CB_GETLBTEXT
, nIndex
, (LPARAM
)pszHomeDrive
);
165 pUserInfo
->usri3_home_dir_drive
= pszHomeDrive
;
170 status
= NetUserSetInfo(NULL
, pUserData
->szUserName
, 3, (LPBYTE
)pUserInfo
, &dwIndex
);
171 if (status
!= NERR_Success
)
173 DebugPrintf(_T("Status: %lu Index: %lu"), status
, dwIndex
);
176 status
= NERR_Success
;
180 HeapFree(GetProcessHeap(), 0, pszProfilePath
);
183 HeapFree(GetProcessHeap(), 0, pszScriptPath
);
186 HeapFree(GetProcessHeap(), 0, pszHomeDir
);
189 HeapFree(GetProcessHeap(), 0, pszHomeDrive
);
191 NetApiBufferFree(pUserInfo
);
193 return (status
== NERR_Success
);
198 UserProfilePageProc(HWND hwndDlg
,
203 PPROFILE_USER_DATA pUserData
;
205 UNREFERENCED_PARAMETER(lParam
);
206 UNREFERENCED_PARAMETER(wParam
);
207 UNREFERENCED_PARAMETER(hwndDlg
);
209 pUserData
= (PPROFILE_USER_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
214 pUserData
= (PPROFILE_USER_DATA
)HeapAlloc(GetProcessHeap(),
216 sizeof(PROFILE_USER_DATA
) +
217 lstrlen((LPTSTR
)((PROPSHEETPAGE
*)lParam
)->lParam
) * sizeof(TCHAR
));
218 lstrcpy(pUserData
->szUserName
, (LPTSTR
)((PROPSHEETPAGE
*)lParam
)->lParam
);
220 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (INT_PTR
)pUserData
);
222 GetUserProfileData(hwndDlg
,
227 switch (LOWORD(wParam
))
229 case IDC_USER_PROFILE_PATH
:
230 case IDC_USER_PROFILE_SCRIPT
:
231 if (HIWORD(wParam
) == EN_CHANGE
)
232 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
235 case IDC_USER_PROFILE_LOCAL
:
236 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_LOCAL_PATH
), TRUE
);
237 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_DRIVE
), FALSE
);
238 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_REMOTE_PATH
), FALSE
);
241 case IDC_USER_PROFILE_REMOTE
:
242 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_LOCAL_PATH
), FALSE
);
243 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_DRIVE
), TRUE
);
244 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_REMOTE_PATH
), TRUE
);
250 HeapFree(GetProcessHeap(), 0, pUserData
);
254 if (((LPPSHNOTIFY
)lParam
)->hdr
.code
== PSN_APPLY
)
256 SetUserProfileData(hwndDlg
, pUserData
);
267 GetUserMembershipData(HWND hwndDlg
, PMEMBERSHIP_USER_DATA pUserData
)
269 NET_API_STATUS status
;
280 hwndLV
= GetDlgItem(hwndDlg
, IDC_USER_MEMBERSHIP_LIST
);
282 /* Create the image list */
283 hImgList
= ImageList_Create(16, 16, ILC_COLOR8
| ILC_MASK
, 5, 5);
284 hIcon
= LoadImage(hApplet
, MAKEINTRESOURCE(IDI_GROUP
), IMAGE_ICON
, 16, 16, LR_DEFAULTCOLOR
);
285 ImageList_AddIcon(hImgList
, hIcon
);
287 (void)ListView_SetImageList(hwndLV
, hImgList
, LVSIL_SMALL
);
289 /* Set the list column */
290 GetClientRect(hwndLV
, &rect
);
292 memset(&column
, 0x00, sizeof(column
));
293 column
.mask
= LVCF_FMT
| LVCF_WIDTH
| LVCF_SUBITEM
;
294 column
.fmt
= LVCFMT_LEFT
;
295 column
.cx
= (INT
)(rect
.right
- rect
.left
);
297 (void)ListView_InsertColumn(hwndLV
, 0, &column
);
300 status
= NetUserGetLocalGroups(NULL
, pUserData
->szUserName
, 0, 0,
301 (LPBYTE
*)&pUserData
->pGroupData
,
302 MAX_PREFERRED_LENGTH
,
303 &pUserData
->dwGroupCount
,
305 if (status
!= NERR_Success
)
308 for (i
= 0; i
< pUserData
->dwGroupCount
; i
++)
310 ZeroMemory(&lvi
, sizeof(lvi
));
311 lvi
.mask
= LVIF_TEXT
| LVIF_STATE
| LVIF_IMAGE
;
312 lvi
.pszText
= pUserData
->pGroupData
[i
].lgrui0_name
;
316 (void)ListView_InsertItem(hwndLV
, &lvi
);
322 RemoveGroupFromUser(HWND hwndDlg
,
323 PMEMBERSHIP_USER_DATA pUserData
)
325 TCHAR szGroupName
[UNLEN
];
327 LOCALGROUP_MEMBERS_INFO_3 memberInfo
;
330 NET_API_STATUS status
;
332 hwndLV
= GetDlgItem(hwndDlg
, IDC_USER_MEMBERSHIP_LIST
);
333 nItem
= ListView_GetNextItem(hwndLV
, -1, LVNI_SELECTED
);
337 /* Get the new user name */
338 ListView_GetItemText(hwndLV
,
343 /* Display a warning message because the remove operation cannot be reverted */
344 wsprintf(szText
, TEXT("Do you really want to remove the user \"%s\" from the group \"%s\"?"),
345 pUserData
->szUserName
, szGroupName
);
346 if (MessageBox(NULL
, szText
, TEXT("User Accounts"), MB_ICONWARNING
| MB_YESNO
) == IDNO
)
349 memberInfo
.lgrmi3_domainandname
= pUserData
->szUserName
;
351 status
= NetLocalGroupDelMembers(NULL
, szGroupName
,
352 3, (LPBYTE
)&memberInfo
, 1);
353 if (status
!= NERR_Success
)
356 wsprintf(szText
, TEXT("Error: %u"), status
);
357 MessageBox(NULL
, szText
, TEXT("NetLocalGroupDelMembers"), MB_ICONERROR
| MB_OK
);
361 (void)ListView_DeleteItem(hwndLV
, nItem
);
363 if (ListView_GetItemCount(hwndLV
) == 0)
364 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_MEMBERSHIP_REMOVE
), FALSE
);
369 InitUserGroupsList(HWND hwndDlg
)
376 NET_API_STATUS netStatus
;
377 PLOCALGROUP_INFO_1 pBuffer
;
380 DWORD_PTR resume_handle
= 0;
388 hwndLV
= GetDlgItem(hwndDlg
, IDC_USER_ADD_MEMBERSHIP_LIST
);
389 GetClientRect(hwndLV
, &rect
);
391 hImgList
= ImageList_Create(16,16,ILC_COLOR8
| ILC_MASK
,5,5);
392 hIcon
= LoadImage(hApplet
,MAKEINTRESOURCE(IDI_GROUP
),IMAGE_ICON
,16,16,LR_DEFAULTCOLOR
);
393 ImageList_AddIcon(hImgList
,hIcon
);
396 (void)ListView_SetImageList(hwndLV
, hImgList
, LVSIL_SMALL
);
397 (void)ListView_SetExtendedListViewStyle(hwndLV
, LVS_EX_FULLROWSELECT
);
399 memset(&column
, 0x00, sizeof(column
));
400 column
.mask
= LVCF_FMT
| LVCF_WIDTH
| LVCF_SUBITEM
| LVCF_TEXT
;
401 column
.fmt
= LVCFMT_LEFT
;
402 column
.cx
= (INT
)((rect
.right
- rect
.left
) * 0.40);
404 LoadString(hApplet
, IDS_NAME
, szStr
, sizeof(szStr
) / sizeof(szStr
[0]));
405 column
.pszText
= szStr
;
406 (void)ListView_InsertColumn(hwndLV
, 0, &column
);
408 column
.cx
= (INT
)((rect
.right
- rect
.left
) * 0.60);
410 LoadString(hApplet
, IDS_DESCRIPTION
, szStr
, sizeof(szStr
) / sizeof(szStr
[0]));
411 column
.pszText
= szStr
;
412 (void)ListView_InsertColumn(hwndLV
, 1, &column
);
416 netStatus
= NetLocalGroupEnum(NULL
, 1, (LPBYTE
*)&pBuffer
,
418 &totalentries
, &resume_handle
);
419 if (netStatus
!= NERR_Success
&& netStatus
!= ERROR_MORE_DATA
)
422 for (i
= 0; i
< entriesread
; i
++)
424 memset(&lvi
, 0x00, sizeof(lvi
));
425 lvi
.mask
= LVIF_TEXT
| LVIF_STATE
| LVIF_IMAGE
;
426 lvi
.pszText
= pBuffer
[i
].lgrpi1_name
;
429 iItem
= ListView_InsertItem(hwndLV
, &lvi
);
431 ListView_SetItemText(hwndLV
, iItem
, 1,
432 pBuffer
[i
].lgrpi1_comment
);
435 NetApiBufferFree(pBuffer
);
437 /* No more data left */
438 if (netStatus
!= ERROR_MORE_DATA
)
445 AddSelectedGroupsToUser(HWND hwndDlg
,
446 PMEMBERSHIP_USER_DATA pUserData
)
450 TCHAR szGroupName
[UNLEN
];
451 BOOL bResult
= FALSE
;
454 LOCALGROUP_MEMBERS_INFO_3 memberInfo
;
455 NET_API_STATUS status
;
457 hwndLV
= GetDlgItem(hwndDlg
, IDC_USER_ADD_MEMBERSHIP_LIST
);
459 if (ListView_GetSelectedCount(hwndLV
) > 0)
461 nItem
= ListView_GetNextItem(hwndLV
, -1, LVNI_SELECTED
);
464 /* Get the new user name */
465 ListView_GetItemText(hwndLV
,
471 for (i
= 0; i
< pUserData
->dwGroupCount
; i
++)
473 if (_tcscmp(pUserData
->pGroupData
[i
].lgrui0_name
, szGroupName
) == 0)
479 memberInfo
.lgrmi3_domainandname
= pUserData
->szUserName
;
481 status
= NetLocalGroupAddMembers(NULL
, szGroupName
, 3,
482 (LPBYTE
)&memberInfo
, 1);
483 if (status
== NERR_Success
)
485 DebugPrintf(_TEXT("Selected group: %s"), szGroupName
);
491 wsprintf(szText
, TEXT("Error: %u"), status
);
492 MessageBox(NULL
, szText
, TEXT("NetLocalGroupAddMembers"), MB_ICONERROR
| MB_OK
);
496 nItem
= ListView_GetNextItem(hwndLV
, nItem
, LVNI_SELECTED
);
505 AddGroupToUserDlgProc(HWND hwndDlg
,
510 PMEMBERSHIP_USER_DATA pUserData
;
512 UNREFERENCED_PARAMETER(wParam
);
514 pUserData
= (PMEMBERSHIP_USER_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
519 pUserData
= (PMEMBERSHIP_USER_DATA
)lParam
;
520 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (INT_PTR
)pUserData
);
521 InitUserGroupsList(hwndDlg
);
525 switch (LOWORD(wParam
))
528 if (AddSelectedGroupsToUser(hwndDlg
, pUserData
))
529 EndDialog(hwndDlg
, IDOK
);
531 EndDialog(hwndDlg
, IDCANCEL
);
535 EndDialog(hwndDlg
, IDCANCEL
);
549 AddGroupToUser(HWND hwndDlg
,
550 PMEMBERSHIP_USER_DATA pUserData
)
553 NET_API_STATUS status
;
558 if (DialogBoxParam(hApplet
,
559 MAKEINTRESOURCE(IDD_USER_ADD_MEMBERSHIP
),
561 AddGroupToUserDlgProc
,
562 (LPARAM
)pUserData
) == IDOK
)
564 // TODO: Update Membership list!
565 hwndLV
= GetDlgItem(hwndDlg
, IDC_USER_MEMBERSHIP_LIST
);
567 if (pUserData
->pGroupData
)
568 NetApiBufferFree(pUserData
->pGroupData
);
570 (void)ListView_DeleteAllItems(hwndLV
);
572 status
= NetUserGetLocalGroups(NULL
, pUserData
->szUserName
, 0, 0,
573 (LPBYTE
*)&pUserData
->pGroupData
,
574 MAX_PREFERRED_LENGTH
,
575 &pUserData
->dwGroupCount
,
577 if (status
!= NERR_Success
)
580 for (i
= 0; i
< pUserData
->dwGroupCount
; i
++)
582 ZeroMemory(&lvi
, sizeof(lvi
));
583 lvi
.mask
= LVIF_TEXT
| LVIF_STATE
| LVIF_IMAGE
;
584 lvi
.pszText
= pUserData
->pGroupData
[i
].lgrui0_name
;
588 (void)ListView_InsertItem(hwndLV
, &lvi
);
595 OnNotify(HWND hwndDlg
,
596 PMEMBERSHIP_USER_DATA pUserData
,
599 LPNMLISTVIEW lpnmlv
= (LPNMLISTVIEW
)lParam
;
601 switch (((LPNMHDR
)lParam
)->idFrom
)
603 case IDC_USER_MEMBERSHIP_LIST
:
604 switch (((LPNMHDR
)lParam
)->code
)
607 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_MEMBERSHIP_REMOVE
), (lpnmlv
->iItem
!= -1));
611 if (((LPNMLVKEYDOWN
)lParam
)->wVKey
== VK_DELETE
)
613 RemoveGroupFromUser(hwndDlg
, pUserData
);
626 UserMembershipPageProc(HWND hwndDlg
,
631 PMEMBERSHIP_USER_DATA pUserData
;
633 UNREFERENCED_PARAMETER(lParam
);
634 UNREFERENCED_PARAMETER(wParam
);
635 UNREFERENCED_PARAMETER(hwndDlg
);
637 pUserData
= (PMEMBERSHIP_USER_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
642 pUserData
= (PMEMBERSHIP_USER_DATA
)HeapAlloc(GetProcessHeap(),
644 sizeof(MEMBERSHIP_USER_DATA
) +
645 lstrlen((LPTSTR
)((PROPSHEETPAGE
*)lParam
)->lParam
) * sizeof(TCHAR
));
646 lstrcpy(pUserData
->szUserName
, (LPTSTR
)((PROPSHEETPAGE
*)lParam
)->lParam
);
648 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (INT_PTR
)pUserData
);
650 GetUserMembershipData(hwndDlg
, pUserData
);
654 switch (LOWORD(wParam
))
656 case IDC_USER_MEMBERSHIP_ADD
:
657 AddGroupToUser(hwndDlg
, pUserData
);
660 case IDC_USER_MEMBERSHIP_REMOVE
:
661 RemoveGroupFromUser(hwndDlg
, pUserData
);
667 if (((LPPSHNOTIFY
)lParam
)->hdr
.code
== PSN_APPLY
)
673 return OnNotify(hwndDlg
, pUserData
, lParam
);
679 if (pUserData
->pGroupData
)
680 NetApiBufferFree(pUserData
->pGroupData
);
682 HeapFree(GetProcessHeap(), 0, pUserData
);
691 UpdateUserOptions(HWND hwndDlg
,
692 PGENERAL_USER_DATA pUserData
,
695 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_GENERAL_CANNOT_CHANGE
),
696 !pUserData
->dwPasswordExpired
);
697 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_GENERAL_NEVER_EXPIRES
),
698 !pUserData
->dwPasswordExpired
);
699 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_GENERAL_FORCE_CHANGE
),
700 (pUserData
->dwFlags
& (UF_PASSWD_CANT_CHANGE
| UF_DONT_EXPIRE_PASSWD
)) == 0);
702 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_GENERAL_LOCKED
),
703 (pUserData
->dwFlags
& UF_LOCKOUT
) != 0);
707 CheckDlgButton(hwndDlg
, IDC_USER_GENERAL_FORCE_CHANGE
,
708 pUserData
->dwPasswordExpired
? BST_CHECKED
: BST_UNCHECKED
);
710 CheckDlgButton(hwndDlg
, IDC_USER_GENERAL_CANNOT_CHANGE
,
711 (pUserData
->dwFlags
& UF_PASSWD_CANT_CHANGE
) ? BST_CHECKED
: BST_UNCHECKED
);
713 CheckDlgButton(hwndDlg
, IDC_USER_GENERAL_NEVER_EXPIRES
,
714 (pUserData
->dwFlags
& UF_DONT_EXPIRE_PASSWD
) ? BST_CHECKED
: BST_UNCHECKED
);
716 CheckDlgButton(hwndDlg
, IDC_USER_GENERAL_DISABLED
,
717 (pUserData
->dwFlags
& UF_ACCOUNTDISABLE
) ? BST_CHECKED
: BST_UNCHECKED
);
719 CheckDlgButton(hwndDlg
, IDC_USER_GENERAL_LOCKED
,
720 (pUserData
->dwFlags
& UF_LOCKOUT
) ? BST_CHECKED
: BST_UNCHECKED
);
726 GetUserGeneralData(HWND hwndDlg
,
727 PGENERAL_USER_DATA pUserData
)
729 PUSER_INFO_3 pUserInfo
= NULL
;
731 SetDlgItemText(hwndDlg
, IDC_USER_GENERAL_NAME
, pUserData
->szUserName
);
733 NetUserGetInfo(NULL
, pUserData
->szUserName
, 3, (LPBYTE
*)&pUserInfo
);
735 SetDlgItemText(hwndDlg
, IDC_USER_GENERAL_FULL_NAME
, pUserInfo
->usri3_full_name
);
736 SetDlgItemText(hwndDlg
, IDC_USER_GENERAL_DESCRIPTION
, pUserInfo
->usri3_comment
);
738 pUserData
->dwFlags
= pUserInfo
->usri3_flags
;
739 pUserData
->dwPasswordExpired
= pUserInfo
->usri3_password_expired
;
741 NetApiBufferFree(pUserInfo
);
743 UpdateUserOptions(hwndDlg
, pUserData
, TRUE
);
748 SetUserGeneralData(HWND hwndDlg
,
749 PGENERAL_USER_DATA pUserData
)
751 PUSER_INFO_3 pUserInfo
= NULL
;
752 LPTSTR pszFullName
= NULL
;
753 LPTSTR pszComment
= NULL
;
754 NET_API_STATUS status
;
760 NetUserGetInfo(NULL
, pUserData
->szUserName
, 3, (LPBYTE
*)&pUserInfo
);
762 pUserInfo
->usri3_flags
=
763 (pUserData
->dwFlags
& VALID_GENERAL_FLAGS
) |
764 (pUserInfo
->usri3_flags
& ~VALID_GENERAL_FLAGS
);
766 pUserInfo
->usri3_password_expired
= pUserData
->dwPasswordExpired
;
768 nLength
= GetWindowTextLength(GetDlgItem(hwndDlg
, IDC_USER_GENERAL_FULL_NAME
));
771 pUserInfo
->usri3_full_name
= NULL
;
775 pszFullName
= HeapAlloc(GetProcessHeap(), 0, (nLength
+ 1) * sizeof(TCHAR
));
776 GetDlgItemText(hwndDlg
, IDC_USER_GENERAL_FULL_NAME
, pszFullName
, nLength
+ 1);
777 pUserInfo
->usri3_full_name
= pszFullName
;
780 nLength
= GetWindowTextLength(GetDlgItem(hwndDlg
, IDC_USER_GENERAL_DESCRIPTION
));
783 pUserInfo
->usri3_full_name
= NULL
;
787 pszComment
= HeapAlloc(GetProcessHeap(), 0, (nLength
+ 1) * sizeof(TCHAR
));
788 GetDlgItemText(hwndDlg
, IDC_USER_GENERAL_DESCRIPTION
, pszComment
, nLength
+ 1);
789 pUserInfo
->usri3_comment
= pszComment
;
793 status
= NetUserSetInfo(NULL
, pUserData
->szUserName
, 3, (LPBYTE
)pUserInfo
, &dwIndex
);
794 if (status
!= NERR_Success
)
796 DebugPrintf(_T("Status: %lu Index: %lu"), status
, dwIndex
);
799 status
= NERR_Success
;
803 HeapFree(GetProcessHeap(), 0, pszFullName
);
806 HeapFree(GetProcessHeap(), 0, pszComment
);
808 NetApiBufferFree(pUserInfo
);
810 return (status
== NERR_Success
);
815 UserGeneralPageProc(HWND hwndDlg
,
820 PGENERAL_USER_DATA pUserData
;
822 UNREFERENCED_PARAMETER(lParam
);
823 UNREFERENCED_PARAMETER(wParam
);
824 UNREFERENCED_PARAMETER(hwndDlg
);
826 pUserData
= (PGENERAL_USER_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
831 pUserData
= (PGENERAL_USER_DATA
)HeapAlloc(GetProcessHeap(),
833 sizeof(GENERAL_USER_DATA
) +
834 lstrlen((LPTSTR
)((PROPSHEETPAGE
*)lParam
)->lParam
) * sizeof(TCHAR
));
835 lstrcpy(pUserData
->szUserName
, (LPTSTR
)((PROPSHEETPAGE
*)lParam
)->lParam
);
837 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (INT_PTR
)pUserData
);
839 GetUserGeneralData(hwndDlg
,
844 switch (LOWORD(wParam
))
846 case IDC_USER_GENERAL_FULL_NAME
:
847 case IDC_USER_GENERAL_DESCRIPTION
:
848 if (HIWORD(wParam
) == EN_CHANGE
)
849 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
852 case IDC_USER_GENERAL_FORCE_CHANGE
:
853 pUserData
->dwPasswordExpired
= !pUserData
->dwPasswordExpired
;
854 UpdateUserOptions(hwndDlg
, pUserData
, FALSE
);
855 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
858 case IDC_USER_GENERAL_CANNOT_CHANGE
:
859 pUserData
->dwFlags
^= UF_PASSWD_CANT_CHANGE
;
860 UpdateUserOptions(hwndDlg
, pUserData
, FALSE
);
861 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
864 case IDC_USER_GENERAL_NEVER_EXPIRES
:
865 pUserData
->dwFlags
^= UF_DONT_EXPIRE_PASSWD
;
866 UpdateUserOptions(hwndDlg
, pUserData
, FALSE
);
867 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
870 case IDC_USER_GENERAL_DISABLED
:
871 pUserData
->dwFlags
^= UF_ACCOUNTDISABLE
;
872 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
875 case IDC_USER_GENERAL_LOCKED
:
876 pUserData
->dwFlags
^= UF_LOCKOUT
;
877 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
883 if (((LPPSHNOTIFY
)lParam
)->hdr
.code
== PSN_APPLY
)
885 SetUserGeneralData(hwndDlg
, pUserData
);
891 HeapFree(GetProcessHeap(), 0, pUserData
);
900 InitPropSheetPage(PROPSHEETPAGE
*psp
, WORD idDlg
, DLGPROC DlgProc
, LPTSTR pszUser
)
902 ZeroMemory(psp
, sizeof(PROPSHEETPAGE
));
903 psp
->dwSize
= sizeof(PROPSHEETPAGE
);
904 psp
->dwFlags
= PSP_DEFAULT
;
905 psp
->hInstance
= hApplet
;
906 psp
->pszTemplate
= MAKEINTRESOURCE(idDlg
);
907 psp
->pfnDlgProc
= DlgProc
;
908 psp
->lParam
= (LPARAM
)pszUser
;
913 UserProperties(HWND hwndDlg
)
915 PROPSHEETPAGE psp
[3];
917 TCHAR szUserName
[UNLEN
];
921 hwndLV
= GetDlgItem(hwndDlg
, IDC_USERS_LIST
);
922 nItem
= ListView_GetNextItem(hwndLV
, -1, LVNI_SELECTED
);
926 /* Get the new user name */
927 ListView_GetItemText(hwndLV
,
932 ZeroMemory(&psh
, sizeof(PROPSHEETHEADER
));
933 psh
.dwSize
= sizeof(PROPSHEETHEADER
);
934 psh
.dwFlags
= PSH_PROPSHEETPAGE
| PSH_PROPTITLE
;
935 psh
.hwndParent
= hwndDlg
;
936 psh
.hInstance
= hApplet
;
938 psh
.pszCaption
= szUserName
;
939 psh
.nPages
= sizeof(psp
) / sizeof(PROPSHEETPAGE
);
943 InitPropSheetPage(&psp
[0], IDD_USER_GENERAL
, (DLGPROC
)UserGeneralPageProc
, szUserName
);
944 InitPropSheetPage(&psp
[1], IDD_USER_MEMBERSHIP
, (DLGPROC
)UserMembershipPageProc
, szUserName
);
945 InitPropSheetPage(&psp
[2], IDD_USER_PROFILE
, (DLGPROC
)UserProfilePageProc
, szUserName
);
947 return (PropertySheet(&psh
) == IDOK
);