我遇到过这样一种情况,即同一批处理文件的工作方式与命令行不同,以及何时从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的相同问题。
答案 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是调查此类问题的绝佳工具,如果将应用程序池标识更改为自定义域帐户并未查明问题,我建议您使用这些寻找更多线索。
有关托管服务帐户的一些参考资料