首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >文件副本从aspnet work窗体开始,使用批处理、pstools和机器人复制实现,但不起作用。

文件副本从aspnet work窗体开始,使用批处理、pstools和机器人复制实现,但不起作用。
EN

Stack Overflow用户
提问于 2017-11-24 15:01:00
回答 1查看 208关注 0票数 1

我有4台独立的服务器(非域服务器):IIS、SQL1、SQL2、SQL3

我希望通过单击托管在IIS上的网页,将数据库备份从SQL1复制到SQL2SQL3 (取决于参数)。

为此,我编写了一个按钮单击方法,该方法调用位于IIS上inetpub文件夹中的批处理文件。

批处理使用pstoolsSQL1上运行机器人复制,它应该将所需文件复制到目标服务器(SQL3 2E 221E 122SQL3 3E 223)。

如果我直接在IIS (cmd作为管理员)上执行批处理,或者当我在本地计算机上调试它时,这个解决方案就能工作,但如果从运行中的站点调用它,则不会工作。它甚至不会在以下几行之间花费任何时间:

代码语言:javascript
复制
        batchProcess.Start();
        batchProcess.WaitForExit();

以下是我的复制方法:

代码语言:javascript
复制
private bool ProcessCopy(string file, string destinationIp)
    {
        SecureString password = ConvertToSecureString("myPassword");

        try
        {
            string batchPath = Server.MapPath(".") + "\\CopyFile.bat";
            string cmd = @"c:\Windows\System32\cmd.exe";

            ProcessStartInfo processInfo = new ProcessStartInfo
            {
                FileName = cmd,
                UseShellExecute = false
            };

            Process batchProcess = new Process {StartInfo = processInfo};

            batchProcess.StartInfo.Arguments = $"/C {batchPath} {file} {destinationIp}";
            batchProcess.StartInfo.Domain = "";
            batchProcess.StartInfo.UserName = "Administrator";
            batchProcess.StartInfo.Password = password;
            batchProcess.StartInfo.RedirectStandardOutput = true;
            batchProcess.StartInfo.RedirectStandardError = true;
            batchProcess.StartInfo.CreateNoWindow = true;

            batchProcess.Start();
            batchProcess.WaitForExit();
            string response = batchProcess.StandardOutput.ReadToEnd();
            response += batchProcess.StandardError.ReadToEnd();
            statusStringAppend($"response: {response}");

            return true;
        }
        catch (Exception ex)
        {
            statusStringAppend($"Failed: {ex.Message}. {ex.StackTrace}");
        }
        return false;
    }

批处理主体是:

代码语言:javascript
复制
@echo off
c:\qa\tools\pstools\psexec64.exe -accepteula -u Administrator -p myPassword \\SourceIP robocopy \\SourceIP\qa\db_backup\ \\%2\qa\db_backup\ %1 /is

我的问题是:

  1. 为什么文件没有被复制?
  2. 有什么更好的方法来复制吗?

根据以下建议更新代码

EN

回答 1

Stack Overflow用户

发布于 2017-11-25 20:36:17

我的猜测是,您从未像以前一样以IIS服务正在运行的用户的身份执行pstools,因此EULA对话框阻止了您的执行。

如果您还记得,您总是有一个窗口,并需要在第一次运行任何sysinternals工具(如pstools )时按接受按钮。

我想这应该对你有用:

代码语言:javascript
复制
c:\qa\tools\pstools\psexec64.exe -accepteula -u Administrator -p myPassword \\SourceIP robocopy \\SourceIP\qa\db_backup\ \\%2\qa\db_backup\ %1 /is

编辑您以后很可能遇到了这个问题,无论如何它对您不起作用,所以我必须列出您的代码还可能有什么问题:

  • 启动.bat文件需要cmd.exe作为母进程,不能直接将.bat文件作为进程启动。相反,您可以使用ProcessStartInfo以外的另一种自动生成系统默认脚本解释器的方法:Executing Batch File in C#
  • 执行批处理文件的过程是"cmd.exe",第一个参数是"/C",第二个参数是正在执行的批处理文件。
  • 在执行典型的命令行工具时,可以考虑读取正在执行的进程的SDTOUT (标准输出),如下所示:Capturing console output from a .NET application (C#)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47475829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档