【问题标题】:shell command not executing using c# on IIS servershell 命令未在 IIS 服务器上使用 c# 执行
【发布时间】:2019-12-06 11:20:26
【问题描述】:
                        cmd.StartInfo.FileName = "cmd.exe";
                        cmd.StartInfo.RedirectStandardInput = true;
                        cmd.StartInfo.RedirectStandardOutput = true;
                        cmd.StartInfo.CreateNoWindow = true;
                        cmd.StartInfo.UseShellExecute = false;
                        cmd.Start();
                        cmd.StandardInput.WriteLine("@echo off");
                        cmd.StandardInput.WriteLine("echo.");
                        cmd.StandardInput.WriteLine(".\\lmutil.exe" + " lmstat -S adskflex -c xxxx@192.168.xx.xx > " + Server.MapPath("Status.txt"));
                        cmd.StandardInput.WriteLine("echo.");
                        cmd.StandardInput.WriteLine("echo.");
                        cmd.StandardInput.WriteLine("pause");
                        cmd.StandardInput.WriteLine("exit");
                        cmd.StandardInput.Flush();
                        cmd.StandardInput.Close();
                        cmd.WaitForExit();

此代码从 AutoDesk 许可证服务器 获取 status.txt 并将其保存到当前目录。每次 status.txt 都会更新。 在本地主机上一切正常,但在主服务器上却不行。

在真正的 IIS 服务器上 status.txt 不会更新。当我在服务器上打开 cmd 并执行此命令时,它会说

找不到 lmutil.exe

即使在所有代码所在的同一目录中。 我从 localhost 移动到服务器时遇到的所有问题...

【问题讨论】:

  • 你有什么理由不直接启动lmutil.exe,而不是调用cmd并将数据传递给stdin?

标签: c# shell iis command-prompt autodesk


【解决方案1】:

您是否尝试过计算您在服务器上的 .\ 路径是什么?假设您以本地计算机上的用户身份运行您的工具,并且您的路径很可能是您的工具的 exe 所在的路径。如果您在另一台机器上运行它,例如作为管理员(提升的 cmd 提示符),您最终可能会到达一个不完全是 .\ 您期望的位置。

所以尝试使用类似的东西

AppDomain.CurrentDomain.BaseDir 类似

 FileInfo fi = New FileInfo($"{AppDomain.CurrentDomain.BaseDir}\\lmutil.exe");
 if(fi.Exisits)
 {
   //do something with your tool
 }

找出您的应用程序的真正位置并在该目录中获取 lmutil.exe。

根据评论更新:

您似乎只想更新 IIS 上 DocumentRoot 中的文件,因此最简单的方法是将您的工具放在服务器上并在那里运行它。如果你不能把它放在服务器上,你仍然需要确保你可以访问 IIS 上的 status.txt 并将 lnutil.exe 复制到你想要运行你的应用程序的机器上(我想这就是你为测试所做的) .

Server.MapPath 更新

这将为您提供服务器上的路径,例如 C:\inet\mysite\bin\lmutil.exe 但如果您在不同的机器上运行您的应用程序,这并不意味着该路径存在于那里。您运行的代码针对的是本地路径,因此如果您在服务器上运行 lmutil,您需要弄清楚如何在远程位置调用 lmutil.exe!

【讨论】:

  • 我不认为它与路径 bcs 的问题我尝试过使用 Server.MapPath("lmutil.exe");但不工作
  • 我不知道 server.mappath 但您希望能够在应用程序的 basedir 中调用可执行文件,这就是上面这行试图提供的内容。通往这种应用的道路。将路径放入 FileInfo 并检查它是否存在,如果存在,您应该能够调用该可执行文件
  • Server.MapPath() 给出像 C://xx/xx/xx/xx.exe 这样的绝对路径,在 fileinfo 中它显示相同的路径
  • 是你期望工具的路径,你有运行它的权限吗?你只为你的 status.txt 使用 Server.MapPath 而不是 lmutil.exe 所以你的错误表明它找不到 lmutil.exe 我给你的例子展示了如何检查 ylmutil.exe 是否存在于相同的路径中然后你的应用程序存在.不多也不少。
  • 据我了解 mappath 它将一个 url 映射到服务器上的物理路径,但如果您在同一台服务器上运行您的应用程序,则不需要开始。如果不是,您必须确保您有权访问物理路径,这意味着您需要确保您可以从服务器上的文档根目录访问 lmutil.exe。我不了解 IIS,但我很确定有一些关于可执行文件的保护措施。
【解决方案2】:

尝试指定完整路径到配置lmutil.exe

【讨论】:

  • 用 Server.MapPath("lmutil.exe");但不工作
  • 您好,欢迎来到 Stack Overflow。虽然您不符合要求的50 reputation to comment,但我敦促您在将评论作为问题发表之前回答自我解释性问题,因为这将获得反对票并使您更难达到最低 50 次代表
猜你喜欢
  • 1970-01-01
  • 2017-09-26
  • 2019-04-21
  • 2020-07-31
  • 1970-01-01
  • 2011-04-05
  • 2017-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多