我有一个位于四个不同服务器上的Windows应用程序,其目的是查看目录,查找.wav文件并将它们复制到远程位置。它从服务器上的目录运行时非常有效,但我不喜欢去四个不同的服务器来执行应用程序。下面,我有一个控制台应用程序,它只是告诉用户将wav文件的ID存储在正确的位置,以便四个应用程序可以看到它们,然后执行各种程序。问题是所有四个应用程序在发布后立即崩溃,我认为这与我执行命令的方式有关,但我无法弄明白。有什么想法吗?
class Program
{
static void Main()
{
Console.SetWindowSize(90, 35);
Console.WriteLine(@"Place the ID of the interaction(s) you wish to recover in \\SERVER\c$\IDKeys.txt." + Environment.NewLine);
Console.WriteLine("Press Enter to find interactions.");
Console.ReadLine();
exeCmd();
}
static void exeCmd()
{
string[] executable =
{
@"\\Server1\C$\App\findwavs.exe",
@"\\Server2\C$\App\findwavs.exe",
@"\\Server3\C$\App\findwavs.exe",
@"\\Server4\C$\App\findwavs.exe"
};
foreach (string exe in executable)
{
Process proc = new Process();
proc.StartInfo.FileName = exe;
proc.Start();
}
}
}
答案 0 :(得分:4)
您拥有的代码在本地计算机上执行可执行文件。
使用@"\\Server1\C$\App\findwavs.exe
并不意味着可执行文件将在Server1上运行,这只意味着您的本地计算机将查找此网络路径以获取可执行文件,但将在本地运行。
您可以使用PsExec在远程计算机上执行应用程序。
请考虑以下使用PsExec在远程计算机上运行可执行文件的代码:
string application = "c:\\app\\findwavs.exe";
string arguments = ""; //use this if you want to pass any command line arguments to the findwavs.exe executable
string location_of_psexec = "c:\\pstools\\psexec.exe"; //location of Psexec.exe on local machine
string remote_machine = "Server1"; //name of remote machine
Process process = new Process();
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.FileName = location_of_psexec;
process.StartInfo.Arguments = string.Format("\\\\{0} -c \"{1}\" \"{2}\"", remote_machine, application, arguments);
此代码假定应用程序路径(例如" c:\ app \ findwavs.exe")与本地计算机相关,而不是远程计算机。
如果要使用相对于远程计算机的路径,只需从process.StartInfo.Arguments
<强>更新强>
引用上述参考文献:
如果省略用户名,则该过程将在远程系统上的帐户上下文中运行,但无法访问网络资源(因为它是模拟的)。如果远程进程需要访问网络资源或在其他帐户中运行,请在Domain \ User语法中指定有效的用户名。请注意,密码和命令在传输到远程系统时已加密。
要使应用程序能够访问网络资源,请使用-u和-p开关提供用户名和密码。
答案 1 :(得分:3)
运行代码相当于在资源管理器中导航到\\Server1\C$\App\findwavs.exe
并双击exe。我的意思是它会在告诉它运行的机器上运行程序,而不是存储exe的地方。
我能看到完成您要执行的任务的最简单方法是使用PsExec。