J'ai un dossier partagé sur un serveur et j'ai besoin d'exécuter à distance une commande sur certains fichiers. Comment je fais ça?
Quels services doivent être exécutés sur le serveur pour que cela fonctionne?
Quelques détails: Seul C # peut être utilisé. Rien ne peut être installé sur le serveur.
Une autre solution consiste à utiliser WMI.NET ou Windows Management Instrumentation .
À l'aide de l'espace de noms .NET Framework System.Management, vous pouvez automatiser des tâches administratives à l'aide de Windows Management Instrumentation (WMI).
Exemple de code
var processToRun = new[] { "notepad.exe" };
var connection = new ConnectionOptions();
connection.Username = "username";
connection.Password = "password";
var wmiScope = new ManagementScope(String.Format("\\\\{0}\\root\\cimv2", REMOTE_COMPUTER_NAME), connection);
var wmiProcess = new ManagementClass(wmiScope, new ManagementPath("Win32_Process"), new ObjectGetOptions());
wmiProcess.InvokeMethod("Create", processToRun);
Si vous rencontrez des problèmes d’authentification, vérifiez la configuration DCOM.
dcomcnfg
à partir de la commande Invite. Component Services\Computers\My Computer\DCOM Config
8BC3F05E-D86B-11D0-A075-00C04FB68820
(vous pouvez le voir dans la vue détaillée).REMARQUE: Tous les chemins utilisés pour le processus distant doivent être locaux sur la machine cible.
Vous pouvez utiliser PsExec de SysInternal.
try
{
string AppPath = "\\\\spri11U1118\\SampleBatch\\Bin\\";
string strFilePath = AppPath + "ABCED120D_XXX.bat";
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo.FileName = strFilePath;
string pwd = "s44erver";
proc.StartInfo.Domain = "abcd";
proc.StartInfo.UserName = "sysfaomyulm";
System.Security.SecureString secret = new System.Security.SecureString();
foreach (char c in pwd)
secret.AppendChar(c);
proc.StartInfo.Password = secret;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.WorkingDirectory = "psexec \\\\spri11U1118\\SampleBatch\\Bin ";
proc.Start();
while (!proc.HasExited)
{
proc.Refresh();
// Thread.Sleep(1000);
}
proc.Close();
}
catch (Exception ex)
{
throw ex;
}
OMI, dans votre cas, vous pouvez essayer ceci:
- Mappez le dossier partagé sur un lecteur ou un dossier de votre ordinateur. ( Voici comment )
- Accédez au lecteur/dossier mappé comme vous le feriez normalement avec des fichiers locaux.
Rien ne doit être installé. Aucun service ne doit être en cours d'exécution, à l'exception de ceux qui permettent le partage de dossiers.
Si vous pouvez accéder au dossier partagé et le mapper sur votre ordinateur, la plupart des choses doivent fonctionner comme des fichiers locaux, y compris les invites de commande et tous les outils d'amélioration de l'Explorateur.
Cela diffère de l'utilisation de PsExec (ou de RDP-ing) dans la mesure où vous n'avez pas besoin de droits d'administrateur et/ou de droits de connexion aux services bureau/terminal distants sur le serveur distant, vous devez simplement pouvoir accéder à ces dossiers partagés.
Assurez-vous également que vous disposez de toutes les autorisations de sécurité nécessaires pour exécuter les commandes/outils que vous souhaitez exécuter sur ces dossiers partagés.
Si, comme vous le souhaitez, le traitement doit être effectué sur la machine cible, vous pouvez essayer PsExec , comme l'a souligné @divo et @recursive:
PsExec \\yourServerName -u yourUserName cmd.exe
Ce qui vous amène vous donne une commande Invite à la machine distante. Et à partir de là, vous pouvez exécuter ce que vous voulez.
Je ne suis pas sûr, mais je pense que vous avez besoin du service Serveur (lanmanserver
) ou des services Terminal Server (TermService
) (qui devrait déjà l'être).