web-dev-qa-db-fra.com

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

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

Comment puis-je faire ceci?

J'ai cherché sur Google et trouvé des informations sur l'octroi d'autorisations à l'aide de la commande [sc sdset], mais je ne suis pas tout à fait 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.

119
Sach

J'ai rassemblé ci-dessous tout ce que j'ai appris sur le démarrage/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 méthodes pour démarrer/arrêter un service Windows. 1. Accès direct au service via un compte d'utilisateur Windows connecté. 2. Accès au service via IIS à l'aide du 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 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));
}

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

1. Méthode d'accès direct

Si le compte d'utilisateur Windows à partir duquel vous exécutez la commande ou exécutez le code est un compte non administrateur, vous devez définir les privilèges de ce compte d'utilisateur particulier afin qu'il puisse démarrer et arrêter les services Windows. Voici comment tu le fais. Connectez-vous à un compte administrateur sur l'ordinateur qui a 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>

La sortie de ce sera quelque chose comme ça:

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.

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.

Nous devons maintenant définir les autorisations appropriées sur Démarrer/Arrêter les services Windows pour les groupes ou les utilisateurs souhaités. Dans ce cas, l'utilisateur non-administrateur actuel doit pouvoir démarrer/arrêter le service afin que nous puissions définir les autorisations 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 localisez 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 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é pour afficher 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 appartient le SID. Par exemple, si le nom d'utilisateur du compte est SACH, la valeur de "ProfileImagePath" sera quelque chose comme "C:\Users\Sach". Notez donc le SID du compte d'utilisateur pour lequel vous souhaitez définir les autorisations.

Note2: Voici un exemple simple de code C # qui peut être utilisé pour obtenir une liste de ces clés et de ses 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 sur lequel nous voulons définir les autorisations, passons à cela. Supposons que le SID du compte d'utilisateur est S-1-5-21-2103278432-2794320136-1883075150-10. Copiez le résultat 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 la partie S: (AU; ... du texte. Puis changez cette partie pour qu'elle ressemble à ceci: (A ;; RPWPCR ;;; S-1-5-21- 2103278432-2794320136-1883075150-1000)

Ajoutez ensuite sc sdset à l’avant, et placez la partie ci-dessus entre guillemets. Votre commande finale devrait ressembler à ceci:

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 le résultat comme suit en cas de succès:

[SC] SetServiceObjectSecurity SUCCESS

Maintenant nous sommes prêts à partir! Des autorisations de démarrer/arrêter votre service ont été accordées à votre compte d'utilisateur non administrateur. Essayez de vous connecter au compte d'utilisateur et de démarrer/arrêter le service et cela devrait vous permettre de le faire.

2. Accès par IIS Méthode

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 paramètres de la commande seront modifiés. Puisque nous avons défini l’autorisation sur "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 <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 la commande Invite à partir d'un compte utilisateur Admin et le tour est joué! Vous avez l'autorisation 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) à l'aide d'un WebMethod. Reportez-vous à la Note 1 pour savoir comment faire.

137
Sach

J'utilise l'utilitaire SubInACL pour cela. Par exemple, si je voulais donner à l'utilisateur un travail 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 autorisations que vous pouvez accorder sont définies comme suit (liste extraite de here ):

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 PTO, j'autorise l'utilisateur du travail à suspendre/continuer, démarrer et arrêter le service w3svc.

111
arcain
  1. Connectez-vous en tant qu'administrateur.
  2. Téléchargez subinacl.exe à partir de Microsoft:
    http://www.Microsoft.com/en-us/download/details.aspx?id=2351
  3. Accordez des autorisations au compte d'utilisateur habituel pour gérer les services BST.
    (subinacl.exe est 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 pouvoir lancer le service BST.
40
Venkat

Il existe un outil graphique gratuit ServiceSecurityEditor

Ce qui vous permet de modifier les autorisations du service Windows. Je l'ai utilisé avec succès pour donner à un utilisateur non administrateur les droits de démarrer et d'arrêter un service.

J'avais utilisé "sc sdset" avant de connaître cet outil.

ServiceSecurityEditor a l'impression de tricher, c'est aussi simple que ça :)

13
FCW

Il est beaucoup plus facile d'octroyer des autorisations de gestion à un service à l'aide de l'un de ces outils:

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

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

11
Ryan Fisher

l'outil de ligne de commande subinacl.exe est probablement le seul logiciel viable et très facile à utiliser, quel que soit le contenu de ce message. Vous ne pouvez pas utiliser un GPO avec des services non-système et l'autre option est beaucoup trop compliquée.

1
JustAGuy