130 votes

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

J'ai un WindowsService nommé, disons, BST. Et j'ai besoin de donner à un utilisateur non administrateur, UserA, les autorisations de démarrer/arrêter ce service particulier. Mon service fonctionne sur une variété de systèmes d'exploitation Windows, allant de Windows Server 2003 à Windows 7.

Comment puis-je le faire ?

J'ai cherché sur Google et j'ai trouvé des informations sur la façon de donner des autorisations à l'aide de la commande [sc sdset], mais je ne suis pas sûr des paramètres. Je ne veux pas définir les autorisations pour un groupe, mais UNIQUEMENT pour un utilisateur particulier, UserA dans ce cas.

154voto

Sach Points 1003

J'ai rassemblé ci-dessous tout ce que j'ai appris sur le démarrage et l'arrêt d'un service Windows à partir d'un compte utilisateur non administrateur, si quelqu'un a besoin de savoir.

Il existe principalement deux façons de démarrer/arrêter un service Windows. 1. Accéder directement au service par le biais d'un compte utilisateur Windows. 2. Accéder au service par IIS en utilisant le compte de service réseau.

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

C:/> net start <SERVICE_NAME>
C:/> net stop <SERVICE_NAME>

Code C# pour démarrer / arrêter des 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));
}

Note 1 : Pour accéder au service via IIS, créez une application Web Visual Studio C# ASP.NET et placez-y le code. Déployez le WebService dans le dossier racine de IIS ( C:\inetpub\wwwroot\ ) et vous êtes prêt à partir. Accédez-y par l'url http:///.

1. Méthode d'accès direct

Si le compte utilisateur Windows à partir duquel vous donnez la commande ou exécutez le code n'est pas un compte Administrateur, vous devez définir les privilèges de ce compte utilisateur particulier afin qu'il puisse démarrer et arrêter les services Windows. Voici comment procéder. Connectez-vous à un compte administrateur sur l'ordinateur qui possède le compte non administrateur à partir duquel vous voulez démarrer/arrêter le service. Ouvrez l'invite de commande et donnez la commande suivante :

C:/>sc sdshow <SERVICE_NAME>

Le résultat 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 autorisations dont dispose chaque utilisateur/groupe sur cet ordinateur en ce qui concerne .

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, nous devons définir les autorisations appropriées pour démarrer/arrêter les services Windows aux groupes ou utilisateurs que nous voulons. Dans ce cas, nous avons besoin que l'utilisateur non-Admin actuel soit capable de démarrer/arrêter le service, nous allons donc définir les autorisations pour cet utilisateur. Pour ce faire, nous avons besoin du SID de ce compte utilisateur Windows particulier. Pour l'obtenir, ouvrez le registre (Démarrer > regedit) et localisez la clé de registre suivante.

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

Il existe une clé distincte pour chaque compte utilisateur de cet ordinateur, et le nom de la clé est le SID de chaque compte. Les SID sont généralement au format S-1-5-21-2103278432-2794320136-1883075150-1000. Cliquez sur chaque clé, et vous verrez dans le volet de droite une liste de valeurs pour chaque clé. Localisez "ProfileImagePath", et par sa valeur vous pouvez trouver le nom d'utilisateur auquel le SID appartient. Par exemple, si le nom d'utilisateur du compte est SACH, alors la valeur de "ProfileImagePath" sera quelque chose comme " C:\Users\Sach ". Notez donc le SID du compte utilisateur auquel vous souhaitez attribuer les autorisations.

Note2 : Voici un exemple de code C# simple qui peut être utilisé pour obtenir une liste de ces 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
string[] sidList = profileList.GetSubKeyNames();

foreach (string sid in sidList)
{
    //Based on above names, get 'Registry Keys' corresponding to each SID
    RegistryKey profile = Registry.LocalMachine.OpenSubKey(Path.Combine(keyName, sid));

    //SID
    string strSID = sid;
    //UserName which is represented by above SID    
    string strUserName = (string)profile.GetValue("ProfileImagePath");
}

