我有一个驻留在服务器上的自托管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具有权限,并且我的服务正在该帐户下运行。所以这似乎不是权利问题。
有什么想法吗?
谢谢, 杰森
答案 0 :(得分:1)
呼!只花了一两个星期!
自我注意:
自我,您必须确保从NETWORK_SERVICE帐户启动的任何第三方应用程序都不会尝试执行NETWORK_SERVICE帐户没有明确权限的操作。就像写入注册表一样,删除文件和其他任务。
尝试在管理员帐户下启动服务,并确保在调用在NETWORK_SERVICE以外的任何帐户下运行的WCF时在客户端中使用servicePrincipalName属性。在客户端的配置文件中有一个例子:
<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>
希望这可以帮助其他人!