从非管理员用户帐户启动/停止Windows服务

Sac*_*ach 119 windows-services administrator user-accounts

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

我怎样才能做到这一点?

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

Sac*_*ach 138

下面我将从非管理员用户帐户启动/停止Windows服务的所有知识汇总到一起,如果有人需要知道的话.

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

用于启动/停止服务的命令行命令:

C:/> net start <SERVICE_NAME>
C:/> net stop <SERVICE_NAME>
Run Code Online (Sandbox Code Playgroud)

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));
}
Run Code Online (Sandbox Code Playgroud)

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

1.直接访问方法

如果您提供命令或运行代码的Windows用户帐户是非管理员帐户,则需要为该特定用户帐户设置权限,以便它能够启动和停止Windows服务.这就是你如何做到的. 登录到具有您要启动/停止服务的非管理员帐户的计算机上的管理员帐户.打开命令提示符并提供以下命令:

C:/>sc sdshow <SERVICE_NAME>
Run Code Online (Sandbox Code Playgroud)

输出将是这样的:

D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)
Run Code Online (Sandbox Code Playgroud)

它列出了此计算机上每个用户/组的所有权限.

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.
Run Code Online (Sandbox Code Playgroud)

现在我们需要做的是为我们想要的组或用户设置启动/停止Windows服务的适当权限.在这种情况下,我们需要当前的非管理员用户能够启动/停止服务,因此我们将为该用户设置权限.为此,我们需要该特定Windows用户帐户的SID.要获取它,请打开注册表("开始">"regedit")并找到以下注册表项.

LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
Run Code Online (Sandbox Code Playgroud)

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

注2: 这是一个简单的C#代码示例,可用于获取所述密钥及其值的列表.

//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");
}
Run Code Online (Sandbox Code Playgroud)

既然我们要将权限设置为用户帐户的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)
Run Code Online (Sandbox Code Playgroud)

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

然后在前面添加sc sdset,并用引号将上面的部分括起来.您的最终命令应如下所示:

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)"
Run Code Online (Sandbox Code Playgroud)

现在在命令提示符中执行此操作,如果成功,它应该按如下方式给出输出:

[SC] SetServiceObjectSecurity SUCCESS
Run Code Online (Sandbox Code Playgroud)

现在我们很高兴!您的非管理员用户帐户已被授予启动/停止服务的权限!尝试登录到用户帐户并启动/停止服务,它应该让你这样做.

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)"
Run Code Online (Sandbox Code Playgroud)

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

  • **注意:**您必须复制在您自己的机器中执行的*shshow*命令的结果,然后根据我指定的内容进行编辑.**请勿**只是从这里复制代码并按原样在您的计算机上执行. (11认同)
  • 我尝试了这种手动方法,它的工作非常出色.但是,如果你像我一样,并且需要在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) (5认同)
  • 为了不脱离这个答案所付出的努力和关心,我认为其他一些答案提供了更简单,更直接的解决方案。除非我缺少这种优势? (2认同)

arc*_*ain 113

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

subinacl.exe /service w3svc /grant=VMX001\job=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
Run Code Online (Sandbox Code Playgroud)

因此,通过指定PTO,我授权作业用户暂停/继续,启动和停止w3svc服务.

  • 这是最好的答案.它使用正确的工具来完成工作,而无需在注册表中进行黑客攻击,转换SID或依赖于模糊的ACL格式.提供快速,轻松完成工作所需的一切,并提供足够的细节,以便将其推广到任何合理的场景. (18认同)
  • 我使用它时是否需要重启或注销/登录? (2认同)
  • @DavidGrinberg我不记得曾经需要让受影响的帐户注销,然后重新启动,或者只在使用subinacl时重新启动,如此处所述. (2认同)

Ven*_*kat 41

  1. 以管理员身份登录.
  2. subinacl.exe从Microsoft 下载: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服务.


小智 14

有一个免费的GUI工具ServiceSecurityEditor

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

在我了解这个工具之前,我曾经使用过"sc sdset".

ServiceSecurityEditor感觉就像作弊一样,很容易:)

  • 我根据这个建议尝试了 ServiceSecurityEditor,它非常好。 (2认同)

Rya*_*her 11

使用以下工具之一向服务授予管理权限要容易得多:

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

以下是MSKB文章以及Windows Server 2008/Windows 7的说明,但2000和2003的说明相同.