2010-12-14 200 views
101

我有一个名为BST的WindowsService。我需要给非管理员用户UserA授予开始/停止这个特定服务的权限。我的服务运行在各种Windows操作系统上,从Windows Server 2003到Windows 7开始。从非管理员用户帐户启动/停止Windows服务

我该怎么做?

我谷歌搜索了一些关于使用命令[sc sdset]给予权限的东西,但我不完全确定参数。我不想为一个组设置权限,但是只针对特定用户,在这种情况下是UserA。

回答

124

下面我汇集了我学习的有关从非管理用户帐户开始/停止Windows服务的所有信息,如果有人需要知道的话。

首先,有两种启动/停止Windows服务的方式。 1.通过登录Windows用户帐户直接访问服务。 2.使用网络服务帐户通过IIS访问服务。

命令行命令来启动/停止服务:

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

C#代码启动/停止服务:

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)); 
} 

注1: 当访问通过IIS服务,创建一个Visual Studio C#ASP.NET Web应用程序并将代码放在那里。将WebService部署到IIS根文件夹(C:\ inetpub \ wwwroot \),然后您就可以开始了。 通过url http:///访问它。

1. Direct Access方式

如果从任你发出命令或运行代码的Windows用户帐户是一个非管理员帐户,那么你需要的权限设置为特定的用户帐户所以它有能力启动和停止Windows服务。这是你如何做到的。 登录到具有要从其启动/停止服务的非Admin帐户的计算机上的管理员帐户。打开命令提示符,然后给下面的命令:

C:/>sc sdshow <SERVICE_NAME> 

的输出,就会是这样的:

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

它列出的所有权限此计算机上的每个用户/组与问候至 。

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. 

现在我们需要做的是设置相应的权限启动/停止Windows服务,以我们想要的组或用户。在这种情况下,我们需要当前非Admin用户能够启动/停止服务,以便我们将权限设置为该用户。为此,我们需要该特定Windows用户帐户的SID。要获取它,请打开注册表(开始>注册表编辑器)并找到以下注册表项。

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

在此计算机中,每个用户帐户都有一个单独的密钥,密钥名称是每个帐户的SID。 SID的格式通常是S-1-5-21-2103278432-2794320136-1883075150-1000。点击每个键,您将在右侧的窗格中看到每个键的值列表。找到“ProfileImagePath”,并通过它的值可以找到SID所属的用户名。例如,如果账户的用户名是SACH,那么“ProfileImagePath”的值将是“C:\ Users \ Sach”。所以记下您想要设置权限的用户帐户的SID。

注2: 这里有一个简单的C#代码示例,可用于获取所述Keys及其值的列表。

//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"); 
} 

现在,我们有用户帐户的SID,我们要设置的权限,让我们到它。假设用户帐户的SID为S-1-5-21-2103278432-2794320136-1883075150-1000。 将[sc sdshow]命令的输出复制到文本编辑器。它看起来是这样的:

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

现在,复制(A ;; CCLCSWRPWPDTLOCRRC ;;; SY)上面的文字部分,并将其粘贴只是S:(AU ;. ..文一部分然后更改部分看起来像这样: (A ;; RPWPCR ;;; S-1-5-21-2103278432-2794320136-1883075150-1000)

然后加入sc sdset在前面,并用引号括住上面的部分。你的f伊纳勒命令看起来应该像下面这样:

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)" 

现在在你的命令提示符下执行此,它应该如果成功如下给出的输出:

[SC] SetServiceObjectSecurity SUCCESS 

现在,我们好去!您的非管理员用户帐户已被授予开始/停止服务的权限!尝试登录到用户帐户和启动/停止服务,它应该让你这样做。

2.通过IIS方法

访问在这种情况下,我们需要授予权限的IIS用户的“网络服务”,而不是登录Windows用户帐户。程序是一样的,只有命令的参数会被改变。由于我们将权限设置为“网络服务”,因此我们在之前使用的最后一个sdset命令中将SID替换为字符串“NS”。最后的命令应该是这个样子:

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)" 

从管理员用户帐户,在命令提示符下执行它,瞧!您有权使用WebMethod从任何用户帐户开始/停止服务(无论是否为管理员帐户)。请参阅Note1以了解如何操作。

