为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
MM们 2021-11-28 16:00:23
当我尝试从 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
查看完整描述

2 回答

?
四季花海

TA贡献1811条经验 获得超5个赞

只是想为可能遇到此问题的任何人或 Windows/System32 目录中“丢失”的任何其他文件指出有关此问题的更新:

首先要检查的是您的系统架构和流程架构:

有几篇关于此功能的帖子(尽管我更喜欢称其为问题),我可以肯定地说,这篇文章解释了它的正确性,并且如果您设置了架构正确性,则 ewfmgr.exe 工作得很好。

为了不依赖另一个帖子/链接,我将重写/复制大卫那里的答案:

有一种解释是有道理的:

  1. 您正在 64 位机器上执行程序。

  2. 您的 C# 程序构建为 x86。

  3. bcdedit.exe文件存在于C:\Windows\System32.

  4. 尽管C:\Windows\System32在您的系统路径上,但在 x86 进程中,您受File System Redirector 的约束。这意味着C:\Windows\System32实际上解析为C:\Windows\SysWOW64.

  5. 没有 32 位版本的bcdedit.exein C:\Windows\SysWOW64

解决方案是将 C# 程序更改为 targetAnyCPUx64.

作为旁注,我还想补充一点,默认情况下,C# 的 VS 项目设置为“任何 CPU”配置,但是在构建选项卡上的项目属性中勾选了复选框,上面写着“首选 32 位”:这需要取消选中/禁用,否则“任何 cpu”构建也会导致 32 位应用程序。

除此之外,我已经成功地在我们的服务应用程序中实现了完全工作的 EWF 管理器。不幸的是,我在使用 pInvoke 和 ewfapi dll 时没有任何运气,因为它似乎没有返回正确的结果。我还不确定实现中是否存在问题,或者 EWF api 本身是否已损坏(说实话,它确实有问题且不可靠。特别是对于我们来说,“禁用”命令什么也不做 - 重新启动后,ewf 是仍然启用。禁用它的唯一方法是禁用和提交,或使用 CommitAndDisableLive,不幸的是,它们都将当前状态提交到驱动器上,所以我不得不在禁用保护之前使用回退并重新启动机器,以确保其处于干净状态),所以我走的路线是使用命令行调用它,并解析响应参数来控制它。

一旦我有时间上传它,我会回来编辑这篇文章以包含 GitHub 链接。如果有人需要它,我很乐意按原样发送。

希望能帮助到你。


查看完整回答
反对 回复 2021-11-28
?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

您可能在过程错误输出流中遇到错误。附加您的登录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();

}


查看完整回答
反对 回复 2021-11-28
  • 2 回答
  • 0 关注
  • 486 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信