Pourquoi un travail du Planificateur de tâches ne peut-il pas accéder à un lecteur réseau mappé?

27

J'ai un travail du Planificateur de tâches pour exécuter Robocopy pour sauvegarder les fichiers locaux sur un partage réseau. Je dois utiliser les informations d'identification du domaine pour accéder au partage réseau, mais l'ordinateur local n'est pas sur le domaine et le travail est exécuté en tant qu'administrateur local. Cette solutionde mapper et de démapper temporairement le partage réseau fonctionne, mais cela laisse mon mot de passe exposé en texte brut pour toute personne qui regarde les actions du planificateur de tâches. Je préférerais mapper le lecteur réseau normalement sur une base semi-permanente afin que le travail du Planificateur de tâches n'ait qu'à exécuter Robocopy et se référer à la lettre de lecteur appropriée. Cependant, j'obtiens toujours l'erreur "Le système ne trouve pas le chemin spécifié." dans le journal Robocopy lors de l'exécution à partir du Planificateur de tâches, même si la commande fonctionne correctement à partir d'une invite de commandes élevée (le travail est configuré pour s'exécuter avec les privilèges les plus élevés). Notez également que j'ai effectué cette modification du registre pour accéder aux lecteurs mappés à partir d'une invite de commande élevée.

EDIT: Pour clarifier, connecté en tant qu'administrateur local, je lance Windows Explorer en tant qu'administrateur. Je mappe le partage réseau à la lettre de lecteur Y. Je lance l'invite de commande en tant qu'administrateur et exécute

C:\Windows\System32\Robocopy.exe C:\temp Y:\temp

Fonctionne bien. Je crée un travail du Planificateur de tâches pour exécuter exactement la même commande, que l'utilisateur soit connecté ou non, avec les privilèges les plus élevés. Je l'exécute et j'obtiens une erreur. J'écris dans un journal et j'obtiens

ERROR 3 (0x00000003) Getting File System Type of Destination Y:\temp\
The system cannot find the path specified.

suivi par

ERROR 3 (0x00000003) Creating Destination Directory Y:\temp\
The system cannot find the path specified.
Craig W
la source
Votre chemin local ou chemin réseau contient-il des espaces? Si oui, encapsulez-vous le chemin avec des guillemets doubles au début et à la fin du chemin?
Sun
@SunWKim Aucun espace dans les deux chemins.
Craig W
Quelle est la ligne de commande que vous utilisez pour effectuer la sauvegarde du local vers le réseau? À quel type de partage réseau sauvegardez-vous? Me fait penser que le partage réseau n'est peut-être pas disponible (non connecté) lorsque vous exécutez la commande de sauvegarde.
dim
Est-ce qu'il fonctionne en tant qu'utilisateur ou simplement "un administrateur". Si c'est votre utilisateur, le lecteur est-il constamment mappé pour votre utilisateur?
Nick
@SunWKim Oui, le lecteur est connecté après le mappage. L'administrateur local n'a pas de droits sur le partage réseau, c'est pourquoi je dois le mapper en tant qu'utilisateur différent avant d'exécuter Robocopy.
Craig W

Réponses:

17

Les lecteurs mappés sont un concept d'interface utilisateur et ne sont pas disponibles pour des tâches d'arrière-plan comme celle-ci. Accédez à la cible via UNC et assurez-vous que l'utilisateur sous lequel la tâche s'exécute a accès à la cible.

Jack
la source
Pas possible. L'ordinateur n'est pas sur le domaine, je dois donc exécuter la tâche en tant qu'utilisateur non-domaine, mais seuls les utilisateurs du domaine ont accès au partage réseau.
Craig W
Je sais que c'est très tard dans le jeu, mais avez-vous essayé de séparer votre travail en 2 tâches planifiées, une pour le partage réseau avec les informations d'identification de domaine, puis une autre fonctionnant en tant qu'administrateur local avec accès au lecteur mappé? Il vous suffirait de les échelonner ou d'utiliser un fichier mutex ou quelque chose pour vous assurer qu'ils fonctionnent dans l'ordre.
Dan Csharpster
7

Dans mon cas, tout ce que je devais faire était de décocher le run with highest privilegesdrapeau, mais j'exécutais la tâche sur le même utilisateur que l'utilisateur qui avait mappé le lecteur.

Peter
la source
C'était tout pour moi. Logique.
Tom Haws
1

