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

本文概述

  • 1.创建Wow64Interop类
  • 2.运行位于system32目录内的应用程序
在Windows中, 对于某些基于x64的系统, 当你尝试从Windows的(C:\ Windows \ system32)目录中的应用程序运行某些可执行文件时, 有时会遇到奇怪的行为, 例如使用dfrgui.exe, 允许用户对系统上的磁盘进行碎片整理的应用程序。理论上可以从以下代码开始:
// First wayProcess processToStart = new Process{StartInfo ={FileName = @"dfrgui.exe", WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.System)}}; processToStart.Start(); // Second wayProcess.Start(@"C:\Windows\system32\dfrgui.exe");

但是, 当你在提到的平台上运行代码时, 你什么也看不到, 绝对什么也没有。没有例外, 没有堆栈跟踪, 仅此而已。这个问题可能让人非常沮丧, 幸运的是, 有一个解决方案, 你可以轻松地在应用程序中实现而无需太多麻烦。
在本文中, 我们将向你介绍如何防止这种行为, 并使用Winforms中的C#运行Windows的System32目录中的任何可执行文件。
1.创建Wow64Interop类【如何在WinForms中使用C#在Windows的System32目录中运行任何可执行文件】为了运行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 namespacesusing System; using System.Diagnostics; using System.Windows.Forms; IntPtr wow64Value = http://www.srcmini.com/IntPtr.Zero; try{// 1. Disable initially the Wow64FSRedirectionWow64Interop.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.exeProcess processToStart = new Process{StartInfo ={FileName = @"dfrgui.exe", WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.System)}}; // Start the applicationprocessToStart.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 stateWow64Interop.Wow64RevertWow64FsRedirection(wow64Value); }

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

    推荐阅读