【发布时间】:2019-02-19 11:22:30
【问题描述】:
我有点困惑。我已经构建了一个 Intranet 应用程序,该应用程序具有允许用户将文件“上传”到网络共享驱动器的功能。这不是问题,因为我能够成功地将文件复制到指定文件夹。 复制文件后,下一个要求是让用户单击附件的链接并使用默认程序打开文件(即,用于 .txt 扩展名的 Notepad.exe 等)。 使用 Process.Start 我已经在我的 localhost 机器上成功演示了这一点,但是,当应用程序发布到主机服务器时会出现问题,因为它最初给出了“访问被拒绝”错误。在将网络文件夹的权限设置为接受服务帐户并将应用程序池标识更改为该服务帐户后,它不再引发权限错误。事实上,它根本不会引发错误。就像在本地主机上一样,它一直通过函数,但它显然没有打开文件,而是什么都不做。 至少在我看来,应用程序似乎“认为”它已经打开了程序,因此继续前进,就好像没有任何问题一样。我在这里真的很茫然。我显然遗漏了一些东西,但我终其一生都无法弄清楚。
这是打开文件的函数:
ActivityLog activityLog = new ActivityLog();
FileInfo fileInfo = new FileInfo(filePath);
Process process = new Process();
try
{
if (fileInfo.Exists)
{
//I've used both UseShellExecute and the
//command line arguments with the same results.
/*
process.StartInfo = new ProcessStartInfo
{
FileName = fileInfo.FullName,
WorkingDirectory = fileInfo.DirectoryName,
UseShellExecute = true
};
*/
process.StartInfo = new ProcessStartInfo("cmd", $"/c start " + fileInfo.FullName.FileStringToUri());
process.Start();
}
else throw new Exception("FileInfo not found | File Path: " + filePath);
}
catch (Exception e)
{
if (fileInfo.Exists)
activityLog.LogErrorAsync(new Exception("File Path: " + fileInfo.FullName + " | " + e.Message, e));
else
activityLog.LogErrorAsync(e);
throw e;
}
FileStringToUri() 是一个自定义扩展,它本质上创建一个类似于file://{file}/{path} 的uri 字符串,但如果使用UseShellExecute 方法,则不需要此扩展。
【问题讨论】:
-
这在概念上被破坏了。您正在在服务器上启动一个进程,而不是在运行浏览器的机器上。 (当它们是同一台机器并且“服务器”在您自己的交互式登录会话中运行时,它看起来似乎有效)。不允许网站从浏览器启动随机可执行文件,我希望有非常明显的原因。
-
而且“好像应用程序“认为”它已经打开了程序”——那是因为它已经打开了程序。记事本(或其他)现在正在服务器的会话 0 中运行。这是一个非交互式会话(因此无法显示 UI,也无法提供输入),但该机器上的任务管理器会显示它正在那里运行。
-
感谢您这么快回复。对此,我真的非常感激。我有点怀疑可能是这种情况,但希望我能以某种方式解决安全问题。事实上,我很高兴我做不到。您是否要做出答复,以便我记下您并关闭此问题?
标签: c# .net .net-core process.start .net-core-2.1