Démarrer / arrêter un service Windows à partir d’un compte utilisateur non administrateur

J’ai un service Windows nommé, disons, BST. Et je dois donner à un utilisateur non-administrateur, UserA, les permissions pour démarrer / arrêter ce service particulier. Mon service s’exécute sur divers systèmes d’exploitation Windows, de Windows Server 2003 à Windows 7.

Comment puis-je faire ceci?

J’ai googlé et trouvé des trucs pour donner des permissions en utilisant la commande [sc sdset], mais je ne suis pas vraiment sûr des parameters. Je ne veux pas définir les permissions pour un groupe, mais UNIQUEMENT pour un utilisateur particulier, UserA dans ce cas.

Ci-dessous, j’ai rassemblé tout ce que j’ai appris sur le démarrage / arrêt d’un service Windows à partir d’un compte utilisateur non-administrateur, si quelqu’un doit le savoir.

Principalement, il existe deux manières de démarrer / arrêter un service Windows. 1. Accéder directement au service via le compte d’utilisateur Windows d’ouverture de session. 2. Accéder au service via IIS à l’aide du compte de service réseau.

Commande de ligne de commande pour démarrer / arrêter les services:

C:/> net start  C:/> net stop  

C # Code pour démarrer / arrêter les services:

 ServiceController service = new ServiceController(SERVICE_NAME); //Start the service if (service.Status == ServiceControllerStatus.Stopped) { service.Start(); service.WaitForStatus(ServiceControllerStatus.Running, TimeSpan.FromSeconds(10.0)); } //Stop the service if (service.Status == ServiceControllerStatus.Running) { service.Stop(); service.WaitForStatus(ServiceControllerStatus.Stopped, TimeSpan.FromSeconds(10.0)); } 

Remarque 1: lorsque vous accédez au service via IIS, créez une application Web ASP.NET Visual Studio C # et insérez-y le code. Déployez le WebService sur le dossier racine IIS (C: \ inetpub \ wwwroot \) et vous êtes prêt. Accédez-le par l’url http: ///.

1. Méthode d’access direct

Si le compte d’utilisateur Windows à partir duquel vous donnez la commande ou exécutez le code est un compte non-administrateur, vous devez définir les privilèges sur ce compte d’utilisateur particulier pour qu’il puisse démarrer et arrêter les services Windows. Voici comment vous le faites. Connectez-vous à un compte administrateur sur l’ordinateur sur lequel se trouve le compte non-administrateur à partir duquel vous souhaitez démarrer / arrêter le service. Ouvrez l’invite de commande et donnez la commande suivante:

 C:/>sc sdshow  

La sortie de ceci sera quelque chose comme ceci:

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

Il répertorie toutes les permissions de chaque utilisateur / groupe sur cet ordinateur.

 A description of one part of above command is as follows: D:(A;;CCLCSWRPWPDTLOCRRC;;;SY) It has the default owner, default group, and it has the Security descriptor control flags (A;;CCLCSWRPWPDTLOCRRC;;;SY): ace_type - "A": ACCESS_ALLOWED_ACE_TYPE, ace_flags - n/a, rights - CCLCSWRPWPDTLOCRRC, please refer to the Access Rights and Access Masks and Directory Services Access Rights CC: ADS_RIGHT_DS_CREATE_CHILD - Create a child DS object. LC: ADS_RIGHT_ACTRL_DS_LIST - Enumerate a DS object. SW: ADS_RIGHT_DS_SELF - Access allowed only after validated rights checks supported by the object are performed. This flag can be used alone to perform all validated rights checks of the object or it can be combined with an identifier of a specific validated right to perform only that check. RP: ADS_RIGHT_DS_READ_PROP - Read the properties of a DS object. WP: ADS_RIGHT_DS_WRITE_PROP - Write properties for a DS object. DT: ADS_RIGHT_DS_DELETE_TREE - Delete a tree of DS objects. LO: ADS_RIGHT_DS_LIST_OBJECT - List a tree of DS objects. CR: ADS_RIGHT_DS_CONTROL_ACCESS - Access allowed only after extended rights checks supported by the object are performed. This flag can be used alone to perform all extended rights checks on the object or it can be combined with an identifier of a specific extended right to perform only that check. RC: READ_CONTROL - The right to read the information in the object's security descriptor, not including the information in the system access control list (SACL). (This is a Standard Access Right, please read more http://msdn.microsoft.com/en-us/library/aa379607(VS.85).aspx) object_guid - n/a, inherit_object_guid - n/a, account_sid - "SY": Local system. The corresponding RID is SECURITY_LOCAL_SYSTEM_RID. 

