Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 можно ли выполнять textcopy.exe с помощью xp_cmdshell?  [new]
Eugenia
Member

Откуда:
Сообщений: 94
Задача у меня такая - нужно поместить файл вложения в базу. Для этого написан следующий текст:

declare @attachments_path varchar(1000)
declare @cmdline_att varchar(1000)
declare @status_ int
set @cmdline_att='"C:\Program Files\Microsoft SQL Server\MSSQL\Binn\textcopy.exe" /S. /Usa /PKJiok279NMsD43gfd /Dworkflow35 /Ttable1 /Cfile_ex /W" where id=(select top 1 id from table1 order by id desc) " /F"D:\webroot\workflow\wwwroot\inboxatt\2005_1469_1.jpg" /I'
exec @status_ = master.dbo.xp_cmdshell @cmdline_att
if @status_ <> 0
begin
raiserror('Error on executing command shell', 14, 1, @cmdline_att)
-- goto error
end

если его писать напрямую в командной строке - "C:\Program Files\Microsoft SQL Server\MSSQL\Binn\textcopy.exe" /S. /Usa /PKJiok279NMsD43gfd /Dworkflow35 /Ttable1 /Cfile_ex /W" where id=(select top 1 id from table1 order by id desc) " /F"D:\webroot\workflow\wwwroot\inboxatt\2005_1469_1.jpg" /I
то все выполняется как положено.

Если же использовать cmdshell - то получается ошибка.

Подскажите пожалуйста в чем я не права? И можно ли вообще код такого типа выполнять с помощью cmdshell?
24 фев 05, 15:56    [1342463]     Ответить | Цитировать Сообщить модератору
 Re: можно ли выполнять textcopy.exe с помощью xp_cmdshell?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37100
автор
Если же использовать cmdshell - то получается ошибка.

А ее текст - тайна?
24 фев 05, 15:58    [1342469]     Ответить | Цитировать Сообщить модератору
 Re: можно ли выполнять textcopy.exe с помощью xp_cmdshell?  [new]
Eugenia
Member

Откуда:
Сообщений: 94
Вы имеете ввиду текст ошибки? Нет. Это не тайна.

'c:\Program' is not recognized as an internal or external command,
operable program or batch file.
NULL


Причем если прописывать отдельный cmd типа:

set @cmdline='cd c:\Program Files\Microsoft SQL Server\MSSQL\Binn'
exec @status_ = master.dbo.xp_cmdshell @cmdline

то получается сообщение об ошибке такого же типа:

'textcopy.exe' is not recognized as an internal or external command,
operable program or batch file.
NULL
24 фев 05, 16:07    [1342514]     Ответить | Цитировать Сообщить модератору
 Re: можно ли выполнять textcopy.exe с помощью xp_cmdshell?  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 34223
Блог
Не видит файл.

Попробуйте ...C:\Program%20Files..., или нет прав доступа к файлу - проверьте учетную запись, под которой запускается SQL Server
24 фев 05, 16:45    [1342683]     Ответить | Цитировать Сообщить модератору
 Re: можно ли выполнять textcopy.exe с помощью xp_cmdshell?  [new]
dburtsev1
Member

Откуда: NY USA
Сообщений: 351
'cd "c:\Program Files\Microsoft SQL Server\MSSQL\Binn"'
24 фев 05, 17:49    [1342937]     Ответить | Цитировать Сообщить модератору
 Re: можно ли выполнять textcopy.exe с помощью xp_cmdshell?  [new]
mwolf
Member

Откуда: Харьков
Сообщений: 600
Всю строку в двойные кавычки заключай.
У меня та же ошибка была.
Вот мой код.
INSERT INTO Pictures(picture) VALUES('')
DECLARE @cmd varchar(2000)
SET @cmd = '""C:\Program Files\Microsoft SQL Server\MSSQL\Binn\textcopy.exe" /S TESTERS /U sa /P password /D MWolf_Mail /T Pictures /C picture /I /F "C:\Documents and Settings\mssql\My Documents\Photo.gif"  /Z /W "WHERE id='+CAST(@@IDENTITY as varchar)+'""'
EXEC master..xp_cmdshell @cmd
24 фев 05, 18:10    [1343006]     Ответить | Цитировать Сообщить модератору
 Re: можно ли выполнять textcopy.exe с помощью xp_cmdshell?  [new]
Eugenia
Member

Откуда:
Сообщений: 94
Спасибо!
25 фев 05, 09:12    [1343595]     Ответить | Цитировать Сообщить модератору
 Re: можно ли выполнять textcopy.exe с помощью xp_cmdshell?  [new]
Eugenia
Member

