我有一个名为 BST 的 WindowsService。我需要授予非管理员用户 UserA 启动/停止此特定服务的权限。我的服务在各种 Windows 操作系统上运行,从 Windows Server 2003 到 Windows 7。
我怎样才能做到这一点?
我在 Google 上搜索并找到了一些关于使用命令 [sc sdset] 授予权限的内容,但我不确定参数。我不想为一个组设置权限,但只对一个特定的用户,在这种情况下是 UserA。
我有一个名为 BST 的 WindowsService。我需要授予非管理员用户 UserA 启动/停止此特定服务的权限。我的服务在各种 Windows 操作系统上运行,从 Windows Server 2003 到 Windows 7。
我怎样才能做到这一点?
我在 Google 上搜索并找到了一些关于使用命令 [sc sdset] 授予权限的内容,但我不确定参数。我不想为一个组设置权限,但只对一个特定的用户,在这种情况下是 UserA。
下面我汇总了我从非管理员用户帐户中了解的关于启动/停止 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.直接访问方法
如果您发出命令或运行代码的 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。要获取它,请打开注册表(开始 > regedit)并找到以下注册表项。
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# 代码示例,可用于获取所述键及其值的列表。
//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,上面的部分用引号括起来。您的最终命令应如下所示:
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 从任何用户帐户(无论是否为管理员帐户)启动/停止服务。请参阅注 1 以了解如何执行此操作。
为此,我使用了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 服务。
编辑:更新到 web.archive.org 的链接,因为原来的 MS 链接已经失效。
subinacl.exe
从 Microsoft下载:http: subinacl.exe
在C:\Program Files (x86)\Windows Resource Kits\Tools\
)。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
有一个免费的 GUI 工具ServiceSecurityEditor
它允许您编辑 Windows 服务权限。我已成功使用它为非管理员用户授予启动和停止服务的权限。
在我知道这个工具之前,我使用过“sc sdset”。
ServiceSecurityEditor 感觉像是在作弊,就这么简单:)
使用以下工具之一向服务授予管理权限要容易得多:
这是包含 Windows Server 2008 / Windows 7 说明的MSKB 文章,但 2000 和 2003 的说明相同。
subinacl.exe 命令行工具可能是本文中唯一可行且非常易于使用的工具。您不能将 GPO 与非系统服务一起使用,而另一种选择实在是太复杂了。
Windows 服务使用本地系统帐户运行。它可以在用户登录系统时自动启动,也可以手动启动。但是,Windows 服务说 BST 可以使用机器上的特定用户帐户运行。可以这样做如下:启动 services.msc 并转到 Windows 服务的属性,BST。从那里您可以提供所需用户的登录参数。服务然后使用该用户帐户运行,并且没有其他用户可以运行该服务。