web-dev-qa-db-fra.com

Windows 10: Les tâches planifiées sans verrouillage ne sont pas déclenchées

J'utilise Windows 10 et j'essaie de faire fonctionner deux tâches planifiées. Ces tâches sont configurées pour s'exécuter sur le verrouillage et le déverrouillage du poste de travail et exécuter un script qui verrouille ou déverrouille à distance un poste de travail Arch-linux adjacent. Ceci est accompli via l'interface de ligne de commande WinSCP, WinSCP.com, et sa capacité de script intégrée. Ces scripts fonctionnent très bien - je peux les appeler manuellement pour obtenir l’effet souhaité. Je peux même cliquer avec le bouton droit sur les tâches que j'ai configurées, cliquer sur "Exécuter" et observer l'effet souhaité. Le problème est que les événements de verrouillage de poste de travail et de déverrouillage de poste de travail ne semblent pas être déclenchés lors du verrouillage et du déverrouillage du poste de travail. Ce même ensemble de tâches planifiées a fonctionné comme prévu sous Windows 7.

Lock/Unlock tasks overview

Task Scheduler window

D'après les réponses obtenues jusqu'à présent, je peux faire en sorte que les tâches s'exécutent comme prévu si je coche la case "Exécuter uniquement lorsque l'utilisateur est connecté", mais cela a pour effet indésirable de faire apparaître une fenêtre de commande lorsque les tâches sont déclenchées. .

Le système d'exploitation est Windows 10 Enterprise LTSB 2016 (x64). Toute idée ou idée serait appréciée.

Ce que j'ai déjà essayé:

  • Utilisation de GPO pour activer l'audit des événements de verrouillage/déverrouillage du poste de travail - aucun effet. (les événements de verrouillage/déverrouillage apparaissent dans l'afficheur d'événements comme prévu)

  • Création d'un autre utilisateur Windows et définition de la tâche à exécuter en tant que principal.

  • Emballer l'appel à WinSCP.com dans un script batch.

  • Modification de GPOlocal _ pour vous assurer que la connexion en tant que lot est activée.

Autres informations pertinentes: Les autres tâches planifiées (par exemple, celles exécutées à une heure ou à un intervalle défini) fonctionnent correctement. Seules ces deux tâches ne parviennent pas à se déclencher.

Edit: Par le commentaire de Twisty, j'ai activé l'historique des tâches et j'ai reçu un message d'erreur: Task scheduler error message

Il semble donc que la tâche est bien déclenchée mais ne parvient pas à se lancer. Fait intéressant, cela ne met pas à jour la propriété "Last Run Time" pour la tâche.

Certaines recherches rapides indiquent que cette erreur peut être liée aux informations de connexion/mot de passe. J'ai vérifié que le mot de passe stocké est correct, mais le même problème persiste. Voici une capture d'écran de l'onglet "Général" comme demandé. General Tab

Voici le script WINSCP en cours d'exécution (clé censurée):

# Connect
open sftp://[email protected]:2222/ -hostkey="ssh-rsa 2048 
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx"
call cinnamon-screensaver-command -d
close
exit

Je viens d'essayer d'envelopper cela dans un fichier batch très simple:

@ECHO ON

SET prgwinscp="C:\Program Files (x86)\WinSCP\WinSCP.com"
%prgwinscp% /script=lock-Arch.winscp

Je peux l'exécuter à la main et, en tant que tâche planifiée, cela fonctionne lorsque je coche la case "Exécuter uniquement lorsque l'utilisateur est connecté". Malheureusement, comme auparavant, une fois que j'ai défini la tâche sur "Exécuter si l'utilisateur est connecté ou non", j'obtiens l'échec habituel.

Comme demandé, voici une capture d'écran de l'onglet actions: actions pane

Le texte masqué est le suivant:

Add Arguments (Optional):    /script=unlock-Arch.winscp
Start in (Optional):    C:\Program Files (x86)\WinSCP
7
Fopedush

Suivez les étapes ci-dessous pour dépanner et résoudre votre problème

Propriétés du planificateur de tâches...

