通过C#代码运行的进程与命令行运行方式不同

时间:2017-09-28 22:18:55

标签: c# asp.net iis processstartinfo

我在ASP.Net应用程序中从C#调用Vipre的命令行实用程序来扫描文件中的恶意软件。我是机器的管理员,所有这一切都在这里发生。当我:

  • 从命令行运行我的用户(管理员)下的实际命令行工具,它可以工作(退出代码1或0)
  • 我的用户下调试Visual Studio中的ASP.Net项目调试时,在C#中启动该过程,它可以工作(退出代码1或0)
  • 在IIS中运行且在应用程序池标识设置为默认的情况下启动C#进程,它返回退出代码-1073741502
  • 在IIS中运行时启动进程,并将应用程序池标识设置为我的用户,它可以正常工作(退出代码0或1)

好的,非常清楚,它需要在管理用户下运行。所以,我认为我只需使用以下代码在我的凭据下启动该过程。这就是我的麻烦和困惑开始的地方:

var proc = new Process
{
    StartInfo = new ProcessStartInfo
    {
        Arguments = string.Format($"/scanfile \"{filePath}\""),
        FileName = Settings.CommandLineScannerPath,
        CreateNoWindow = true,
        UseShellExecute = false,

        Domain = "domain",
        UserName = "username",
        Password = GetSecureString("password")
    }
};

proc.Start();
proc.WaitForExit();
if (proc.ExitCode != 0
    && proc.ExitCode != 1)
{
    throw new Exception($"Unexpected result: " + proc.ExitCode);
}
return proc.ExitCode == 0 ? AntivirusScanResult.Clean : AntivirusScanResult.Dirty;

令我惊讶的是,它的行为完全相同:

  • 我的用户下调试Visual Studio中的ASP.Net项目调试时,在C#中启动该过程,它可以工作(退出代码1或0)
  • 在IIS中运行且在应用程序池标识设置为默认的情况下启动C#进程,它返回退出代码-1073741502
  • 在IIS中运行时启动进程,并将应用程序池标识设置为我的用户,它可以正常工作(退出代码0或1)

这些案件有何不同?从技术上讲,他们都在我的用户之下,因为我在用户下启动了进程......对吗?我错过了什么?为什么它的行为会有所不同,具体取决于它在我的用户下运行的确切机制?

注意:我也要联系Vipre,找出退出代码的含义

0 个答案:

没有答案