2016-05-19 21 views
0

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.

+0

Ist die Zeichenfolge für 'var args =„cmd.exe ... 'sein müssen @ -quoted? – lit

+0

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

+0

Sie können das Verzeichnis zuordnen, wenn es in Ihrer Umgebung ratsam ist. Netznutzung wird dir dort helfen. –

Antwort

0

Falls jemand diese oder anderes Problem in Zusammenhang steht, ist dies, wie ich es gelöst:

Das Problem ist nicht, dass WMI nicht mit UNC-Pfaden umgehen kann, aber WMI-Operationen sind nicht erlaubt, Netzwerkressourcen aus Sicherheitsgründen für den Zugriff auf Einschränkungen in Windows. Es spielt keine Rolle, ob Sie die Pfade zuordnen, es ist einfach nicht autorisiert. In diesem speziellen Fall bestand die Problemumgehung darin, die Datei setup.exe in einen temporären Ordner auf dem Remotecomputer zu kopieren und schließlich über WMI auszuführen, indem ich wie zuvor auf den lokalen Pfad zugreife.

var execResult = WmiExecuteRemoteProcess("XPSP3", @"C:\temp_folder\My_Setup.exe", @"domain\user", "mypass");