在shell(或类似)中执行几个提升的命令

时间:2014-02-18 09:26:50

标签: c# windows shell uac elevated-privileges

我需要执行具有提升权限的多个命令,例如:

  1. 调用程序,修改服务的.config文件(需要管理员权限)
  2. net stop myservice(需要管理员权限)
  3. net start myservice(需要管理员权限)
  4. 所有这些动态,e。 G。第一行可以包含代理设置,包括用户名和密码,或对设置文件的任何其他修改。 (设置文件在程序文件夹中,从外部提供修改设置文件的程序。实际信息将由用户通过GUI输入。)

    我想创建一个非常灵活的解决方案,使用带有重定向的stdin和stdout的cmd.exe进程。但是......它看起来像“runas”(需要ShellExecute)并且重定向输入/输出是独占的。

    (另外,我注意到重定向和cmd.exe很难处理..我必须编写自己的函数,例如作为ReadLine的替代品,因为ReadLine期望最终的NewLine并等待,例如,如果有一个命令提示符(意思是你在行中有文字,如c:\ bla>但没有NewLine。但是,不知道结果是什么让写一些通用的东西变得困难。)

    我能想到的有三种选择:

    1. 获取每个命令的UAC提示符(我不希望这样)
    2. 启动一个提升的进程,然后可以调用它想要的任何内容 - >需要一个我想避免的额外项目(.exe),也使部署更加困难(附加文件)
    3. 动态创建批处理文件,将其升级运行。这也是我想避免的,因为该文件中可能存在纯文本的密码信息(例如代理的用户/密码)。我至少必须确保始终覆盖其内容然后将其删除。
    4. 如何处理?

1 个答案:

答案 0 :(得分:1)

我认为您已经诊断出了这个问题,并列举了您的可用选项。在我看来,最好的选择是使用runas来创建一个新的提升过程,并让该过程完成工作。

另一个进程不一定是不同的可执行文件,它可能是您使用特定命令行参数启动的现有可执行文件。一旦你有另一个进程升级,你当然可以使用cmd重定向stdin / stdout来完成工作。但是,为什么使用net stop/start而不是服务API?您是否可以在不启动单独流程的情况下进行.config文件修改?