2010-12-14 283 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

相關問題