Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 OpenRowSet(BULK ...) = error code 5...  [new]
Greenhorn
Member

Откуда:
Сообщений: 311
Добрый день.

Есть Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64)
Apr 2 2010 15:48:46
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)
Работающий в домене из под LocalSystem_а (вопрос о доменной учетке решается второй день).

Настроен Proxy windows account на xp_cmedshell
Логинимся к SQL_ю под c этой учеткой
Есть необходимость грузить файл с удаленной шары.
Проверяем доступ к файлу:
exec sp_cmdshell 'type \\RemoteServer\ShareName\txtFile.txt'

получаем содержимое этого файла
Проверяем, что не приснилось и зашел с нужной учеткой: select suser_name() - Все ОК - не приснилось.
Пытаемя выполнить OpenRowSet(); Bulk insert
SELECT *
FROM OpenRowSet( 
   BULK '\\RemoteServer\ShareName\txtFile.txt'
  ,FORMATFILE='c:\XML_Format\Format.xml'
  ,FIRSTROW=2
) as t


Cannot bulk load because the file "\\RemoteServer\ShareName\txtFile.txt" could not be opened. Operating system error code 5(Отказано в доступе.)
Читаю BOL
Если пользователь использует имя входа SQL Server, то применяется профиль безопасности учетной записи процесса SQL Server.
Если пользователь SQL Server входит в систему с проверкой подлинности Windows, то ему доступны только те файлы, к которым имеет доступ учетная запись пользователя,
независимо от профиля безопасности процесса SQL Server.

Ничего не понимаю - в чем проблема ?
20 ноя 12, 11:07    [13498878]     Ответить | Цитировать Сообщить модератору
 Re: OpenRowSet(BULK ...) = error code 5...  [new]
Glory
Member

Откуда:
Сообщений: 104760
Greenhorn
Ничего не понимаю - в чем проблема ?


"error code 5(Отказано в доступе)"
"Если пользователь использует имя входа SQL Server, то применяется профиль безопасности учетной записи процесса SQL Server."

Greenhorn
Логинимся к SQL_ю под c этой учеткой

Какой "этой" ? sql login или windows authentication ?
20 ноя 12, 11:14    [13498900]     Ответить | Цитировать Сообщить модератору
 Re: OpenRowSet(BULK ...) = error code 5...  [new]
Greenhorn
Member

Откуда:
Сообщений: 311
Glory
Greenhorn
Ничего не понимаю - в чем проблема ?


"error code 5(Отказано в доступе)"
"Если пользователь использует имя входа SQL Server, то применяется профиль безопасности учетной записи процесса SQL Server."

Greenhorn
Логинимся к SQL_ю под c этой учеткой

Какой "этой" ? sql login или windows authentication ?

С windows учеткой (доменной), у которой есть права на чтение файла. Проверено несколькими способами:
1) Через проводник с сервера, на котором крутится SQL
2) через xp_cmdshell 'type \\RemoteServer\ShareName\txtFile.txt'

Ситуация стала еще загадочней. SQL_ю выдали доменную учетку, рестартовали с ней.
Залогинился на SQL с этой доменной учеткой (свежевыданной для SQL_я) и получил тот-же "error code 5(Отказано в доступе)"
Досту к файлу проверил всеми перечисленными выше способами.

Что за бред ?
20 ноя 12, 11:26    [13498947]     Ответить | Цитировать Сообщить модератору
 Re: OpenRowSet(BULK ...) = error code 5...  [new]
Glory
Member

Откуда:
Сообщений: 104760
Greenhorn
С windows учеткой (доменной), у которой есть права на чтение файла. Проверено несколькими способами:
1) Через проводник с сервера, на котором крутится SQL
2) через xp_cmdshell 'type \\RemoteServer\ShareName\txtFile.txt'

Вы уверяете, что у вас на xp_cmdshell сделан прокси аккаунт
Т.е. type \\RemoteServer\ShareName\txtFile.txt работает вовсе не под той учетной записью, под которой произошел логин
20 ноя 12, 11:30    [13498967]     Ответить | Цитировать Сообщить модератору
 Re: OpenRowSet(BULK ...) = error code 5...  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
Greenhorn,

а ко второму файлу c:\XML_Format\Format.xml вы тоже доступ проверили?
20 ноя 12, 11:33    [13498987]     Ответить | Цитировать Сообщить модератору
 Re: OpenRowSet(BULK ...) = error code 5...  [new]