Откуда:
Сообщений: 94
Попыталась вышенаписанные строки поместить в процедуру обработки входящей почты. Получила ошибку:

TEXTCOPY Version 1.0
DB-Library version 8.00.194
DB-Library Error 10024: SQL Server connection timed out.
ERROR: Query execution failed.
NULL


Пробовала увеличить время выполнения запроса (query timed-out) не помогло.

Поскажите пожалуйста в чем еще может быть проблема?

Код процедуры:


CREATE procedure sp_fetchmail_test as

declare @status int
declare @status_ int
declare @mapifailure int
declare @message_id varchar(255)
declare @cur_msg_id varchar(255)
declare @originator varchar(255)
declare @subject varchar(255)
declare @recipients varchar(255)
declare @message varchar(255)
declare @date_received varchar(255)
declare @attachments varchar(255)
declare @attachment varchar(255)
declare @offset smallint
declare @index smallint
declare @attachment_name varchar(255)
declare @attachment_ext varchar(255)
declare @attachment_number varchar(255)
declare @i int
declare @attachments_path varchar(255)
declare @cmdline varchar(1000)
declare @cmdline_att varchar(1000)
declare @msg_length int
declare @skip_bytes int
declare @number int
declare @id int
declare @ptrval varbinary(16)
declare @originator_address varchar(255)
declare @bcc_list varchar(255)
declare @cc_list varchar (255)
declare @all_recipients varchar(1000)
declare @priv int
declare @limit varchar(255)
declare @first_recipient varchar(255)
declare @enb_int int
declare @enb_msk int
declare @orig_office varchar(10)
declare @recip_office varchar(10)
declare @count_lim int
declare @subj_limit varchar(255)
declare @strt_val int
declare @ban_list int
declare @exit int
declare @enb_msk_block int
declare @enb_int_route int
declare @enb_mail_del int


-- Проверка на существование пути сохранения вложений в таблице INBOX

select @enb_mail_del=value_n from settings where name='enable_mail_delete'
select @attachments_path = value_s from settings where name = 'inbox_attachments_path'
if IsNull(@attachments_path, '') = ''
begin
raiserror('INBOX attachment path is not defined', 14, 1)
-- return -1
end

-- Добавление "\" к пути сохранения вложений (если "\" не было)

if substring(@attachments_path, len(@attachments_path), 1) <> '\' set @attachments_path = @attachments_path + '\'

set @mapifailure = 0
set @message_id = null

-- Цикл находжения первого непрочитанного сообщения (пока нет ошибки расширенной процедуры)

while @mapifailure = 0
begin
set @cur_msg_id = @message_id

exec @status = master.dbo.xp_findnextmsg @msg_id = @message_id output
if @status <> 0 set @mapifailure = 1

if @enb_mail_del=1
begin
if IsNull(@cur_msg_id, '') <> '' exec master.dbo.xp_deletemail @cur_msg_id
end

if IsNull(@message_id, '') = '' break

-- Чтение первого непрочитанного сообщения

exec @status = master.dbo.xp_readmail @msg_id = @message_id, @peek = true, @suppress_attach = false, @originator = @originator output, @recipients = @recipients output, @cc_list=@cc_list output, @bcc_list =@bcc_list output, @subject = @subject output, @date_received = @date_received output, @message = @message output, @attachments = @attachments output, @msg_length = @msg_length output, @originator_address =@originator_address output
if @status <> 0
begin
set @mapifailure = 1
break
end


--insert into help_table values (@message_id, @originator_address)





-- Если не существует сообщения с message_id первого непрочитанного, то начинаем транзакцию
if @priv <> 0 goto error2
if not exists (select * from inbox where message_id = @message_id)
begin
begin transaction

-- переменной number присваивается значение "последний номер в таблице+1"

select @number = IsNull(max(number), 0)+1 from inbox where year(date_received) = year(getdate())

-- проверка на наличие адресов получателей в поле "копия"

if (isNull (@cc_list, '') = '') and (isNull(@bcc_list,'')='')
set @all_recipients=@recipients

if (isNull (@cc_list, '') <> '') and (isNull(@bcc_list,'')='')
set @all_recipients=@recipients+'; '+ @cc_list

if (isNull (@cc_list, '') = '') and (isNull(@bcc_list,'')<>'')
set @all_recipients=@recipients+'; '+ @bcc_list

if (isNull (@cc_list, '') <> '') and (isNull(@bcc_list,'')<>'')
set @all_recipients=@recipients+'; '+ @cc_list+'; '+@bcc_list

-- Добавление нового сообщения в таблицу INBOX


