Немногие знают, но через запросы к базе Microsoft SQL можно читать реестр и соответственно писать в него. Делается это с помощью нескольких встроенных функций:
xp_regread
xp_instance_regread
xp_regwrite
и тд
Эти процедуры являются недокументированными, поэтому в какой-то момент (а именно после 2000 SP4) логика их работы поменялась и для непривилегированных юзеров стали выдаваться ошибки.
На сайте microsoft есть документ, как исправлять это.
Хоть там и написано, что ошибка идет после установки 2000 SP4, в 2005 и 2008 сервере логика работы осталась прежней.
Но как обычно, там есть неточности и некоторые моменты не оговорены.
Во-первых, как узнать имя ключа в реестре для своего инстанса.
Идем в данную ветку:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL
Здесь смотрим параметр с именем вашего инстанса, например, MSSQL.3
Во-вторых, создаем ветку в реестре:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.3\MSSQLServer\ExtendedProcedures
По умолчанию, этот ключ не создан, его нужно создавать вручную.
В этом ключе уже создаем нужный нам параметр - для чтения или записи реестра ("Xp_regread Allowed Paths" или "Xp_regwrite_Allowed Paths"). Тип данного ключа - REG_MULTI_SZ
И в конце концов, в этом параметре прописываем нужные нам для чтения или записи ветки, по одному на строчку. И обратите внимание - ключ должен быть без символа "\" в конце. Иначе по непонятным причинам сервер mssql при чтении этого параметра получает Buffer Overflow и в запросе вернется ошибка "Access is denied"
Оказывается, расположение данных в реестре поменялось в 2005 версии, там стал использовать идентификатор инстанса вместо его имени. Пруфлинк:
ОтветитьУдалитьhttp://msdn.microsoft.com/ru-ru/library/ms143547(v=sql.90).aspx