Я попытался вызвать окно поиска Active Directory из моего приложения с административными и другими расширенными функциями. Для этого я использую такие флаги:
DSQPF_ENABLEADMINFEATURES | DSQPF_ENABLEADVANCEDFEATURES;
Как описано в MSDN:
DSQPF_ENABLEADMINFEATURES — Использует функции, поддерживаемые инструментами администрирования службы каталогов, такими как Admin Display Specifier для контекстные меню а также страницы свойств.
DSQPF_ENABLEADVANCEDFEATURES — Задает расширенные функции в экземпляре IDataObject, передаваемом контекстные меню а также страницы свойств.
Эти два флага отлично работают для вкладок. Как администратор домена, я вижу много вкладок в свойствах пользователя. Но этот параметр не влияет на контекстное меню. Вот пример:
Вызвать из приложения Скриншот
Приложение запускается от администратора домена. UAC отключен. Протестировано на Windows Server 2008 R2.
Есть ли способ показать это контекстное меню?
Здесь вы можете увидеть пример кода, который я использовал для вызова диалога поиска AD.
#include "stdafx.h"#include "activeds.h"#include "cmnquery.h"#include "dsquery.h"#include "shlobj.h"#include "dsclient.h"#include "windows.h"
#pragma comment(lib, "uuid.lib")
#pragma comment(lib, "activeds.lib")
HRESULT FindADUsers(HWND hwndParent)
{
HRESULT hr;
ICommonQuery *pcq;
hr = CoCreateInstance(CLSID_CommonQuery,
NULL,
CLSCTX_INPROC_SERVER,
IID_ICommonQuery,
(LPVOID*)&pcq);
if (SUCCEEDED(hr))
{
OPENQUERYWINDOW openQueryWindow;
DSQUERYINITPARAMS dqip;
IDataObject *pdo;
ZeroMemory(&openQueryWindow, sizeof(openQueryWindow));
openQueryWindow.cbStruct = sizeof(openQueryWindow);
openQueryWindow.dwFlags = OQWF_DEFAULTFORM | OQWF_SINGLESELECT | OQWF_SHOWOPTIONAL;
openQueryWindow.pHandlerParameters = &dqip;
openQueryWindow.clsidHandler = CLSID_DsQuery;
openQueryWindow.clsidDefaultForm = CLSID_DsFindPeople;
ZeroMemory(&dqip, sizeof(dqip));
dqip.cbStruct = sizeof(dqip);
dqip.dwFlags = DSQPF_NOSAVE | DSQPF_SHOWHIDDENOBJECTS | DSQPF_ENABLEADMINFEATURES | DSQPF_ENABLEADVANCEDFEATURES;
hr = pcq->OpenQueryWindow(hwndParent, &openQueryWindow, &pdo);
if (S_OK == hr)
{
pdo->Release();
}
pcq->Release();
}
return hr;
}
// Entry point for application
int main(int argc, _TCHAR* argv[])
{
HRESULT hr;
CoInitialize(NULL);
hr = FindADUsers(NULL);
CoUninitialize();
return 0;
}
Задача ещё не решена.
Других решений пока нет …