web-dev-qa-db-fra.com

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

Nous avons une suite de services Windows exécutés sur nos serveurs qui effectuent un tas 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 ne se bloque pas, ce service tente de redémarrer le service et, si une exception est levée lors de la tentative, envoie un e-mail à l'équipe de support à la place, afin qu'ils puissent redémarrer le service eux-mêmes.

Après avoir fait quelques recherches, je suis tombé sur quelques "solutions" qui vont de la solution de contournement mentionnée dans KB90746 à donner au compte sous lequel le service exécute des droits d'administrateur.

Je ne suis à l'aise avec aucune de ces méthodes - je ne comprends pas les conséquences de la première méthode, comme indiqué dans l'article de la base de connaissances de Microsoft, mais je ne veux certainement pas donner à l'administrateur un accès au compte sous lequel le service s'exécute .

J'ai jeté un coup d'œil à travers la politique de sécurité locale et autre que la politique qui définit si un compte peut se connecter en tant que service, je ne vois rien d'autre qui ressemble à des services.

Nous l'exécutons sur Server 2003 et Server 2008, donc toutes les idées ou pointeurs seront aimablement reçus!


Clarification: Je ne veux pas accorder la possibilité de démarrer/arrêter/redémarrer TOUS les services à un utilisateur ou un groupe donné - Je veux pouvoir accorder l'autorisation de le faire sur spécifique services uniquement, à 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 accessibles sur Internet qui reçoivent des fichiers, les traitent et les envoyer à des tiers, ainsi que la diffusion de quelques sites Web, de sorte que la stratégie de groupe Active Directory n'est pas possible. Désolé de ne pas avoir clarifié cela.

61
abitgone

Il ne semble pas y avoir de méthode basée sur l'interface graphique à moins que vous ne soyez connecté à un domaine - du moins pas un que je puisse trouver n'importe où - alors j'ai fait un peu plus de fouilles et j'ai trouvé une réponse qui fonctionne pour notre situation.

Je ne comprenais pas ce que signifiait la représentation sous forme de chaîne dans l'article de la base de connaissances, mais un peu de fouille m'a amené à découvrir que c'était la syntaxe SDDL. Des recherches plus poussées m'ont amené à cet article d'Alun Jones qui explique comment obtenir le descripteur de sécurité d'un service et ce que signifie chaque bit. 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 - comme c'est le cas avec le nôtre - 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/continuer le service) et LO (pour interroger l'état actuel du service). Cela pourrait être fait en ajoutant notre compte de service au groupe Utilisateurs avec pouvoir, mais je veux seulement accorder un accès individuel au compte sous lequel le service de maintenance s'exécute.

À l'aide de runas pour ouvrir une invite de commande sous le compte de service, j'ai exécuté whoami /all 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 le sc sdset commande (avant la S: texte):

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é, suspendu et son état est interrogé par l'utilisateur défini par le SID ci-dessus.

52
abitgone

J'ai juste eu 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=en&id=2351

Utilisation msiexec /a PathToMSIFile /qb TARGETDIR=DirectoryToExtractTo pour extraire les fichiers si vous ne souhaitez pas installer le .msi

  1. Ouvrez une invite de commande en tant qu'administrateur
  2. Accédez au répertoire dans lequel vous avez placé le .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 les droits de gestion des services dans Windows 20
ou tapez subinacl /help

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

34
patrx

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 vous pouvez également configurer les ACL de sécurité pour chaque service. Par défaut, l'interface répertorie uniquement les services installés sur la machine sur laquelle vous exécutez l'éditeur GP.

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
4
Ryan Bolger

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

La commande est:

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

Notez simplement que j'ai entré l'utilisateur sans le préfixer avec le domaine ... sinon la commande échoue lors de l'analyse de la commande!

2