1

管理機能やその他の拡張機能を使用して、アプリケーションから Active Directory 検索ウィンドウを呼び出そうとしました。この目的のために、私はそのようなフラグを使用しています:

DSQPF_ENABLEADMINFEATURES | DSQPF_ENABLEADVANCEDFEATURES;

MSDN で説明されているように:

DSQPF_ENABLEADMINFEATURES -コンテキスト メニュープロパティ ページの管理表示指定子など、ディレクトリ サービス管理ツールでサポートされている機能を使用します。

DSQPF_ENABLEADVANCEDFEATURES -コンテキスト メニュープロパティ ページに渡される IDataObject インスタンスで高度な機能を指定します。

この 2 つのフラグは、タブに対して完全に機能します。ドメイン管理者として、ユーザーのプロパティに多くのタブが表示されます。ただし、このパラメータはコンテキスト メニューには影響しません。ここで例:

  1. Server Managerから呼び出された検索ダイアログ。管理コンテキスト メニューが表示されます。

サーバー マネージャーのスクリーンショット

  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;
}
4

0 に答える 0