我有4个独立的服务器(不在域中): IIS,SQL1,SQL2,SQL3
我想将 SQL1 的数据库备份复制到 SQL2 或 SQL3 (取决于参数),方法是按住 IIS
我为此编写了一个按钮点击方法,该方法调用位于 IIS
上的inetpub文件夹中的批处理文件批量正在使用 pstools 在 SQL1 上运行 robocopy , SQL1 应将所需文件复制到目标服务器(< strong> SQL2 或 SQL3 )
如果我直接在 IIS (cmd作为管理员)上执行批处理,或者在本地计算机上调试批处理时,此解决方案有效,但如果从运行站点调用它则不会。 它甚至不会在以下几行之间花费任何时间:
batchProcess.Start();
batchProcess.WaitForExit();
这是我的复制方法:
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;
}
批处理正文是:
@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.有没有更好的方法来复制它?
根据以下建议更新的代码
答案 0 :(得分:1)
我的猜测是你从未像以前那样以IIS服务运行的用户身份执行pstools,因此EULA对话框阻止了你的执行。
如果你还记得,你总是有一个窗口,并且在第一次运行像pstools这样的sysinternals工具时需要按下接受按钮。
我想这应该适合你:
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#)