ICommonQuery::OpenQueryWindow. Нет административного контекстного меню в результатах поиска

Я попытался вызвать окно поиска Active Directory из моего приложения с административными и другими расширенными функциями. Для этого я использую такие флаги:

DSQPF_ENABLEADMINFEATURES | DSQPF_ENABLEADVANCEDFEATURES;

Как описано в MSDN:

DSQPF_ENABLEADMINFEATURES - использует функции, поддерживаемые инструментами администрирования службы каталогов, такими как Admin Display Specifier для контекстных меню и страниц свойств.

DSQPF_ENABLEADVANCEDFEATURES - указывает расширенные функции в экземпляре IDataObject, передаваемые в контекстные меню и страницы свойств.

Эти два флага отлично работают для вкладок. Как администратор домена, я вижу много вкладок в свойствах пользователя. Но этот параметр не влияет на контекстное меню. Вот пример:

  1. Диалог поиска, который был вызван из диспетчера сервера. Вы можете увидеть административное контекстное меню.

Скриншот диспетчера сервера

  1. Это диалог, вызываемый из моего приложения. Здесь очень короткое контекстное меню, но если я нажму " Свойства", я смогу изменить все, что связано с этой учетной записью, с правами администратора.

Вызвать из приложения Скриншот

Приложение запускается от администратора домена. 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;
}

0 ответов

Другие вопросы по тегам