c# - PsExec 1.98(从 C# 进程派生)在跨域运行 7Zip 时永远不会完成

标签 c# c#-4.0 7zip psexec

我正在使用带有代码的 C# .NET 4 进程启动 PsExec

var startInfo = new ProcessStartInfo(psExecLocation)
{
    Arguments = string.Format(@"\\{0} -accepteula -u {1} -p {2} {3}", serverName, username, password, command),
    RedirectStandardError = true,
    RedirectStandardOutput = true,
    CreateNoWindow = true,
    StandardErrorEncoding = Encoding.UTF8,
    StandardOutputEncoding = Encoding.UTF8,
    UseShellExecute = false
};

当我和我的开发机器在同一个域中时(对于我正在进行的所有调用,我遇到的问题不仅仅是这个调用)和执行简单的 DOS 命令(rmdir 和 mkdir)时,使用 PsExec 工作正常) 跨域(因为我在这次调用之前正在做它们)。

但是,当我让它运行以下命令时:

C:\7Zip\7za x "C:[文件路径包含空格]\__STAGING__\App01 [Trunk - STAGE_20121217.2].7z"-o"C:[文件路径包含空格]\__STAGING__\"-y -aoa

它永远不会回来。我可以看到它开始返回数据(我正在使用该过程重定向输出,它开始返回它所做的),但它突然停止并且什么都不做。在调用

之后它永远不会返回
process.WaitForExit();

奇怪的是它确实成功完成了。我可以通过 RDP 进入我们正在提取文件的服务器,我可以在那里看到文件,只是 PsExec 没有返回任何内容。我已经尝试删除 -y -aoa 开关并移动事物的顺序,但似乎没有任何效果。仅供引用,我们尝试提取此内容的服务器是 Windows Server 2003 版本和 Windows Server 2008 R2 版本。

正如所问,这正是我使用 PsExec 打开进程所做的:

        try
        {
            using (var process = new Process())
            {
                var startInfo = new ProcessStartInfo(psExecLocation)
                    {
                        Arguments = string.Format(@"\\{0} -accepteula -u {1} -p {2} {3}", serverName, username, password, command),
                        RedirectStandardError = true,
                        RedirectStandardOutput = true,
                        CreateNoWindow = true,
                        StandardErrorEncoding = Encoding.UTF8,
                        StandardOutputEncoding = Encoding.UTF8,
                        UseShellExecute = false
                    };

                process.StartInfo = startInfo;

                var processOutput = "";
                Action<object, DataReceivedEventArgs> action = (obj, eventArgs) =>
                    {
                        if (string.IsNullOrWhiteSpace(eventArgs.Data) == false)
                            processOutput += string.Format("{0}\r\n", eventArgs.Data);
                    };

                process.OutputDataReceived += new DataReceivedEventHandler(action);
                process.ErrorDataReceived += new DataReceivedEventHandler(action);

                process.Start();

                process.BeginOutputReadLine();
                process.BeginErrorReadLine();

                process.WaitForExit();

                // There appears to be a fault in PsExec that has everything go to error even if it is output. This gets around that
                output = "";
                if (string.IsNullOrWhiteSpace(processOutput) == false)
                {
                    output = processOutput;

                    // error code 0 means it worked / succeeded. Any other "error code" means something failed
                    var loweredOutput = processOutput.ToLower().Replace("\r\n", "").Trim();
                    return loweredOutput.EndsWith("error code 0.") || loweredOutput.EndsWith("error code 0");
                }

                // if it got here, psexec didn't return anything. That SHOULD never happen (emphasis on should)
                return false;
            }
        }
        catch (Exception ex)
        {
            Logging.Logger.LogError(ex);
            output = "";
            return false;
        }

最佳答案

这不是真正的答案,但我遇到了一个非常相似的问题。我在同一个域中运行,但看到的结果与描述的相同。

每次我从 C# 代码或 PowerShell 运行 PsExec 时,进程似乎挂起。当我观察远程服务器时,我看到 PSEXESVC 进程启动,同时我试图在远程服务器上运行命令。命令正常退出,但 PSEXESVC 似乎挂起。

我传递的远程命令是:cmd/c dir E:\temp

我已经从 LINQPad 测试了这个,CreateNoWindow 设置为 false,重定向设置为 false,打开的命令提示符确实返回了预期的输出。一旦我尝试再次捕获输出,进程就会回到挂起状态。

我知道这曾经在一两年前使用相同的代码从 C# 运行,所以我不确定是什么改变导致它现在挂起。

关于c# - PsExec 1.98(从 C# 进程派生)在跨域运行 7Zip 时永远不会完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13940288/

相关文章:

c# - Null 合并在 LINQ 查询中不起作用

c# - 为什么我们需要 Http 处理程序?

sql - 查询未返回唯一结果 : 2 . Nhibernate 查询问题

java - 7-zip-JBinding 解压文件的用法

c# - 当另一端关闭时套接字未注册

c# - C# (.net) 下带有 HTTP 服务器的 Keep-Alive 套接字如何发送多个查询?

wpf - WrapPanel 中的 ListViewItem 折叠时占用空间

c# - 检查 list<t> 是否包含任何其他列表

java - 尝试解压缩 7-Zip 存档(二进制模式)时出现异常

python - 将内存中的数据写入加密的 ZIP 或 7Z(不使用磁盘临时文件)