首页 > 解决方案 > 通过 MIM .dll 调用时,无法从任何应用程序调用 cmd.exe

问题描述

我目前拥有的是需要调用命令行来运行一些控制台命令的元节的 MIM .dll 扩展。这些控制台命令用于名为 GAM 的 Web 工具,该工具将创建 G-Suite 用户。我有一个内置 .NET Framework 4.7.2 的测试控制台应用程序,它工作得很好。使用我的 .dll 运行代码时,它似乎处理得很好,甚至返回一个正的退出代码 0,但没有在 cmd 中执行预期的功能。.dll 位于 .NET Framework 4.5 中。两个应用程序的代码块相同:

using (Process gamProcess = new Process())
            {
                gamProcess.StartInfo.UseShellExecute = false;
                gamProcess.StartInfo.RedirectStandardOutput = true;
                gamProcess.StartInfo.FileName = @"C:\Windows\System32\cmd.exe";
                gamProcess.StartInfo.CreateNoWindow = true;
                gamProcess.StartInfo.Arguments = "/c gam create user " + username + " firstname " + firstname + " lastname " + lastname + " password " + pass;
                gamProcess.Start();
                gamProcess.WaitForExit();
            }

如果我直接从 .dll 调用此代码块,它会表现得好像它执行了该操作但没有任何反应。如果我从独立应用程序中调用此代码,它就可以正常工作。我什至试图从 .dll 调用这个应用程序并将参数直接传递给它。如果我在 Visual Studio 中设置参数,这将起作用,但如果我从 .dll 调用应用程序,它将不起作用。我在这里不知所措,我无法弄清楚从我的扩展程序运行和从应用程序运行之间有什么区别。

另一个旁注,我构建了一个更简单的控制台应用程序,它只写入文件。我能够从 .dll 调用这个应用程序,它工作得很好。只有上面的命令 .dll 似乎不想正确处理。

标签: c#c#-4.0dllcmdgoogle-workspace

解决方案


我设法修复了上面的代码。我同时做了两件事,所以我不确定哪个是这个问题的关键,但它现在完美无缺。我将代码中的 /c 更改为 /C 大写。代码现在如下所示:

using (Process gamProcess = new Process())
        {
            gamProcess.StartInfo.UseShellExecute = false;
            gamProcess.StartInfo.RedirectStandardOutput = true;
            gamProcess.StartInfo.FileName = @"C:\Windows\System32\cmd.exe";
            gamProcess.StartInfo.CreateNoWindow = true;
            gamProcess.StartInfo.Arguments = "/C gam create user " + username + " firstname " + firstname + " lastname " + lastname + " password " + pass;
            gamProcess.Start();
            gamProcess.WaitForExit();
        }

我执行的第二个操作是重新启动我正在处理的开发服务器。我不确定哪个有效,特别是因为我在控制台应用程序中运行小写 /c,但代码现在可以工作。谢谢所有看过这个问题的人。


推荐阅读