我有4台独立的服务器(非域服务器):IIS、SQL1、SQL2、SQL3
我希望通过单击托管在IIS上的网页,将数据库备份从SQL1复制到SQL2或SQL3 (取决于参数)。
为此,我编写了一个按钮单击方法,该方法调用位于IIS上inetpub文件夹中的批处理文件。
批处理使用pstools在SQL1上运行机器人复制,它应该将所需文件复制到目标服务器(SQL3 2E 221或E 122SQL3 3E 223)。
如果我直接在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我的问题是:
根据以下建议更新代码
发布于 2017-11-25 20:36:17
我的猜测是,您从未像以前一样以IIS服务正在运行的用户的身份执行pstools,因此EULA对话框阻止了您的执行。
如果您还记得,您总是有一个窗口,并需要在第一次运行任何sysinternals工具(如pstools )时按接受按钮。
我想这应该对你有用:
c:\qa\tools\pstools\psexec64.exe -accepteula -u Administrator -p myPassword \\SourceIP robocopy \\SourceIP\qa\db_backup\ \\%2\qa\db_backup\ %1 /is编辑您以后很可能遇到了这个问题,无论如何它对您不起作用,所以我必须列出您的代码还可能有什么问题:
https://stackoverflow.com/questions/47475829
复制相似问题