
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.128] |
![]() |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Здравствуйте кодеры.
Облазил весь инет, но не нашел то что ищу. Раскрою суть вопроса, а то можно не так понять. Мне необходимо показать диалог "выбора пользователей компьютеров и групп" в NT-системах. Для примера, до него можно добраться так: папка->свойства->безопасность->дополнительно->добавить. Может быть кто-то из вас с этим сталкивался? Заранее спасибо. |
Сообщ.
#2
,
|
|
|
c C++ дружишь?
|
Сообщ.
#3
,
|
|
|
Немного. Но преобразовать код С++ в Делфи могу
![]() |
Сообщ.
#5
,
|
|
|
Отлично! Спасибо еще раз!
|
Сообщ.
#6
,
|
|
|
а вообще если лень переводить то вот тебе:
![]() ![]() 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; Пример вызова: ![]() ![]() 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 Добавлено сам пользую. |
Сообщ.
#7
,
|
|
|
Переводить то действительно лень, но зато так можно "въехать" в этот код. Это ведь для меня новое. Ладно и на этом спасибо
![]() |
Сообщ.
#8
,
|
|
|
ща прокоментирую
|
Сообщ.
#9
,
|
|
|
а как указать по дефолту домен domain.int?
Параметры использую такие: ![]() ![]() 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'; то это воспринимается как компьютер, а не как домен. |
Сообщ.
#10
,
|
|
|
Цитата rtwolf @ если указать InitInfo.pwzTargetComputer := 'domain.int'; то это воспринимается как компьютер, а не как домен у меня воспринимается как домен ![]() |
Сообщ.
#11
,
|
|
|
уверен на 100%
дай тогда константы для ScopeInit[0].flType ScopeInit[0].flScope и прочего Если домен выбрать диалогом, то в поле он так и высвечивается (domain.int) ЗЫ: В действительности домен называется не так как я написал тут. |
Сообщ.
#12
,
|
|
|
Цитата rtwolf @ дай тогда константы для ScopeInit[0].flType ScopeInit[0].flScope и прочего смотри в ObjSel |
Сообщ.
#13
,
|
|
|
Нее, это я знаю. Меня интересуют Ваши константы
![]() |
Сообщ.
#14
,
|
|
|
Цитата tIce @ у меня воспринимается как домен sorry, проверил, тожа как комп. ща попробую расковырять поглубже. ![]() Добавлено попробуй убрать DSOP_SCOPE_TYPE_TARGET_COMPUTER. это приводит в тому что по умолчанию становится домен в котором ты есть. Добавлено Короче разобрался: ![]() ![]() 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'; |
Сообщ.
#15
,
|
|
|
Помогло. Теперь наверно точно можно закрывать тему
![]() Хотя нет еще, с этим я погорячился ![]() Еще один вопрос а как в резалт вернуть имя домена Domain, не выдирать же его из этого ![]() ![]() 'Object : %u'#13#10 + ' Name : %s'#13#10 + ' Class: %s'#13#10 + ' Path : %s'#13#10 + ' UPN : %s'#13#10 |