从 C# 进程启动时未执行 Cmd 命令(ewfmgr C: -commit)

当我尝试从 C# 运行 cmd 命令“efwmgr C:-commit”时,得到没有任何信息的空日志文件,当手动检查“ewfmgr C:”时,得到“引导命令 NO_CMD”,因此提交不运行。


相同的代码只是更改了 Arguments = "/C chkdsk C:" 它运行良好,将整个输出插入到我的日志中。


我使用的方法。


public static void StartProcess()

{

    var procStartInfo = new ProcessStartInfo

    {

        CreateNoWindow = false,

        WindowStyle = ProcessWindowStyle.Normal,

        FileName = "cmd",

        Arguments = "/C ewfmgr C: -commit",

        UseShellExecute = false,

        RedirectStandardOutput = true,

        RedirectStandardInput = true,

        RedirectStandardError = true

    };


    var process = new Process { StartInfo = procStartInfo, EnableRaisingEvents = true };


    using (StreamWriter writer = new StreamWriter(@"D:\commitFile.txt"))

    {

        process.OutputDataReceived += (sender, e) =>

        {

            writer.WriteLine(e.Data);

        };


        process.Start();

        process.BeginOutputReadLine();

        process.WaitForExit();

    }

}

这是我在https://social.msdn.microsoft.com/Forums/vstudio/en-US/4e014365-8e8f-4f93-998a-156f2e55ebab/how-to-get-and-write-ewf-上找到的几乎示例current-to-text-file-using-c?forum=csharpgeneral


MM们
浏览 487回答 2
2回答

四季花海

只是想为可能遇到此问题的任何人或 Windows/System32 目录中“丢失”的任何其他文件指出有关此问题的更新:首先要检查的是您的系统架构和流程架构:有几篇关于此功能的帖子(尽管我更喜欢称其为问题),我可以肯定地说,这篇文章解释了它的正确性,并且如果您设置了架构正确性,则 ewfmgr.exe 工作得很好。为了不依赖另一个帖子/链接,我将重写/复制大卫那里的答案:有一种解释是有道理的:您正在 64 位机器上执行程序。您的 C# 程序构建为 x86。该bcdedit.exe文件存在于C:\Windows\System32.尽管C:\Windows\System32在您的系统路径上,但在 x86 进程中,您受File System Redirector 的约束。这意味着C:\Windows\System32实际上解析为C:\Windows\SysWOW64.没有 32 位版本的bcdedit.exein C:\Windows\SysWOW64。解决方案是将 C# 程序更改为 targetAnyCPU或x64.作为旁注,我还想补充一点,默认情况下,C# 的 VS 项目设置为“任何 CPU”配置,但是在构建选项卡上的项目属性中勾选了复选框,上面写着“首选 32 位”:这需要取消选中/禁用,否则“任何 cpu”构建也会导致 32 位应用程序。除此之外,我已经成功地在我们的服务应用程序中实现了完全工作的 EWF 管理器。不幸的是,我在使用 pInvoke 和 ewfapi dll 时没有任何运气,因为它似乎没有返回正确的结果。我还不确定实现中是否存在问题,或者 EWF api 本身是否已损坏(说实话,它确实有问题且不可靠。特别是对于我们来说,“禁用”命令什么也不做 - 重新启动后,ewf 是仍然启用。禁用它的唯一方法是禁用和提交,或使用 CommitAndDisableLive,不幸的是,它们都将当前状态提交到驱动器上,所以我不得不在禁用保护之前使用回退并重新启动机器,以确保其处于干净状态),所以我走的路线是使用命令行调用它,并解析响应参数来控制它。一旦我有时间上传它,我会回来编辑这篇文章以包含 GitHub 链接。如果有人需要它,我很乐意按原样发送。希望能帮助到你。

潇潇雨雨

您可能在过程错误输出流中遇到错误。附加您的登录ErrorDataReceived事件处理程序。对于'ewfmgr' is not recognized as an internal or external command您应该编辑流程环境变量或指定应用程序的完整路径。这是你的代码应该是这样的:var procStartInfo = new ProcessStartInfo{    CreateNoWindow = false,    WindowStyle = ProcessWindowStyle.Normal,    FileName = "cmd",    //Append PATH environment variable bellow if you use this    Arguments = "/C ewfmgr C: -commit",    //Or use full path to application without changing environment variable    //Arguments = "/C c:\full\path\to\application\ewfmgr C: -commit",    UseShellExecute = false,    RedirectStandardOutput = true,    RedirectStandardInput = true,    RedirectStandardError = true };procStartInfo.EnvironmentVariables["PATH"] += @";c:\full\path\to\application\";var process = new Process { StartInfo = procStartInfo, EnableRaisingEvents = true };using (StreamWriter writer = new StreamWriter(@"D:\commitFile.txt")){   process.OutputDataReceived += (sender, e) =>   {      writer.WriteLine(e.Data);   };   process.ErrorDataReceived+= (sender, e) =>   {      writer.WriteLine(e.Data);   };   process.Start();   process.BeginOutputReadLine();   process.BeginErrorReadLine();   process.WaitForExit();}
打开App,查看更多内容
随时随地看视频慕课网APP