Redémarrage planifié d'un service avec Powerhshell en tant que compte de service non administrateur

11

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.

entrez la description de l'image ici

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.

VolrathTheFallen
la source
Cela pourrait être d'une certaine aide serverfault.com/questions/357424/… il semble que powershell soit très pointilleux sur les autorisations et non les plus évidentes
Drifter104
@ Drifter104: Même si j'utilise GPO pour définir les autorisations sur le service, pas subinacl, je l'ai quand même essayé avec les paramètres STOE, mais toujours avec le même résultat. J'ai vérifié mes paramètres GPO et l'option Énumérer les services dépendants est également activée.
VolrathTheFallen
@ MyronSemack-msemack J'ai essayé de définir manuellement la chaîne SDDL pour le service comme décrit dans l'article, mais toujours pas de chance, je pense qu'en fin de compte, un GPO et un subinacl font la même chose, car ils semblent remplacer l'un et l'autre.
VolrathTheFallen
1
Que diriez-vous d'essayer Set-Service $($service[1]) -status stopped -ComputerName . -Verbose ....au lieu du Stop-ServiceCmdLet? 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.)
John aka hot2use

Réponses:

3

La réponse à une autre question a également résolu mon problème.

Les étapes que j'ai faites étaient les suivantes:

  1. enable-psremoting sur le serveur dans une invite d'administration powershell
  2. Set-PSSessionConfiguration -Name Microsoft.PowerShell -ShowSecurityDescriptorUI sur le serveur dans une invite d'administration powershell
  3. Ajout du compte de service (ou groupe de sécurité) avec tous les privilèges
  4. sc sdshow scmanager sur le serveur dans une invite de commande d'administration
  5. Copiez la sortie SDDL
  6. Ajouter (A;;KA;;;SID_OF_USER_OR_SECURITY_GROUP)au SDDL avant la partie S:
  7. 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)
  8. Changer mon script powershell pour qu'il utilise le Start-ServiceCmdLet au lieu de Set-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 ...

VolrathTheFallen
la source