Comment puis-je accorder des autorisations de démarrage / arrêt / redémarrage sur un service à un utilisateur ou groupe arbitraire sur un serveur non membre du domaine?

61

Nous avons une suite de services Windows fonctionnant sur nos serveurs qui effectuent une multitude de tâches automatisées indépendamment les unes des autres, à l'exception d'un service qui s'occupe des autres services.

Si l'un des services ne répond pas ou se bloque, ce service tente de le redémarrer et, si une exception est générée au cours de la tentative, envoie un e-mail à l'équipe de support afin qu'elle puisse redémarrer le service elle-même.

Après avoir effectué quelques recherches, j'ai trouvé quelques «solutions» allant de la solution de contournement mentionnée dans le KB907460 à l'attribution du compte sous lequel le service exécute des droits d'administrateur.

Je ne suis pas à l'aise avec l'une ou l'autre de ces méthodes. Je ne comprends pas les conséquences de la première méthode décrite dans l'article de la base de connaissances de Microsoft, mais je ne souhaite absolument pas donner à l'administrateur un accès au compte sous lequel le service est exécuté. .

J'ai parcouru rapidement la stratégie de sécurité locale et, outre la stratégie qui définit si un compte peut ouvrir une session en tant que service, je ne vois rien d'autre qui ressemble à une référence à des services.

Nous utilisons ceci sur Server 2003 et Server 2008, donc toute idée ou tout pointeur serait gracieusement reçu!


Précision: je ne veux pas donner la possibilité de démarrer / arrêter / redémarrer TOUS les services à un utilisateur ou à un groupe donné - je veux pouvoir donner la permission de le faire uniquement à des services spécifiques , à un utilisateur ou à un groupe donné.


Précision supplémentaire: les serveurs sur lesquels je dois accorder ces autorisations n'appartiennent pas à un domaine. Ce sont deux serveurs Internet qui reçoivent les fichiers, les traitent et les envoient à des tiers, tout en servant plusieurs sites Web. La stratégie de groupe Active Directory n'est pas possible. Désolé de ne pas avoir précisé cela.

un peu
la source
vous pouvez également consulter cet article de ms, qui pointe également sur les modifications apportées au GP: support.microsoft.com/kb/256345
3
Désolé de t'avoir manqué ... j'étais occupé. Vous cherchiez quelque chose comme ceci: serverfault.com/questions/15147/…
Evan Anderson
Je sais que la question est très ancienne, mais avez-vous envisagé d'utiliser les options de «récupération» dans le gestionnaire de services Windows?
Tim Long

Réponses:

51

Il ne semble pas y avoir de moyen graphique de faire cela à moins que vous ne fassiez partie d'un domaine - du moins pas d'un domaine que je pourrais trouver nulle part - j'ai donc creusé un peu plus et j'ai trouvé une réponse qui fonctionne pour notre sitaution.

Je ne comprenais pas ce que la représentation sous forme de chaîne signifiait dans l'article de la base de connaissances, mais creuser un peu m'a fait comprendre qu'il s'agissait de la syntaxe SDDL. Les recherches plus approfondies m’ont conduit à cet article d’Alun Jones qui explique comment obtenir le descripteur de sécurité pour un service et ce que chaque bit signifie. MS KB914392 a plus de détails.

Pour ajouter au descripteur de sécurité existant du service, utilisez sc sdshow "Service Name"pour obtenir le descripteur existant. S'il s'agit d'un ancien service Windows .NET simple, comme c'est le cas chez nous, le descripteur de sécurité devrait ressembler à ceci:

D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOC
RRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;CR;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)S:(AU;FA
;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)

Nous devions accorder des autorisations RP(pour démarrer le service), WP(pour arrêter le service), DT(pour suspendre / poursuivre le service) et LO(pour interroger le statut actuel du service). Cela pourrait être fait en ajoutant notre compte de service au groupe Utilisateurs avec pouvoir, mais je souhaite uniquement accorder un accès individuel au compte sous lequel le service de maintenance est exécuté.

Utilisant runaspour ouvrir une invite de commande sous le compte de service, j’ai exécuté whoami /allce qui m’a donné le SID du compte de service, puis construit le SDDL supplémentaire ci-dessous:

(A;;RPWPDTLO;;;S-x-x-xx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxx-xxxx)

Ceci est ensuite ajouté à la section D: de la chaîne SDDL ci-dessus:

D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOC
RRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;CR;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)(A;;RPWP
DTLO;;;S-x-x-xx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxx-xxxx)S:(AU;FA;CCDCLCSWRPWPDTLOC
RSDRCWDWO;;;WD)

Ceci est ensuite appliqué au service en utilisant la sc sdsetcommande:

sc sdset "Service Name" D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;
CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;CR;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU
)(A;;RPWPDTLO;;;S-x-x-xx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxx-xxxx)S:(AU;FA;CCDCLCSW
RPWPDTLOCRSDRCWDWO;;;WD)

Si tout se déroule comme prévu, le service peut alors être démarré, arrêté, mis en pause et son statut doit être interrogé par l'utilisateur défini par le SID ci-dessus.