Maintenant, ce que nous devons faire est de définir les permissions appropriées pour démarrer / arrêter les services Windows pour les groupes ou les utilisateurs que nous voulons. Dans ce cas, l’utilisateur non administrateur actuel doit pouvoir démarrer / arrêter le service afin de définir les permissions pour cet utilisateur. Pour ce faire, nous avons besoin du SID de ce compte d’utilisateur Windows particulier. Pour l’obtenir, ouvrez le registre (Démarrer> regedit) et recherchez la clé de registre suivante.

 LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList 

En dessous, il y a une clé distincte pour chaque compte d’utilisateur sur chaque ordinateur, et le nom de la clé est le SID de chaque compte. SID sont généralement au format S-1-5-21-2103278432-2794320136-1883075150-1000. Cliquez sur chaque touche et vous verrez sur le volet à droite une liste de valeurs pour chaque clé. Recherchez “ProfileImagePath”, et par sa valeur, vous pouvez trouver le nom d’utilisateur auquel SID appartient. Par exemple, si le nom d’utilisateur du compte est SACH, la valeur de “ProfileImagePath” sera similaire à “C: \ Users \ Sach”. Notez donc le SID du compte d’utilisateur auquel vous souhaitez définir les permissions.

Note 2: Voici un exemple de code C # simple qui peut être utilisé pour obtenir une liste des clés et de leurs valeurs.

 //LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList RegistryKey RegistryKey profileList = Registry.LocalMachine.OpenSubKey(keyName); //Get a list of SID corresponding to each account on the computer ssortingng[] sidList = profileList.GetSubKeyNames(); foreach (ssortingng sid in sidList) { //Based on above names, get 'Registry Keys' corresponding to each SID RegistryKey profile = Registry.LocalMachine.OpenSubKey(Path.Combine(keyName, sid)); //SID ssortingng strSID = sid; //UserName which is represented by above SID ssortingng strUserName = (ssortingng)profile.GetValue("ProfileImagePath"); } 

Maintenant que nous avons le SID du compte utilisateur auquel nous voulons définir les permissions, passons à cela. Supposons que le SID du compte d’utilisateur est S-1-5-21-2103278432-2794320136-1883075150-1000 . Copiez la sortie de la commande [sc sdshow] dans un éditeur de texte. Il ressemblera à ceci:

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

