Как устранить эту ошибку "Доступ запрещен", возникающий при использовании xp_cmdshell в Microsoft SQL?

Это вся моя рутина:

Declare @AttFileType as char(5), @HQCo as int, @FormName as Varchar(15),       @KeyID as VarChar(10), @UniqueID as uniqueidentifier, @FilePath as Varchar(100), @StringCommand as Varchar(200)
Declare @AttID as int
DECLARE @cmd as VARCHAR(500)
DECLARE @cmd2 as VARCHAR(500)


CREATE TABLE #tmp(eFileName VARCHAR(100));
INSERT INTO #tmp
EXEC xp_cmdshell 'dir /B C:\Users\*****\Desktop\Test_Images';

Declare @FileName varchar(100)

Set @UniqueID = NewID()

While (Select Count(*) From #tmp where eFileName is not null) > 0
Begin

Select Top 1 @FileName = eFileName From #tmp

Set @FilePath = 'C:\Users\*****\Desktop\Test_Images\' + @FileName

Set @AttID = (Select TOP 1 AttachmentID FROM dbo.bHQAF ORDER BY AttachmentID DESC) + 1
Set @AttFileType = '.jpg'


Insert Into dbo.bHQAF (AttachmentID, AttachmentFileType)
Select @AttID, @AttFileType


SET @cmd = '
Declare @AttID2 as int, @AttFileType2 as char(5), @FilePath2 as Varchar(100)

Set @AttFileType2 = ''.jpg''
Set @AttID2 = (Select TOP 1 AttachmentID FROM dbo.bHQAF ORDER BY AttachmentID DESC)


Update dbo.bHQAF 
Set AttachmentData = (SELECT * From OPENROWSET (Bulk ''' + @FilePath + ''', Single_Blob) rs) 
Where AttachmentID = @AttID2 and AttachmentFileType = @AttFileType2'

Exec (@cmd)

Set @HQCo = 101
Set @FormName = 'HRCompAssets'
Set @KeyID = 'KeyID=2'


Insert Into dbo.bHQAT (HQCo, AttachmentID, FormName, KeyField, UniqueAttchID)
Select @HQCo, @AttID, @FormName, @KeyID, @UniqueID

Insert Into dbo.bHQAI (AttachmentID, HRCo)
Select @AttID, @HQCo

Update dbo.bHQAT 
Set Description = 'TEST3', AddDate =  GETDATE(),  AddedBy = '****', DocAttchYN = 'N',  DocName = 'Database', OrigFileName = @FileName, TableName = 'HRCA'
Where AttachmentID = @AttID and HQCo = @HQCo

Insert Into dbo.bHQAI (AttachmentID, HRCo)
Select @AttID, 101

Update dbo.bHRCA
Set UniqueAttchID = @UniqueID
Where HRCo = 101 and Asset = '00001'

Delete from #tmp Where eFileName = @FileName

End

Я проверил, что код работает для загрузки одного изображения на сервер без этого бита здесь:

-- Declarations here 

CREATE TABLE #tmp(eFileName VARCHAR(100));
INSERT INTO #tmp
EXEC xp_cmdshell 'dir /B C:\Users\*****\Desktop\Test_Images';

While (Select Count(*) From #tmp where eFileName is not null) > 0
Begin

Select Top 1 @FileName = eFileName From #tmp


-- Rest of code here


Delete from #tmp Where eFileName = @FileName

End

Но после добавления операторов while и xp_cmdshell имя файла возвращается как "Доступ запрещен".

Образ

Любая помощь будет оценена!

Я не специалист по SQL, но меня попросили загрузить в базу данных около 1000 файлов PDF и JPEG, и сценарий оказался наиболее логичным.

Когда все сказано и сделано, я бы хотел, чтобы скрипт взял каждое изображение из папки и загрузил его в базу данных.

Я открыт для использования другого метода зацикливания при необходимости.

Изменить: я также попытался добавить следующее в начало кода, который не решил проблему:

--Allow for SQL to use cmd shell
EXEC sp_configure 'show advanced options', 1    -- To allow advanced options to be changed.
RECONFIGURE -- To update the currently configured value for advanced options.
EXEC sp_configure 'xp_cmdshell', 1  -- To enable the feature.
RECONFIGURE -- To update the currently configured value for this feature.

Я также вошел в Facets > Surface Area Configuration и убедился, что xp_cmdshell включен / разрешен (true). Это также уже было помечено как истинное в Facets > Server Security.

2 ответа

Решение

Здесь есть несколько возможных проблем.

xp_cmdShell запускается на сервере. Если на этой машине нет папки с именем C:\Users\*****\Desktop\Test_Images она не будет работать.

xp_CmdShell запускается с использованием учетной записи службы. Если эта учетная запись не имеет разрешений для целевой папки, произойдет сбой.

xp_CmdShell должен быть включен. Из MSDN.

Параметр xp_cmdshell - это параметр конфигурации сервера SQL Server, который позволяет системным администраторам контролировать возможность выполнения расширенной хранимой процедуры xp_cmdshell в системе. По умолчанию параметр xp_cmdshell отключен в новых установках и может быть включен с помощью управления на основе политик или с помощью системной хранимой процедуры sp_configure.

Я понял!

Спасибо @destination-data & @GarethLyons за всю помощь!

Вы, ребята, были правы, была проблема с разрешениями для папки, я не осознавал, что мне нужно будет зайти в папку и вручную обновить разрешения, чтобы включить "Сервис". Как только я сделал, все работало отлично!

Еще раз спасибо вам обоим, простите за сумбур.

Для тех, у кого в будущем возникнет эта проблема, сначала сделайте следующее:

1) Перейти в папку

2) Правый клик

3) Выберите свойства

4) Выберите вкладку "Безопасность".

5) Нажмите Дополнительно

6) Нажмите Добавить

7) Нажмите, чтобы выбрать принцип

8) Введите "Сервис" и проверьте имена

9) Выберите Сервис и нажмите ОК

10) Выберите соответствующие разрешения в разделе "Основные разрешения"

11) Выберите "Только применить эти разрешения к объекту в этом контейнере"

12) Примените изменения и попробуйте снова запустить xp_cmdshell

Другие вопросы по тегам