当我尝试从C#运行cmd命令'efwmgr C:-commit'时,得到了没有任何信息的空日志文件,当手动检查'ewfmgr C:'时,得到了'Boot Command NO_CMD',因此提交不运行。
刚刚更改了相同的代码参数=“ / 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();
}
}
上发现的几乎示例
答案 0 :(得分:0)
您可能在过程错误输出流中遇到错误。在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();
}
答案 1 :(得分:0)
只想为可能遇到此问题的任何人,或Windows / System32目录中“丢失”的任何其他文件指出有关此问题的更新:
首先要检查的是您的系统架构和流程架构:
关于此功能有好几篇文章(尽管我更喜欢称之为问题),我可以肯定地说this one解释了它的正确性,并且如果您设置架构的正确性,ewfmgr.exe也可以正常工作。 / p>
为了不依赖其他帖子/链接,我将在此处重写/复制大卫的答案:
有一种合理的解释:
bcdedit.exe
文件存在于C:\Windows\System32
中。 C:\Windows\System32
在您的系统路径上,但是在x86进程中,您必须遵守File System Redirector。这意味着C:\Windows\System32
实际上解析为C:\Windows\SysWOW64
。 bcdedit.exe
中没有C:\Windows\SysWOW64
的32位版本。 解决方案是将您的C#程序更改为以AnyCPU
或x64
为目标。
此外,我还要补充一点,默认情况下,C#的VS项目设置为“任何CPU”配置,但是在“构建”选项卡上的项目属性中选中了复选框,即“首选”。 32位”:需要取消选中/禁用此选项,否则“任何cpu”构建也将导致32位应用程序。
除此之外,我已经在我们的服务应用程序中成功实现了可正常使用的EWF管理器。不幸的是,使用pInvoke和ewfapi dll并没有带来任何运气,因为它似乎未返回正确的结果。我不确定执行中是否存在问题,或者EWF api本身是否损坏(说实话,它确实有错误和不可靠。对于我们来说,“ Disable”命令无任何作用-重新启动后,ewf为禁用它的唯一方法是禁用并提交,或使用CommitAndDisableLive,它们都不幸将当前状态提交到驱动器上,因此我必须使用回退并在禁用保护之前重新启动计算机,以确保其处于干净状态),因此我使用了命令行来调用它,并解析响应参数来控制它。不幸的是,这是时间紧迫的,我需要生产就绪的解决方案,所以我不得不采取一种解决方法,但是我将发布一个关于pInvoke的单独问题,然后将其作为最终解决方案全部放在GitHub上。
一旦有时间上载,我将返回并编辑该帖子以包含GitHub链接。如果有人立即需要它,我很乐意照原样发送。
希望有帮助。