À partir de Windows Task Scheduler au travail properties (voir la plupart des captures d’écran en bas) dans le. . .

  • 1.General onglet, assurez-vous que les options ci-dessous sont sélectionnées/cochées ou cochées comme indiqué dans écran d'impression A

    • Décocher Run only when user is logged on
    • Check Run whether user is logged on or not
    • Check Run with the highest privileges
  • 2.Conditions onglet, assurez-vous que les options ci-dessous sont sélectionner, coché ou décoché comme indiqué dans écran d'impression B

    • Check Wake the computer to run this task
  • .Actions onglet, cliquez sur Edit, et assurez-vous que la Start in (optional) est définie exactement comme indiqué dans l'exemple ci-dessous (NE PAS FAIRE mettez des guillemets doubles autour) pour le chemin complet indiquant l'endroit où se trouve le script batch SANS a barre oblique finale "\" impression d'écran C


CONSIDERATIONS DE SECURITE

  • Une fois que vous avez appuyé sur OK (2. (- ci-dessus) il devrait vous inviter à indiquer le justificatif d’identité comme tel, et ce justificatif est ce qui nécessitera un accès à EXECUTE au fichier de commandes où il existe, et il devra également y avoir accès faire quel que soit le fichier batch en cours d'exécution que vous avez scripté.

  • Il peut être préférable de configurer un compte d'utilisateur de service/proxy statique pour ce processus, puis d'utiliser ses informations d'identification pour exécuter le processus. Vous devez vous assurer que son mot de passe est fort et qu'il est défini pour ne jamais expirer - et il a besoin d'accéder à EXECUTE au traitement par lots et à l'exécution du processus de traitement par lots, ainsi qu'aux commandes et ressources, ect. qu'il utilise également.

  • Il semble que l'option Run whether user is logged on or not vous DEVEZ cocher l'option Run with highest privileges pour qu'elle s'exécute comme prévu dans le planificateur de tâches.

Vérification d'erreur

  • S'il y a un problème avec le script de traitement par lots actuel mais que Windows Planificateur de tâches l'exécute pour l'exécuter, mais que la logique du script de traitement par lots sort, etc. pour une raison quelconque, le Planificateur de tâches peut ne pas s'afficher. cet échec à ce niveau. De son point de vue (par défaut la plupart du temps), il exécute le fichier de commandes de sorte que, tant qu’il peut l’exécuter et y a accès, son travail est terminé.

  • Ajoutez vérification d'erreur ou journalisation à la logique de script de traitement par lots à capture (ou dépannage) à ce niveau, notamment en vous assurant que le contexte de sécurité dans lequel le planificateur de traitement par lots l'exécute accès approprié aux commandes, ressources, etc. sous lesquelles le script de traitement par lots est exécuté.


Considérations sur la stratégie de groupe

VÉRIFICATION DES POLITIQUES DE GROUPE ET CONNEXION COMME AUTORISATIONS DE TRAVAIL PAR LOTS

Answer: Sous Windows, ce privilège est accordé par l'intermédiaire du Local ou stratégie de sécurité du domaine. Pour ce faire, utilisez le stratégie de sécurité locale, suivez ces instructions: étapes.

  1. Dans le Panneau de configuration, ouvrez Outils d'administration, puis Sécurité locale Stratégie.
  2. Sous Paramètres de sécurité, ouvrez Stratégies locales et mettez en surbrillance Attribution des droits de l’utilisateur.
  3. Localiser Connexion en tant que travail par lots. Ouvrez le propriétés et ajoutez tous les utilisateurs ayant besoin de ce droit.
  4. Lorsque vous avez terminé, enregistrez vos modifications et fermez la fenêtre Paramètres de sécurité locaux.

Vos modifications devraient prendre effet immédiatement. Pour modifier la stratégie de sécurité du domaine, sur un contrôleur de domaine, utilisez l’utilitaire tilitaire de stratégie de sécurité du domaine dans le Panneau de configuration


Logique de script par lots avec lecteurs mappés ou chemin UNC complet et problèmes. . .

Si votre script fait référence à un lecteur réseau mappé mais que vous voulez qu'il s'appelle Run whether the user is logged on or not, dans ce contexte, le mappage de lecteur peut ne pas être réellement disponible pour que le traitement par lots puisse effectuer les opérations attendues.

Si possible, utilisez les chemins UNC dans votre logique de script de traitement par lots plutôt que par une lettre de lecteur mappé pour éviter les problèmes. Sinon, vous devrez peut-être utiliser PUSHD \\ServerName\ShareName au début du processus de traitement par lots, puis POPD à la fin du processus de traitement par lots. Vous pouvez mapper le lecteur avec Net Use X: \\ServerName\ShareName au début du processus de traitement par lots, puis le déconnecter avec Net Use X: /DELETE à la fin du processus de traitement par lots.


Écrans d'impression

Impression d'écran A

enter image description here

Imprimer l'écran B

enter image description here

Imprimer l'écran C

enter image description here


Exemples de scripts de lot WinSCP

Vous trouverez ci-dessous deux exemples élémentaires de script FTP à télécharger et un script FTP à télécharger à partir d'un serveur FTP à l'aide de WinSCP.com. Assurez-vous que la variable SET winscplogin= est définie sur le nom de la connexion FTP. vous avez défini à partir de l'interface graphique WinSCP.

De cette façon, le script est construit dynamiquement et vous créez les commandes FTP à partir du script de traitement par lots, mais vous pouvez également simplement le diriger vers un script WinSCP statique contenant les commandes FTP, sinon, ce qui est facile à configurer.

Télécharger sur un serveur FTP

@ECHO ON

SET logfile=C:\folder\path\log.log

::SET WinSCP variables, etc.
SET prgwinscp="C:\Program Files\WinSCP3\WinSCP.com"
SET winscplogin="ABC Company"
SET winscpfile=C:\folder\path\ABCompany_FTP_OUT_WinSCP.txt
IF EXIST "%winscpfile%" DEL /Q /F "%winscpfile%"

:ftpout
ECHO.                                              >> "%logfile%"
ECHO *******************FTP OUT******************* >> "%logfile%"
ECHO Delivering file(s) to ABC Company FTP server  >> "%logfile%"
SET ftpdir="ToABC"
ECHO option batch on           >> %winscpfile%
ECHO option confirm off        >> %winscpfile%
ECHO option transfer binary    >> %winscpfile%
ECHO open %winscplogin%        >> %winscpfile%
ECHO cd %ftpdir%               >> %winscpfile%
ECHO put "C:\Folder\Path\*.*"  >> %winscpfile%
ECHO dir                       >> %winscpfile%
ECHO close                     >> %winscpfile%
ECHO exit                      >> %winscpfile%
ECHO %winscpfile%                                >> "%logfile%"
TYPE %winscpfile%                                >> "%logfile%"
ECHO - - - - - - - - - - - - - - - - - - - - - - >> "%logfile%"
%prgwinscp% /script=%winscpfile%                 >> "%logfile%"
ECHO - - - - - - - - - - - - - - - - - - - - - - >> "%logfile%"
IF EXIST "%winscpfile%" DEL /Q /F "%winscpfile%"
ECHO Transmission complete                       >> "%logfile%"

Télécharger depuis un serveur FTP

@ECHO ON

SET logfile=C:\folder\path\log.log

::SET WinSCP variables, etc.
SET prgwinscp="C:\Program Files\WinSCP3\WinSCP.com"
SET winscplogin="ABC Company"
SET winscpfile=C:\folder\path\ABCompany_FTP_IN_WinSCP.txt
IF EXIST "%winscpfile%" DEL /Q /F "%winscpfile%"

:ftpin
ECHO.                                             >> %logfile%
ECHO *******************FTP IN******************* >> %logfile%
ECHO Retrieving files from ABC Company server     >> %logfile%
SET ftpdir="FromABC"
ECHO option batch on          >> %winscpfile%
ECHO option confirm off       >> %winscpfile%
ECHO option transfer binary   >> %winscpfile%
ECHO open %winscplogin%       >> %winscpfile%
ECHO cd %ftpdir%              >> %winscpfile%
ECHO ls                       >> %winscpfile%
ECHO get "*.*" "C:\Folder\path\"  >> %winscpfile%
ECHO close                    >> %winscpfile%
ECHO exit                     >> %winscpfile%
ECHO %winscpfile%                                >> %logfile%
TYPE %winscpfile%                                >> %logfile%
ECHO ------------------------------------------- >> %logfile%
%prgwinscp% /script=%winscpfile%                 >> %logfile%
ECHO ------------------------------------------- >> %logfile%
IF EXIST "%winscpfile%" DEL /Q /F "%winscpfile%"
ECHO FTP Downloading Complete                    >> %logfile%
ECHO Transmission complete                       >> %logfile%

Exemples de scripts personnalisés

Veillez à utiliser les options Run whether user is logged on or not et Run with the highest privileges lorsque vous planifiez le script de traitement par lots. Une fois que vous avez appliqué ces modifications, vous devez entrer les informations d'identification pour exécuter la tâche de manière explicite. Veillez à utiliser un compte disposant d'un accès d'exécution au fichier C:\Program Files (x86)\WinSCP\WinSCP.com et répondant également aux autres conditions préalables générales décrites ci-dessus.

Si vous rencontrez toujours des problèmes et souhaitez confirmer que cela ne concerne pas la sécurité du système d'exploitation, créez un nouveau compte local sur la machine et attribuez-lui un mot de passe fort, définissez-le pour qu'il n'expire jamais et pour que les autorisations soient exécutées par lots. Vous pouvez également en faire un administrateur local et effectuer un test pour vérifier si le fait de donner au compte un accès en tant qu'administrateur local sur l'ordinateur a un impact.

Cela signifie que vous avez deux fichiers: un script de traitement par lots et un WinSCP. Le script de traitement par lots passera le script WinSCP à WinSCP.com et vous pourrez simplement l'exécuter pour exécuter le processus. Assurez-vous que ce script fonctionne comme le même utilisateur lorsqu'il est connecté en l'exécutant simplement pour tester, puis tester avec le même compte tout en étant connecté à la session de l'ordinateur avec l'option Run only when user is logged on pour confirmer qu'il fonctionne également à partir du planificateur de tâches avant de le définir pour son exécution. connecté ou non, etc.

L'onglet Actions du Planificateur de tâches utilisera uniquement le champ Program/Script: avec tous les autres champs laissés en blanc, mais le champ Program/Script: aura une valeur de C:\folder\path\yourbatchscript.cmd.

script de lot

@ECHO ON

SET prgwinscp="C:\Program Files (x86)\WinSCP\WinSCP.com"
%prgwinscp% /script=lock-Arch.winscp

EXIT

Script WinSCP

open sftp://[email protected]:2222/ -hostkey="ssh-rsa 2048 
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx"
call cinnamon-screensaver-command -d
close
exit
7
Pimp Juice IT

J'ai résolu ce problème en contournant les types de déclencheurs "Sur le poste de travail" et en configurant les déclencheurs pour qu'ils consultent directement le journal des événements Windows.

Ce n'est pas idéal, mais devrait être durable. Certainement toujours curieux de savoir pourquoi les déclencheurs fournis par le Planificateur de tâches ne fonctionnent pas.


Configurez les événements de verrouillage/déverrouillage

Par défaut, les événements de verrouillage/déverrouillage ne sont pas audités dans le journal des événements. Vous devez activer la journalisation de ces événements. Vous pouvez le faire à partir de l'éditeur de stratégie de groupe:

lancer -> gpedit.msc

et en configurant la catégorie suivante:

Configuration de l'ordinateur ->
Paramètres Windows ->
Paramètres de sécurité ->
Configuration de la stratégie d'audit avancée ->
Stratégies d'audit système - Objet de stratégie de groupe local ->
Connexion/Déconnexion ->
Audit d'autres événements de connexion/déconnexion

(Dans l'onglet Explain , il est indiqué "... vous permet d'auditer ... Verrouillage et déverrouillage d'un poste de travail".)

Crédit: https://stackoverflow.com/a/15904838/1216896


Créer des déclencheurs

À partir de là, vous pouvez configurer des déclencheurs pour les événements 4800 (verrouiller) et 4801 (déverrouiller) comme suit:

Trigger configuration

3
Waxen

Le planificateur de tâches Win10 a beaucoup de bugs - en particulier dans l'interface graphique. Voir: https://www.ctrl.blog/entry/idle-task-scheduler-powershell

Vous pourriez avoir un peu de chance en recompilant l'interface:

mofcomp c:\Windows\System32\wbem\SchedProv.mof

Vous pouvez également créer la tâche via l'interface COM dans PowerShell. Je préfère utiliser une variable de chaîne contenant la définition XML. Vous pouvez exporter le code XML de la tâche créée par l'interface graphique et le nettoyer/le corriger. Ensuite:

$TaskService = new-object -ComObject('Schedule.Service')
$TaskService.connect()
$Task = $TaskService.NewTask($null)
$task.XmlText = $XMLstring
$null = $Global:TaskFolder.RegisterTaskDefinition('Lock Arch Workstation', $Task, 6, $null, $null, 3)

Bonne chance!

2
Teknowledgist