Avant d'être abattu, je sais comment planifier une tâche, redémarrer un service avec PowerShell ou donner à un compte non administrateur les privilèges pour redémarrer un service. Ce n'est pas ça le problème. Le problème est cependant la combinaison de ces trois tâches combinées.
J'ai un service Windows qui doit traiter des fichiers sur un dossier réseau. Par conséquent, il se connecte avec un "compte de service" qui n'est en fait qu'un compte de domaine normal. Ce compte de domaine n'est pas un administrateur mais dispose de droits d'accès audit dossier. Le service fonctionne bien et fait son travail.
Cependant, il y a parfois une erreur dans l'un des fichiers qui empêche le traitement d'autres fichiers. Habituellement, il faut un certain temps à quelqu'un pour le remarquer et il y a un arriéré.
J'ai donc créé un script de surveillance dans PowerShell qui interroge le dossier réseau pour ces fichiers erronés. S'ils sont trouvés, les fichiers sont déplacés vers un dossier temporaire pour examen et le service doit être redémarré.
J'ai donné les privilèges du compte de service via la stratégie de groupe pour démarrer et arrêter le service.
Lorsque je me connecte au serveur avec le compte de service, je peux redémarrer le service manuellement à l'aide de la console MMC Services. Je peux également exécuter le script powershell et il fait exactement ce qu'il est censé faire: interroger le dossier, déplacer les fichiers et redémarrer le service. Génial!
Dans la phase suivante, j'ai créé une tâche planifiée qui s'exécute toutes les 10 minutes. La tâche utilise le même compte de service que le service pour exécuter le script powershell. La case "exécuter avec les privilèges les plus élevés" est cochée. Comme je l'ai dit, le script powershell doit avoir accès au lecteur réseau, donc je ne peux pas l'exécuter en tant qu'administrateur du serveur local et je ne veux pas utiliser les informations d'identification d'administrateur de domaine pour une tâche aussi délicate comme celle-ci. (J'essaie de mettre en œuvre le principe du moindre privilège autant que possible.)
J'ai donné au compte de service les droits de «connexion en tant que tâche par lots» sur le serveur local à l'aide de la stratégie de sécurité locale MMC.
Maintenant, pour la partie que je ne peux pas comprendre: à l'heure planifiée, les tâches planifiées se terminent avec succès et le script PowerShell est en cours d'exécution. Le script interroge le dossier et les fichiers d'erreur sont déplacés. La seule chose qui ne fonctionne pas est le redémarrage du service ...?! Encore une fois, l'exécution manuelle du script en tant que même utilisateur a parfaitement fonctionné.
Je ne vois pas grand-chose dans l'observateur d'événements, mais la connexion à mon script indique cette erreur:
TerminatingError (Stop-Service): "Impossible d'ouvrir Service Control Manager sur l'ordinateur '.'. Cette opération peut nécessiter d'autres privilèges."
Les commandes que j'utilise pour redémarrer le service sont:
Stop-Service -Verbose -DisplayName $($service[1])
...
Start-Service -Verbose -DisplayName $($service[1])
(J'utilise Windows Server 2012 R2 et PowerShell version 4 sur un domaine 2008 R2.)
Mise à jour: j'ai essayé de définir les autorisations de service pour l'utilisateur à l'aide de subinacl (comme décrit ici ) et de définir la chaîne SDDL manuellement (comme décrit ici ), de sorte que mes indicateurs de contrôle ressemblent à ceci (A ;; CCLCSWRPWPDTLOCRRC ;;; S-1- X-XX-XXXXXXXXXX-XXXXXXXX-XXXXXXXXX-XXXX). J'ai également essayé de définir les privilèges du service sur Contrôle total dans le GPO. Aucun de ces problèmes n'a résolu le problème non plus. Cela doit être un problème avec des privilèges quelque part que je néglige toujours, car lorsque je planifie la tâche avec un compte de domaine qui est un administrateur local sur le serveur, cela fonctionne très bien.
la source
Set-Service $($service[1]) -status stopped -ComputerName . -Verbose ....
au lieu duStop-Service
CmdLet? Stop-Service et Start-Service ne sont apparemment pas accessibles à distance selon cette réponse: Impossible d'utiliser Get-Service –NomOrdinateur sur un ordinateur distant et votre message d'erreur peut être lié à une tentative de connexion à un hôte local "distant". '' (<== c'est un point là-bas.)Réponses:
La réponse à une autre question a également résolu mon problème.
Les étapes que j'ai faites étaient les suivantes:
enable-psremoting
sur le serveur dans une invite d'administration powershellSet-PSSessionConfiguration -Name Microsoft.PowerShell -ShowSecurityDescriptorUI
sur le serveur dans une invite d'administration powershellsc sdshow scmanager
sur le serveur dans une invite de commande d'administration(A;;KA;;;SID_OF_USER_OR_SECURITY_GROUP)
au SDDL avant la partie S:sc sdset scmanager THE_MODIFIED_SDDL
le mien ressemblait à ceci:sc sdset scmanager D:(A;;CC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)(A;;CC;;;AC)(A;;KA;;;S-1-X-XX-XXXXXXXXXX-XXXXXXXX-XXXXXXXXX-XXXX)S:(AU;FA;KA;;;WD)(AU;OIIOFA;GA;;;WD)
Start-Service
CmdLet au lieu deSet-Service
(Set-Service n'a pas fonctionné).On dirait que quelque chose de simple s'est avéré être beaucoup plus compliqué qu'il n'aurait dû l'être ...
la source