1

我尝试使用管理和其他扩展功能从我的应用程序调用 Active Directory 搜索窗口。为此,我使用了这样的标志:

DSQPF_ENABLEADMINFEATURES | DSQPF_ENABLEADVANCEDFEATURES;

如 MSDN 中所述:

DSQPF_ENABLEADMINFEATURES - 使用目录服务管理工具支持的功能,例如上下文菜单属性页的管理显示说明符。

DSQPF_ENABLEADVANCEDFEATURES - 指定传递给上下文菜单属性页的 IDataObject 实例中的高级功能。

这两个标志非常适用于标签。作为域管理员,我可以在用户属性中看到很多选项卡。但是这个参数对上下文菜单没有影响。这里的例子:

  1. 从服务器管理器调用的搜索对话框。您可以看到管理上下文菜单。

服务器管理器截图

  1. 这是从我的应用程序调用的对话框。上下文菜单非常短,但如果我单击Properties,我将能够使用管理权限更改与此帐户相关的所有内容。

从应用程序屏幕截图调用

应用程序从域管理员运行。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;
}
4

0 回答 0