2013-06-20 2 views
0

Мне нужно написать консольное приложение, которое возвращает код возврата, который может быть захвачен через xp_cmdshell.XP_CMDSHELL Как записать возвращаемое значение?

Я начал с C# код следующим образом,

class Program 
    { 
     static int Main(string[] args) 
     { 
      //make sure the correct number of arguments are being passed. 
      if (args.Length !=5) 
      { 
       Console.WriteLine("not thr right number of args. \nUsage SFTPUploadFile <host> <port> <username> <password> <localFilePath>"); 
       return 1; 
      } 

      return 0;   
     } 

    } 

The XP_cmdhsell Я использую некоторый код, который я нашел

declare @rc int 

create table #output (id int identity(1,1), output nvarchar(255) null) 
insert #output (output) exec @rc = master..xp_cmdshell 'd:\FILENAME PARA1 PARA2 PARA3 PARA4 PARA5' 
select * from #output where output is not null order by id 
drop table #output 

, но когда я бегу мой xp_cmdshell, я просто получить нулевой. Разве я не должен получать 1 или 0?

Благодаря

+0

Возможно, вы должны добавить свой вызов в 'xp_cmdshell' и как проверить его значение. –

ответ

0

Похоже, ваша программа проверяет, действительно ли есть 5 параметров, и ничего не делает (возвращает 0), если есть.

Команда xp_cmdshell, в свою очередь, предоставляет все параметры. xp_cmdshell вернет NULL, если он не получит никакого вывода.

Если вы изменили код, чтобы что-то вроде этого чтения:

class Program 
    { 
     static int Main(string[] args) 
     { 
      //make sure the correct number of arguments are being passed. 
      if (args.Length !=5) 
      { 
       Console.WriteLine("not thr right number of args. \nUsage SFTPUploadFile <host> <port> <username> <password> <localFilePath>"); 
       return 1; 
      } 

      Console.WriteLine("You had the right number of args."); 
      return 0;   
     } 

    } 

(В качестве альтернативы, вы можете сделать Console.WriteLine("0"); и Console.WriteLine("1");, если вы действительно хотите 0 или 1 назад.)

Вы бы вернуться You had the right number of args.. Это связано с тем, что return 0; и return 1; ничего не печатают на консоль, а это то, что xp_cmdshell отправит обратно клиенту.

Это можно сделать, выполнив EXEC master..xp_cmdshell 'cd ..' ... это команда, которая не возвращает результаты. С другой стороны, EXEC master..xp_cmdshell 'dir *.exe' вернет вам содержимое каталога, так как это будет выводиться (или записываться) на консоль.

+0

на моем локальном уровне он фактически выводит сообщения об успешном завершении или сообщения об ошибках. Но на производственном сервере он просто возвращает null или оба случая ... может ли быть проблема с разрешением? – user2206329

+0

Вы правы - xp_cmdshell работает под вашим именем пользователя/паролем при попытке запуска (и вы являетесь системным администратором), иначе он будет использовать пользователя-прокси. Вы (или пользователь-прокси) могут иметь или не иметь права доступа к серверу на производстве, чтобы увидеть результат. Подробнее можно найти здесь (http://msdn.microsoft.com/en-us/library/ms175046.aspx) – brazilianldsjaguar

Смежные вопросы