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

我有一个叫做 BST 的 Windows 服务。我需要给予非管理员用户 UserA 启动/停止此特定服务的权限。我的服务运行在各种 Windows 操作系统上,从 WindowsServer2003到 Windows7。

我怎么能这么做?

我谷歌了一下,发现了一些关于使用命令[ sc sdset ]授予权限的内容,但是我不太确定参数是什么。我不想为一个组设置权限,但仅限于一个特定的用户,在本例中为 UserA。

290332 次浏览

Windows 服务使用本地系统帐户运行。它可以在用户登录到系统时自动启动,也可以手动启动。但是,Windows 服务说 BST 可以使用机器上的特定用户帐户运行。可以这样做: 启动 services.msc 并转到您的 windows 服务的属性 BST。从那里您可以给出所需用户的登录参数。然后使用该用户帐户运行服务,其他用户无法运行该服务。

如果有人需要知道的话,下面我将从一个非管理员用户帐户中学到的关于启动/停止 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));
}

注一: 当通过 IIS 访问服务时,创建一个 Visual Studio C # ASP.NET Web 应用程序并将代码放入其中。将 WebService 部署到 IIS 根文件夹(C: inetpub wwwroot)就可以了。 访问它的网址 http:///。

1. 直接存取法

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

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 服务。在这种情况下,我们需要当前的非管理用户能够启动/停止服务,所以我们将设置该用户的权限。为此,我们需要该特定 Windows 用户帐户的 SID。要获取它,请打开 Registry (Start > regedit)并找到以下注册表项。

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

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

注二: 下面是一个简单的 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");
}

现在我们已经有了要设置权限的用户帐户的 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)部分,并将其粘贴到 就在那之前学生: (天文台; ..。部分。然后把那部分改成这样: (A; ; RPWPCR; ; S-1-5-21-2103278432-2794320136-1883075150-1000)

然后在前面加上 电话号码,并在上面的部分加上引号。您的最终命令应该如下所示:

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 用户“ NetworkServices”,而不是授予登录 Windows 用户帐户。过程是相同的,只有该命令的参数将被更改。因为我们将权限设置为“ Network Services”,所以在前面使用的最后一个 电话号码命令中将 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 从任何用户帐户启动/停止服务(不管它是否是管理帐户)。请参阅注1以了解如何做到这一点。

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

  • 团体政策
  • 安全模板
  • Exe 命令行工具。

下面是带有 WindowsServer2008/Windows7指令的 MSKB 文章,但是2000和2003的指令是相同的。

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

我使用 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

因此,通过指定 PTO,我允许 工作用户暂停/继续、启动和停止 w3svc 服务。


编辑 : < em > 更新到 web.archive. org 的链接,因为原始的 MS 链接已经死亡。

Exe 命令行工具可能是本文中唯一可行且非常容易使用的工具。你不能使用 GPO 与非系统服务和其他选择只是方式太复杂了。

有一个免费的 GUI 工具 ServiceSecurityEditor

它允许您编辑 Windows 服务权限。我已经成功地使用它为非管理员用户提供了启动和停止服务的权限。

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

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