Greenhorn
Member

Откуда:
Сообщений: 311
WarAnt
Greenhorn,

а ко второму файлу c:\XML_Format\Format.xml вы тоже доступ проверили?


Прикольно - а доступа то нет !!!
Спасибо.
20 ноя 12, 11:53    [13499135]     Ответить | Цитировать Сообщить модератору
 Re: OpenRowSet(BULK ...) = error code 5...  [new]
Greenhorn
Member

Откуда:
Сообщений: 311
Greenhorn
WarAnt
Greenhorn,

а ко второму файлу c:\XML_Format\Format.xml вы тоже доступ проверили?


Прикольно - а доступа то нет !!!
Спасибо.

Тем не менее bulk insert тоже не работает !!!
20 ноя 12, 11:56    [13499163]     Ответить | Цитировать Сообщить модератору
 Re: OpenRowSet(BULK ...) = error code 5...  [new]
Greenhorn
Member

Откуда:
Сообщений: 311
Glory
Greenhorn
С windows учеткой (доменной), у которой есть права на чтение файла. Проверено несколькими способами:
1) Через проводник с сервера, на котором крутится SQL
2) через xp_cmdshell 'type \\RemoteServer\ShareName\txtFile.txt'

Вы уверяете, что у вас на xp_cmdshell сделан прокси аккаунт
Т.е. type \\RemoteServer\ShareName\txtFile.txt работает вовсе не под той учетной записью, под которой произошел логин

Т.е если я говорю
Greenhorn
Настроен Proxy windows account на xp_cmdshell
Логинимся к SQL_ю под этой учеткой

То это означает, что я вошел на SQL, специально под доменной учеткой, которая используется для proxy account_а.
Кстати, только для этой учетки открыт доступ на чтение.
И xp_cmd_shell 'type ...' подтверждает, что доступ на чтение к файлу есть.
Greenhorn
Проверяем, что не приснилось и зашел с нужной учеткой: select suser_name() - Все ОК - не приснилось
По моему говорит о том, что я действительно зашел под учеткой, которая имеет права на файл.

Сейчас ситуация такова:
1) Proxy account убрали
2) SQL_запущен под доменной учеткой, которая раньше использовалась для Proxy account
Результат:
1) xp_cmdshell доступ к файлу получает под любым логином, что понятно
2) "Bulk Insert" и "OpenRowSet(BULK ...)" не работает - Operating system error code 5(Отказано в доступе.)

Продолжаю ничего не понимать.
20 ноя 12, 12:32    [13499448]     Ответить | Цитировать Сообщить модератору
 Re: OpenRowSet(BULK ...) = error code 5...  [new]
Glory
Member

Откуда:
Сообщений: 104760
Greenhorn
То это означает, что я вошел на SQL, специально под доменной учеткой, которая используется для proxy account_а.
Кстати, только для этой учетки открыт доступ на чтение.
И xp_cmd_shell 'type ...' подтверждает, что доступ на чтение к файлу есть.

Чем подтверждается, что доступ в xp_cmdshell идет именно под этой учетной записью ?
Чем подтверждается, что доступ в penRowSet(BULK ...)" идет именно под этой учетной записью ?
20 ноя 12, 12:36    [13499471]     Ответить | Цитировать Сообщить модератору
 Re: OpenRowSet(BULK ...) = error code 5...  [new]
Greenhorn
Member

Откуда:
Сообщений: 311
Glory
Greenhorn
То это означает, что я вошел на SQL, специально под доменной учеткой, которая используется для proxy account_а.
Кстати, только для этой учетки открыт доступ на чтение.
И xp_cmd_shell 'type ...' подтверждает, что доступ на чтение к файлу есть.

Чем подтверждается, что доступ в xp_cmdshell идет именно под этой учетной записью ?

Тем, что только одной доменной учетке даны права на супер пупер секретную шару в которой лежит тот самй файл.
И тем, что успешно отрабатывает (показывает содержимое файла) команда
exec sp_cmdshell 'type \\RemoteServer\ShareName\txtFile.txt'

Если я заблуждаюсь на счет этого - прошу объяснить в чем ???
Glory
Чем подтверждается, что доступ в penRowSet(BULK ...)" идет именно под этой учетной записью ?