Une autre option consiste simplement à utiliser le chemin d'accès réseau complet, car Robocopy les prend en charge. ie robocopy c: \ temp \\ server \ share \ temp

Ou mieux encore, exécutez la sauvegarde sur le serveur lui-même. Créez un compte d'administrateur de domaine uniquement pour le processus de sauvegarde. Feed robocopy le mot de passe à partir d'un fichier texte auquel seuls les administrateurs de domaine peuvent accéder.

Il y a des années, j'ai créé plusieurs scripts .cmd qui permettraient de sauvegarder les fichiers essentiels pour chaque système du réseau de cette façon. Le seul programme externe que j'ai utilisé était la commande Grep de Cgywin et un expéditeur de messagerie smtp à l'invite de commandes.

J'ai fait un script qui scannerait le réseau pour les systèmes. Il créerait un fichier texte de tous les noms de système et m'alerterait par e-mail de tout nouveau système qu'il aurait trouvé. (J'avais un fichier de configuration qu'il analyserait pour les systèmes à ignorer.) Chaque nouveau système avait un répertoire de sauvegarde créé pour lui et un fichier de configuration de sauvegarde placé dedans. L'utilisateur peut modifier ce fichier et répertorier tous les répertoires qui doivent être sauvegardés. Ils pouvaient également spécifier l'heure de leurs sauvegardes afin que cela ne se produise pas lorsqu'ils étaient au bureau. J'ai exécuté ce script sur le serveur toutes les 5 minutes, car cela n'a pris aucun temps de traitement et j'aime la fonction de sécurité de m'alerter lorsqu'un nouveau système a été branché sur le réseau.

Un autre script analyserait tous les fichiers de configuration de sauvegarde individuels et planifierait une tâche pour exécuter une sauvegarde sur ce système. Cela a été exécuté tous les jours à 00h01.

Enfin, le script de sauvegarde analysera le fichier de configuration qui lui a été transmis par le planificateur et à l'aide de robocopy copiera tous les fichiers. J'ai eu une vérification complète des erreurs sur les fichiers de configuration car les utilisateurs les éditeraient et je recevrais des e-mails en cas de problème.

Les utilisateurs pouvaient lire leurs fichiers de sauvegarde, mais ne pouvaient pas supprimer la sauvegarde. Cela a fourni une certaine protection contre les dommages causés par un éventuel employé mécontent.

Probablement quelque chose de beaucoup plus élégant aurait pu être fait en .vbs ou powershell, mais je ne suis pas vraiment un programmeur. Mes cours de programmation incluaient Cobal et JCL. Je me souviens avoir copié les scripts quand je suis parti, mais qui sait où ils sont maintenant.

Kevin
la source
1

J'ai surmonté le problème en modifiant l'option «Exécuter si l'utilisateur est connecté ou non» à «Exécuter uniquement lorsque l'utilisateur est connecté». Essayez ceci, cela peut vous aider.

user731960
la source
1
echo Get-Date >> c:\mount_nfs_log.txt
net use X: \\share\folder password /user:domain\user>> c:\mount_nfs_log.txt 2>&1

La création de ce script PowerShell, la planification du travail en tant que SYSTEM et sa configuration pour s'exécuter au redémarrage m'ont permis d'utiliser des lettres de lecteur dans mes scripts, car UNC n'est pas une option en raison d'un mal de tête lié à d'autres problèmes.

Ryan McGrath
la source
Cela a résolu le problème pour moi! avoir cette commande pour se connecter avec authentification à exécuter avant que le script ne fasse des merveilles! Cela résout le casse-tête d'avoir à «mettre en miroir les comptes d'utilisateurs» avec quelque chose de robuste.
Tschallacka
1
La première fois que j'ai aidé quelqu'un sur un débordement de pile, je suis content d'avoir pu aider. Aussi, utilisez "echo Get-Date" au lieu de ce que j'avais avant.
Ryan McGrath
Je n'avais pas besoin de la journalisation, j'ai donc ajouté une cmd /c net useentrée de travail avant l'entrée de travail de copie dans la tâche et cela a résolu mon problème. Votre message a été le premier après quatre heures à rencontrer des comptes miroirs suggérés qui ont fourni une solution facile. Continuez votre bon travail!
Tschallacka
Vous maintenez toujours les chemins UNC avec ce script, donc vous le savez. Tout simplement parce que vous affectez une lettre de lecteur à un chemin UNC et que vous vous référez ensuite à cette lettre de lecteur, vous devez toujours conserver le \\ServerName\ShareNamedans ce type de logique. De plus, cela ne doit pas nécessairement être PowerShell, car il NET USEs'exécute également par lots et en ce qui concerne la planification avec Task Scheduler en tant que compte SYSTEM, vous pouvez le faire quel que soit le type de script, la logique, etc. que vous prévoyez d'exécuter via Task. Planificateur.
Pimp Juice IT
En outre, juste pour clarifier, veuillez noter que vous pouvez également utiliser NET USE \\<ServerName>\<ShareName> <password> /user:<domain>\<username>juste comme ça et ne pas avoir à spécifier de lettre de lecteur du tout si l'authentification seule pour le partage est ce qui est nécessaire plutôt que la lettre de lecteur réelle.
Pimp Juice IT
0

