2013-01-21 1 views
0

J'ai écrit une application wmi qui exécute un fichier batch sur une machine distante.Exécution de commandes sur une machine distante

Ce fichier de commandes écrit la sortie dans la chaîne de répertoire qui lui est transmise en tant qu'argument. Lorsque je lance mon application et que je choisis le lecteur C comme répertoire de sortie, tout fonctionne. Mais, quand je choisis un lecteur réseau, cela ne fonctionne pas, pour une raison quelconque.

(Ce lecteur réseau est le lecteur de l'entreprise et mappé pour chaque utilisateur sur le réseau).

Si je lance exactement la même commande (avec le lecteur réseau) manuellement à partir de la machine distante, il fonctionne aussi ...

ConnectionOptions connOptions = new ConnectionOptions(); 
connOptions.Impersonation = ImpersonationLevel.Impersonate; 
connOptions.Username = sUsername; 
connOptions.Password = sPassword; 
connOptions.Authority = "NTLMDomain:" + sDomain; 
connOptions.EnablePrivileges = true; 
ManagementScope manScope = new ManagementScope(String.Format(@"\\{0}\ROOT\CIMV2", sHost), connOptions); 
manScope.Connect(); 
ManagementPath managementPath = new ManagementPath("Win32_Process"); 
ManagementClass processClass = new ManagementClass(manScope, managementPath, objectGetOptions); 
ManagementBaseObject inParams = processClass.GetMethodParameters("Create"); 

for (int i = 0; i < listOfJobs.Items.Count; i++) 
{ 
    listOfJobs.SetSelected(i, true); 
    inParams["CommandLine"] = listOfJobs.SelectedItem.ToString(); 
    ManagementBaseObject outParams = processClass.InvokeMethod("Create", inParams, null); 
} 

Exemple pour les chaînes d'emploi:

scénario de travail : C: \ scripts \ BatchScript -p C: \ test C: \ OutputDir

défaut de script: C: \ scripts \ BatchScript -p C: \ test U: \ OutputDir

Des idées?

+0

Vous devriez publier le code utilisé afin d'aider les gens à répondre à votre question. –

+0

Voyons voir du code s'il vous plaît. – Derek

+0

a ajouté le code ... – Idanis

Répondre

0

Définissez le paramètre ImpersonationLevel sur Delegate. L'emprunt d'identité n'autorise qu'un saut de réseau, c'est-à-dire que le serveur peut uniquement accéder aux fichiers localement ou à ceux qui sont de retour sur le client. Pour accéder à une troisième machine (le lecteur réseau) signifie un autre saut d'où Delegate est requis.

+0

Je l'ai fait, alors maintenant je reçois une exception: 'L'application a appelé une interface qui a été rassemblée pour un thread différent. (Exception de: HRESULT: 0x80010010E (RPC_E_WRONG_THREAD)) ' – Idanis

+0

Je suppose qu'il existe une sorte de mise à jour de l'interface utilisateur après l'appel distant? Essayez d'utiliser une méthode Dispatcher.RunAsync pour l'élément d'interface utilisateur. Je sors de ma zone de confort maintenant, donc si vous êtes toujours coincé, peut-être que cela doit être une nouvelle question ... – NigelK

+0

essayé de trouver un moyen de faire ce que vous avez suggéré, mais ne l'ai pas trouvé ... Cela montre les erreurs de compilation: 'var dispatcher.RunAsync (CoreDispatcherPriority.Normal,() => { ManagementBaseObject outparams = processClass.InvokeMethod ("Créer", inParams, null); });' – Idanis

Questions connexes