
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.3] |
![]() |
|
Сообщ.
#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 |
Сообщ.
#16
,
|
|
|
Цитата rtwolf @ не выдирать же его из этого ![]() ![]() 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)]); //сдесь выдирается имя домена (s:string) s:=WideCharToString(SelLst.aDsSelection[Index].pwzUPN); delete(s,1,pos('@',s)); // в результате в s будет имя домена |
Сообщ.
#17
,
|
|
|
Ну я это и имел ввиду, только думал не из UPN а из ADsPath.
А более "правильного" метода нет? |
Сообщ.
#18
,
|
|
|
Цитата rtwolf @ А более "правильного" метода нет? думаю что нет |
![]() |
Сообщ.
#19
,
|
|
tIce, а где ты ObjSel взял?
|
Сообщ.
#20
,
|
|
|
Цитата Rouse_ @ tIce, а где ты ObjSel взял? http://cvs.sourceforge.net/viewcvs.py/jvcl/dev/JVCL3/common/ скачать надо ObjSel.pas, jedi.inc, jvcl.inc, jvcld7.inc (для D7) и windowsonly.inc |
![]() |
Сообщ.
#21
,
|
|
Блин, ну я так и подумал что из JCL, только у меня это называется JclObjSel.pas...
tIce, надеюсь ты не будешь против если я чуть поправленный код в FAQ выложу. Структуры просто необходимые из JclObjSel.pas в основной модуль перетащу? Завтра покажу, у меня на работе просто все лежит... Да кстати, за примерчик лови + |
Сообщ.
#22
,
|
|
|
Цитата Rouse_ @ надеюсь ты не будешь против конечно не против, выкладывай сколько надо. ![]() ![]() |
![]() |
Сообщ.
#23
,
|
|
Сообщ.
#24
,
|
|
|
Цитата Rouse_ @ Вот итого отлично, только я думаю надо выложить полный список DSOP_SCOPE_TYPE_... (может кому понадобится глобальный каталог, uplevel или downlevel) ![]() ![]() DSOP_SCOPE_TYPE_TARGET_COMPUTER = $00000001; DSOP_SCOPE_TYPE_UPLEVEL_JOINED_DOMAIN = $00000002; DSOP_SCOPE_TYPE_DOWNLEVEL_JOINED_DOMAIN = $00000004; DSOP_SCOPE_TYPE_ENTERPRISE_DOMAIN = $00000008; DSOP_SCOPE_TYPE_GLOBAL_CATALOG = $00000010; DSOP_SCOPE_TYPE_EXTERNAL_UPLEVEL_DOMAIN = $00000020; DSOP_SCOPE_TYPE_EXTERNAL_DOWNLEVEL_DOMAIN = $00000040; DSOP_SCOPE_TYPE_WORKGROUP = $00000080; DSOP_SCOPE_TYPE_USER_ENTERED_UPLEVEL_SCOPE = $00000100; DSOP_SCOPE_TYPE_USER_ENTERED_DOWNLEVEL_SCOPE = $00000200; флаги выбора ![]() ![]() DSOP_SCOPE_FLAG_STARTING_SCOPE = $00000001; DSOP_SCOPE_FLAG_WANT_PROVIDER_WINNT = $00000002; DSOP_SCOPE_FLAG_WANT_PROVIDER_LDAP = $00000004; DSOP_SCOPE_FLAG_WANT_PROVIDER_GC = $00000008; DSOP_SCOPE_FLAG_WANT_SID_PATH = $00000010; DSOP_SCOPE_FLAG_WANT_DOWNLEVEL_BUILTIN_PATH = $00000020; DSOP_SCOPE_FLAG_DEFAULT_FILTER_USERS = $00000040; DSOP_SCOPE_FLAG_DEFAULT_FILTER_GROUPS = $00000080; DSOP_SCOPE_FLAG_DEFAULT_FILTER_COMPUTERS = $00000100; DSOP_SCOPE_FLAG_DEFAULT_FILTER_CONTACTS = $00000200; и фильтры ![]() ![]() DSOP_FILTER_INCLUDE_ADVANCED_VIEW = $00000001; DSOP_FILTER_USERS = $00000002; DSOP_FILTER_BUILTIN_GROUPS = $00000004; DSOP_FILTER_WELL_KNOWN_PRINCIPALS = $00000008; DSOP_FILTER_UNIVERSAL_GROUPS_DL = $00000010; DSOP_FILTER_UNIVERSAL_GROUPS_SE = $00000020; DSOP_FILTER_GLOBAL_GROUPS_DL = $00000040; DSOP_FILTER_GLOBAL_GROUPS_SE = $00000080; DSOP_FILTER_DOMAIN_LOCAL_GROUPS_DL = $00000100; DSOP_FILTER_DOMAIN_LOCAL_GROUPS_SE = $00000200; DSOP_FILTER_CONTACTS = $00000400; DSOP_FILTER_COMPUTERS = $00000800; |