insert into inbox (number, message_id, mes_year, originator, recipients, date_received, subject, message, orig_address)
values (@number, @message_id, year(getdate()), @originator, @all_recipients, convert(datetime, @date_received), @subject, @message, @originator_address)
if @@error <> 0 goto error


set @id = @@identity

-- Если длина сообщения больше 255, то начинаем цикл

if @msg_length > 255
begin
select @ptrval = textptr(message) from inbox where id = @id
set @skip_bytes = 255
while 1 = 1
begin

-- Читаем тоже письмо, попуская первые 255 символов
exec @status = master.dbo.xp_readmail @msg_id = @message_id, @peek = true, @message = @message output, @skip_bytes = @skip_bytes output
if @status <> 0
begin
set @mapifailure = 1
break
end

-- Добавляется оставшийся текст в поле "message"

updatetext inbox.message @ptrval null 0 @message
if @@error <> 0 goto error
if @skip_bytes = @msg_length break
end
end
if @mapifailure <> 0 break

-- Проверка на существование вложенного файла, если он есть, то начинаем цикл

set @offset = 1
set @attachment_number = 1
if IsNull(@attachments, '') <> ''
while 1 = 1
begin


-- Ищем символ ";" в переменной "attachments" начиная с первой позиции

set @index = charindex(';', @attachments, @offset)
if @index = 0 set @index = len(@attachments)+1
set @attachment = substring(@attachments, @offset, @index-@offset)

set @i = len(@attachment)
while @i > 0 and substring(@attachment, @i, 1) <> '\' set @i = @i -1
set @attachment_name = substring(@attachment, @i+1, len(@attachment)-@i)

set @i = len(@attachment)
while @i > 0 and substring(@attachment, @i, 1) <> '.' set @i = @i - 1
if @i > 0 set @attachment_ext = substring(@attachment, @i, len(@attachment)-@i+1) else set @attachment_ext = ''

-- Записываем в таблицу ATTACHMENTS id-входящего, номер вложения, имя вложения

insert into attachments (inbox_id, number, name, attachment) values (@id, @attachment_number, @attachment_name, '0x0')
if @@error <> 0 goto error

-- Формируем командную строку для выполнения ее операционной системой

--Это добавленные в процедуру строчки
set @cmdline_att='""C:\Program Files\Microsoft SQL Server\MSSQL\Binn\textcopy.exe" /S. /Usa /PKJiok279NMsD43gfd /Dworkflow35 /Tattachments /Cattachment /W" where id=(select top 1 id from attachments order by id desc) " /F"'+@attachment+'" /I""'
exec @status_ = master.dbo.xp_cmdshell @cmdline_att--, no_output

if @status_ <> 0
begin
raiserror('Error on executing command shell _att', 14, 1, @cmdline)
print @cmdline_att
print @attachment
goto error
end


if @index = len(@attachments)+1 break
set @offset = @index+1
set @attachment_number = @attachment_number + 1
end
commit transaction
continue
error:
rollback transaction
end
error2:
end

if @mapifailure <> 0
begin
if @@trancount > 0 rollback transaction
return -1
end

return 0
GO


25 фев 05, 14:39    [1345253]     Ответить | Цитировать Сообщить модератору
 Re: можно ли выполнять textcopy.exe с помощью xp_cmdshell?  [new]
Палестинец
Member

Откуда:
Сообщений: 8314
может /S.
не нравится?
а что если имя сервака написать?
25 фев 05, 16:11    [1345738]     Ответить | Цитировать Сообщить модератору
 Re: можно ли выполнять textcopy.exe с помощью xp_cmdshell?  [new]
Eugenia
Member

Откуда:
Сообщений: 94
Попробовала - не помогло.
Тем более что если выполнять строчки:

set @cmdline_att='""C:\Program Files\Microsoft SQL Server\MSSQL\Binn\textcopy.exe" /S. /Usa /PKJiok279NMsD43gfd /Dworkflow35 /Tattachments /Cattachment /W" where id=(select top 1 id from attachments order by id desc) " /F"'+@attachment+'" /I""'        exec @status_ = master.dbo.xp_cmdshell @cmdline_att--, no_output

В QA - то все выполняется без проблем...
25 фев 05, 16:34    [1345847]     Ответить | Цитировать Сообщить модератору
 Re: можно ли выполнять textcopy.exe с помощью xp_cmdshell?  [new]
mwolf
Member

Откуда: Харьков
Сообщений: 600
where id=(select top 1 id from attachments order by id desc)
Опасный тут момент!!!
Посмотри как у меня
/W "WHERE id='+CAST(@@IDENTITY as varchar)+...
Что мешает так сделать?

И ещё, поставь ключ /Z - это для подробного сообщения об ошибках.
25 фев 05, 18:22    [1346236]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить