4

我正在开发一个 C# 应用程序。

我需要创建变量并将其传递给一个新进程,我正在使用ProcessStartInfo.EnvironmentVariables.

新进程必须运行提升,所以我使用 Verb = "runas"

var startInfo =  new ProcessStartInfo(command)
{
    UseShellExecute = true,
    CreateNoWindow = true,
    Verb = "runas"
};
foreach (DictionaryEntry entry in enviromentVariables)
{
    startInfo.EnvironmentVariables.Add(entry.Key.ToString(), entry.Value.ToString());
}

问题是根据msdn 文档

更改属性后,您必须将该UseShellExecute属性设置为 false才能启动该过程EnvironmentVariables。如果UseShellExecute为 true,InvalidOperationException则在调用 Start 方法时抛出 an。

但该runas变量需要UseShellExecute=true

有没有办法做到这两点:以提升的方式运行进程并设置环境变量?

编辑

我会尝试改写我的问题...

有没有办法将参数安全地传递给另一个进程,这样只有另一个进程才能读取参数。

4

2 回答 2

1

它可以工作,但缺点是它还显示了第二个命令提示符,环境变量仅在启动过程的上下文中设置,因此设置不会传播到整个盒子。

    static void Main(string[] args)
    {
        var command = "cmd.exe";
        var environmentVariables = new System.Collections.Hashtable();
        environmentVariables.Add("some", "value");
        environmentVariables.Add("someother", "value");

        var filename = Path.GetTempFileName() + ".cmd";
        StreamWriter sw = new StreamWriter(filename);
        sw.WriteLine("@echo off");
        foreach (DictionaryEntry entry in environmentVariables)
        {
            sw.WriteLine("set {0}={1}", entry.Key, entry.Value);
        } 
        sw.WriteLine("start /w {0}", command);
        sw.Close();
        var psi = new ProcessStartInfo(filename) {
            UseShellExecute = true, 
            Verb="runas"
        };
        var ps =  Process.Start(psi);
        ps.WaitForExit();
        File.Delete(filename);
    }
于 2012-08-06T13:16:53.987 回答
0

有一个更好的答案:您仍然可以使用具有 UseShellExecute = true 的 ProcessStartInfo 调用 Process.Start(),前提是您调用它的方法已用 [STAThread] 属性标记。

于 2016-03-23T01:17:29.410 回答