На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! user posted image
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Соблюдайте общие правила форума

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры - внедрение в удаленное адресное прстранство)
... (продолжение следует) ...

Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки - бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

Модераторы: Rouse_, Krid
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Показать диалог выбора пользователей
    Здравствуйте кодеры.
    Облазил весь инет, но не нашел то что ищу. Раскрою суть вопроса, а то можно не так понять. Мне необходимо показать диалог "выбора пользователей компьютеров и групп" в NT-системах. Для примера, до него можно добраться так: папка->свойства->безопасность->дополнительно->добавить. Может быть кто-то из вас с этим сталкивался?
    Заранее спасибо.
      c C++ дружишь?
        Немного. Но преобразовать код С++ в Делфи могу ;)
        Сообщение отредактировано: rtwolf -
          Цитата rtwolf @
          Немного. Но преодразовать код С++ в Делфи могу


          смотри тут
            Отлично! Спасибо еще раз!
              а вообще если лень переводить то вот тебе:

              ExpandedWrap disabled
                function InitObjectPicker(Picker: IDsObjectPicker): HRESULT;
                var
                  ScopeInit: array [0..0] of TDSOPScopeInitInfo; // ибъект который указывает что будем выбирать
                  InitInfo: TDSOPInitInfo; // информация об инициализации
                begin
                  if nil = Picker then
                    Result := E_INVALIDARG
                  else
                  begin
                    ZeroMemory(@ScopeInit, SizeOf(ScopeInit)); //заполняем нулями
                    ScopeInit[0].cbSize := SizeOf(TDSOPScopeInitInfo); // заполняем структуру TDSOPScopeInitInfo
                    ScopeInit[0].flType := DSOP_SCOPE_TYPE_TARGET_COMPUTER;
                    ScopeInit[0].flScope := DSOP_SCOPE_TYPE_USER_ENTERED_DOWNLEVEL_SCOPE;
                    ScopeInit[0].FilterFlags.Uplevel.flBothModes := DSOP_FILTER_USERS;
                    ScopeInit[0].FilterFlags.flDownlevel := DSOP_DOWNLEVEL_FILTER_USERS;
                 
                    ZeroMemory(@InitInfo, SizeOf(InitInfo));// заполняем структуру TDSOPInitInfo
                    InitInfo.cbSize := SizeOf(InitInfo);
                    InitInfo.cDsScopeInfos := SizeOf(ScopeInit) div SizeOf(TDSOPScopeInitInfo);
                    InitInfo.aDsScopeInfos := @ScopeInit;
                    InitInfo.flOptions := DSOP_FLAG_SKIP_TARGET_COMPUTER_DC_CHECK;
                // инициализируем объект выбора
                    Result := Picker.Initialize(InitInfo);
                  end;
                end;
                 
                function ProcessSelectedObjects(DatObj: IDataObject): HRESULT;
                var
                  StgMed: TStgMedium; //объект хранения данных
                  FmtEtc: TFormatEtc;  //формат ыввода данных
                  SelLst: PDSSelectionList;  //выбранные объекты
                  Index: ULONG;  
                  Text: string;
                begin
                //проверка на "дурака"
                 if nil = DatObj then
                    Result := E_INVALIDARG
                  else
                  begin
                    with FmtEtc do
                    begin
                //регистрируем формат вывода данных
                      cfFormat := RegisterClipboardFormat(CFSTR_DSOP_DS_SELECTION_LIST);
                      ptd      := nil;
                      dwAspect := DVASPECT_CONTENT;
                      lindex   := -1;
                      tymed    := TYMED_HGLOBAL;
                    end;
                    Result := DatObj.GetData(FmtEtc, StgMed);
                    if Succeeded(Result) then
                    begin
                //получаем результат вызора в удобоваримом формате
                      SelLst := PDS_SELECTION_LIST(GlobalLock(StgMed.hGlobal));
                // и если не nil обрабатываем его
                      if SelLst <> nil then
                      try
                        Text := '';
                        for Index := 0 to SelLst.cItems - 1 do
                        begin
                          Text := Text + Format(
                            'Object : %u'#13#10 +
                            '  Name : %s'#13#10 +
                            '  Class: %s'#13#10 +
                            '  Path : %s'#13#10 +
                            '  UPN  : %s'#13#10, [
                            Index,
                            WideCharToString(SelLst.aDsSelection[Index].pwzName),
                            WideCharToString(SelLst.aDsSelection[Index].pwzClass),
                            WideCharToString(SelLst.aDsSelection[Index].pwzADsPath),
                            WideCharToString(SelLst.aDsSelection[Index].pwzUPN)]);
                        end;
                        ShowMessage(Text);
                      finally
                        GlobalUnlock(StgMed.hGlobal);
                      end
                      else
                        Result := E_POINTER;
                 
                      ReleaseStgMedium(StgMed);
                    end;
                  end;
                end;


              Пример вызова:
              ExpandedWrap disabled
                procedure TForm1.Button1Click(Sender: TObject);
                var
                  Picker: IDsObjectPicker;
                  DatObj: IDataObject;
                begin
                //инициализируем COM+
                  if Succeeded(CoInitialize(nil)) then
                  try
                // создаем Picker как объект COM+
                    if Succeeded(CoCreateInstance(CLSID_DsObjectPicker, nil,
                      CLSCTX_INPROC_SERVER, IID_IDsObjectPicker, Picker)) then
                    try
                //если инициализация Picker успешна вызываем сам диалог
                      if Succeeded(InitObjectPicker(Picker)) then
                        case Picker.InvokeDialog(Self.Handle, DatObj) of
                          S_OK:
                            try
                //вызов диалога
                              ProcessSelectedObjects(DatObj);
                            finally
                //освобождаем DatObj
                              DatObj := nil;
                            end;
                          S_FALSE:
                            ShowMessage('Ничего не выбрано');
                        end;
                    finally
                      Picker := nil;
                    end;
                  finally
                    CoUninitialize;
                  end;
                end;


              только добавь в uses ActiveX и ObjSel

              Добавлено
              сам пользую.
              Сообщение отредактировано: tIce -
                Переводить то действительно лень, но зато так можно "въехать" в этот код. Это ведь для меня новое. Ладно и на этом спасибо :)
                  ща прокоментирую
                    а как указать по дефолту домен domain.int?
                    Параметры использую такие:
                    ExpandedWrap disabled
                          ScopeInit[0].cbSize := SizeOf(TDSOPScopeInitInfo);
                          ScopeInit[0].flType := DSOP_SCOPE_TYPE_UPLEVEL_JOINED_DOMAIN or
                                                      DSOP_SCOPE_TYPE_DOWNLEVEL_JOINED_DOMAIN or
                                                      DSOP_SCOPE_TYPE_GLOBAL_CATALOG or
                                                      DSOP_SCOPE_TYPE_ENTERPRISE_DOMAIN or
                                                      DSOP_SCOPE_TYPE_EXTERNAL_UPLEVEL_DOMAIN or
                                                      DSOP_SCOPE_TYPE_EXTERNAL_DOWNLEVEL_DOMAIN or
                                      DSOP_SCOPE_TYPE_TARGET_COMPUTER;
                          ScopeInit[0].flScope := DSOP_SCOPE_TYPE_USER_ENTERED_DOWNLEVEL_SCOPE;
                          ScopeInit[0].FilterFlags.Uplevel.flBothModes := DSOP_FILTER_USERS;
                          ScopeInit[0].FilterFlags.flDownlevel := DSOP_DOWNLEVEL_FILTER_USERS;


                    если указать
                    InitInfo.pwzTargetComputer := 'domain.int';
                    то это воспринимается как компьютер, а не как домен.
                    Сообщение отредактировано: rtwolf -
                      Цитата rtwolf @
                      если указать
                      InitInfo.pwzTargetComputer := 'domain.int';
                      то это воспринимается как компьютер, а не как домен


                      у меня воспринимается как домен :wacko: незнаю, а ты уверен что как компьютер?
                        уверен на 100%
                        дай тогда константы для
                        ScopeInit[0].flType
                        ScopeInit[0].flScope и прочего
                        Если домен выбрать диалогом, то в поле он так и высвечивается (domain.int)
                        ЗЫ: В действительности домен называется не так как я написал тут.
                          Цитата rtwolf @
                          дай тогда константы для
                          ScopeInit[0].flType
                          ScopeInit[0].flScope и прочего

                          смотри в ObjSel
                            Нее, это я знаю. Меня интересуют Ваши константы :), те с которыми ваш домен правильно отображается/определяется в диалоге
                              Цитата tIce @
                              у меня воспринимается как домен

                              sorry, проверил, тожа как комп. ща попробую расковырять поглубже. :)

                              Добавлено
                              попробуй убрать DSOP_SCOPE_TYPE_TARGET_COMPUTER. это приводит в тому что по умолчанию становится домен в котором ты есть.

                              Добавлено
                              Короче разобрался:
                              ExpandedWrap disabled
                                    ZeroMemory(@ScopeInit, SizeOf(ScopeInit));
                                    ScopeInit[0].cbSize := SizeOf(TDSOPScopeInitInfo);
                                    ScopeInit[0].flType := DSOP_SCOPE_TYPE_UPLEVEL_JOINED_DOMAIN or
                                                                DSOP_SCOPE_TYPE_EXTERNAL_UPLEVEL_DOMAIN;
                                 
                                    ScopeInit[0].flScope := DSOP_SCOPE_TYPE_USER_ENTERED_DOWNLEVEL_SCOPE;
                                    ScopeInit[0].FilterFlags.Uplevel.flBothModes := DSOP_FILTER_USERS;
                                    ScopeInit[0].FilterFlags.flDownlevel := DSOP_DOWNLEVEL_FILTER_USERS;
                                 
                                    ZeroMemory(@InitInfo, SizeOf(InitInfo));
                                    InitInfo.cbSize := SizeOf(InitInfo);
                                    InitInfo.cDsScopeInfos := SizeOf(ScopeInit) div SizeOf(TDSOPScopeInitInfo);
                                    InitInfo.aDsScopeInfos := @ScopeInit;
                                    InitInfo.flOptions :=DSOP_FLAG_SKIP_TARGET_COMPUTER_DC_CHECK;
                                    initInfo.pwzTargetComputer:='Domain.int';
                                Помогло. Теперь наверно точно можно закрывать тему :)

                                Хотя нет еще, с этим я погорячился :)
                                Еще один вопрос а как в резалт вернуть имя домена Domain, не выдирать же его из этого
                                ExpandedWrap disabled
                                              'Object : %u'#13#10 +
                                              '  Name : %s'#13#10 +
                                              '  Class: %s'#13#10 +
                                              '  Path : %s'#13#10 +
                                              '  UPN  : %s'#13#10
                                Сообщение отредактировано: rtwolf -
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0438 ]   [ 15 queries used ]   [ Generated: 17.07.25, 20:30 GMT ]