为什么我的应用程序在远程启动时失败?

时间:2015-10-16 20:06:11

标签: c#

我有一个位于四个不同服务器上的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();
        }
    }
}

2 个答案:

答案 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

的值中删除-c即可

<强>更新

引用上述参考文献:

  

如果省略用户名,则该过程将在远程系统上的帐户上下文中运行,但无法访问网络资源(因为它是模拟的)。如果远程进程需要访问网络资源或在其他帐户中运行,请在Domain \ User语法中指定有效的用户名。请注意,密码和命令在传输到远程系统时已加密。

要使应用程序能够访问网络资源,请使用-u和-p开关提供用户名和密码。

答案 1 :(得分:3)

运行代码相当于在资源管理器中导航到\\Server1\C$\App\findwavs.exe并双击exe。我的意思是它会在告诉它运行的机器上运行程序,而不是存储exe的地方。

我能看到完成您要执行的任务的最简单方法是使用PsExec