handle the WM_SIZE message and resize/move the controls appropriately

svn path=/trunk/; revision=17092
This commit is contained in:
Thomas Bluemel 2005-08-06 01:14:09 +00:00
parent 406b162be2
commit 044ab19d99
9 changed files with 422 additions and 151 deletions

View file

@ -30,12 +30,17 @@
HINSTANCE hDllInstance; HINSTANCE hDllInstance;
static PCWSTR ObjectPickerAttributes[] =
{
L"ObjectSid",
};
static VOID static VOID
DestroySecurityPage(IN PSECURITY_PAGE sp) DestroySecurityPage(IN PSECURITY_PAGE sp)
{ {
if(sp->hiUsrs != NULL) if(sp->hiPrincipals != NULL)
{ {
ImageList_Destroy(sp->hiUsrs); ImageList_Destroy(sp->hiPrincipals);
} }
HeapFree(GetProcessHeap(), HeapFree(GetProcessHeap(),
@ -46,11 +51,11 @@ DestroySecurityPage(IN PSECURITY_PAGE sp)
} }
static VOID static VOID
FreeAceList(IN PACE_LISTITEM *AceListHead) FreePrincipalsList(IN PPRINCIPAL_LISTITEM *PrincipalsListHead)
{ {
PACE_LISTITEM CurItem, NextItem; PPRINCIPAL_LISTITEM CurItem, NextItem;
CurItem = *AceListHead; CurItem = *PrincipalsListHead;
while (CurItem != NULL) while (CurItem != NULL)
{ {
/* free the SID string if present */ /* free the SID string if present */
@ -67,16 +72,16 @@ FreeAceList(IN PACE_LISTITEM *AceListHead)
CurItem = NextItem; CurItem = NextItem;
} }
*AceListHead = NULL; *PrincipalsListHead = NULL;
} }
static PACE_LISTITEM static PPRINCIPAL_LISTITEM
FindSidInAceList(IN PACE_LISTITEM AceListHead, FindSidInPrincipalsList(IN PPRINCIPAL_LISTITEM PrincipalsListHead,
IN PSID Sid) IN PSID Sid)
{ {
PACE_LISTITEM CurItem; PPRINCIPAL_LISTITEM CurItem;
for (CurItem = AceListHead; for (CurItem = PrincipalsListHead;
CurItem != NULL; CurItem != NULL;
CurItem = CurItem->Next) CurItem = CurItem->Next)
{ {
@ -91,7 +96,7 @@ FindSidInAceList(IN PACE_LISTITEM AceListHead,
} }
static VOID static VOID
ReloadUsersGroupsList(IN PSECURITY_PAGE sp) ReloadPrincipalsList(IN PSECURITY_PAGE sp)
{ {
PSECURITY_DESCRIPTOR SecurityDescriptor; PSECURITY_DESCRIPTOR SecurityDescriptor;
BOOL DaclPresent, DaclDefaulted; BOOL DaclPresent, DaclDefaulted;
@ -99,7 +104,7 @@ ReloadUsersGroupsList(IN PSECURITY_PAGE sp)
HRESULT hRet; HRESULT hRet;
/* delete the cached ACL */ /* delete the cached ACL */
FreeAceList(&sp->AceListHead); FreePrincipalsList(&sp->PrincipalsListHead);
/* query the ACL */ /* query the ACL */
hRet = sp->psi->lpVtbl->GetSecurity(sp->psi, hRet = sp->psi->lpVtbl->GetSecurity(sp->psi,
@ -113,7 +118,7 @@ ReloadUsersGroupsList(IN PSECURITY_PAGE sp)
&Dacl, &Dacl,
&DaclDefaulted)) &DaclDefaulted))
{ {
PACE_LISTITEM AceListItem, *NextAcePtr; PPRINCIPAL_LISTITEM AceListItem, *NextAcePtr;
PSID Sid; PSID Sid;
PVOID Ace; PVOID Ace;
ULONG AceIndex; ULONG AceIndex;
@ -121,7 +126,7 @@ ReloadUsersGroupsList(IN PSECURITY_PAGE sp)
SID_NAME_USE SidNameUse; SID_NAME_USE SidNameUse;
DWORD LookupResult; DWORD LookupResult;
NextAcePtr = &sp->AceListHead; NextAcePtr = &sp->PrincipalsListHead;
for (AceIndex = 0; for (AceIndex = 0;
AceIndex < Dacl->AceCount; AceIndex < Dacl->AceCount;
@ -133,7 +138,7 @@ ReloadUsersGroupsList(IN PSECURITY_PAGE sp)
Sid = (PSID)&((PACCESS_ALLOWED_ACE)Ace)->SidStart; Sid = (PSID)&((PACCESS_ALLOWED_ACE)Ace)->SidStart;
if (!FindSidInAceList(sp->AceListHead, if (!FindSidInPrincipalsList(sp->PrincipalsListHead,
Sid)) Sid))
{ {
SidLength = GetLengthSid(Sid); SidLength = GetLengthSid(Sid);
@ -153,7 +158,7 @@ ReloadUsersGroupsList(IN PSECURITY_PAGE sp)
/* allocate the ace */ /* allocate the ace */
AceListItem = HeapAlloc(GetProcessHeap(), AceListItem = HeapAlloc(GetProcessHeap(),
0, 0,
sizeof(ACE_LISTITEM) + sizeof(PRINCIPAL_LISTITEM) +
SidLength + SidLength +
((AccountNameSize + DomainNameSize) * sizeof(WCHAR))); ((AccountNameSize + DomainNameSize) * sizeof(WCHAR)));
if (AceListItem != NULL) if (AceListItem != NULL)
@ -341,8 +346,8 @@ ReloadUsersGroupsList(IN PSECURITY_PAGE sp)
} }
static INT static INT
AddAceListEntry(IN PSECURITY_PAGE sp, AddPrincipalListEntry(IN PSECURITY_PAGE sp,
IN PACE_LISTITEM AceListItem, IN PPRINCIPAL_LISTITEM PrincipalListItem,
IN INT Index, IN INT Index,
IN BOOL Selected) IN BOOL Selected)
{ {
@ -353,8 +358,8 @@ AddAceListEntry(IN PSECURITY_PAGE sp,
li.iSubItem = 0; li.iSubItem = 0;
li.state = (Selected ? LVIS_SELECTED : 0); li.state = (Selected ? LVIS_SELECTED : 0);
li.stateMask = LVIS_SELECTED; li.stateMask = LVIS_SELECTED;
li.pszText = (AceListItem->DisplayString != NULL ? AceListItem->DisplayString : AceListItem->AccountName); li.pszText = (PrincipalListItem->DisplayString != NULL ? PrincipalListItem->DisplayString : PrincipalListItem->AccountName);
switch (AceListItem->SidNameUse) switch (PrincipalListItem->SidNameUse)
{ {
case SidTypeUser: case SidTypeUser:
li.iImage = 0; li.iImage = 0;
@ -366,42 +371,42 @@ AddAceListEntry(IN PSECURITY_PAGE sp,
li.iImage = -1; li.iImage = -1;
break; break;
} }
li.lParam = (LPARAM)AceListItem; li.lParam = (LPARAM)PrincipalListItem;
return ListView_InsertItem(sp->hWndAceList, return ListView_InsertItem(sp->hWndPrincipalsList,
&li); &li);
} }
static VOID static VOID
FillUsersGroupsList(IN PSECURITY_PAGE sp) FillPrincipalsList(IN PSECURITY_PAGE sp)
{ {
LPARAM SelLParam; LPARAM SelLParam;
PACE_LISTITEM CurItem; PPRINCIPAL_LISTITEM CurItem;
RECT rcLvClient; RECT rcLvClient;
SelLParam = ListViewGetSelectedItemData(sp->hWndAceList); SelLParam = ListViewGetSelectedItemData(sp->hWndPrincipalsList);
DisableRedrawWindow(sp->hWndAceList); DisableRedrawWindow(sp->hWndPrincipalsList);
ListView_DeleteAllItems(sp->hWndAceList); ListView_DeleteAllItems(sp->hWndPrincipalsList);
ReloadUsersGroupsList(sp); ReloadPrincipalsList(sp);
for (CurItem = sp->AceListHead; for (CurItem = sp->PrincipalsListHead;
CurItem != NULL; CurItem != NULL;
CurItem = CurItem->Next) CurItem = CurItem->Next)
{ {
AddAceListEntry(sp, AddPrincipalListEntry(sp,
CurItem, CurItem,
-1, -1,
(SelLParam == (LPARAM)CurItem)); (SelLParam == (LPARAM)CurItem));
} }
EnableRedrawWindow(sp->hWndAceList); EnableRedrawWindow(sp->hWndPrincipalsList);
GetClientRect(sp->hWndAceList, &rcLvClient); GetClientRect(sp->hWndPrincipalsList, &rcLvClient);
ListView_SetColumnWidth(sp->hWndAceList, ListView_SetColumnWidth(sp->hWndPrincipalsList,
0, 0,
rcLvClient.right); rcLvClient.right);
} }
@ -409,7 +414,7 @@ FillUsersGroupsList(IN PSECURITY_PAGE sp)
static VOID static VOID
UpdateControlStates(IN PSECURITY_PAGE sp) UpdateControlStates(IN PSECURITY_PAGE sp)
{ {
PACE_LISTITEM Selected = (PACE_LISTITEM)ListViewGetSelectedItemData(sp->hWndAceList); PPRINCIPAL_LISTITEM Selected = (PPRINCIPAL_LISTITEM)ListViewGetSelectedItemData(sp->hWndPrincipalsList);
EnableWindow(sp->hBtnRemove, Selected != NULL); EnableWindow(sp->hBtnRemove, Selected != NULL);
EnableWindow(sp->hAceCheckList, Selected != NULL); EnableWindow(sp->hAceCheckList, Selected != NULL);
@ -570,80 +575,246 @@ LoadPermissionsList(IN PSECURITY_PAGE sp,
} }
} }
static HRESULT static VOID
InitializeObjectPicker(IN PSECURITY_PAGE sp, ResizeControls(IN PSECURITY_PAGE sp,
OUT IDsObjectPicker **pDsObjectPicker) IN INT Width,
IN INT Height)
{ {
HRESULT hRet; HWND hWndAllow, hWndDeny;
RECT rcControl, rcControl2, rcControl3, rcWnd;
INT cxWidth, cxEdge, btnSpacing;
POINT pt, pt2;
HDWP dwp;
INT nControls = 7;
LVCOLUMN lvc;
*pDsObjectPicker = NULL; hWndAllow = GetDlgItem(sp->hWnd,
IDC_LABEL_ALLOW);
hWndDeny = GetDlgItem(sp->hWnd,
IDC_LABEL_DENY);
hRet = CoCreateInstance(&CLSID_DsObjectPicker, GetWindowRect(sp->hWnd,
&rcWnd);
cxEdge = GetSystemMetrics(SM_CXEDGE);
/* use the left margin of the principal list view control for all control
margins */
pt.x = 0;
pt.y = 0;
MapWindowPoints(sp->hWndPrincipalsList,
sp->hWnd,
&pt,
1);
cxWidth = Width - (2 * pt.x);
if (sp->ObjectInfo.dwFlags & SI_ADVANCED)
{
nControls += 2;
}
if (!(dwp = BeginDeferWindowPos(nControls)))
{
return;
}
/* resize the Principal list view */
GetWindowRect(sp->hWndPrincipalsList,
&rcControl);
if (!(dwp = DeferWindowPos(dwp,
sp->hWndPrincipalsList,
NULL, NULL,
CLSCTX_INPROC_SERVER,
&IID_IDsObjectPicker,
(LPVOID*)pDsObjectPicker);
if (SUCCEEDED(hRet))
{
DSOP_INIT_INFO InitInfo;
UINT i;
PCWSTR Attributes[] =
{
L"ObjectSid",
};
DSOP_SCOPE_INIT_INFO Scopes[] =
{
{
sizeof(DSOP_SCOPE_INIT_INFO),
DSOP_SCOPE_TYPE_TARGET_COMPUTER,
DSOP_SCOPE_FLAG_DEFAULT_FILTER_USERS | DSOP_SCOPE_FLAG_DEFAULT_FILTER_GROUPS |
DSOP_SCOPE_FLAG_STARTING_SCOPE,
{
{
0, 0,
0, 0,
0 cxWidth,
}, rcControl.bottom - rcControl.top,
DSOP_DOWNLEVEL_FILTER_USERS | DSOP_DOWNLEVEL_FILTER_LOCAL_GROUPS | SWP_NOMOVE | SWP_NOZORDER)))
DSOP_DOWNLEVEL_FILTER_GLOBAL_GROUPS | DSOP_DOWNLEVEL_FILTER_ALL_WELLKNOWN_SIDS {
}, return;
}
/* move the Add Principal button */
GetWindowRect(sp->hBtnAdd,
&rcControl);
GetWindowRect(sp->hBtnRemove,
&rcControl2);
btnSpacing = rcControl2.left - rcControl.right;
pt2.x = 0;
pt2.y = 0;
MapWindowPoints(sp->hBtnAdd,
sp->hWnd,
&pt2,
1);
if (!(dwp = DeferWindowPos(dwp,
sp->hBtnAdd,
NULL, NULL,
pt.x + cxWidth - (rcControl2.right - rcControl2.left) -
(rcControl.right - rcControl.left) -
btnSpacing - cxEdge,
pt2.y,
0,
0,
SWP_NOSIZE | SWP_NOZORDER)))
{
return;
}
/* move the Delete Principal button */
pt2.x = 0;
pt2.y = 0;
MapWindowPoints(sp->hBtnRemove,
sp->hWnd,
&pt2,
1);
if (!(dwp = DeferWindowPos(dwp,
sp->hBtnRemove,
NULL, NULL,
S_OK pt.x + cxWidth - (rcControl2.right - rcControl2.left) - cxEdge,
}, pt2.y,
}; 0,
0,
InitInfo.cbSize = sizeof(InitInfo); SWP_NOSIZE | SWP_NOZORDER)))
InitInfo.pwzTargetComputer = (PCWSTR)sp->ServerName;
InitInfo.cDsScopeInfos = sizeof(Scopes) / sizeof(Scopes[0]);
InitInfo.aDsScopeInfos = Scopes;
InitInfo.flOptions = DSOP_FLAG_MULTISELECT | DSOP_SCOPE_TYPE_TARGET_COMPUTER;
InitInfo.cAttributesToFetch = sizeof(Attributes) / sizeof(Attributes[0]);
InitInfo.apwzAttributeNames = Attributes;
for (i = 0; i < InitInfo.cDsScopeInfos; i++)
{ {
if ((sp->ObjectInfo.dwFlags & SI_SERVER_IS_DC) && return;
(InitInfo.aDsScopeInfos[i].flType & DSOP_SCOPE_TYPE_UPLEVEL_JOINED_DOMAIN)) }
/* move the Permissions For label */
GetWindowRect(hWndAllow,
&rcControl);
GetWindowRect(hWndDeny,
&rcControl2);
GetWindowRect(sp->hPermissionsForLabel,
&rcControl3);
pt2.x = 0;
pt2.y = 0;
MapWindowPoints(sp->hPermissionsForLabel,
sp->hWnd,
&pt2,
1);
if (!(dwp = DeferWindowPos(dwp,
sp->hPermissionsForLabel,
NULL,
0,
0,
cxWidth - (rcControl2.right - rcControl2.left) -
(rcControl.right - rcControl.left) -
(2 * btnSpacing) - cxEdge,
rcControl3.bottom - rcControl3.top,
SWP_NOMOVE | SWP_NOZORDER)))
{ {
/* only set the domain controller string if we know the target return;
computer is a domain controller and the scope type is an
up-level domain to which the target computer is joined */
InitInfo.aDsScopeInfos[i].pwzDcName = InitInfo.pwzTargetComputer;
}
} }
hRet = (*pDsObjectPicker)->lpVtbl->Initialize(*pDsObjectPicker, /* move the Allow label */
&InitInfo); pt2.x = 0;
pt2.y = 0;
if (FAILED(hRet)) MapWindowPoints(hWndAllow,
sp->hWnd,
&pt2,
1);
if (!(dwp = DeferWindowPos(dwp,
hWndAllow,
NULL,
cxWidth - (rcControl2.right - rcControl2.left) -
(rcControl.right - rcControl.left) -
btnSpacing - cxEdge,
pt2.y,
0,
0,
SWP_NOSIZE | SWP_NOZORDER)))
{ {
/* delete the object picker in case initialization failed! */ return;
(*pDsObjectPicker)->lpVtbl->Release(*pDsObjectPicker); }
/* move the Deny label */
pt2.x = 0;
pt2.y = 0;
MapWindowPoints(hWndDeny,
sp->hWnd,
&pt2,
1);
if (!(dwp = DeferWindowPos(dwp,
hWndDeny,
NULL,
cxWidth - (rcControl2.right - rcControl2.left) - cxEdge,
pt2.y,
0,
0,
SWP_NOSIZE | SWP_NOZORDER)))
{
return;
}
/* resize the Permissions check list box */
GetWindowRect(sp->hAceCheckList,
&rcControl);
GetWindowRect(sp->hBtnAdvanced,
&rcControl2);
GetWindowRect(GetDlgItem(sp->hWnd,
IDC_LABEL_ADVANCED),
&rcControl3);
if (!(dwp = DeferWindowPos(dwp,
sp->hAceCheckList,
NULL,
0,
0,
cxWidth,
((sp->ObjectInfo.dwFlags & SI_ADVANCED) ?
Height - (rcControl.top - rcWnd.top) - (rcControl3.bottom - rcControl3.top) - pt.x - btnSpacing :
Height - (rcControl.top - rcWnd.top) - pt.x),
SWP_NOMOVE | SWP_NOZORDER)))
{
return;
}
if (sp->ObjectInfo.dwFlags & SI_ADVANCED)
{
/* move and resize the Advanced label */
if (!(dwp = DeferWindowPos(dwp,
GetDlgItem(sp->hWnd,
IDC_LABEL_ADVANCED),
NULL,
pt.x,
Height - (rcControl3.bottom - rcControl3.top) - pt.x,
cxWidth - (rcControl2.right - rcControl2.left) - cxEdge,
rcControl3.bottom - rcControl3.top,
SWP_NOZORDER)))
{
return;
}
/* move and resize the Advanced button */
if (!(dwp = DeferWindowPos(dwp,
sp->hBtnAdvanced,
NULL,
cxWidth - (rcControl2.right - rcControl2.left) + pt.x,
Height - (rcControl2.bottom - rcControl2.top) - pt.x,
0,
0,
SWP_NOSIZE | SWP_NOZORDER)))
{
return;
} }
} }
return hRet; EndDeferWindowPos(dwp);
/* update the width of the principal list view column */
GetClientRect(sp->hWndPrincipalsList,
&rcControl);
lvc.mask = LVCF_WIDTH;
lvc.cx = rcControl.right;
ListView_SetColumn(sp->hWndPrincipalsList,
0,
&lvc);
/* calculate the columns of the allow/deny checkboxes */
SetAceCheckListColumns(sp->hAceCheckList,
CLB_ALLOW,
hWndAllow);
SetAceCheckListColumns(sp->hAceCheckList,
CLB_DENY,
hWndDeny);
} }
static INT_PTR CALLBACK static INT_PTR CALLBACK
@ -663,7 +834,7 @@ SecurityPageProc(IN HWND hwndDlg,
DWL_USER); DWL_USER);
if (sp != NULL) if (sp != NULL)
{ {
if (pnmh->hwndFrom == sp->hWndAceList) if (pnmh->hwndFrom == sp->hWndPrincipalsList)
{ {
switch (pnmh->code) switch (pnmh->code)
{ {
@ -707,7 +878,7 @@ SecurityPageProc(IN HWND hwndDlg,
{ {
switch (LOWORD(wParam)) switch (LOWORD(wParam))
{ {
case IDC_ACELIST_ADD: case IDC_ADD_PRINCIPAL:
{ {
HRESULT hRet; HRESULT hRet;
IDsObjectPicker *pDsObjectPicker = NULL; IDsObjectPicker *pDsObjectPicker = NULL;
@ -716,7 +887,9 @@ SecurityPageProc(IN HWND hwndDlg,
sp = (PSECURITY_PAGE)GetWindowLongPtr(hwndDlg, sp = (PSECURITY_PAGE)GetWindowLongPtr(hwndDlg,
DWL_USER); DWL_USER);
hRet = InitializeObjectPicker(sp, hRet = InitializeObjectPicker(sp->ServerName,
&sp->ObjectInfo,
ObjectPickerAttributes,
&pDsObjectPicker); &pDsObjectPicker);
if (SUCCEEDED(hRet)) if (SUCCEEDED(hRet))
{ {
@ -737,6 +910,17 @@ SecurityPageProc(IN HWND hwndDlg,
break; break;
} }
case WM_SIZE:
{
sp = (PSECURITY_PAGE)GetWindowLongPtr(hwndDlg,
DWL_USER);
ResizeControls(sp,
(INT)LOWORD(lParam),
(INT)HIWORD(lParam));
break;
}
case WM_INITDIALOG: case WM_INITDIALOG:
{ {
sp = (PSECURITY_PAGE)((LPPROPSHEETPAGE)lParam)->lParam; sp = (PSECURITY_PAGE)((LPPROPSHEETPAGE)lParam)->lParam;
@ -746,8 +930,9 @@ SecurityPageProc(IN HWND hwndDlg,
RECT rcLvClient; RECT rcLvClient;
sp->hWnd = hwndDlg; sp->hWnd = hwndDlg;
sp->hWndAceList = GetDlgItem(hwndDlg, IDC_ACELIST); sp->hWndPrincipalsList = GetDlgItem(hwndDlg, IDC_PRINCIPALS);
sp->hBtnRemove = GetDlgItem(hwndDlg, IDC_ACELIST_REMOVE); sp->hBtnAdd = GetDlgItem(hwndDlg, IDC_ADD_PRINCIPAL);
sp->hBtnRemove = GetDlgItem(hwndDlg, IDC_REMOVE_PRINCIPAL);
sp->hBtnAdvanced = GetDlgItem(hwndDlg, IDC_ADVANCED); sp->hBtnAdvanced = GetDlgItem(hwndDlg, IDC_ADVANCED);
sp->hAceCheckList = GetDlgItem(hwndDlg, IDC_ACE_CHECKLIST); sp->hAceCheckList = GetDlgItem(hwndDlg, IDC_ACE_CHECKLIST);
sp->hPermissionsForLabel = GetDlgItem(hwndDlg, IDC_LABEL_PERMISSIONS_FOR); sp->hPermissionsForLabel = GetDlgItem(hwndDlg, IDC_LABEL_PERMISSIONS_FOR);
@ -766,31 +951,31 @@ SecurityPageProc(IN HWND hwndDlg,
DWL_USER, DWL_USER,
(DWORD_PTR)sp); (DWORD_PTR)sp);
sp->hiUsrs = ImageList_LoadBitmap(hDllInstance, sp->hiPrincipals = ImageList_LoadBitmap(hDllInstance,
MAKEINTRESOURCE(IDB_USRGRPIMAGES), MAKEINTRESOURCE(IDB_USRGRPIMAGES),
16, 16,
3, 3,
0); 0);
/* setup the listview control */ /* setup the listview control */
ListView_SetExtendedListViewStyleEx(sp->hWndAceList, ListView_SetExtendedListViewStyleEx(sp->hWndPrincipalsList,
LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT,
LVS_EX_FULLROWSELECT); LVS_EX_FULLROWSELECT);
ListView_SetImageList(sp->hWndAceList, ListView_SetImageList(sp->hWndPrincipalsList,
sp->hiUsrs, sp->hiPrincipals,
LVSIL_SMALL); LVSIL_SMALL);
GetClientRect(sp->hWndAceList, &rcLvClient); GetClientRect(sp->hWndPrincipalsList, &rcLvClient);
/* add a column to the list view */ /* add a column to the list view */
lvc.mask = LVCF_FMT | LVCF_WIDTH; lvc.mask = LVCF_FMT | LVCF_WIDTH;
lvc.fmt = LVCFMT_LEFT; lvc.fmt = LVCFMT_LEFT;
lvc.cx = rcLvClient.right; lvc.cx = rcLvClient.right;
ListView_InsertColumn(sp->hWndAceList, 0, &lvc); ListView_InsertColumn(sp->hWndPrincipalsList, 0, &lvc);
FillUsersGroupsList(sp); FillPrincipalsList(sp);
ListViewSelectItem(sp->hWndAceList, ListViewSelectItem(sp->hWndPrincipalsList,
0); 0);
/* calculate the columns of the allow/deny checkboxes */ /* calculate the columns of the allow/deny checkboxes */
@ -841,6 +1026,8 @@ SecurityPageProc(IN HWND hwndDlg,
CLM_ENABLEQUICKSEARCH, CLM_ENABLEQUICKSEARCH,
TRUE, TRUE,
0); 0);
UpdateControlStates(sp);
} }
break; break;
} }

View file

@ -6,9 +6,9 @@ CAPTION "Sicherheit"
FONT 8, "MS Shell Dlg", 0, 0, 0x0 FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN BEGIN
LTEXT "&Gruppen oder Benutzernamen:", -1, 7, 7, 105, 8 LTEXT "&Gruppen oder Benutzernamen:", -1, 7, 7, 105, 8
CONTROL "", IDC_ACELIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP, 7, 17, 213, 66, WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE CONTROL "", IDC_PRINCIPALS, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP, 7, 17, 213, 66, WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE
PUSHBUTTON "&Hinzufügen...", IDC_ACELIST_ADD, 116, 87, 50, 14 PUSHBUTTON "&Hinzufügen...", IDC_ADD_PRINCIPAL, 116, 87, 50, 14
PUSHBUTTON "&Entfernen", IDC_ACELIST_REMOVE, 170, 87, 50, 14 PUSHBUTTON "&Entfernen", IDC_REMOVE_PRINCIPAL, 170, 87, 50, 14
LTEXT "", IDC_LABEL_PERMISSIONS_FOR, 7, 107, 105, 8, SS_LEFT | SS_NOPREFIX LTEXT "", IDC_LABEL_PERMISSIONS_FOR, 7, 107, 105, 8, SS_LEFT | SS_NOPREFIX
LTEXT "Erlauben", IDC_LABEL_ALLOW, 135, 107, 32, 8, SS_CENTER LTEXT "Erlauben", IDC_LABEL_ALLOW, 135, 107, 32, 8, SS_CENTER
LTEXT "Verbieten", IDC_LABEL_DENY, 176, 107, 32, 8, SS_CENTER LTEXT "Verbieten", IDC_LABEL_DENY, 176, 107, 32, 8, SS_CENTER

View file

@ -6,9 +6,9 @@ CAPTION "Security"
FONT 8, "MS Shell Dlg", 0, 0, 0x0 FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN BEGIN
LTEXT "&Group or user names:", -1, 7, 7, 105, 8 LTEXT "&Group or user names:", -1, 7, 7, 105, 8
CONTROL "", IDC_ACELIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP, 7, 17, 213, 66, WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE CONTROL "", IDC_PRINCIPALS, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP, 7, 17, 213, 66, WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE
PUSHBUTTON "A&dd...", IDC_ACELIST_ADD, 116, 87, 50, 14 PUSHBUTTON "A&dd...", IDC_ADD_PRINCIPAL, 116, 87, 50, 14
PUSHBUTTON "&Remove", IDC_ACELIST_REMOVE, 170, 87, 50, 14 PUSHBUTTON "&Remove", IDC_REMOVE_PRINCIPAL, 170, 87, 50, 14
LTEXT "", IDC_LABEL_PERMISSIONS_FOR, 7, 107, 105, 8, SS_LEFT | SS_NOPREFIX LTEXT "", IDC_LABEL_PERMISSIONS_FOR, 7, 107, 105, 8, SS_LEFT | SS_NOPREFIX
LTEXT "Allow", IDC_LABEL_ALLOW, 135, 107, 32, 8, SS_CENTER LTEXT "Allow", IDC_LABEL_ALLOW, 135, 107, 32, 8, SS_CENTER
LTEXT "Deny", IDC_LABEL_DENY, 176, 107, 32, 8, SS_CENTER LTEXT "Deny", IDC_LABEL_DENY, 176, 107, 32, 8, SS_CENTER

View file

@ -6,9 +6,9 @@ CAPTION "Beveiling"
FONT 8, "MS Shell Dlg", 0, 0, 0x0 FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN BEGIN
LTEXT "&Groep of gebruikersnamen:", -1, 7, 7, 105, 8 LTEXT "&Groep of gebruikersnamen:", -1, 7, 7, 105, 8
CONTROL "", IDC_ACELIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP, 7, 17, 213, 66, WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE CONTROL "", IDC_PRINCIPALS, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP, 7, 17, 213, 66, WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE
PUSHBUTTON "&Toevoegen...", IDC_ACELIST_ADD, 116, 87, 50, 14 PUSHBUTTON "&Toevoegen...", IDC_ADD_PRINCIPAL, 116, 87, 50, 14
PUSHBUTTON "&Verwijderen", IDC_ACELIST_REMOVE, 170, 87, 50, 14 PUSHBUTTON "&Verwijderen", IDC_REMOVE_PRINCIPAL, 170, 87, 50, 14
LTEXT "", IDC_LABEL_PERMISSIONS_FOR, 7, 107, 105, 8, SS_LEFT | SS_NOPREFIX LTEXT "", IDC_LABEL_PERMISSIONS_FOR, 7, 107, 105, 8, SS_LEFT | SS_NOPREFIX
LTEXT "Toestaan", IDC_LABEL_ALLOW, 135, 107, 32, 8, SS_CENTER LTEXT "Toestaan", IDC_LABEL_ALLOW, 135, 107, 32, 8, SS_CENTER
LTEXT "Weigeren", IDC_LABEL_DENY, 176, 107, 32, 8, SS_CENTER LTEXT "Weigeren", IDC_LABEL_DENY, 176, 107, 32, 8, SS_CENTER

View file

@ -24,9 +24,9 @@ CAPTION "S
FONT 8, "MS Shell Dlg", 0, 0, 0x0 FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN BEGIN
LTEXT "&Grupp eller användarnamn:", -1, 7, 7, 105, 8 LTEXT "&Grupp eller användarnamn:", -1, 7, 7, 105, 8
CONTROL "", IDC_ACELIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP, 7, 17, 213, 66, WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE CONTROL "", IDC_PRINCIPALS, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP, 7, 17, 213, 66, WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE
PUSHBUTTON "&Lägg till...", IDC_ACELIST_ADD, 116, 87, 50, 14 PUSHBUTTON "&Lägg till...", IDC_ADD_PRINCIPAL, 116, 87, 50, 14
PUSHBUTTON "&Ta bort", IDC_ACELIST_REMOVE, 170, 87, 50, 14 PUSHBUTTON "&Ta bort", IDC_REMOVE_PRINCIPAL, 170, 87, 50, 14
LTEXT "", IDC_LABEL_PERMISSIONS_FOR, 7, 107, 105, 8, SS_LEFT | SS_NOPREFIX LTEXT "", IDC_LABEL_PERMISSIONS_FOR, 7, 107, 105, 8, SS_LEFT | SS_NOPREFIX
LTEXT "Tillåt", IDC_LABEL_ALLOW, 135, 107, 32, 8, SS_CENTER LTEXT "Tillåt", IDC_LABEL_ALLOW, 135, 107, 32, 8, SS_CENTER
LTEXT "Neka", IDC_LABEL_DENY, 176, 107, 32, 8, SS_CENTER LTEXT "Neka", IDC_LABEL_DENY, 176, 107, 32, 8, SS_CENTER

View file

@ -1776,6 +1776,7 @@ CheckListWndProc(IN HWND hwnd,
case CLM_SETCHECKBOXCOLUMN: case CLM_SETCHECKBOXCOLUMN:
{ {
infoPtr->CheckBoxLeft[wParam != CLB_DENY] = (INT)lParam; infoPtr->CheckBoxLeft[wParam != CLB_DENY] = (INT)lParam;
UpdateControl(infoPtr);
Ret = 1; Ret = 1;
break; break;
} }

View file

@ -204,3 +204,77 @@ ListViewSelectItem(IN HWND hwnd,
&li); &li);
} }
HRESULT
InitializeObjectPicker(IN PCWSTR ServerName,
IN PSI_OBJECT_INFO ObjectInfo,
IN PCWSTR Attributes[],
OUT IDsObjectPicker **pDsObjectPicker)
{
HRESULT hRet;
*pDsObjectPicker = NULL;
hRet = CoCreateInstance(&CLSID_DsObjectPicker,
NULL,
CLSCTX_INPROC_SERVER,
&IID_IDsObjectPicker,
(LPVOID*)pDsObjectPicker);
if (SUCCEEDED(hRet))
{
DSOP_INIT_INFO InitInfo;
UINT i;
DSOP_SCOPE_INIT_INFO Scopes[] =
{
{
sizeof(DSOP_SCOPE_INIT_INFO),
DSOP_SCOPE_TYPE_TARGET_COMPUTER,
DSOP_SCOPE_FLAG_DEFAULT_FILTER_USERS | DSOP_SCOPE_FLAG_DEFAULT_FILTER_GROUPS |
DSOP_SCOPE_FLAG_STARTING_SCOPE,
{
{
0,
0,
0
},
DSOP_DOWNLEVEL_FILTER_USERS | DSOP_DOWNLEVEL_FILTER_LOCAL_GROUPS |
DSOP_DOWNLEVEL_FILTER_GLOBAL_GROUPS | DSOP_DOWNLEVEL_FILTER_ALL_WELLKNOWN_SIDS
},
NULL,
NULL,
S_OK
},
};
InitInfo.cbSize = sizeof(InitInfo);
InitInfo.pwzTargetComputer = ServerName;
InitInfo.cDsScopeInfos = sizeof(Scopes) / sizeof(Scopes[0]);
InitInfo.aDsScopeInfos = Scopes;
InitInfo.flOptions = DSOP_FLAG_MULTISELECT | DSOP_SCOPE_TYPE_TARGET_COMPUTER;
InitInfo.cAttributesToFetch = sizeof(Attributes) / sizeof(Attributes[0]);
InitInfo.apwzAttributeNames = Attributes;
for (i = 0; i < InitInfo.cDsScopeInfos; i++)
{
if ((ObjectInfo->dwFlags & SI_SERVER_IS_DC) &&
(InitInfo.aDsScopeInfos[i].flType & DSOP_SCOPE_TYPE_UPLEVEL_JOINED_DOMAIN))
{
/* only set the domain controller string if we know the target
computer is a domain controller and the scope type is an
up-level domain to which the target computer is joined */
InitInfo.aDsScopeInfos[i].pwzDcName = InitInfo.pwzTargetComputer;
}
}
hRet = (*pDsObjectPicker)->lpVtbl->Initialize(*pDsObjectPicker,
&InitInfo);
if (FAILED(hRet))
{
/* delete the object picker in case initialization failed! */
(*pDsObjectPicker)->lpVtbl->Release(*pDsObjectPicker);
}
}
return hRet;
}

View file

@ -26,30 +26,33 @@ ULONG DbgPrint(PCH Format,...);
extern HINSTANCE hDllInstance; extern HINSTANCE hDllInstance;
typedef struct _ACE_LISTITEM typedef struct _PRINCIPAL_LISTITEM
{ {
struct _ACE_LISTITEM *Next; struct _PRINCIPAL_LISTITEM *Next;
SID_NAME_USE SidNameUse; SID_NAME_USE SidNameUse;
WCHAR *DisplayString; WCHAR *DisplayString;
WCHAR *AccountName; WCHAR *AccountName;
WCHAR *DomainName; WCHAR *DomainName;
} ACE_LISTITEM, *PACE_LISTITEM; } PRINCIPAL_LISTITEM, *PPRINCIPAL_LISTITEM;
typedef struct _SECURITY_PAGE typedef struct _SECURITY_PAGE
{ {
HWND hWnd; HWND hWnd;
HWND hBtnAdd;
HWND hBtnRemove; HWND hBtnRemove;
HWND hBtnAdvanced; HWND hBtnAdvanced;
HWND hAceCheckList; HWND hAceCheckList;
HWND hPermissionsForLabel; HWND hPermissionsForLabel;
/* Main ACE List */ /* Main Principals List */
HWND hWndAceList; HWND hWndPrincipalsList;
PACE_LISTITEM AceListHead; PPRINCIPAL_LISTITEM PrincipalsListHead;
INT ControlsMargin;
INT SpecialPermCheckIndex; INT SpecialPermCheckIndex;
HIMAGELIST hiUsrs; HIMAGELIST hiPrincipals;
LPSECURITYINFO psi; LPSECURITYINFO psi;
SI_OBJECT_INFO ObjectInfo; SI_OBJECT_INFO ObjectInfo;
@ -79,6 +82,12 @@ BOOL
ListViewSelectItem(IN HWND hwnd, ListViewSelectItem(IN HWND hwnd,
IN INT Index); IN INT Index);
HRESULT
InitializeObjectPicker(IN PCWSTR ServerName,
IN PSI_OBJECT_INFO ObjectInfo,
IN PCWSTR Attributes[],
OUT IDsObjectPicker **pDsObjectPicker);
/* CHECKLIST CONTROL **********************************************************/ /* CHECKLIST CONTROL **********************************************************/
#define CIS_DENYDISABLED (0x8) #define CIS_DENYDISABLED (0x8)

View file

@ -3,9 +3,9 @@
#define IDD_SECPAGE 101 #define IDD_SECPAGE 101
#define IDC_ACELIST 1001 #define IDC_PRINCIPALS 1001
#define IDC_ACELIST_ADD 1002 #define IDC_ADD_PRINCIPAL 1002
#define IDC_ACELIST_REMOVE 1003 #define IDC_REMOVE_PRINCIPAL 1003
#define IDC_ACE_CHECKLIST 1004 #define IDC_ACE_CHECKLIST 1004
#define IDC_LABEL_ALLOW 1005 #define IDC_LABEL_ALLOW 1005
#define IDC_LABEL_DENY 1006 #define IDC_LABEL_DENY 1006