2 回答
TA贡献1811条经验 获得超5个赞
只是想为可能遇到此问题的任何人或 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.exe
inC:\Windows\SysWOW64
。
解决方案是将 C# 程序更改为 targetAnyCPU
或x64
.
作为旁注,我还想补充一点,默认情况下,C# 的 VS 项目设置为“任何 CPU”配置,但是在构建选项卡上的项目属性中勾选了复选框,上面写着“首选 32 位”:这需要取消选中/禁用,否则“任何 cpu”构建也会导致 32 位应用程序。
除此之外,我已经成功地在我们的服务应用程序中实现了完全工作的 EWF 管理器。不幸的是,我在使用 pInvoke 和 ewfapi dll 时没有任何运气,因为它似乎没有返回正确的结果。我还不确定实现中是否存在问题,或者 EWF api 本身是否已损坏(说实话,它确实有问题且不可靠。特别是对于我们来说,“禁用”命令什么也不做 - 重新启动后,ewf 是仍然启用。禁用它的唯一方法是禁用和提交,或使用 CommitAndDisableLive,不幸的是,它们都将当前状态提交到驱动器上,所以我不得不在禁用保护之前使用回退并重新启动机器,以确保其处于干净状态),所以我走的路线是使用命令行调用它,并解析响应参数来控制它。
一旦我有时间上传它,我会回来编辑这篇文章以包含 GitHub 链接。如果有人需要它,我很乐意按原样发送。
希望能帮助到你。
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();
}
- 2 回答
- 0 关注
- 486 浏览
添加回答
举报