Страница 1 из 1

Active Directory + winmgmts + Getobject

Добавлено: 03 ноя 2006, 15:41
lka_76
Добрый день!
пытаюсь занятся программированием для AD
почитал в MSDN решил для начала сделать 2 вещи
1. получить список компьютеров в домене.
2. определить операционнцую систему.
нашел примеры на VB (переделал их под kixscript по сути тот же VB)
там все предельно просто

Код: Выделить всё

function domaincomp
 Dim $list, $objDomain, $objComputername, $filter[0]
 $domain=@DOMAIN
 $filter[0]='Computer'
 $objDomain = GetObject('WinNT://' + $domain + ',domain')
  if @ERROR
    exit @ERROR
  endif
 $objDomain.Filter=$filter
 if @ERROR
   exit @ERROR
 endif
 For Each $objComputername In $objDomain
    redim preserve $list[ubound($list)+1]
    $list[ubound($list)] = $objComputername.Name
    ? "Комп"+$objComputername.Name;
 Next
endfunction

Код: Выделить всё

Function OSInfo(optional $Computer)
  Dim $Syst,$
  if not $Computer $Computer = "." endif
  For Each $Syst In GetObject('winmgmts:{impersonationLevel=impersonate}!//' + $Computer + '\root\cimv2' ).ExecQuery('select * from Win32_OperatingSystem', , 48)
   ? 'Ось'+$Syst.Caption+'Версия'+$Syst.Version+'СервисПак'+$Syst.CSDVersion
  Next
EndFunction
и тут столкулся с проблемой в Delphi нет функции GetObject после блуждания по интернету нашел 2 ключевых слова
ADSI и ADO
про ADO все как-то туманно да можно рабоать но конкретно пример или описание нету.. все больше как подключиться к базам Paradox, Acess....
ADSI -- необходимо импортировать библиотеку с кучей классов, но как оказалась он не позволяет работать с winmgmts, что сразу не понравилось...

на мой взгляд можно было рабоать без привязки к классу а сразу через Variant! после некоторого блуждания в интернете наткнулся на такое описание GetObject

Код: Выделить всё

function getobject(const name:string;accs:dword=STGM_default):variant;
var err:HResult;
  bo:tBINDOPTS;
  res:IDispatch;
  nm:widestring;
begin nm := name; fillchar(bo,sizeof(bo),0);
    with bo do begin cbStruct := sizeof(bo);
      grfFlags := BIND_MAYBOTHERUSER;
      grfMode := accs;
    end;
err:=CoGetObject(  @nm[1] , @bo , IDispatch , @res );
OleCheck(err);
result:=res;
end;
да отрабатывает без ошибки, но опять но :( , теперь проблема как с VB перевести For Each ____ In ____ т. е те объекты, которые в единственном экземпляре нет проблем я получаю данные, но если их несколько, то проблема...

подскажите может кто-нибудь сталкивался с такими проблемами..
желательно пример...
заранее спасибо!

Добавлено: 06 ноя 2006, 01:35
Naeel Maqsudov
For Each для перебора элементов некой коллекции Collection1 надо переделать так.

For i:=1 to Соllection1.Count //или от 0 до Count-1

Для обращения к элементу вместо переменной цикла ForEach используется выражение вида Collection1.Item

Добавлено: 08 ноя 2006, 11:11
lka_76
Соllection1.Count
--- EOleException Not Implemented
попробуем в лоб for i:=1 to 2 do
Collection1.Item
--- EOleSysError member not found
если же попробовать Collection1.Item(i) то EOleException The Active Directory property cannot be found in the cashe
есть еще вариант использовать функции Next но Collection1.Next --- EOleException Uncpecified Error

Добавлено: 08 ноя 2006, 12:15
Лелик_1044
Если не секрет на что направлена программа?

Добавлено: 09 ноя 2006, 11:41
lka_76
на самом деле задумок много...
некоторые можно выполнить обходными маневрами, некоторые нет
например на уровне компьютеров
1. что-то типа учета компов. причем не только и нестолько оборудования, сколько месторасположения
2. выявление компов запись о которых еще есть в домене но самих компов уже нет либо их после ремонта с делали с другим именем..
на уровне пользователей
например по умолчание у пользователй доступ в сеть с 8-20 но иногда ( например перенос праздников или работа в выходные дни) необходим доступ и в нерабочее время, но разово.. хотелось это тоже атоматизировать... т.е. пршел приказ иванов, петров, сидоров работают в эту субботу и воскресенье им сделали доступ ... а в понедельник нажимаешь кнопку и кончилось им счастье :D