5

Windowsの[ユーザー、サービスアカウント、またはグループの選択]ダイアログは次のとおりです。

ここに画像の説明を入力してください

APIを介してサードパーティの開発者が利用できますか?

「ADブラウザ」の共通ダイアログはありますか?

4

3 に答える 3

7

.NETソリューションをお探しの場合は、https://github.com/Tulpep/Active-Directory-Object-Pickerで利用できるNuGetを作成しました。

これは、このプロジェクトhttps://adui.codeplex.com/に基づいていますが、x64コンピューター用に更新されています。

于 2014-10-28T21:04:04.157 に答える
4

ディレクトリオブジェクトピッカー

サンプルの擬似コード:

String SelectUsers(HWND hwndParent, IList<String> usersLdapPaths)
{
   IDsObjectPicker objPicker;
   IDataObject objData;
   PDSOP_INIT_INFO pInfo;
   LPWSTR[0..2] attr;
   HRESULT hr;

   /*
      Returns the LDAP path to the selected user, e.g.:
         LDAP://stackoverflow.com/CN=Ian Boyd,OU=Stack Users,DC=stackoverflow,DC=com

      usersLdapPaths can be null. 
      If not null then the user can mutli-select users, 
      and the selected user's LDAP paths will be returned in usersLdapPaths 
      (with the function result containing just the first user)

      If the user cancels the dialog, then the result (and usersLdapPaths ) will be empty
   */
   Result := '';

   objPicker = CreateComObject(CLSID_DsObjectPicker) as IDsObjectPicker;

   System.New(pInfo);
   try
   {
      ZeroMemory(pInfo, SizeOf(DSOP_INIT_INFO));
      pInfo.cbSize = SizeOf(DSOP_INIT_INFO);
      pInfo.pwzTargetComputer = nil; //local computer

      pInfo.cDsScopeInfos := 1;
      System.New(pInfo.aDsScopeInfos);
      try
      {
         ZeroMemory(pInfo.aDsScopeInfos, SizeOf(DSOP_SCOPE_INIT_INFO));
         pInfo.aDsScopeInfos.cbSize = SizeOf(pInfo.aDsScopeInfos);
         pInfo.aDsScopeInfos.flType = DSOP_SCOPE_TYPE_UPLEVEL_JOINED_DOMAIN;  //or DSOP_SCOPE_TYPE_TARGET_COMPUTER;
         pInfo.aDsScopeInfos.flScope = DSOP_SCOPE_FLAG_WANT_PROVIDER_LDAP;
         pInfo.aDsScopeInfos.FilterFlags.Uplevel.flBothModes = DSOP_FILTER_USERS;
         pInfo.aDsScopeInfos.FilterFlags.flDownlevel = DSOP_DOWNLEVEL_FILTER_USERS;

         if (UsersLdapPaths != null)
            pInfo.flOptions = DSOP_FLAG_MULTISELECT;

         pInfo.cAttributesToFetch := 3;
         attr[0] = "description";
         attr[1] = "name";
         attr[2] = "fullName";
         pInfo.apwzAttributeNames = @attr;

         hr = objPicker.Initialize(pInfo);
         OleCheck(hr);
         hr = objPicker.InvokeDialog(hwndParent, objData);
         OleCheck(hr);

         //the result is false if the user cancelled the dialog
         if hr = S_FALSE then
            return '';

         return ReadAttributes(objData, UsersLdapPaths);
      }
      finally
      {
         System.Dispose(pInfo.aDsScopeInfos);
      }      
   }
   finally
   {
      Dispose(pInfo);
   }
}

そして、ヘルパー関数(ある擬似コード言語から別の擬似コード言語にトランスコードする必要はありません):

function TActiveDirectory.ReadAttributes(ADataObject: IDataObject; AValues: TStrings): string;
var
    fmtIn: TFormatEtc;
    stgOut: TStgMedium;
    pSelList: PDS_SELECTION_LIST;
    i: Integer;
    path: string;
//  x: LongWord;
//  pVar: POleVariant;
    items: PDsSelectionArray;
begin
    Result := '';

    if Assigned(AValues) then
        AValues.Clear;

    if not Assigned(ADataObject) then
        Exit;

    stgOut.tymed := TYMED_HGLOBAL;
    fmtIn.tymed := TYMED_HGLOBAL;
    fmtIn.cfFormat := RegisterClipboardFormat(CFSTR_DSOP_DS_SELECTION_LIST);
    fmtIn.dwAspect := DVASPECT_CONTENT;
    fmtIn.lindex := -1;

    if (ADataObject.GetData(fmtIn, stgOut) <> S_OK) then
        Exit;

    pSelList := GlobalLock(stgOut.hGlobal);
    try
        if pSelList.cItems > 0 then
            items := PDsSelectionArray(@pSellist.aDsSelection)
        else
            items := nil;

        for i := 0 to pSelList^.cItems-1 do
        begin
//          path := TDsSelectionArray(pSellist.aDsSelection)[i].pwzADsPath;
            path := items[i].pwzADsPath;

            if Assigned(AValues) then
                AValues.Add(path);

            if Result = '' then
                Result := path;

{           Result := pSelList^.aDsSelection[i].pwzName+' ('+pSelList.aDsSelection[i].pwzADsPath+')';
            AValues.Add(Result);
            AValues.Add('   Class: '+pSelList^.aDsSelection[i].pwzClass); //"user"
            AValues.Add('   UPN: '+pSelList^.aDsSelection[i].pwzUPN );    //e.g. "ian@stackoverflow.com"
            pVar := pSelList^.aDsSelection[i].pvarFetchedAttributes;
            for x := 0 to pSelList^.cFetchedAttributes-1 do
            begin
                AValues.Add('   '+VarToStr(pVar^));
                if x < pSelList^.cFetchedAttributes then
                    Inc(pVar);
            end;}
        end;
    finally
        GlobalUnlock(stgOut.hGlobal);
    end;
end;
于 2012-03-13T21:30:29.537 に答える
1

.NETおよびC#の場合:

ここに画像の説明を入力してください

于 2012-03-13T21:58:20.823 に答える