VB.NET (WCF) -> Файл CMD -> Стороннее приложение - PullRequest
0 голосов
/ 24 мая 2011

У меня есть собственная служба WCF (VB), расположенная на сервере.У этой службы есть метод, который я вызываю из другого приложения, который должен запустить файл .cmd, который вызывает стороннюю программу.

Мой WCF использовал как старую команду Shell (), так и Process() объект.Оба могут вызывать файл .cmd (расположенный на локальном диске сервера).Файл .cmd выглядит следующим образом:

echo Before calling 3rd party app >> C:\HelloFubar.txt
cd C:\Program Files\Exstream\Dialog 6.1
Engine -CONTROLFILE=C:\Exstream\Development\LetterWriter\Control Files\Letter.opt
echo After calling 3rd party app >> C:\HelloFubar.txt

Теперь я знаю, что файл .cmd (сохраненный как Letter.cmd) запускается, потому что когда я проверяю txt-файл после тестирования моего приложения, операторы before / afterбыли написаны.Однако стороннее приложение не запускается.

Теперь странная часть - если я дважды щелкну по cmd-файлу из проводника, операторы теста будут записаны в текстовый файл, и стороннее приложение начнет работу.Отлично работает.

Я дважды проверил приложение и соответствующие файлы, чтобы убедиться, что у NETWORK_SERVICE есть разрешения, и моя служба работает под этой учетной записью.Так что это не похоже на проблему с правами.

Есть идеи?

Спасибо, Джейсон

1 Ответ

1 голос
/ 27 мая 2011

Уф!Только заняла неделя или две!

Примечание для себя:

Само собой, вы должны убедиться, что любые сторонние приложения, запущенные из учетной записи NETWORK_SERVICE, не пытаются делать то, что у учетной записи NETWORK_SERVICE нет явных прав.Как запись в реестр, удаление файлов и другие задачи.

Попробуйте запустить службу под учетной записью администратора и обязательно используйте атрибут servicePrincipalName на клиенте при вызове WCF, работающего под любой учетной записью, кроме NETWORK_SERVICE.Пример может быть таким в конфигурационном файле клиента:

<endpoint address="net.tcp://myserver-2:8080/Service" binding="netTcpBinding"
bindingConfiguration="NetTcpBinding_IService1" contract="TCPService.IService1"
name="NetTcpBinding_IService1">
  <identity>
     <servicePrincipalName value="MyServiceReferenceName(InSolutionExplorer)\myserver-2"/>
     <dns value="myserver-2.mydomain.local" />
  </identity>
</endpoint>

Надеюсь, что это может помочь кому-то еще!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...