un peu
la source
10
Pour un moyen plus simple de faire la même chose, vous devriez utiliser SetACL.exe . Voici un exemple d'utilisation de ce dernier pour définir des autorisations sur un service:SetACL.exe -on "\\server1\W32Time" -ot srv -actn ace -ace "n:domain1\group1;p:start_stop"
Mason G. Zhwiti
2
Vous pouvez utiliser Process Hacker ( processhacker.sourceforge.net ) pour une interface graphique permettant de configurer tous les services. Il inclut des services cachés et vous permet de configurer davantage de paramètres d’un service, tels que le chemin binaire - et les autorisations.
Ygoe
1
Le CoreTech gui a fonctionné pour moi. Difficile de croire que l'interface graphique n'existe pas déjà dans Windows. En lisant les réponses ici, comment peut-il être aussi difficile? Gros échec pour le compte de Microsoft.
MikeKulls
J'aime ajouter CCLCSWaux autorisations SDDL (en plus de RPWPDTLO) afin que je puisse également voir le service répertorié lorsque j'exécute Get-Service (ce qui nécessite d'abord de modifier le SDDL pour que le service du gestionnaire de contrôle de service scmanager puisse répertorier les services accessibles). . Je devais aussi SWpouvoir redémarrer certains services.
Baodad
34

Je viens d'avoir le même problème.
Vous pouvez utiliser SubInACL.exe à partir du Kit de ressources. Téléchargez l'utilitaire autonome ici: http://www.microsoft.com/download/en/details.aspx?displaylang=fr&id=23510

Utilisez msiexec /a PathToMSIFile /qb TARGETDIR=DirectoryToExtractTopour extraire les fichiers si vous ne voulez pas installer le .msi

  1. Ouvrez une invite de commande en tant qu'administrateur
  2. Allez dans le répertoire où vous avez placé le fichier .exe
  3. Courir subinacl /service SERVICE_NAME /grant=COMPUTER_NAME\USERNAME=TOP

T = Démarrer le service
O = Arrêter le service
P = Mettre en pause / continuer le service

Référence complète: Comment accorder aux utilisateurs le droit de gérer des services dans Windows 2000
ou de tapersubinacl /help

Remarque: n'essayez pas subinacl /service SERVICE_NAME /permcar cela pourrait vous causer des ennuis (leçon apprise: P). Le nom peut être trompeur (perm! = Permission), car il supprime toutes les autorisations accordées à tous les utilisateurs (même l'administrateur!).

patrx
la source
Impossible de fusionner les comptes SO et SF, désolé Pat.
Chopper3
@ Chopper3 Merci pour votre réponse. En fait, j'ai 2 comptes SO: l'un est enregistré et associé à ce compte SF; l'autre est un compte SO non enregistré que j'avais avant de m'inscrire (utilisé la même adresse électronique). J'espérais que les deux pourraient être fusionnés afin que je puisse suivre le post que j'ai déjà fait. Comme mentionné ici, j'ai essayé de signaler un message mais je ne pouvais pas le faire sur SO (1 réputation). C'est pourquoi j'ai signalé ce post. J'ai également essayé d'envoyer un e-mail à [email protected] il y a plus de deux semaines, mais je n'ai reçu aucune réponse. Pourriez-vous me diriger au bon endroit / personne s'il vous plaît?
Patrx
1
Consultez les détails de cette procédure sur MSDN: support.microsoft.com/?kbid=288129
Marc Climent
4

Vous recherchez Configuration ordinateur - Stratégies - Paramètres Windows - Paramètres de sécurité - Services système

Là, vous pouvez non seulement définir le type de démarrage du service, mais également configurer les ACL de sécurité pour chaque service. Par défaut, l'interface ne répertorie que les services installés sur la machine sur laquelle vous exécutez l'éditeur de stratégie de groupe.

Pour ajouter des services qui n'existent que sur une autre machine:

  • exporter la clé reg du service depuis l'autre machine
  • importer sur la machine gpedit
  • appliquer la politique
  • supprimer la clé importée
Ryan Bolger
la source
J'espère que vous envisagez de le faire gpedit.msc, car la fenêtre "Gérer le serveur" ne répertorie pas de nœud de stratégies. Si tel est le cas, je ne vois aucun élément sous le nœud Paramètres de sécurité faisant référence à "Services système", comme vous le suggérez ci-dessus, que ce soit sur Server 2008 ou Server 2003.
peu
Ah oui. J'ai supposé que vous aviez l'intention d'apporter ces modifications via la stratégie de groupe.
Ryan Bolger
1
En effet, ce ne sont pas des serveurs membres. Existe-t-il un moyen de cibler cela à l'aide d'une politique locale ou d'une autre méthode?
Abitgone
2

J'ai utilisé SubinAcl (comme suggéré par patrx) pour pouvoir démarrer MySQL en tant qu'utilisateur de domaine normal (pas administrateur) et cela fonctionne parfaitement! (la commande doit cependant être exécutée en tant que -local au moins- Admin)

La commande est:

[PATH_TO_SUBACL]\subinacl.exe /service MySQL /grant=[Domain User - Without domain]=TOP

Il suffit de noter que j'ai entré l'utilisateur sans le préfixer avec le domaine ... sinon, la commande échoue lors de l'analyse syntaxique!

Mahieddine M. Ichir
la source