【问题标题】:C# web service running batch file or dos command?C# Web 服务运行批处理文件或 dos 命令?
【发布时间】:2011-08-14 16:10:25
【问题描述】:

从我之前的问题,Executing batch file in C# web service

我检查了所有相关内容的权限,发现:

批处理文件:权限 = 对所有用户的完全控制

IIS 用户 = 我的用户

..win32\cmd.exe:系统权限、管理员权限、myUser = 读取和执行、“TrustedInstaller”的读取权限(它是什么?)= 完全控制

Visual Studio 正在管理员模式下运行。

我在互联网上做了一些研究,似乎我需要在我的机器上使用“本地策略”做一些事情。不幸的是,我使用的是 Windows Vista Home Premium,这似乎我无法设置本地策略......我也尝试将 cmd.exe 的权限更改为“完全控制”,但它不允许我这样做。

我似乎面临一个“无法解决”的问题,所以我将解释我在做什么,以便有人可以告诉我该怎么做。

  • 我使用黑莓模拟器开发了黑莓应用程序。它与我的网络服务在同一台 PC 上。

  • 我用 C# 开发了 Web 服务,并在我的本地主机上发布。

  • Blackberry 应用程序将文件上传到 Web 服务。 Web 服务将文件存储在我的 PC 上。 (这部分我没有问题。)

  • 我的电脑上有一个程序,我将它命名为 myprogram.exe。该程序仅在dos上运行。该程序将使用命令将文件从一种文件类型转换为另一种文件类型 myprogram.exe path\oldfile.x path\newfile.y newfile.y 将自动创建并存储在我的 PC 上。

  • 我需要转换从 BB 发送并现在存储在本地 PC 上的文件,因此我编写了 1 个包含 dos 命令的批处理文件。 Web 服务应该执行批处理文件,但它不会。

如果我停止尝试使用批处理文件,有什么方法可以执行这些命令吗? (或我可以运行该外部程序的任何方式)请给我一个想法。我在互联网上搜索过,但仍然没有任何想法。我不知道现在该怎么办。 T_T

PS。如果我的问题很愚蠢,请原谅我。我只是想尽一切可能使这部分项目取得成功。

【问题讨论】:

  • 你为什么要创建批处理文件而不是直接调用 myprogram.exe。当您将另一个用户分配给您的服务而不是拥有足够权限进行您需要的操作的本地服务时会发生什么?
  • 我真的不知道怎么调用myprogram.exe直接输入命令。你能给我举个例子吗?
  • 我试过 System.Diagnostics.Process.Start(@"C:\Program Files\TotalAudioConverter\AudioConverter.exe");但什么也没发生。 Y_Y
  • 您的 AudioConverter.exe 可能需要一些参数?所以 System.Diagnostics.Process.Start(@"C:\Program Files\TotalAudioConverter\AudioConverter.exe",@"C:\MyFolder\MyInFile C:\MyFolder\MyOutFile"); (或任何需要的参数)
  • 所以这意味着我可以将所有参数放在 C:\Program Files\TotalAudioConverter\AudioConverter.exe 之后,对吗?完整的参数是 C:\MyFolder\MyInFile C:\MyFolder\MyOutFile c-mp3 所以它看起来像 System.Diagnostics.Process.Start(@"C:\Program Files\TotalAudioConverter\AudioConverter.exe",@"C :\MyFolder\MyInFile C:\MyFolder\MyOutFile -cmp3");对?非常感谢您的帮助,十一人!!!我会尽快尝试并告诉你结果:)

标签: c# web-services batch-file cmd


【解决方案1】:

我能想到的只有:

  1. 您的 ASP.NET 网站在 DefaultAppPool 下运行。 DefaultAppPool 只有有限的权限。

    为了从您的服务中执行批处理文件 创建一个新的应用程序池。

    a) 打开 Internet 信息服务管理器 (IIS 7)。 您将找到 Internet 信息服务 Windows Vista 开始菜单中的管理器。

    b) 在左侧的树中右键单击应用程序池 并添加一个新的应用程序池。

    c) 选择您新创建的应用程序池并单击 高级设置。

    d) 在身份下选择 LocalSystem。

    e) 在树中选择您的网站(例如默认网站)。 选择基本设置并选择您创建的应用程序池。

    f) 重新启动您的网站(右键单击您的网站,在 管理您的网站选择重启)。

    您应该能够执行您的批处理文件。 这是一个例子:

    进程 oProcess = new Process();

    oProcess.StartInfo.UseShellExecute = false;

    oProcess.StartInfo.WorkingDirectory = @"c:\temp\test";

    oProcess.StartInfo.FileName = @"c:\windows\system32\cmd.exe";

    oProcess.StartInfo.CreateNoWindow = true;

    oProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;

    oProcess.StartInfo.Arguments = @"/C c:\temp\test\mybatch.bat";

    oProcess.Start();

    但是,我不推荐这种方法。

  2. 重新考虑您的设计。我建议使用托管在 Windows 服务来执行你的批处理文件。 然后从您的 Web 服务调用 WCF-Service 来执行您的 像这样的批处理文件(伪代码):

    var wcfClient = new ConverterServiceClient();

    wcfClient.Convert(@"c:\temp\oldfile.x", "c:\temp\newfile.y");

    // 这里你的服务已经使用你的应用程序转换了文件。

    如果您绑定到 .NET Framework 2.0,您可以托管一个 Windows 服务应用程序中的 .NET Remoting 服务。

希望,这会有所帮助。

【讨论】:

  • 感谢 Hansjoerg!我会试着告诉你结果! :)
  • 现在,我有使用 DefaultApplicationPool(网络服务)的 wwwroot 和使用 NewAppPool(本地系统)的 MyApp。我仍然无法运行批处理文件。我尝试将 放入 web.config,但没有任何反应。请指导我犯了什么错误。
  • 我在任务管理器中看到了所有进程,并且有一个用户名=system的.exe程序进程。但我仍然不明白为什么它从未被执行。 :(
  • 我认为由于 Windows Vista 的用户帐户控制 (UAC),您的程序从未执行过。 UAC 将应用程序限制为标准用户权限。
  • 哦不...我打算换到另一台机器(Windows 7)。只是希望我不会在 Windows 7 上再次遇到这个问题。:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多