Ich entwickle eine Server-C# -Anwendung, die eine EXE-Datei über ein lokales Domänennetzwerk auf verschiedenen Clientcomputern ausführt. Ich habe gewählt, um es über WMI zu tun und funktioniert gut, wenn der .exe-Pfad für den Remote-Rechner lokal ist. Ich habe festgestellt, dass WMI keine UNC-Pfade unterstützt (hier kommt mein Problem).WMI-Zugriff auf UNC-Pfade
Wenn ich die Methode unten rufen eine .exe auf dem Remote-PC-Desktop platziert auszuführen, ist es nur funktioniert:
var execResult = WmiExecuteRemoteProcess("XPSP3", @"C:\Documents and Settings\user1\Desktop\My_Setup.exe", @"domain\user", "mypass");
Jetzt, wenn ich versuche, UNC-Pfade zu verwenden, ich die bekommen Exit-Code 2:
var execResult = WmiExecuteRemoteProcess("XPSP3", @"\\server\shared\My_Setup.exe", @"domain\user", "mypass");
Die WmiExecuteRemoteProcess
Methode sieht wie folgt aus:
public bool WmiExecuteRemoteProcess(string remoteComputerName, string arguments, string pUser, string pPassword)
{
try
{
ConnectionOptions connOptions = new ConnectionOptions();
connOptions.Username = pUser;
connOptions.Password = pPassword;
connOptions.Impersonation = ImpersonationLevel.Impersonate;
connOptions.EnablePrivileges = true;
ManagementScope manScope = new ManagementScope(string.Format(@"\\{0}\ROOT\CIMV2", remoteComputerName), connOptions);
manScope.Connect();
ObjectGetOptions objectGetOptions = new ObjectGetOptions();
ManagementPath managementPath = new ManagementPath("Win32_Process");
using (ManagementClass processClass = new ManagementClass(manScope, managementPath, objectGetOptions))
{
using (ManagementBaseObject inParams = processClass.GetMethodParameters("Create"))
{
inParams["CommandLine"] = arguments;
using (ManagementBaseObject outParams = processClass.InvokeMethod("Create", inParams, null))
{
return (uint)outParams["returnValue"] == 0;
}
}
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
return false;
}
}
diese Situation I Art „betrügen“ durch Parsen der arguments
Parameter entschieden haben, wie folgt:
var args = "cmd.exe /c \"pushd \"\"\\\\server\\shared\"\" && My_Setup.exe && popd\"";
var execResult = WmiExecuteRemoteProcess("XPSP3",args,@"domain\user", "mypass");
Was ich versuche, hier zu tun ist, um die cmd.exe mit den Befehlen zu verwenden pushd
und popd
, um den UNC-Pfad in einen netzwerkbasierten Laufwerkspfad wie "Z: \ shared" zu mappen. Auf diese Weise müssen sowohl WMI als auch cmd.exe nicht mit dem UNC-Pfad umgehen.
Ergebnis: Wenn die EXE-Datei lokal für die Remote-Maschine ist, funktioniert sie zwar sehr gut, aber wenn Sie einen UNC-Pfad verwenden, wird nur der Prozess cmd.exe angezeigt. Vielleicht wirft es intern den Exit-Code 2 erneut, aber ich kann ihn nicht abfangen und leite sogar die Ausgabe der cmd-Ausführung in eine Log-Datei um.
Vielleicht kann jemand, der in dieser Art von Mechanik erfahren ist, etwas Licht darauf werfen. Ich würde es vorziehen, nicht nur einen ganzen Dienst dafür zu entwickeln, oder PsExec zu verwenden (vielleicht diesen als letzten Ausweg).
Bitte lassen Sie mich wissen, wenn ich irgendwelche Informationen vermisse. Alle Kommentare werden sehr geschätzt.
Grüße.
Bearbeiten: Ich überprüft und es ist keine Frage der Berechtigungen für den freigegebenen Ordner oder die Datei.
Ist die Zeichenfolge für 'var args =„cmd.exe ... 'sein müssen @ -quoted? – lit
Nein, in der Tat würde das @ den Befehl, wenn in cmd ausgeführt fehlschlagen. Ich verwendete double \\ und \ "weil ich sie zum Befehl cmd geparst haben wollte, nicht vom Compiler interpretiert – Petaflop
Sie können das Verzeichnis zuordnen, wenn es in Ihrer Umgebung ratsam ist. Netznutzung wird dir dort helfen. –