C#运行过程奇怪的东西

时间:2013-04-26 20:03:45

标签: c# process

没有错误。没有例外。第二个和第三个产生文件f [1] / [2]。但不是第一个。为什么?我验证使用debug命令是好的。并使用我从debug,cut和past捕获的命令到命令行,我可以生成文件[f0]。

        string[] f = new string[4];
        f[0] = "SNICKER.reg.txt";
        f[1] = "SNDIS.reg.txt";
        f[2] = "SNICS.reg.txt";
        f[3] = "Ssmf.xml";

        //First
        Run_Process("REG", "EXPORT HKEY_LOCAL_MACHINE\\SOFTWARE\\sridge\\Snicker " + f[0] + " /y");

        //Second
        Run_Process("REG", "EXPORT HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\services\\SNDIS " + f[1] + " /y");

        //Third
        Run_Process("REG", "EXPORT HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\SClass " + f[2] + " /y");



    private static void Run_Process(string exe_name, string arg)
    {

        Process myProcess = new Process();
        try
        {
            myProcess.StartInfo.UseShellExecute = false;
            myProcess.StartInfo.FileName = exe_name;
            //myProcess.StartInfo.Arguments = "/C getLH.exe > feed.txt";
            myProcess.StartInfo.Arguments = arg;
            myProcess.StartInfo.CreateNoWindow = true;
            myProcess.Start();
            myProcess.WaitForExit();

        }
        catch (Exception ep)
        {
            Console.WriteLine(exe_name + " " + arg + ". Error: " + ep.Message);

        }
    }

2 个答案:

答案 0 :(得分:2)

当您的应用在64位操作系统上运行并且您尝试访问注册表时,您最终可能会读取错误文件夹中的值。
编译x86平台时会发生这种情况,因此您的代码将以32位代码的形式发出 在这种情况下,注册表重定向程序会启动并更改手工制作的注册表路径,指向HKLM\SOFTWAREHKLM\SOFTWARE\Wow6432Node内的文件夹。
这种行为背后的原因很复杂,您可以尝试阅读here

说,我仍然无法理解当我们在这个场景中将REG程序作为从使用AnyCPU构建的应用程序启动的进程执行时会发生什么。此应用程序应作为64位代码执行,但由于某种原因,执行的REG程序是32位版本(是的,有两个版本的REG.EXE,一个在system32中,一个在SysWow64中),此版本搜索您的数据在错误的道路上。也许这与PATH环境变量的当前值有关。

作为旁注。微软有史以来做出的最糟糕决定之一是允许应用程序将其配置数据存储在注册表中。我真的建议改变这种行为,如果可能的话

<强>更新 我可以确认在64位操作系统上,编译为AnyCPU的控制台应用程序运行执行上述REG.EXE命令的代码,从WINDOWS \ SYSWOW64启动REGbit的32位版本。我已经检查了ProcMon,我无法解释为什么会发生这种情况。它与PATH env变量无关,因为我只有C:\ WINDOWS \ SYSTEM32的路径

答案 1 :(得分:0)

签出Process.start: how to get the output?并尝试使用该方法查看命令的输出。我不认为会有任何异常,因为它只会捕获该代码块的异常,而不是您尝试运行的外部程序的例外。