无法加载可执行文件

4

我尝试创建一个能够打开应用程序的服务,但是一直没有成功。于是,我下载了下面这段示例代码,并试图基于它创建一个服务。但是,它也不起作用。代码会被执行,但可执行文件却从未被调用(在下面的案例中,计算器没有被打开)。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;

namespace Open_Calculator
{
    public partial class Service1 : ServiceBase
    {
        public static Process process;
        public Service1()
        {
            //InitializeComponent();
            string[] args = { "1", "2" };
            OnStart(args);
        }
        protected override void OnStart(string[] args)
        {
            start_calc();
        }
        protected override void OnStop()
        {
        }
        static protected void start_calc()
        {
            process = new Process();
            process.StartInfo.FileName = @"C:\Windows\system32\calc.exe";
            process.StartInfo.CreateNoWindow = true;
            process.StartInfo.ErrorDialog = false;
            process.StartInfo.RedirectStandardError = true;
            process.StartInfo.RedirectStandardInput = true;
            process.StartInfo.RedirectStandardOutput = true;
            process.StartInfo.UseShellExecute = false;
            process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
            process.Start();
        }
    }
}

同样的代码在控制台应用程序中复制粘贴后可以工作。

该服务被设置为与桌面交互,并且它被设置为以“LocalSystem”运行。

运行服务的帐户确实具有对C:\Windows\System32的访问权限,我已经测试过了。Process.Start()没有返回任何错误,并且通过任务管理器检查,计算器没有在后台运行。


运行该服务的账户是否有访问 C:\Windows\System32 的权限?process.Start() 是否会产生错误?您是否已经通过任务管理器并检查“显示所有用户的进程”来验证计算器没有在后台运行? - Pete
运行服务的帐户确实可以访问 C:\Windows\System32,我已经测试过了。Process.Start() 没有返回任何错误,并且通过任务管理器检查,calc 也没有在后台运行。 - Dot NET
@PMF 如我在问题中所述,我已启用了该复选框 :/ - Dot NET
哦,疏忽了... - PMF
你尝试过创建一个控制台应用程序,然后将你的start_calc函数复制粘贴到其中吗?这样至少可以确定是与服务相关还是你的代码有问题。 - Pete
显示剩余6条评论
2个回答

0

以“管理员身份运行”权限执行它


这不是问题,我正在使用管理员帐户运行。 - Dot NET

0

这个问题一直让我很沮丧,但最终我解决了它。是的,我成功地让一个服务加载了一个GUI应用程序,尽管每个人都说这是不可能的。不过需要注意的是,“修复”可以被视为利用Windows中的漏洞,因为我使用的代码基本上通过了Vista和Windows 7的UAC。实质上,该应用程序始终以完全权限执行并绕过了UAC。

如果有人遇到同样的问题,你需要做的是在PC上遍历已登录用户的列表,并选择在此会话(具有用户桌面)中打开UI应用程序,而不是在服务应该运行的会话0中打开(没有桌面)。

对于某些人来说,这可能不是一个安全的解决方案。但在我的情况下,安全性不是主要问题,我只需要它能够工作(必须是一个服务)。

希望这能帮助到与我有相同问题的任何人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接