Maintenant que nous avons le SID du compte d'utilisateur auquel nous voulons attribuer des autorisations, passons à l'action. Supposons que le SID du compte 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 le (A;;CCLCSWRPWPDTLOCRRC;;;SY) partie du texte ci-dessus, et le coller juste avant le site S :(AU ;... partie du texte. Puis changez cette partie pour qu'elle ressemble à ceci : (A;;RPWPCR;;;S-1-5-21-2103278432-2794320136-1883075150-1000)

Puis ajoutez sc sdset à l'avant, et mettre la partie ci-dessus entre guillemets. Votre commande finale devrait ressembler à ce qui suit :

sc sdset <SERVICE_NAME> "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)"

Maintenant, exécutez ceci dans votre invite de commande, et il devrait donner la sortie comme suit si elle réussit :

[SC] SetServiceObjectSecurity SUCCESS

Maintenant nous sommes prêts à partir ! Votre compte utilisateur non-Admin a reçu les permissions de démarrer/arrêter votre service ! Essayez de vous connecter au compte utilisateur et de démarrer/arrêter le service et vous devriez pouvoir le faire.

2. Accès par la méthode IIS

Dans ce cas, nous devons accorder la permission à l'utilisateur IIS "Network Services" au lieu du compte utilisateur Windows de connexion. La procédure est la même, seuls les paramètres de la commande seront modifiés. Puisque nous accordons l'autorisation à "Network Services", remplacez SID par la chaîne "NS" dans le paramètre final. sdset que nous avons utilisé précédemment. La commande finale devrait ressembler à ceci :

sc sdset <SERVICE_NAME> "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 voilà ! Vous avez la permission de démarrer / arrêter le service à partir de n'importe quel compte utilisateur (qu'il s'agisse d'un compte Admin ou non) en utilisant une WebMethod. Reportez-vous à la note 1 pour savoir comment procéder.

13 votes

NOTE : ** Vous DEVEZ copier les résultats de shshow exécutée dans votre propre machine, puis modifiez-la en fonction de ce que j'ai spécifié. **DÉFAUT il suffit de copier le code d'ici et de l'exécuter sur votre ordinateur tel quel.

0 votes

Je ne l'ai pas encore essayé, mais en supposant que cela fonctionne, cela va me faire gagner beaucoup de temps et de maux de tête au travail ! Merci !

7 votes

J'ai essayé cette approche manuelle et cela a fonctionné à merveille. Mais, si vous êtes comme moi, et que vous devez faire cela sur plus de 20 ordinateurs, alors vous allez vouloir un programme, ou script pour le faire. Vous pouvez utiliser les appels de l'API Windows QueryServiceObjectSecurity y SetServiceObjectSecurity . MSDN dispose d'une Exemple d'application au compte "Invité".

121voto

arcain Points 7152

J'utilise le SubInACL utilité pour cela. Par exemple, si je voulais donner à l'utilisateur emploi sur l'ordinateur VMX001 la possibilité de démarrer et d'arrêter le service de publication World Wide Web (également connu sous le nom de w3svc), je dois lancer 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 tirée de aquí ) :

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

Donc, en spécifiant PTO, je donne droit à la emploi pour mettre en pause/continuer, démarrer et arrêter le service w3svc.


Modifier : liens mis à jour vers web.archive.org puisque les liens MS originaux sont morts.

22 votes

C'est la meilleure réponse. Elle utilise le bon outil pour le travail à accomplir sans avoir à bidouiller dans le registre, à traduire les SID ou à dépendre d'un obscur formatage des ACL. Elle fournit tout ce qui est nécessaire pour effectuer le travail rapidement et facilement, avec suffisamment de détails pour l'extrapoler à tout scénario raisonnable.

2 votes

Dois-je redémarrer ou me déconnecter/ouvrir une session lorsque j'utilise cette fonction ?

2 votes

@DavidGrinberg Je ne me souviens pas avoir eu besoin que le compte affecté se déconnecte puis se reconnecte, ni d'avoir à redémarrer en utilisant uniquement subinacl comme décrit ici.

44voto

Venkat Points 759
  1. Connectez-vous en tant qu'administrateur.
  2. Télécharger subinacl.exe de Microsoft :
    http://www.microsoft.com/en-us/download/details.aspx?id=23510
  3. Accordez des permissions au compte d'utilisateur normal pour gérer les services de la BST pour gérer les services de la BST.
    ( subinacl.exe est en 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. Il devrait maintenant être en mesure de lancer le service BST.

1 votes

Cela semble beaucoup plus facile et plus efficace que de manipuler manuellement les configurations.

1 votes

La déconnexion est-elle obligatoire ?

0 votes

Oups ! Échec... J'ai obtenu "Error OpenSCManager : The RPC server is unavailable. WARNING : /grant=mike=f : Aucun objet précédent n'a été ouvert". Le service que j'ai essayé était MySQL. Redémarrage : l'accès est refusé, comme toujours.

11voto

Ryan Fisher Points 201

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

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

Voici le Article du MSKB avec des instructions pour Windows Server 2008 / Windows 7, mais les instructions sont les mêmes pour 2000 et 2003.

-2voto

jack_sparrow Points 21

Un service Windows fonctionne en utilisant un compte système local.Il peut démarrer automatiquement lorsque l'utilisateur se connecte au système ou il peut être démarré manuellement.Toutefois, un service Windows, comme BST, peut être exécuté en utilisant un compte utilisateur particulier sur la machine.Cela peut être fait comme suit : démarrer services.msc et aller aux propriétés de votre service Windows, BST.De là, vous pouvez donner les paramètres de connexion de l'utilisateur requis.Service fonctionne alors avec ce compte utilisateur et aucun autre utilisateur peut exécuter ce service.

1 votes

Merci pour la réponse, Jack. Cependant, ce n'est pas ce que je veux faire. J'ai besoin que mon service BST fonctionne comme il le fait actuellement. J'ai seulement besoin que tout utilisateur qui n'est pas un administrateur puisse l'arrêter/démarrer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X