Maintenant, copiez la partie (A ;; CCLCSWRPWPDTLOCRRC ;;; SY) du texte ci-dessus et collez-la juste avant le S: (AU; partie du texte. Puis changez cette partie pour qu’elle ressemble à ceci: (A ;; RPWPCR ;;; S-1-5-21-2103278432-2794320136-1883075150-1000)

Ensuite, ajoutez sc sdset au début et placez la partie ci-dessus avec des guillemets. Votre commande finale devrait ressembler à ceci:

 sc sdset  "D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;RPWPCR;;;S-1-5-21-2103278432-2794320136-1883075150-1000)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)" 

Exécutez maintenant ceci dans votre invite de commande, et cela devrait donner le résultat comme suit si réussi:

 [SC] SetServiceObjectSecurity SUCCESS 

Maintenant, nous sums prêts à partir! Votre compte d’utilisateur non-administrateur a été autorisé à démarrer / arrêter votre service! Essayez de vous connecter au compte d’utilisateur et lancez / arrêtez le service et cela devrait vous permettre de le faire.

2. Accès via la méthode IIS

Dans ce cas, nous devons accorder l’autorisation à l’utilisateur IIS “Services réseau” au lieu du compte d’utilisateur Windows d’ouverture de session. La procédure est la même, seuls les parameters de la commande seront modifiés. Étant donné que nous accordons l’autorisation à “Services réseau”, remplacez SID par la chaîne “NS” dans la dernière commande sdset utilisée précédemment. La commande finale devrait ressembler à ceci:

 sc sdset  "D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;RPWPCR;;;NS)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)" 

Exécutez-le dans l’invite de commande à partir d’un compte d’utilisateur Admin, et le tour est joué! Vous avez la permission de démarrer / arrêter le service à partir de n’importe quel compte d’utilisateur (qu’il s’agisse d’un compte administrateur ou non) en utilisant une méthode Web. Reportez-vous à la note 1 pour savoir comment procéder.

J’utilise l’utilitaire SubInACL pour cela. Par exemple, si je voulais donner au travail utilisateur sur l’ordinateur VMX001 la possibilité de démarrer et d’arrêter le service de publication World Wide Web (également appelé w3svc), j’émettrais la commande suivante en tant qu’administrateur:

subinacl.exe /service w3svc /grant=VMX001\job=PTO

Les permissions que vous pouvez accorder sont définies comme suit (liste prise ici ):

 F : Full Control R : Generic Read W : Generic Write X : Generic eXecute L : Read controL Q : Query Service Configuration S : Query Service Status E : Enumerate Dependent Services C : Service Change Configuration T : Start Service O : Stop Service P : Pause/Continue Service I : Interrogate Service U : Service User-Defined Control Commands 

Ainsi, en spécifiant la prise de force, j’autorise l’utilisateur du travail à suspendre / continuer, démarrer et arrêter le service w3svc.

  1. Connectez-vous en tant qu’administrateur.
  2. Téléchargez subinacl.exe de Microsoft:
    http://www.microsoft.com/en-us/download/details.aspx?id=23510
  3. Accordez des permissions au compte d’utilisateur régulier pour gérer les services BST.
    ( subinacl.exe trouve dans C:\Program Files (x86)\Windows Resource Kits\Tools\ ).
  4. cd C:\Program Files (x86)\Windows Resource Kits\Tools\
    subinacl /SERVICE \\MachineName\bst /GRANT=domainname.com\username=F ou
    subinacl /SERVICE \\MachineName\bst /GRANT=username=F
  5. Déconnectez-vous et reconnectez-vous en tant qu’utilisateur. Ils devraient maintenant être en mesure de lancer le service BST.

Il est beaucoup plus facile d’accorder des permissions de gestion à un service en utilisant l’un de ces outils:

  • Stratégie de groupe
  • Modèle de sécurité
  • outil de ligne de commande subinacl.exe.

Voici l’ article MSKB avec des instructions pour Windows Server 2008 / Windows 7, mais les instructions sont les mêmes pour 2000 et 2003.

Il existe un outil GUI gratuit ServiceSecurityEditor

Qui vous permet de modifier les permissions du service Windows. Je l’ai utilisé avec succès pour donner à un utilisateur non-administrateur le droit de démarrer et d’arrêter un service.

J’avais utilisé “sc sdset” avant de connaître cet outil.

ServiceSecurityEditor a envie de sortingcher, c’est aussi simple que ça 🙂

L’outil de ligne de commande subinacl.exe est probablement le seul outil viable et très facile à utiliser. Vous ne pouvez pas utiliser un object de stratégie de groupe avec des services non-système et l’autre option est tout simplement trop compliquée.

Le service Windows s’exécute à l’aide d’un compte système local. Il peut démarrer automatiquement lorsque l’utilisateur se connecte au système ou peut être démarré manuellement. Cependant, un service Windows dit que BST peut être exécuté avec un compte utilisateur particulier sur la machine. procédez comme suit: démarrez services.msc et accédez aux propriétés de votre service Windows, BST.À partir de là, vous pouvez indiquer les parameters de connexion de l’utilisateur requirejs. Le service s’exécute alors avec ce compte utilisateur et aucun autre utilisateur ne peut exécuter ce service.