К сожалению аудит на доступ к файлу включить не могу, т.к. у меня нет прав.
Остается верить BOL->bulk insert
Если пользователь SQL Server вошел в систему с помощью проверки подлинности Windows, он имеет доступ только к тем файлам,
которые доступны учетной записи этого пользователя, вне зависимости от профиля безопасности процесса SQL Server.
Как я уже нреоднократно говорил - я специально вошел на SQL-сервер используя ту самую доменную учетку, которой выданы права. Проверено проводником - доступ есть !!!
У Вас есть иная трактовка приведенной выдержки из BOL_а ?
Прошу Вас - поделитесь...
20 ноя 12, 13:01    [13499608]     Ответить | Цитировать Сообщить модератору
 Re: OpenRowSet(BULK ...) = error code 5...  [new]
Glory
Member

Откуда:
Сообщений: 104760
Greenhorn
Тем, что только одной доменной учетке даны права на супер пупер секретную шару в которой лежит тот самй файл.

Согласен ли с этим утверждением стандартный аудит доступа ?

Greenhorn
Как я уже нреоднократно говорил - я специально вошел на SQL-сервер используя ту самую доменную учетку, которой выданы права. Проверено проводником - доступ есть !!!
У Вас есть иная трактовка приведенной выдержки из BOL_а ?
Прошу Вас - поделитесь...

Дело не трактовке. А в том, что нужные права не назначены
Серверу незачем вас обманывать
20 ноя 12, 13:08    [13499676]     Ответить | Цитировать Сообщить модератору
 Re: OpenRowSet(BULK ...) = error code 5...  [new]
mike909
Member

Откуда:
Сообщений: 662
Glory
Greenhorn
Тем, что только одной доменной учетке даны права на супер пупер секретную шару в которой лежит тот самй файл.

Согласен ли с этим утверждением стандартный аудит доступа ?

Greenhorn
Как я уже нреоднократно говорил - я специально вошел на SQL-сервер используя ту самую доменную учетку, которой выданы права. Проверено проводником - доступ есть !!!
У Вас есть иная трактовка приведенной выдержки из BOL_а ?
Прошу Вас - поделитесь...

Дело не трактовке. А в том, что нужные права не назначены
Серверу незачем вас обманывать

Совершенно верно - незачем. Но, в данном конкретном случае сервер может легко ввести в заблуждение - сказав правду
Итак, что имеем:
Во первых - SQL2k8 в домене, запущен под доменной учеткой, имеющей доступ к файлу на удаленном сервере.
Во вторых - прокся на xp_cmdshell отключена, что зря с точки срения безопасности.
И следовательно, при наличии прав на запуск xp_cmdshell, выполняется по учеткой SLQ2k8, что и подтверждает Greenhorn.

А теперь о "заблуждении":
Если зарыться в BOL поглубже на счет безопасности bulk insert и openrowset, то найдем следующее:
 При использовании инструкции BULK INSERT или OPENROWSET очень важно понимание того, как SQL Server 2005 и 
более поздних версий обеспечивает безопасность олицетворения пользователя. Это позволяет хранить файл данных не на том компьютере,
на котором вошел пользователь или работает процесс SQL Server. Например, если пользователь на компьютере_A имеет доступ к
файлу данных на компьютере_B и делегирование учетных данных было соответствующим образом настроено, этот пользователь может подключиться
к экземпляру SQL Server, запущенному на компьютере_C, получить доступ к файлу данных на компьютере_B и выполнить
массовый импорт данных из этого файла в таблицу на компьютере_C.
Похоже на наш случай.
Проверяется легко - достаточно войти под SQL-ной учеткой и выполнить bulk insert. Т.к. в этом случае bulk insert будет выполняться без какого либо олицетворения, а просто под учеткой SQL2k8, у которой доступ есть.
В тоже время зайдя под доменной учеткой при выполнении bulk insert включается механизм олицетворения, который и не срабатывает из-за access denied. И вовсе не из-за доступа к файлу, а из-за невозможности провести олицетворение.
Я даже прекрасно понимаю программеров SQL_я, которым было влом выяснять "успешность" олицетворение в связи с тем,
что следующая команда по открытию фала на чтение все равно свалится с нужной ошибкой.
Это все равно, что в программе проверять успешно ли отработал AllocMem - если не отработал, то свалимся.

Короче - проблема в том, что не все "соответствующим образом настроено"
To Greenhorn
1. Проверь корректность SPN на учетке SQL2k8. см. подробнее
2. Проверь, включено ли делегирование на учетке SQL2k8. еще подробнее
21 ноя 12, 00:29    [13504287]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить