从服务执行 shell 命令

Kev*_*lls 5 c# shell service

我正在尝试从我创建的 C# 服务中执行 shell 命令。但是,这个命令似乎没有执行。作为一个标准的控制台应用程序,它运行得很好,所以我知道命令本身没有问题,或者它是如何在代码中执行的。谁能告诉我为什么这行不通?请记住,我对 C# 还很陌生,所以这可能只是我缺乏经验的问题。以下是服务本身的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management;
using System.Diagnostics;
using System.ServiceProcess;
using System.Threading;

namespace AdapterDisableTest
{
    class Program : ServiceBase
    {
        //private static Timer workTimer;

        static void Main(string[] args)
        {
            ServiceBase.Run(new Program());
        }

        public Program()
        {
            this.ServiceName = "AdapterDisableTest";
        }

        protected override void OnStart(string[] args)
        {
            base.OnStart(args);

            Process myProcess = new Process();

            myProcess.StartInfo.FileName = @"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe";
            myProcess.StartInfo.Arguments = "controlvm test setlinkstate1 off";
            myProcess.StartInfo.UseShellExecute = false;
            myProcess.StartInfo.CreateNoWindow = true;
            myProcess.Start();

        }

        protected override void OnStop()
        {
            base.OnStop();

            //TODO: clean up any variables and stop any threads
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

Kev*_*lls 0

事实证明,这不起作用的原因是应用程序兼容性 - 会话 0 隔离。本质上,服务按预期启动了进程,但它是在会话 0 内启动的,因此它对用户隐藏,因此用户无法与其交互。

\n\n

为了解决这个限制,我能够遵循由 Pero Mati\xc4\x87 编写的指南Subverting Vista UAC in Both 32 and 64 bit Architectures。这个简短的指南允许我从当前登录用户会话内的服务生成一个进程,而不是在会话 0 内。遗憾的是,我不再拥有用于让它作为项目工作的完整代码我正在使用它,但被取消了。

\n