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)
24 GetProfileData(HWND hwndDlg
, LPTSTR lpUserName
)
26 PUSER_INFO_3 userInfo
= NULL
;
27 NET_API_STATUS status
;
33 status
= NetUserGetInfo(NULL
, lpUserName
, 3, (LPBYTE
*)&userInfo
);
34 if (status
!= NERR_Success
)
37 SetDlgItemText(hwndDlg
, IDC_USER_PROFILE_PATH
, userInfo
->usri3_profile
);
38 SetDlgItemText(hwndDlg
, IDC_USER_PROFILE_SCRIPT
, userInfo
->usri3_script_path
);
41 bLocal
= (userInfo
->usri3_home_dir_drive
== NULL
) ||
42 (_tcslen(userInfo
->usri3_home_dir_drive
) == 0);
43 CheckRadioButton(hwndDlg
, IDC_USER_PROFILE_LOCAL
, IDC_USER_PROFILE_REMOTE
,
44 bLocal
? IDC_USER_PROFILE_LOCAL
: IDC_USER_PROFILE_REMOTE
);
46 for (i
= 0; i
< 26; i
++)
48 wsprintf(szDrive
, _T("%c:"), (TCHAR
)('A' + i
));
49 nSel
= SendMessage(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_DRIVE
),
50 CB_INSERTSTRING
, -1, (LPARAM
)szDrive
);
55 SetDlgItemText(hwndDlg
, IDC_USER_PROFILE_LOCAL_PATH
, userInfo
->usri3_home_dir
);
56 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_DRIVE
), FALSE
);
57 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_REMOTE_PATH
), FALSE
);
61 SetDlgItemText(hwndDlg
, IDC_USER_PROFILE_REMOTE_PATH
, userInfo
->usri3_home_dir
);
62 nSel
= SendMessage(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_DRIVE
),
63 CB_FINDSTRINGEXACT
, -1, (LPARAM
)userInfo
->usri3_home_dir_drive
);
66 SendMessage(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_DRIVE
),
67 CB_SETCURSEL
, nSel
, 0);
69 NetApiBufferFree(userInfo
);
74 UserProfilePageProc(HWND hwndDlg
,
80 UNREFERENCED_PARAMETER(lParam
);
81 UNREFERENCED_PARAMETER(wParam
);
82 UNREFERENCED_PARAMETER(hwndDlg
);
87 GetProfileData(hwndDlg
,
88 (LPTSTR
)((PROPSHEETPAGE
*)lParam
)->lParam
);
92 switch (LOWORD(wParam
))
94 case IDC_USER_PROFILE_LOCAL
:
95 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_LOCAL_PATH
), TRUE
);
96 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_DRIVE
), FALSE
);
97 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_REMOTE_PATH
), FALSE
);
100 case IDC_USER_PROFILE_REMOTE
:
101 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_LOCAL_PATH
), FALSE
);
102 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_DRIVE
), TRUE
);
103 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_PROFILE_REMOTE_PATH
), TRUE
);
114 GetMembershipData(HWND hwndDlg
, LPTSTR lpUserName
)
116 PLOCALGROUP_USERS_INFO_0 usersInfo
= NULL
;
117 NET_API_STATUS status
;
129 hwndLV
= GetDlgItem(hwndDlg
, IDC_USER_MEMBERSHIP_LIST
);
131 /* Create the image list */
132 hImgList
= ImageList_Create(16, 16, ILC_COLOR8
| ILC_MASK
, 5, 5);
133 hIcon
= LoadImage(hApplet
, MAKEINTRESOURCE(IDI_GROUP
), IMAGE_ICON
, 16, 16, LR_DEFAULTCOLOR
);
134 ImageList_AddIcon(hImgList
, hIcon
);
136 (void)ListView_SetImageList(hwndLV
, hImgList
, LVSIL_SMALL
);
138 /* Set the list column */
139 GetClientRect(hwndLV
, &rect
);
141 memset(&column
, 0x00, sizeof(column
));
142 column
.mask
= LVCF_FMT
| LVCF_WIDTH
| LVCF_SUBITEM
;
143 column
.fmt
= LVCFMT_LEFT
;
144 column
.cx
= (INT
)(rect
.right
- rect
.left
);
146 (void)ListView_InsertColumn(hwndLV
, 0, &column
);
149 status
= NetUserGetLocalGroups(NULL
, lpUserName
, 0, 0,
151 MAX_PREFERRED_LENGTH
,
154 if (status
!= NERR_Success
)
157 for (i
= 0; i
< dwRead
; i
++)
159 ZeroMemory(&lvi
, sizeof(lvi
));
160 lvi
.mask
= LVIF_TEXT
| LVIF_STATE
| LVIF_IMAGE
;
161 lvi
.pszText
= usersInfo
[i
].lgrui0_name
;
165 (void)ListView_InsertItem(hwndLV
, &lvi
);
169 NetApiBufferFree(usersInfo
);
175 UserMembershipPageProc(HWND hwndDlg
,
181 UNREFERENCED_PARAMETER(lParam
);
182 UNREFERENCED_PARAMETER(wParam
);
183 UNREFERENCED_PARAMETER(hwndDlg
);
188 GetMembershipData(hwndDlg
,
189 (LPTSTR
)((PROPSHEETPAGE
*)lParam
)->lParam
);
199 UpdateUserOptions(HWND hwndDlg
,
200 PGENERAL_USER_DATA pUserData
,
203 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_GENERAL_CANNOT_CHANGE
),
204 !pUserData
->dwPasswordExpired
);
205 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_GENERAL_NEVER_EXPIRES
),
206 !pUserData
->dwPasswordExpired
);
207 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_GENERAL_FORCE_CHANGE
),
208 (pUserData
->dwFlags
& (UF_PASSWD_CANT_CHANGE
| UF_DONT_EXPIRE_PASSWD
)) == 0);
210 EnableWindow(GetDlgItem(hwndDlg
, IDC_USER_GENERAL_LOCKED
),
211 (pUserData
->dwFlags
& UF_LOCKOUT
) != 0);
215 CheckDlgButton(hwndDlg
, IDC_USER_GENERAL_FORCE_CHANGE
,
216 pUserData
->dwPasswordExpired
? BST_CHECKED
: BST_UNCHECKED
);
218 CheckDlgButton(hwndDlg
, IDC_USER_GENERAL_CANNOT_CHANGE
,
219 (pUserData
->dwFlags
& UF_PASSWD_CANT_CHANGE
) ? BST_CHECKED
: BST_UNCHECKED
);
221 CheckDlgButton(hwndDlg
, IDC_USER_GENERAL_NEVER_EXPIRES
,
222 (pUserData
->dwFlags
& UF_DONT_EXPIRE_PASSWD
) ? BST_CHECKED
: BST_UNCHECKED
);
224 CheckDlgButton(hwndDlg
, IDC_USER_GENERAL_DISABLED
,
225 (pUserData
->dwFlags
& UF_ACCOUNTDISABLE
) ? BST_CHECKED
: BST_UNCHECKED
);
227 CheckDlgButton(hwndDlg
, IDC_USER_GENERAL_LOCKED
,
228 (pUserData
->dwFlags
& UF_LOCKOUT
) ? BST_CHECKED
: BST_UNCHECKED
);
234 GetGeneralUserData(HWND hwndDlg
,
235 PGENERAL_USER_DATA pUserData
)
237 PUSER_INFO_3 pUserInfo
= NULL
;
239 SetDlgItemText(hwndDlg
, IDC_USER_GENERAL_NAME
, pUserData
->szUserName
);
241 NetUserGetInfo(NULL
, pUserData
->szUserName
, 3, (LPBYTE
*)&pUserInfo
);
243 SetDlgItemText(hwndDlg
, IDC_USER_GENERAL_FULL_NAME
, pUserInfo
->usri3_full_name
);
244 SetDlgItemText(hwndDlg
, IDC_USER_GENERAL_DESCRIPTION
, pUserInfo
->usri3_comment
);
246 pUserData
->dwFlags
= pUserInfo
->usri3_flags
;
247 pUserData
->dwPasswordExpired
= pUserInfo
->usri3_password_expired
;
249 NetApiBufferFree(pUserInfo
);
251 UpdateUserOptions(hwndDlg
, pUserData
, TRUE
);
256 SetGeneralUserData(HWND hwndDlg
,
257 PGENERAL_USER_DATA pUserData
)
259 PUSER_INFO_3 pUserInfo
= NULL
;
260 LPTSTR pszFullName
= NULL
;
261 LPTSTR pszComment
= NULL
;
262 NET_API_STATUS status
;
266 NetUserGetInfo(NULL
, pUserData
->szUserName
, 3, (LPBYTE
*)&pUserInfo
);
268 pUserInfo
->usri3_flags
=
269 (pUserData
->dwFlags
& VALID_GENERAL_FLAGS
) |
270 (pUserInfo
->usri3_flags
& ~VALID_GENERAL_FLAGS
);
272 pUserInfo
->usri3_password_expired
= pUserData
->dwPasswordExpired
;
274 nLength
= GetWindowTextLength(GetDlgItem(hwndDlg
, IDC_USER_GENERAL_FULL_NAME
));
277 pUserInfo
->usri3_full_name
= NULL
;
281 pszFullName
= HeapAlloc(GetProcessHeap(), 0, (nLength
+ 1) * sizeof(TCHAR
));
282 GetDlgItemText(hwndDlg
, IDC_USER_GENERAL_FULL_NAME
, pszFullName
, nLength
+ 1);
283 pUserInfo
->usri3_full_name
= pszFullName
;
286 nLength
= GetWindowTextLength(GetDlgItem(hwndDlg
, IDC_USER_GENERAL_DESCRIPTION
));
289 pUserInfo
->usri3_full_name
= NULL
;
293 pszComment
= HeapAlloc(GetProcessHeap(), 0, (nLength
+ 1) * sizeof(TCHAR
));
294 GetDlgItemText(hwndDlg
, IDC_USER_GENERAL_DESCRIPTION
, pszComment
, nLength
+ 1);
295 pUserInfo
->usri3_comment
= pszComment
;
298 status
= NetUserSetInfo(NULL
, pUserData
->szUserName
, 3, (LPBYTE
)pUserInfo
, &dwIndex
);
299 if (status
!= NERR_Success
)
301 DebugPrintf(_T("Status: %lu Index: %lu"), status
, dwIndex
);
305 HeapFree(GetProcessHeap(), 0, pszFullName
);
307 NetApiBufferFree(pUserInfo
);
309 return (status
== NERR_Success
);
314 UserGeneralPageProc(HWND hwndDlg
,
319 PGENERAL_USER_DATA pUserData
;
321 UNREFERENCED_PARAMETER(lParam
);
322 UNREFERENCED_PARAMETER(wParam
);
323 UNREFERENCED_PARAMETER(hwndDlg
);
325 pUserData
= (PGENERAL_USER_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
330 pUserData
= (PGENERAL_USER_DATA
)HeapAlloc(GetProcessHeap(),
332 sizeof(GENERAL_USER_DATA
) +
333 lstrlen((LPTSTR
)((PROPSHEETPAGE
*)lParam
)->lParam
) * sizeof(TCHAR
));
334 lstrcpy(pUserData
->szUserName
, (LPTSTR
)((PROPSHEETPAGE
*)lParam
)->lParam
);
336 GetGeneralUserData(hwndDlg
,
339 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (INT_PTR
)pUserData
);
343 switch (LOWORD(wParam
))
345 case IDC_USER_GENERAL_FORCE_CHANGE
:
346 pUserData
->dwPasswordExpired
= !pUserData
->dwPasswordExpired
;
347 UpdateUserOptions(hwndDlg
, pUserData
, FALSE
);
348 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
351 case IDC_USER_GENERAL_CANNOT_CHANGE
:
352 pUserData
->dwFlags
^= UF_PASSWD_CANT_CHANGE
;
353 UpdateUserOptions(hwndDlg
, pUserData
, FALSE
);
354 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
357 case IDC_USER_GENERAL_NEVER_EXPIRES
:
358 pUserData
->dwFlags
^= UF_DONT_EXPIRE_PASSWD
;
359 UpdateUserOptions(hwndDlg
, pUserData
, FALSE
);
360 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
363 case IDC_USER_GENERAL_DISABLED
:
364 pUserData
->dwFlags
^= UF_ACCOUNTDISABLE
;
365 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
368 case IDC_USER_GENERAL_LOCKED
:
369 pUserData
->dwFlags
^= UF_LOCKOUT
;
370 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
376 if (((LPPSHNOTIFY
)lParam
)->hdr
.code
== PSN_APPLY
)
378 SetGeneralUserData(hwndDlg
, pUserData
);
384 HeapFree(GetProcessHeap(), 0, pUserData
);
393 InitPropSheetPage(PROPSHEETPAGE
*psp
, WORD idDlg
, DLGPROC DlgProc
, LPTSTR pszUser
)
395 ZeroMemory(psp
, sizeof(PROPSHEETPAGE
));
396 psp
->dwSize
= sizeof(PROPSHEETPAGE
);
397 psp
->dwFlags
= PSP_DEFAULT
;
398 psp
->hInstance
= hApplet
;
399 psp
->pszTemplate
= MAKEINTRESOURCE(idDlg
);
400 psp
->pfnDlgProc
= DlgProc
;
401 psp
->lParam
= (LPARAM
)pszUser
;
406 UserProperties(HWND hwndDlg
)
408 PROPSHEETPAGE psp
[3];
410 TCHAR szUserName
[UNLEN
];
414 hwndLV
= GetDlgItem(hwndDlg
, IDC_USERS_LIST
);
415 nItem
= ListView_GetNextItem(hwndLV
, -1, LVNI_SELECTED
);
419 /* Get the new user name */
420 ListView_GetItemText(hwndLV
,
425 ZeroMemory(&psh
, sizeof(PROPSHEETHEADER
));
426 psh
.dwSize
= sizeof(PROPSHEETHEADER
);
427 psh
.dwFlags
= PSH_PROPSHEETPAGE
| PSH_PROPTITLE
;
428 psh
.hwndParent
= hwndDlg
;
429 psh
.hInstance
= hApplet
;
431 psh
.pszCaption
= szUserName
;
432 psh
.nPages
= sizeof(psp
) / sizeof(PROPSHEETPAGE
);
436 InitPropSheetPage(&psp
[0], IDD_USER_GENERAL
, (DLGPROC
)UserGeneralPageProc
, szUserName
);
437 InitPropSheetPage(&psp
[1], IDD_USER_MEMBERSHIP
, (DLGPROC
)UserMembershipPageProc
, szUserName
);
438 InitPropSheetPage(&psp
[2], IDD_USER_PROFILE
, (DLGPROC
)UserProfilePageProc
, szUserName
);
440 return (PropertySheet(&psh
) == IDOK
);