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
;
268 NetUserGetInfo(NULL
, pUserData
->szUserName
, 3, (LPBYTE
*)&pUserInfo
);
270 pUserInfo
->usri3_flags
=
271 (pUserData
->dwFlags
& VALID_GENERAL_FLAGS
) |
272 (pUserInfo
->usri3_flags
& ~VALID_GENERAL_FLAGS
);
274 pUserInfo
->usri3_password_expired
= pUserData
->dwPasswordExpired
;
276 nLength
= GetWindowTextLength(GetDlgItem(hwndDlg
, IDC_USER_GENERAL_FULL_NAME
));
279 pUserInfo
->usri3_full_name
= NULL
;
283 pszFullName
= HeapAlloc(GetProcessHeap(), 0, (nLength
+ 1) * sizeof(TCHAR
));
284 GetDlgItemText(hwndDlg
, IDC_USER_GENERAL_FULL_NAME
, pszFullName
, nLength
+ 1);
285 pUserInfo
->usri3_full_name
= pszFullName
;
288 nLength
= GetWindowTextLength(GetDlgItem(hwndDlg
, IDC_USER_GENERAL_DESCRIPTION
));
291 pUserInfo
->usri3_full_name
= NULL
;
295 pszComment
= HeapAlloc(GetProcessHeap(), 0, (nLength
+ 1) * sizeof(TCHAR
));
296 GetDlgItemText(hwndDlg
, IDC_USER_GENERAL_DESCRIPTION
, pszComment
, nLength
+ 1);
297 pUserInfo
->usri3_comment
= pszComment
;
301 status
= NetUserSetInfo(NULL
, pUserData
->szUserName
, 3, (LPBYTE
)pUserInfo
, &dwIndex
);
302 if (status
!= NERR_Success
)
304 DebugPrintf(_T("Status: %lu Index: %lu"), status
, dwIndex
);
307 status
= NERR_Success
;
311 HeapFree(GetProcessHeap(), 0, pszFullName
);
314 HeapFree(GetProcessHeap(), 0, pszComment
);
316 NetApiBufferFree(pUserInfo
);
318 return (status
== NERR_Success
);
323 UserGeneralPageProc(HWND hwndDlg
,
328 PGENERAL_USER_DATA pUserData
;
330 UNREFERENCED_PARAMETER(lParam
);
331 UNREFERENCED_PARAMETER(wParam
);
332 UNREFERENCED_PARAMETER(hwndDlg
);
334 pUserData
= (PGENERAL_USER_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
339 pUserData
= (PGENERAL_USER_DATA
)HeapAlloc(GetProcessHeap(),
341 sizeof(GENERAL_USER_DATA
) +
342 lstrlen((LPTSTR
)((PROPSHEETPAGE
*)lParam
)->lParam
) * sizeof(TCHAR
));
343 lstrcpy(pUserData
->szUserName
, (LPTSTR
)((PROPSHEETPAGE
*)lParam
)->lParam
);
345 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (INT_PTR
)pUserData
);
347 GetGeneralUserData(hwndDlg
,
352 switch (LOWORD(wParam
))
354 case IDC_USER_GENERAL_FULL_NAME
:
355 case IDC_USER_GENERAL_DESCRIPTION
:
356 if (HIWORD(wParam
) == EN_CHANGE
)
357 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
360 case IDC_USER_GENERAL_FORCE_CHANGE
:
361 pUserData
->dwPasswordExpired
= !pUserData
->dwPasswordExpired
;
362 UpdateUserOptions(hwndDlg
, pUserData
, FALSE
);
363 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
366 case IDC_USER_GENERAL_CANNOT_CHANGE
:
367 pUserData
->dwFlags
^= UF_PASSWD_CANT_CHANGE
;
368 UpdateUserOptions(hwndDlg
, pUserData
, FALSE
);
369 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
372 case IDC_USER_GENERAL_NEVER_EXPIRES
:
373 pUserData
->dwFlags
^= UF_DONT_EXPIRE_PASSWD
;
374 UpdateUserOptions(hwndDlg
, pUserData
, FALSE
);
375 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
378 case IDC_USER_GENERAL_DISABLED
:
379 pUserData
->dwFlags
^= UF_ACCOUNTDISABLE
;
380 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
383 case IDC_USER_GENERAL_LOCKED
:
384 pUserData
->dwFlags
^= UF_LOCKOUT
;
385 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
391 if (((LPPSHNOTIFY
)lParam
)->hdr
.code
== PSN_APPLY
)
393 SetGeneralUserData(hwndDlg
, pUserData
);
399 HeapFree(GetProcessHeap(), 0, pUserData
);
408 InitPropSheetPage(PROPSHEETPAGE
*psp
, WORD idDlg
, DLGPROC DlgProc
, LPTSTR pszUser
)
410 ZeroMemory(psp
, sizeof(PROPSHEETPAGE
));
411 psp
->dwSize
= sizeof(PROPSHEETPAGE
);
412 psp
->dwFlags
= PSP_DEFAULT
;
413 psp
->hInstance
= hApplet
;
414 psp
->pszTemplate
= MAKEINTRESOURCE(idDlg
);
415 psp
->pfnDlgProc
= DlgProc
;
416 psp
->lParam
= (LPARAM
)pszUser
;
421 UserProperties(HWND hwndDlg
)
423 PROPSHEETPAGE psp
[3];
425 TCHAR szUserName
[UNLEN
];
429 hwndLV
= GetDlgItem(hwndDlg
, IDC_USERS_LIST
);
430 nItem
= ListView_GetNextItem(hwndLV
, -1, LVNI_SELECTED
);
434 /* Get the new user name */
435 ListView_GetItemText(hwndLV
,
440 ZeroMemory(&psh
, sizeof(PROPSHEETHEADER
));
441 psh
.dwSize
= sizeof(PROPSHEETHEADER
);
442 psh
.dwFlags
= PSH_PROPSHEETPAGE
| PSH_PROPTITLE
;
443 psh
.hwndParent
= hwndDlg
;
444 psh
.hInstance
= hApplet
;
446 psh
.pszCaption
= szUserName
;
447 psh
.nPages
= sizeof(psp
) / sizeof(PROPSHEETPAGE
);
451 InitPropSheetPage(&psp
[0], IDD_USER_GENERAL
, (DLGPROC
)UserGeneralPageProc
, szUserName
);
452 InitPropSheetPage(&psp
[1], IDD_USER_MEMBERSHIP
, (DLGPROC
)UserMembershipPageProc
, szUserName
);
453 InitPropSheetPage(&psp
[2], IDD_USER_PROFILE
, (DLGPROC
)UserProfilePageProc
, szUserName
);
455 return (PropertySheet(&psh
) == IDOK
);