个性化阅读
专注于IT技术分析

如何在WinForms中使用C#在Windows的System32目录中运行任何可执行文件

本文概述

在Windows中, 对于某些基于x64的系统, 当你尝试从Windows的(C:\ Windows \ system32)目录中的应用程序运行某些可执行文件时, 有时会遇到奇怪的行为, 例如使用dfrgui.exe, 允许用户对系统上的磁盘进行碎片整理的应用程序。理论上可以从以下代码开始:

// First way
Process processToStart = new Process
{
    StartInfo =
    {
        FileName = @"dfrgui.exe", WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.System)
    }
};

processToStart.Start();

// Second way
Process.Start(@"C:\Windows\system32\dfrgui.exe");

但是, 当你在提到的平台上运行代码时, 你什么也看不到, 绝对什么也没有。没有例外, 没有堆栈跟踪, 仅此而已。这个问题可能让人非常沮丧, 幸运的是, 有一个解决方案, 你可以轻松地在应用程序中实现而无需太多麻烦。

在本文中, 我们将向你介绍如何防止这种行为, 并使用Winforms中的C#运行Windows的System32目录中的任何可执行文件。

1.创建Wow64Interop类

为了运行Windows系统目录(C:\ Windows \ system32)中的任何可执行文件, 你将需要为调用线程禁用文件系统重定向。默认情况下, 每个系统上都启用文件系统重定向, 因此你将需要运行Windows的本机方法, 即Wow64DisableWow64FsRedirection函数。以前, 实现此目的的先决功能是Wow64EnableWow64FsRedirection, 但是, 当存在嵌套调用时, 此功能可能无法可靠地工作。为确保你的应用程序具有正确的功能, 请确保使用Wow64DisableWow64FsRedirection方法。该类还将包含用于还原我们在上一个函数开始时所做的操作的方法, 即Wow64RevertWow64FsRedirection方法, 代表Wow64DisableWow64FsRedirection函数的所有数据分配都将被该函数清除。

我们可以通过以下方式在我们的代码中包含此帮助程序。继续在你的Winforms应用程序中包含此方法, 从而在你自己的名称空间中创建以下类。此类的名称将是Wow64Interop(文件名Wow64Interop.cs), 并包含以下代码:

using System;
using System.Runtime.InteropServices;

namespace Sandbox
{
    public class Wow64Interop
    {
        const string Kernel32dll = "Kernel32.Dll";

        [DllImport(Kernel32dll, EntryPoint = "Wow64DisableWow64FsRedirection")]
        public static extern bool DisableWow64FSRedirection(ref IntPtr ptr);

        [DllImport(Kernel32dll, EntryPoint = "Wow64RevertWow64FsRedirection")]
        public static extern bool Wow64RevertWow64FsRedirection(IntPtr ptr);
    }
}

包含该类后, 它应该在你的应用程序中公开公开, 因为稍后我们将使用它来运行该应用程序。

2.运行位于system32目录内的应用程序

现在, 如开篇所述, 我们首先需要为调用线程禁用文件系统重定向, 因此我们将代码包装应用程序初始化, 并在try-catch块中初始化应用程序, 该块将在Wow64Interop.DisableWow64FSRedirection(true)方法之前运行将允许你启动可执行文件(禁用重定向):

// Required namespaces
using System;
using System.Diagnostics;
using System.Windows.Forms;

IntPtr wow64Value = IntPtr.Zero;

try
{
    // 1. Disable initially the Wow64FSRedirection
    Wow64Interop.DisableWow64FSRedirection(ref wow64Value);

    // 2. Prepare the code that starts another executable
    // Run the application from the system32 directory
    // In this case we will run the dfrgui.exe app
    //
    // C:\Windows\system32\dfrgui.exe
    Process processToStart = new Process
    {
        StartInfo =
        {
            FileName = @"dfrgui.exe", WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.System)
        }
    };

    // Start the application
    processToStart.Start();
}
catch (Exception exc)
{
    Console.WriteLine("Unabled to disable/enable WOW64 File System Redirection");
    Console.WriteLine(exc.Message);
}
finally
{
    // 3. Let the Wow64FSRedirection with its initially state
    Wow64Interop.Wow64RevertWow64FsRedirection(wow64Value);
}

现在, 该代码应该可以启动应用程序而没有任何问题(如果你没有权限, 你将至少看到异常触发的凭据原因, 但你至少会看到一些东西, 这与我们之前的代码不同)开始)。一旦可执行文件在finally语句中启动, 别忘了再次还原对重定向所做的更改(Wow64Interop.Wow64RevertWow64FsRedirection(true))。

编码愉快!

赞(0)
未经允许不得转载:srcmini » 如何在WinForms中使用C#在Windows的System32目录中运行任何可执行文件

评论 抢沙发

评论前必须登录!