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

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

我该怎么做?

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

下面我把所有我学到的东西放在一起,如果有人需要知道,从非pipe理员用户帐户开始/停止Windows服务。

主要有两种启动/停止Windows服务的方式。 1.通过loginWindows用户帐户直接访问服务。 2.使用networking服务帐户通过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访问服务时,创build一个Visual Studio C#ASP.NET Web应用程序,并将代码放在那里。 将WebService部署到IIS根文件夹(C:\ inetpub \ wwwroot \),然后您就可以开始了。 通过url http:///访问它。

1.直接访问方法

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

 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。 要获得它,打开registry(开始> regedit)并find以下registry项。

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

在这台计算机中,每个用户帐户都有一个独立的密钥,密钥名称是每个帐户的SID。 SID的格式通常是S-1-5-21-2103278432-2794320136-1883075150-1000。 点击每个键,您将在右侧的窗格中看到每个键的值列表。 find“ProfileImagePath”,通过它的值可以findSID所属的用户名。 例如,如果账户的用户名是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; …)部分的文本之前,然后将其更改为如下所示: ;; 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 

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

2.通过IIS方法访问

在这种情况下,我们需要将权限授予IIS用户“networking服务”,而不是loginWindows用户帐户。 程序是一样的,只有命令的参数会被改变。 由于我们将权限设置为“networking服务”,因此在之前使用的最终sdset命令中将 SIDreplace为string“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)" 

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

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

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服务。

  1. 以pipe理员身份login。
  2. 从Microsoft下载subinacl.exe
    http://www.microsoft.com/en-us/download/details.aspx?id=23510
  3. 授予常规用户帐户权限以pipe理BST服务。
    subinacl.exe位于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
    subinacl /SERVICE \\MachineName\bst /GRANT=username=F
  5. 注销并以用户身份重新login。 他们现在应该能够启动BST服务。

使用以下其中一种工具将pipe理权限授予服务将更加容易:

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

以下是MSKB文章,其中包含有关Windows Server 2008 / Windows 7的说明,但是对于2000年和2003年的说明也是一样的。

有一个免费的GUI工具ServiceSecurityEditor

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

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

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

subinacl.exe命令行工具可能是唯一可行的,并且非常容易使用在这篇文章中的任何东西。 你不能使用非系统服务的GPO,另一个选项太复杂了。

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

这可能是一个愚蠢的评论,但我只是去了同样的问题,是我读这个的原因之一。 我自己的解决scheme可能不适合您的需求,但为我做。 右键单击该脚本并select“以pipe理员身份运行”。 我讨厌甚至提供这个,因为它可能是不相关的。