Essayez de changer l'emplacement "start in" en "c: \". Cela a semblé le réparer pour moi, alors peut-être que le système empêchait le cmd.exe de s'exécuter à partir du \ windows \ system32 \ par défaut comme fonction de sécurité.

user364486
la source
0

J'ai eu le même problème en essayant d'accéder à r: /xxxfilename.txt avec un lecteur mappé Windows r: \ server \ share lors de l'appel d'un script à partir du planificateur de tâches Windows.

J'ai résolu en utilisant //server/share/xxxfilename.txt
Veuillez noter la barre oblique inversée convertie en barre oblique.
Maintenant, mon script bash cygwin s'exécute dans le planificateur de tâches Windows et le shell cygwin.
Remarque: la commande " net use " peut accéder aux lecteurs de carte dans le shell mais affiche R non disponible: lorsque j'exécute cette commande dans le Planificateur de tâches Windows.

ijimenez123
la source
Bienvenue sur Super User! Veuillez relire attentivement la question. Votre réponse ne répond pas à la question d'origine. OP ne fait aucune mention de l'utilisation de Cygwin ou bash.
DavidPostill
0

Comme un autre utilisateur l'a noté, le fait de définir l'option "Exécuter si l'utilisateur est connecté ou non" sur "Exécuter uniquement lorsque l'utilisateur est connecté" semble fonctionner. Vous pouvez ensuite utiliser le chemin mappé (par exemple Z :) ou le chemin du serveur (par exemple \\ ServerName \ Path).

Bien sûr, si vous utilisez cette option, vous devez faire ce qui est indiqué et vous assurer que vous vous êtes connecté au serveur en tant qu'utilisateur ayant accès au lecteur correspondant. Je me souviens avoir été dans une entreprise plus ancienne avec un certain nombre d'emplois comme celui-ci. Un jour, quelqu'un s'est «déconnecté» du serveur principal des travaux, ne s'attendant pas à ce que cela ait un impact, car il n'a pas arrêté la machine de quelque façon que ce soit ...

De plus, ces jours-ci, Windows aime faire beaucoup de redémarrages du système auto-invoqués. Utilisez donc cette solution à vos risques et périls.

Chris Matthews
la source
0

Notez également que si vous effectuez le mappage dans le script et que le mot de passe contient%, il doit être écrit %% pour que le script fonctionne à partir du planificateur de tâches mais% pour fonctionner à partir de l'invite de commandes

Tom Arleth
la source
0

on peut utiliser les commandes suivantes, à ajouter dans le script batch lui-même, pour exécuter le script batch à partir de la tâche de planification Windows pour obtenir dir, fichier copié sur le système local à l'aide de la tâche de planification Windows; utilisation nette Y: "\\ xxx \ xxx \ xxx cd / d Y: utilisateur net / d Y: / Y

AshishS1
la source
-2

Merci, je pense que l'utilisation de "démarrer en c: \" a résolu mon problème, je suivrai ce problème pour confirmer qu'il est résolu.

J'avais le même problème, si je cliquais directement sur le lot, il fonctionnait parfaitement mais pas sous la tâche planifiée.

user3062834
la source
Cela ne répond pas à la question de l'auteur. Veuillez ne pas laisser de commentaires comme réponses.
Ramhound
Veuillez ne pas ajouter "merci" comme réponses. Investissez un peu de temps dans le site et vous obtiendrez des privilèges suffisants pour voter positivement sur les réponses que vous aimez, ce qui est la façon dont Super User vous remercie.
DavidPostill