当WCF服务运行批处理文件时,XCopy或MOVE不起作用。 为什么?

我遇到过这样一种情况,即同一批处理文件与命令行的工作方式不同,以及何时从IIS上托管的WCF服务触发。 区别在于XCOPY命令。 当我正常运行批处理文件时,XCOPY会移动我需要的所有数据

XCOPY "C:\from" "C:\to" /K /R /E /I /S /C /H /G /X /Y 

但是当它从WCF服务运行时,不会复制任何内容。 从我的服务运行批处理我使用以下代码在C#中执行批处理文件稍作修改。 我的应用程序拉动在LocalSystem帐户下运行。 我还尝试使用自己的帐户进行应用程序调查 – 不起作用。 怎么了?

简短更新:我最近学到的是我的WCF服务在App Pool User下运行,但过程不是。 为了实验,我在流程开始代码中进行了更新

 var pwdArray = "mypassword".ToArray(); var pwd = new System.Security.SecureString(); Array.ForEach(pwdArray, pwd.AppendChar); processInfo.UserName = "myuser"; processInfo.Password = pwd; processInfo.Domain = "LocalMachine"; 

但它没有帮助。 似乎在描述的条件下运行XCOPY是神秘的。

还有一个更新:在常规Windows服务下启动的进程中也发现了与XCopy相同的问题。

通过这篇文章管理解决我的问题( http://social.msdn.microsoft.com/Forums/vstudio/fr-FR/ab3c0cc7-83c2-4a86-9188-40588b7d1a52/processstart-of-xcopy-only-works-在调试器下?论坛= netfxbcl )所以答案实际上是:

这是xcopy.exe的怪癖。 如果重定向输出,则还必须重定向输入。

  var command = "XCOPY ...." processInfo = new ProcessStartInfo("cmd.exe", "/c " + command); processInfo.CreateNoWindow = true; processInfo.UseShellExecute = true; // *** Redirect the output *** // unfortunately you cannot do it for X Copy //processInfo.RedirectStandardError = true; //processInfo.RedirectStandardOutput = true; process = Process.Start(processInfo); process.WaitForExit(); 

您可以使用ASP.NET兼容模式让WCF服务模拟某个用户。 这不要求您的AppPool在该用户下运行。

涉及3个步骤:

启用ASP.NET兼容模式

   ...   

配置您的服务以使用ASP.NET兼容模式

 [AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Required] public class MyService : IMyService { public void DoTheCopying() { ... } } 

并配置ASP.NET模拟以模拟用户

    

您是否尝试在自定义域帐户下运行应用程序池标识? 作为测试,您可以尝试使用自己的帐户,虽然从长远来看我不建议继续使用它,因为在IIS应用程序池上使用的解密密码是微不足道的,并且每次更改自己的密码时都需要维护它密码。

Microsoft在IIS安全最佳实践( http://technet.microsoft.com/en-us/library/jj635855.aspx#AppPools )中说,使用自定义域帐户是可以接受的:

Blockquote使用自定义身份帐户是可以接受的,但请确保为每个应用程序池使用不同的帐户。

出于安全原因,默认的ApplicationPoolIdentity已被完全锁定,此KB将引用另一个问题,但应该了解在处理该问题时可能遇到的问题: http : //support.microsoft.com/kb/2005172

我希望你不要把它当作毫无根据的批评,但你应该向我们展示所涉及的所有有意义的代码片段。 在这种情况下的具体原因是,当你调用一个进程时,获得退出状态通常是一个非常好的主意,但我不确定你是否这样做。 退出状态可能会给我们一些关于正在发生的事情的线索。

最后但同样重要的是,Microsoft Sysinternals的Process Monitor和Process Explorer是调查此类问题的绝佳工具,如果将应用程序池标识更改为自定义域帐户并未查明问题,我建议使用这些来搜索更多线索。

有关托管服务帐户的一些参考