1

Тема: SQL: Получить список компьютеров домена

Доброго времени суток. ) Пришёл к Вам с вопросом: Как в SQL получить список компьютеров домена и их IP ?

Начал с поиска в интернете запросом "SQL ADSI"
http://www.google.ru/#hl=ru&source= … b63e1c0ff9
Посмотрел примеры. Подключил ADSI как базу. Но что то всё невнятно. И примеры не запускаются. Выдают ошибки.
Кто нибудь занимался подобный вопросом ? Буду очень благодарен примерам / ссылкам / кратким инструкциям и т.п. )
Из ресурсов Microsoft SQL Server 2005 и AD. Если нужна доп. информация - готов посмотреть и ответить. )

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

2

Re: SQL: Получить список компьютеров домена

День добрый!

Так как не знаю что пробовалось, опишу что делал я

1. С помощью процедуры sp_addlinkedserver создал связанный сервер(менял только первый параметр процедуры):


sp_addlinkedserver 'MyDomenAD', 'Active Directory Service Interfaces', 'ADSDSOObject', 'adsdatasource'

2. Так как у меня используется встроенная авторизация, то с помощью процедуры sp_addlinkedsrvlogin добавил логин для входа на связанный сервер(первый параметр это имя связанного сервера, назначенное в sp_addlinkedserver):


sp_addlinkedsrvlogin 'MyDomenAD', false, 'sa', 'MyDomen\Administrator', 'SuperSecretPassword'

Если я правильно перевёл "BOL2000: OLE DB Provider for Microsoft Directory Services", то при использовании в MS SQL Server Windows-авторизации этот пункт не требуется.
3. Слегка допилил запрос из MSDN:


SELECT  [NAME]
FROM OPENQUERY(MyDomenAD, 
  '
  SELECT name
  FROM ''LDAP://DC=mydomen,DC=local''
  WHERE objectCategory=''computer''
  ')

На выходе список компьютеров домена

Проверенно на MSSQL2000(девелоперский) и SQL Server Express 2005(который с "продвинутыми фичами" ). Использовано BOL2000(описание процедур) и немного MSDN(Distributed Query)

По поводу работы примеров - в попадавшихся примерах к ошибкам приводило:
1. Неправильные кавычки(главный бич примеров в интернете, результат бездумного украшательства там где это недопустимо). А именно замена одинарных на двойные, использование двойных вместо одинарных внутри строки в OPENQUERY(в запросе выше все символы кавычек одинарные).
2. Схема может отличаться, тогда выбираемые колонки или условия будут не верны. Однако QA сообщит лишь о том что "что-то не срослось" при работе с "ADSDSOObject" . В этом случае стоит попробовать убрать явно задаваемые имена колонок. Например так:


SELECT  *
FROM OPENQUERY(MyDomenAD, 
     'SELECT *
      	FROM ''LDAP://DC=mydomen,DC=local''
	')

Получим полный набор данных, анализируем что мы имеем в реальности и затачиваем запрос под нашу схему.
3. Строка авторизации. В примерах пользователь для входа на сервер для п.2 указывался в стиле AD, в результате чего QA ругался что отсутствуют права доступа к данным.

3

Re: SQL: Получить список компьютеров домена

2 Bes Yara: Очень благодарен Вам за ответ !. Т.к тема по прежнему актуальна для меня. Но к сожалению я до сих пор бьюсь всё об тот же косяк. При выполнении любого запроса получаю:

An error occurred while preparing the query "
  SELECT name
  FROM 'LDAP://DC=BANK,DC=local'
  WHERE objectCategory='computer'
  " for execution against OLE DB provider "ADSDSOObject" for linked server "BANK".

Домен у нас BANK.

Выполнял всё вот так


sp_addlinkedserver 'BANK', 'Active Directory Service Interfaces', 'ADSDSOObject', 'adsdatasource'

sp_addlinkedsrvlogin 'BANK', FALSE, 'sa', 'BANK\Администратор', 'DomainAdminPassword'

DomainAdminPassword - указывал пароль доменного Администратора.

Линковка, как и раньше прошла успешно. Ранее коннектил AD под именем ADSI.

Решил просто через интерфейс студии пощупать BANK в списке прилинкованных серверов. Дойдя до default\tables получаю сообщение:

TITLE: Microsoft SQL Server Management Studio
------------------------------

Failed to retrieve data for this request. (Microsoft.SqlServer.SmoEnum)

For help, click: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&LinkId=20476

------------------------------
ADDITIONAL INFORMATION:

An exception occurred while executing a Transact-SQL statement or batch. (Microsoft.SqlServer.ConnectionInfo)

------------------------------

Cannot obtain the required interface ("IID_IDBSchemaRowset") from OLE DB provider "ADSDSOObject" for linked server "BANK". (Microsoft SQL Server, Error: 7301)

For help, click: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=09.00.5000&EvtSrc=MSSQLServer&EvtID=7301&LinkId=20476

------------------------------
BUTTONS:

OK
------------------------------

Есть у меня подозрения, что либо какие то службы на доменконтроллере остановлены, либо порты какие то закрыты, либо и правда какой то Shem-ы нету для формирования данных в нормальном виде. В общем - хрень полная. )

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

4

Re: SQL: Получить список компьютеров домена

А домен полностью как называется, bank или bank.local?
В моём случае именно mydomen.local, хотя на mydomen тоже отзывается

Насколько влияет полное-неполное имя домена в запросе к LDAP сказать пока не могу - я уже не на работе, и эти запросы(которые из офиса работали) у меня даже через впн не срабатывают: "An error occurred while preparing a query for execution against OLE DB provider 'ADSDSOObject'". Все "костыли" которые в голову приходили уже испробовал, так что только в понедельник посмотреть смогу.

5

Re: SQL: Получить список компьютеров домена

BeS Yara

1) Полностью называется BANK. Поэтому пробывал


