通过ASP.NET中的`System.Diagnostics.Process`在PATH中执行程序

时间:2015-05-20 17:13:48

标签: c# asp.net

我有一个在PATH中的程序(在命令行中,我可以执行program-name并按预期运行)。这是在 system PATH环境变量中(因此我相信所有用户都应该能够以这种方式访问​​此程序)。

但是,当我使用文件名设置文件名时(即使用process.StartInfo.FileName = "program-name"),我的ASP.NET应用程序无法执行此应用程序。它说它无法找到该文件。如果我使用完整路径(即使用process.StartInfo.FileName = "C:/Program Files/Something/program-name"),它就可以工作。

我测试了一个Windows窗体应用程序,它没有遇到这个问题(也就是说,这两种方法都适用)。那么什么是ASP.NET做得与众不同?有什么方法可以避免指定完整路径吗?我希望用户在PATH中拥有这个程序,并且不希望它们指定位置(这也是更多的工作)。

2 个答案:

答案 0 :(得分:1)

确实找到了系统PATH中的程序。但更新PATH的方式有点奇怪。仅重新启动IIS服务器是不够的。我必须重新启动物理机才能识别新的PATH。

另一个人关于需要“特殊权限来调用进程”的评论似乎不正确。此外,ASP.NET默认情况下肯定会注意环境变量(为简单起见,我使用了系统PATH,但由于您可以将IIS服务器作为特定用户运行,因此您也可以利用它们的环境变量)。 p>

答案 1 :(得分:0)

为什么要首先从Asp.net应用程序运行进程。 Asp.net是服务器/客户端技术,因此运行进程将在服务器端而不是客户端上运行,如果您要在IIS服务器上托管它,它本身就会出现安全问题。您需要授予特殊权限才能在Server上调用进程。

第二,考虑到上述Asp.net不会意识到服务器机器的本地配置,包括环境变量,除非你明确要求它,意味着你可以实现它,但手动从你的代码。您需要做的就是在Path变量中搜索要启动的Exe。

这里是您需要的代码片段。

public static string FindExePath(string exe)
{
    exe = Environment.ExpandEnvironmentVariables(exe);
    if (!File.Exists(exe))
    {
        if (Path.GetDirectoryName(exe) == String.Empty)
        {
            foreach (string test in (Environment.GetEnvironmentVariable("PATH") ?? "").Split(';'))
            {
                string path = test.Trim();
                if (!String.IsNullOrEmpty(path) && File.Exists(path = Path.Combine(path, exe)))
                    return Path.GetFullPath(path);
            }
        }
        throw new FileNotFoundException(new FileNotFoundException().Message, exe);
    }
    return Path.GetFullPath(exe);
}