Question

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 fonctionne sur une variété de Windows OS, à partir de Windows Server 2003 vers Windows 7.

Comment puis-je faire?

J'ai googlé et trouvé des choses à donner des autorisations à l'aide de la commande [sc sdset], mais je ne suis pas exactement sur les paramètres. Je ne veux pas définir les autorisations pour un groupe, mais seulement à un utilisateur particulier, UserA dans ce cas.

Était-ce utile?

La solution

Ci-dessous je l'ai mis en place tout ce que j'appris Démarrage / arrêt d'un service Windows à partir d'un compte utilisateur non administrateur, si les besoins de quelqu'un de savoir.

Principalement, il y a deux façons de démarrer / arrêter un service Windows.      1. L'accès direct au service via le compte utilisateur ouverture de session Windows.     2. Accès au service via IIS en utilisant le compte Service réseau.

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

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

C # code 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: Lorsque vous accédez au service via IIS, créez un Visual Studio C # ASP.NET Web application et mettre le code là-dedans. Déployer le WebService à IIS dossier racine (C: \ inetpub \ wwwroot \) et vous êtes bon pour aller. Vous pouvez y accéder par l'URL http:. ///

1. Méthode d'accès direct

Si le compte utilisateur de Windows à partir de laquelle soit vous donnez la commande ou d'exécuter le code est un compte non administrateur, vous devez définir les privilèges à ce particulier compte utilisateur de sorte qu'il a la capacité de démarrer et d'arrêter les services Windows. Voici comment vous le faites. Se connecter à un compte administrateur sur l'ordinateur qui a le compte non administrateur à partir de laquelle vous voulez Start / Stop le service Ouvrez l'invite de commande et donner la commande suivante:.

C:/>sc sdshow <SERVICE_NAME>

La sortie de ce 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 de chaque utilisateur / groupe sur cet ordinateur a 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, ce que nous devons faire est de définir les autorisations appropriées pour démarrer / arrêter les services Windows aux groupes ou aux utilisateurs que nous voulons. Dans ce cas, nous avons besoin de pouvoir démarrer / arrêter le service actuel utilisateur non-Admin donc nous allons définir les autorisations à cet utilisateur. Pour ce faire, nous avons besoin du SID de ce particulier compte d'utilisateur Windows. Pour l'obtenir, ouvrir le Registre (Démarrer> regedit) et recherchez la clé de Registre suivante.

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

Dans le cadre qu'il ya une clé séparée pour chacun un chaque compte d'utilisateur dans cet ordinateur, et le nom de clé est le SID de chaque compte. SID sont généralement du format S-1-5-21-2103278432-2794320136-1883075150-1000. Cliquez sur chaque touche, et vous verrez dans le volet à droite une liste de valeurs pour chaque clé. Locate « ProfileImagePath », et par sa valeur, vous pouvez le trouver le nom d'utilisateur que SID appartient. Par exemple, si le nom d'utilisateur du compte est SACH, la valeur de « ProfileImagePath » sera quelque chose comme « C: \ Users \ Sach ». Ainsi, la note en bas de la SID du compte d'utilisateur que vous souhaitez définir les autorisations.

Note2: Voici un exemple simple code C # qui peut être utilisé pour obtenir une liste desdites clés et les valeurs de il.

//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 utilisateur que nous voulons définir les autorisations à, Descendons à elle. Supposons que le SID du compte utilisateur est S-1-5-21-2103278432-2794320136-1883075150-1000 . Copiez la sortie de la commande [sc sdshow] à 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) une partie du texte ci-dessus, et collez-le juste avant S: (AU . ... une partie du texte modifie ensuite cette partie à ressembler à ceci: (A ;; RPWPCR ;;; S-1-5-21-2103278432-2794320136-1883075150-1000)

Ajoutez ensuite sc sdset à l'avant, et enferment la partie ci-dessus avec des guillemets. Votre commande finale devrait ressembler à quelque chose comme 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écuter dans votre invite de commande, et il doit donner le résultat comme suit en cas de succès:

[SC] SetServiceObjectSecurity SUCCESS

Maintenant, nous sommes bon pour vous! Votre compte utilisateur non administrateur a été accordé des autorisations pour démarrer / arrêter votre service! Essayez de vous reconnecter au compte d'utilisateur et Start / Stop le service et il devrait vous permettre de le faire.

2. AccèsMéthode par IIS

Dans ce cas, il faut accorder l'autorisation à l'utilisateur IIS « Network Services » au lieu de l'ouverture de session compte d'utilisateur Windows. La procédure est la même, seuls les paramètres de la commande sera modifiée. Depuis que nous avons l'autorisation de « réseau de services », remplacer SID par la chaîne « NS » dans la finale sdset Commande, nous avons utilisé précédemment. devrait ressembler à la dernière commande suivante:

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écuter 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 du compte de l'utilisateur (indépendamment du fait qu'il entre autres un compte administrateur ou non) à l'aide d'un WebMethod. Reportez-vous à Remarque1 pour savoir comment le faire.

Autres conseils

J'utilise le SubInACL utilitaire pour cela. Par exemple, si je voulais donner à l'utilisateur emploi sur l'ordinateur VMX001 la possibilité de démarrer et arrêter le service de publication World Wide Web (aussi connu sous le w3svc), je exécutez la commande suivante en tant qu'administrateur:

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

Les autorisations que vous pouvez accorder sont définis comme suit (liste tirée de 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

, en spécifiant la prise de force, je suis donnant droit emploi utilisateur Pause / Continuer, démarrer et arrêter le service W3SVC.

  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. Octroyer des autorisations au compte utilisateur de gérer le BST services.
    (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éconnexion et retour du journal en tant qu'utilisateur. Ils devraient maintenant pouvoir lancer le service BST.

Il y a une interface graphique sans outil ServiceSecurityEditor

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

J'avais utilisé « sc sdset » avant que je connaissais cet outil.

ServiceSecurityEditor se sent comme de la tricherie, il est facile:)

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

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

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

outil de ligne de commande subinacl.exe est probablement le seul viable et très facile à utiliser quoi que ce soit de ce poste. Vous ne pouvez pas utiliser un GPO avec des services non-système et l'autre option est juste moyen façon trop compliquée.

Service Windows fonctionne à l'aide d'un account.It système local peut démarrer automatiquement l'utilisateur se connecte dans le système ou il peut être démarré manually.However, un exemple de service Windows BST peut être exécuté à l'aide d'un compte utilisateur particulier sur les machine.This peut se faire comme suit: départ services.msc et aller aux propriétés de votre service windows, BST.From là, vous pouvez donner les paramètres de connexion de la user.Service requise est alors avec ce compte utilisateur et aucun autre utilisateur peut exécuter ce service .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top