ASP.Net 通过 API 调用在服务器上运行 exe

Posted

技术标签:

【中文标题】ASP.Net 通过 API 调用在服务器上运行 exe【英文标题】:ASP.Net run exe on server from an API call 【发布时间】:2020-09-20 20:12:28 【问题描述】:

我有一个运行良好的 WebAPI,但需要添加调用服务器上的 EXE 以使用视频运行某些任务的能力,服务器是我们的机器并运行 IIS 来托管 WebAPI。

我已经尝试使用 Process() 并调用它到我编写的 cmd.exe 文件,但问题是用户是 IUSER 并且这不起作用,因为视频处理需要使用系统硬件所以需要是当前登录的 Windows 用户。

出于明显的安全原因,我不想为 IUSER 授予此特权,因此我正在寻找另一种方法来调用并将数据传递给 EXE 或后台任务(短时间运行

这一切都在我们完全控制的服务器上。

当前代码:

string exeLoc = Environment.ExpandEnvironmentVariables(baseEXELocation);
using var process = new Process();
process.StartInfo.FileName = exeLoc; 
process.StartInfo.Arguments = $"command";
process.StartInfo.CreateNoWindow = true;
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.OutputDataReceived += (sender, data) =>

   if (!String.IsNullOrEmpty(data.Data))
   
      Console.WriteLine(data.Data);
      consoleData += data.Data;
    
;
process.Start();
process.BeginOutputReadLine();
var exited = process.WaitForExit(1000 * 10);     // (optional) wait up to 10 seconds

谢谢

【问题讨论】:

您的问题解决了吗?如果您的问题得到解决,那么我请求您将有用的建议标记为答案。这将帮助面临同样问题的其他人。 【参考方案1】:

你可以尝试在iis中使用模拟:

<identity impersonate="true" />

https://support.microsoft.com/en-us/help/306158/how-to-implement-impersonation-in-an-asp-net-application

或通过使用应用程序池高级设置->自定义帐户的身份为应用程序池分配管理员权限。

或者您可以尝试在 Process.Start 中使用动词 runas 以管理员身份执行 exe 文件。

ProcessStartInfo proc = new ProcessStartInfo();
proc.WindowStyle = ProcessWindowStyle.Normal;
proc.FileName = myExePath;
proc.CreateNoWindow = false;
proc.UseShellExecute = false;
proc.Verb = "runas"; //this is how you pass this verb

【讨论】:

以上是关于ASP.Net 通过 API 调用在服务器上运行 exe的主要内容,如果未能解决你的问题,请参考以下文章

在不同的端口上运行 Angular UI 和 Asp.net Web Api

ASP.NET Web API 在来自 Chrome 扩展的并发 AJAX 调用上崩溃

从 ASP.net 4 Web API 2 项目通过 HttpClient 调用 REST 服务导致异常

如何通过js跨域调用ASP.NET Web API (请问如何实现在javascript中通过http get的方式跨域调用ASP.NET Web API?)

ASP.NET Core api 项目 3.1 在 IIS 上发布

如何通过 ASP.NET Core 3 中的中间 Web API 传递未更改的 HTTP 响应?