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

时间:2014-02-12 15:12:26

标签: c# wcf iis-7 windows-services xcopy

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

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

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

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

中进行了更新
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的相同问题。

3 个答案:

答案 0 :(得分:6)

通过这篇文章(http://social.msdn.microsoft.com/Forums/vstudio/fr-FR/ab3c0cc7-83c2-4a86-9188-40588b7d1a52/processstart-of-xcopy-only-works-under-the-debugger?forum=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();

答案 1 :(得分:1)

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

涉及3个步骤:

启用ASP.NET兼容模式

   <system.serviceModel>
       ...
       <serviceHostingEnvironment ... aspNetCompatibilityEnabled="true"/>
   </system.serviceModel>

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

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

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

<system.web>
    <identity impersonate="true" username="user" password="pass" />
</system.web>

答案 2 :(得分:1)

您是否尝试在自定义域帐户下运行应用程序池标识? 作为测试,您可以尝试使用自己的帐户,虽然从长远来看我不建议继续使用它,因为在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是调查此类问题的绝佳工具,如果将应用程序池标识更改为自定义域帐户并未查明问题,我建议您使用这些寻找更多线索。

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