+10

**注意:** 您必须复制在您自己的机器上执行的* shshow *命令的结果,然后根据我指定的内容进行编辑。 **不要**只是从这里复制代码并在您的计算机上执行。 – Sach 2010-12-15 06:19:34

+0

我还没有尝试过,但假设这有效,这将为我节省大量的时间和头痛在工作!谢谢! – 2011-12-05 18:38:55

+5

我尝试了这种手动方式,它出色地工作。但是,如果你像我一样,而你需要在20多台电脑上这样做,那么你将需要一个程序或脚本来做到这一点。您可以使用Windows API调用[QueryServiceObjectSecurity](http://msdn.microsoft.com/en-us/library/windows/desktop/aa379312%28v=vs.85%29.aspx)和[SetServiceObjectSecurity](http ://msdn.microsoft.com/en-us/library/windows/desktop/aa379589%28v=vs.85%29.aspx)。 MSDN有一个完整的[将此应用于“访客”帐户的示例](http://msdn.microsoft.com/en-us/library/windows/desktop/aa379589%28v=vs.85%29.aspx) – 2011-12-16 21:39:54

-1

Windows服务使用本地系统帐户运行。它可以在用户登录到系统时自动启动,也可以手动启动。但是,Windows服务说BST可以使用计算机上的特定用户帐户运行。这可以按照以下步骤完成:启动services.msc并转到您的Windows服务BST的属性。从那里您可以提供所需用户的登录参数。服务随后以该用户帐户运行,并且其他用户无法运行该服务服务。

+1

谢谢你的回应杰克。 但这不是我想要做的。我需要我的服务BST像现在这样运行。我只需要任何不是管理员的用户都可以停止/启动它。 – Sach 2010-12-14 07:50:21

11

这是显著更容易授予管理权限使用这些工具的一个服务:

  • 组策略
  • 安全模板
  • subinacl.exe命令行工具。

这里的MSKB article有适用于Windows Server 2008/Windows 7的指令,但指令是同为2000年和2003年

34
  1. 以管理员身份登录。从微软
  2. 下载subinacl.exe
    http://www.microsoft.com/en-us/download/details.aspx?id=23510
  3. 权限授予普通用户帐户管理BST 服务。
    subinacl.exeC:\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
    subinacl /SERVICE \\MachineName\bst /GRANT=username=F
  5. 退出并重新登录的用户。他们现在应该可以通过 启动BST服务。
+0

看起来比手动操作配置更容易和更好。 – gsk 2013-06-05 10:32:37

+0

很好,谢谢。 – aknuds1 2014-08-18 10:35:50

+0

是否需要注销? – 2015-02-26 16:18:46

89

我使用SubInACL这个工具。例如,如果我想让计算机VMX001上的用户作业能够启动和停止万维网发布服务(也称为w3svc),我将以管理员身份发出以下命令:

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

您可以授予的权限定义如下(从here采取列表):通过指定PTO

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 

所以,我有权作业用户暂停/继续,启动和停止w3svc服务。

+14

这是最好的答案。它使用正确的工具进行工作,无需在注册表中进行篡改,转换SID或根据不明确的ACL格式设置。提供所需的所有信息,以便快速,轻松地完成工作,并提供足够的详细信息,从而将其推广到任何合理的场景。 – 2014-07-11 15:33:32

+1

当我使用它时,我需要重新启动还是注销/登录? – 2015-02-26 16:18:30

+1

@DavidGrinberg我不记得曾经需要让受影响的帐户注销,然后重新开启,或者仅在使用此处所述的subinacl时重新启动。 – arcain 2015-03-01 02:32:32

0

subinacl.exe命令行工具可能是唯一可行且非常容易使用的任何内容。你不能使用非系统服务的GPO,而另一个选项太复杂了。

7

有一个免费的GUI工具ServiceSecurityEditor

它允许你编辑Windows服务的权限。我已成功地使用它为非管理员用户授予启动和停止服务的权利。

在我知道这个工具之前,我曾经使用过“sc sdset”。

ServiceSecurityEditor感觉就像作弊,就这么简单:)

+0

我尝试了基于这个建议的ServiceSecurityEditor,它非常好。 – 2018-03-06 02:58:51

相关问题