show the object picker dialog when clicking the Add button

svn path=/trunk/; revision=16742
This commit is contained in:
Thomas Bluemel 2005-07-26 13:42:15 +00:00
parent 1d403604a1
commit 20dbd58c45
3 changed files with 132 additions and 11 deletions

View file

@ -41,6 +41,8 @@ DestroySecurityPage(IN PSECURITY_PAGE sp)
HeapFree(GetProcessHeap(), HeapFree(GetProcessHeap(),
0, 0,
sp); sp);
CoUninitialize();
} }
static VOID static VOID
@ -456,7 +458,7 @@ SecurityPageCallback(IN HWND hwnd,
{ {
PSECURITY_PAGE sp = (PSECURITY_PAGE)ppsp->lParam; PSECURITY_PAGE sp = (PSECURITY_PAGE)ppsp->lParam;
switch(uMsg) switch (uMsg)
{ {
case PSPCB_CREATE: case PSPCB_CREATE:
{ {
@ -568,6 +570,82 @@ LoadPermissionsList(IN PSECURITY_PAGE sp,
} }
} }
static HRESULT
InitializeObjectPicker(IN PSECURITY_PAGE sp,
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;
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
},
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 = (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) &&
(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;
}
static INT_PTR CALLBACK static INT_PTR CALLBACK
SecurityPageProc(IN HWND hwndDlg, SecurityPageProc(IN HWND hwndDlg,
IN UINT uMsg, IN UINT uMsg,
@ -576,7 +654,7 @@ SecurityPageProc(IN HWND hwndDlg,
{ {
PSECURITY_PAGE sp; PSECURITY_PAGE sp;
switch(uMsg) switch (uMsg)
{ {
case WM_NOTIFY: case WM_NOTIFY:
{ {
@ -587,7 +665,7 @@ SecurityPageProc(IN HWND hwndDlg,
{ {
if (pnmh->hwndFrom == sp->hWndAceList) if (pnmh->hwndFrom == sp->hWndAceList)
{ {
switch(pnmh->code) switch (pnmh->code)
{ {
case LVN_ITEMCHANGED: case LVN_ITEMCHANGED:
{ {
@ -605,7 +683,7 @@ SecurityPageProc(IN HWND hwndDlg,
} }
else if (pnmh->hwndFrom == sp->hAceCheckList) else if (pnmh->hwndFrom == sp->hAceCheckList)
{ {
switch(pnmh->code) switch (pnmh->code)
{ {
case CLN_CHANGINGITEMCHECKBOX: case CLN_CHANGINGITEMCHECKBOX:
{ {
@ -625,6 +703,40 @@ SecurityPageProc(IN HWND hwndDlg,
break; break;
} }
case WM_COMMAND:
{
switch (LOWORD(wParam))
{
case IDC_ACELIST_ADD:
{
HRESULT hRet;
IDsObjectPicker *pDsObjectPicker = NULL;
IDataObject *Selections = NULL;
sp = (PSECURITY_PAGE)GetWindowLongPtr(hwndDlg,
DWL_USER);
hRet = InitializeObjectPicker(sp,
&pDsObjectPicker);
if (SUCCEEDED(hRet))
{
hRet = pDsObjectPicker->lpVtbl->InvokeDialog(pDsObjectPicker,
hwndDlg,
&Selections);
if (FAILED(hRet))
{
MessageBox(hwndDlg, L"InvokeDialog failed!\n", NULL, 0);
}
/* delete the instance */
pDsObjectPicker->lpVtbl->Release(pDsObjectPicker);
}
break;
}
}
break;
}
case WM_INITDIALOG: case WM_INITDIALOG:
{ {
sp = (PSECURITY_PAGE)((LPPROPSHEETPAGE)lParam)->lParam; sp = (PSECURITY_PAGE)((LPPROPSHEETPAGE)lParam)->lParam;
@ -751,7 +863,7 @@ CreateSecurityPage(IN LPSECURITYINFO psi)
SI_OBJECT_INFO ObjectInfo; SI_OBJECT_INFO ObjectInfo;
HRESULT hRet; HRESULT hRet;
if(psi == NULL) if (psi == NULL)
{ {
SetLastError(ERROR_INVALID_PARAMETER); SetLastError(ERROR_INVALID_PARAMETER);
@ -765,7 +877,7 @@ CreateSecurityPage(IN LPSECURITYINFO psi)
ZeroMemory(&ObjectInfo, sizeof(ObjectInfo)); ZeroMemory(&ObjectInfo, sizeof(ObjectInfo));
hRet = psi->lpVtbl->GetObjectInformation(psi, &ObjectInfo); hRet = psi->lpVtbl->GetObjectInformation(psi, &ObjectInfo);
if(FAILED(hRet)) if (FAILED(hRet))
{ {
SetLastError(hRet); SetLastError(hRet);
@ -773,6 +885,13 @@ CreateSecurityPage(IN LPSECURITYINFO psi)
return NULL; return NULL;
} }
hRet = CoInitialize(NULL);
if (FAILED(hRet))
{
DPRINT("CoInitialize failed!\n");
return NULL;
}
if (!RegisterCheckListControl(hDllInstance)) if (!RegisterCheckListControl(hDllInstance))
{ {
DPRINT("Registering the CHECKLIST_ACLUI class failed!\n"); DPRINT("Registering the CHECKLIST_ACLUI class failed!\n");
@ -802,7 +921,7 @@ CreateSecurityPage(IN LPSECURITYINFO psi)
psp.lParam = (LPARAM)sPage; psp.lParam = (LPARAM)sPage;
psp.pfnCallback = SecurityPageCallback; psp.pfnCallback = SecurityPageCallback;
if(ObjectInfo.dwFlags & SI_PAGE_TITLE) if (ObjectInfo.dwFlags & SI_PAGE_TITLE)
{ {
psp.pszTitle = ObjectInfo.pszPageTitle; psp.pszTitle = ObjectInfo.pszPageTitle;
@ -840,7 +959,7 @@ EditSecurity(IN HWND hwndOwner,
LPWSTR lpCaption; LPWSTR lpCaption;
BOOL Ret; BOOL Ret;
if(psi == NULL) if (psi == NULL)
{ {
SetLastError(ERROR_INVALID_PARAMETER); SetLastError(ERROR_INVALID_PARAMETER);
@ -854,7 +973,7 @@ EditSecurity(IN HWND hwndOwner,
ZeroMemory(&ObjectInfo, sizeof(ObjectInfo)); ZeroMemory(&ObjectInfo, sizeof(ObjectInfo));
hRet = psi->lpVtbl->GetObjectInformation(psi, &ObjectInfo); hRet = psi->lpVtbl->GetObjectInformation(psi, &ObjectInfo);
if(FAILED(hRet)) if (FAILED(hRet))
{ {
SetLastError(hRet); SetLastError(hRet);
@ -864,7 +983,7 @@ EditSecurity(IN HWND hwndOwner,
/* create the page */ /* create the page */
hPages[0] = CreateSecurityPage(psi); hPages[0] = CreateSecurityPage(psi);
if(hPages[0] == NULL) if (hPages[0] == NULL)
{ {
DPRINT("CreateSecurityPage(), couldn't create property sheet!\n"); DPRINT("CreateSecurityPage(), couldn't create property sheet!\n");
return FALSE; return FALSE;
@ -890,7 +1009,7 @@ EditSecurity(IN HWND hwndOwner,
Ret = (PropertySheet(&psh) != -1); Ret = (PropertySheet(&psh) != -1);
if(lpCaption != NULL) if (lpCaption != NULL)
{ {
LocalFree((HLOCAL)lpCaption); LocalFree((HLOCAL)lpCaption);
} }

View file

@ -12,6 +12,7 @@
<library>user32</library> <library>user32</library>
<library>gdi32</library> <library>gdi32</library>
<library>comctl32</library> <library>comctl32</library>
<library>ole32</library>
<library>uxtheme</library> <library>uxtheme</library>
<file>aclui.c</file> <file>aclui.c</file>
<file>checklist.c</file> <file>checklist.c</file>

View file

@ -1,5 +1,6 @@
#include <windows.h> #include <windows.h>
#include <commctrl.h> #include <commctrl.h>
#include <objsel.h>
#include <prsht.h> #include <prsht.h>
#include <aclui.h> #include <aclui.h>
#include <sddl.h> #include <sddl.h>