SELECT  *
FROM OPENQUERY(BANK, 
     'SELECT *
          FROM ''LDAP://DC=BANK,DC=local''
    ')

и


SELECT  *
FROM OPENQUERY(BANK, 
     'SELECT *
          FROM ''LDAP://DC=BANK''
    ')

К сожалению равноценно.

2) У нас свзяь доменконтроллера и SQL сервера по идее прямая. Но предполагаю, что наш главный администратор мог закрыть какие то порты в целях безопасности или остановить какие то службы на доменконтроллере.

3) Вот и я в понедельник продолжу. Спасибо за помощь.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

6

Re: SQL: Получить список компьютеров домена


SELECT  *
FROM OPENQUERY(MyDomenAD, 
     'SELECT *
          FROM ''LDAP://DC=mydomen,DC=local''
    ')

Проверил - если указываю в запросе краткое имя(без .local), то получаю ошибку: "An error occurred while preparing a query for execution against OLE DB provider 'ADSDSOObject'." Так что скорее всего проблема где-то в строке LDAP или в настроёках AD. С последним не уверен что помогу - пока работает, я стараюсь систему не трогать(экспериментировать на боевом сервере не готов)
DC - Windows Server 2003 Standart R2(32bit), SQL у меня на ноуте(WinXP Pro. Не в домене, но рабочая группа как краткое имя домена).

7

Re: SQL: Получить список компьютеров домена

Доброго вечера. ) Попробовал сегодня ещё поэкспериментировать. Пока без результатов. Почитал в инете про ошибку 7301. В качестве исправления предлагают добавить права на объект MSDAINITIALIZE для пользователя с правами и у прилинкованного сервера выставить параметры соединения с правами. Выставил.

Вот что читал на MSDN.
ссылка

Не помогает. После каждого изменения ребутал службу SQL сервера. Полный бесперспективняк.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

8

Re: SQL: Получить список компьютеров домена

Добрый день.

Посмотрел статью - для объекта ADSDSOObject там предлагается снять чекбокс у "Allow In Process"("Допускать в ходе процесса"), однако у меня этот чекбокс включен по умолчанию и всё работает.
По поводу этого чекбокса нашел такое на SQL.RU:

Запросов к ораклу выполняется много и данных они получают/отсылают тоже много. На боевом сервере регулярно кончалась непрерывная память и приходилось его перезапускать. Эта проблема вылечилась снятием галки InProcess (т.е. провайдер выполняется не в адресном пространстве sql-сервера)

Так что теоретически он тут не при чём.
Кстати, SQL сервер стартует от какой учётки? Какая авторизация на нём?
А в логах безопасности сервера(DC) есть какие-нибудь события на момент ошибки?
P.S. не знаю, существенно это или нет, но у меня на SQL именованные каналы отключены - из "средств связи" оставлен только TCP.

9

Re: SQL: Получить список компьютеров домена

2 BeS Yara:

Кстати, SQL сервер стартует от какой учётки? Какая авторизация на нём?
А в логах безопасности сервера(DC) есть какие-нибудь события на момент ошибки?

Я к сожалению плохо ориентируюсь в настройке SQL сервака. А зацепить что нибудь не то - так же стрёмно. ) Так что выяснить где эти настройки так и не смог. Решили проблему добавлением в задание VBS скрипта, который по WMI шарится и собирая нужну инфу кидает в нужную нам табличку. Не айс решение, но что поделать.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

10

Re: SQL: Получить список компьютеров домена

Учётка с которой стартует SQL указана в свойствах службы SQLSERVER(для 2005-го может называться иначе) - обычно стартует с правами локальной системы, но если для работы требуется доступ к сетевым ресурсам, то указывают учётную запись с доступом к сети.

Авторизация бывает внутренняя (суперпользователь sa) или windows-авторизация(когда используются учётные данные залогинившегося пользователя). Вариант параметров sp_addlinkedsrvlogin в этой теме подходит для внутренней авторизации пользователя, но не факт что будет работать с windows-авторизацией. Опять же вопрос - имеет ли этот пользователь достаточно прав полноценной для работы? Всё таки LocalSystem не такая уж ограниченная в правах учётка(если не считать отсутствие сетевых прав).

Логи безопасности нужно смотреть на сервере эмулирующем основной контроллер домена(если не ошибаюсь). В настройках аудита нужно проверить включен ли аудит успеха/отказа для событий безопасности.

Хотя возможно это всё тычки пальцем в небо, и имеет место неприятный и трудно вылавливаемый глюк...