以管理员身份在CMD中运行命令

时间:2013-11-27 11:45:52

标签: c# windows command-line cmd

我需要坚持的规则如下:

  1. 运行命令提示符命令as administrator
  2. change directory(路径始终相同)
  3. 运行命令net start something
  4. 有关如何使用C#以编程方式执行此操作的任何想法?

    仅为了记录,我正在运行.net 4.0内置的控制台应用程序

    我正在使用此功能

            private static void commandtorun(string commandexecuted)
        {
            string currentstatus;
            ProcessStartInfo startInfo = new ProcessStartInfo();
            Process myprocess = new Process();
            try
            {
                startInfo.FileName = "cmd"; //
                startInfo.RedirectStandardInput = true;
                startInfo.RedirectStandardOutput = true;
                startInfo.UseShellExecute = false; //'required to redirect
                //startInfo.CreateNoWindow = true; // '<---- creates no window, obviously
                myprocess.StartInfo = startInfo; //
                myprocess.Start(); //
                System.IO.StreamReader SR;
                System.IO.StreamWriter SW;
                Thread.Sleep(200);
                SR = myprocess.StandardOutput;
                SW = myprocess.StandardInput;
                SW.WriteLine(commandexecuted); // 'the command you wish to run.....
                SW.WriteLine("exit"); // 'exits command prompt window
                Thread.Sleep(200);
                currentstatus = SR.ReadToEnd();
                SW.Close();
                SR.Close();
            }
            catch (Exception e)
            {
                Console.WriteLine("{0} Exception caught.", e);
                Console.ReadLine();
            }
            // throw new NotImplementedException();
        }
    

    当我使用此命令调用该函数时,我被拒绝访问:

    commandtorun(@"cd c:\Program Files (x86)\folder1\folder2"); // change the folder because cmd always runs on different path
    commandtorun("net start something"); run the COMMAND
    

    我尝试在一个语句中运行这两个命令,但是遇到了同样的错误。

1 个答案:

答案 0 :(得分:0)

这里有很多问题。

您希望运行升级的其他进程,但您的代码不会采取措施来实现这一点。为此,您需要使用runas动词调用您的流程,并将UseShellExecute设置为true。但您也想重新指导这就是将UseShellExecute设置为false的原因。

我认为没有令人信服的理由进行重定向,因此我认为您可以将true用于UseShellExecute。您正在将exit命令引入cmd.exe以终止该过程。你不需要这样做。只需传递cmd.exe /c参数,该过程将在完成后关闭。

这些更改将允许您删除对Sleep()的这些调用。每当你打电话给Sleep()时,你都应该问问自己为什么要这样做,以及是否可以避免。很少有问题Sleep()是最佳解决方案。

您正尝试通过执行cd来指定工作目录。这又是错误的做法。您可以在ProcessStartInfo对象中指定工作目录。这就是你应该怎么做的。

您的设计让您在单独的过程中执行每个命令。这是一个非常糟糕的方式。您希望在cmd.exe的单个实例中依次执行所有命令。将命令放入.bat.cmd文件中,然后获取cmd.exe进行处理。

想象一下,如果你继续将每个命令作为一个单独的进程处理。第二个进程如何记住您所做的工作目录更改?您真的希望您的用户看到每个单独命令的UAC对话框吗?

虽然已经说了所有这些,但你会以错误的方式解决这个问题。您只是想尝试启动服务。是的,当您在命令行中工作时,使用net start执行此操作。但是从程序中,您可以使用服务API来启动服务。换句话说,我相信您应该丢弃所有这些代码并调用服务API。