如何將服務的啟動/停止/重新啟動權限授予非域成員伺服器上的任意使用者或組?
我們的伺服器上執行著一套 Windows 服務,它們彼此獨立地執行一堆自動化任務,除了一個服務負責其他服務。
如果其中一項服務無法響應或掛起,該服務會嘗試重新啟動服務,如果在嘗試期間引發異常,則會向支持團隊發送電子郵件,以便他們可以自行重新啟動服務。
做了一些研究後,我遇到了一些“解決方案”,從KB907460中提到的解決方法到提供服務執行管理員權限的帳戶。
我對這兩種方法都不滿意 - 我不理解 Microsoft 知識庫文章中概述的第一種方法的後果,但我絕對不想讓管理員訪問執行服務的帳戶.
我快速瀏覽了本地安全策略,除了定義帳戶是否可以作為服務登錄的策略之外,我看不到任何其他看起來像是指服務的東西。
我們在 Server 2003 和 Server 2008 上執行它,所以任何想法或指針都會被親切地接受!
**澄清:**我不想將啟動/停止/重新啟動所有服務的能力授予給定使用者或組 - 我希望能夠僅授予給定使用者或組對特定服務執行此操作的權限。
**進一步澄清:**我需要授予這些權限的伺服器不屬於域 - 它們是兩個面向網際網路的伺服器,它們接收文件、處理它們並將它們發送給第三方,以及為幾個網站提供服務,所以Active Directory 組策略是不可能的。抱歉,我沒有說得更清楚。
除非您加入了域,否則似乎沒有基於 GUI 的方式來執行此操作——至少我在任何地方都找不到——所以我做了更多的探勘,我找到了一個適用於的答案我們的情況。
我不明白知識庫文章中的字元串表示是什麼意思,但是做了一些探勘讓我發現它是 SDDL 語法。進一步探勘讓我看到了Alun Jones 的這篇文章,它解釋瞭如何獲取服務的安全描述符以及每個位的含義。MS KB914392有更多詳細資訊。
要附加到服務的現有安全描述符,請使用
sc sdshow "Service Name"
獲取現有描述符。如果這是一個普通的舊 .NET Windows 服務 - 就像我們的情況一樣 - 安全描述符應該如下所示:D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOC RRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;CR;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)S:(AU;FA ;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)
我們需要授予權限
RP
(啟動服務)、WP
(停止服務)、DT
(暫停/繼續服務)和LO
(查詢服務的目前狀態)。這可以通過將我們的服務帳戶添加到 Power Users 組來完成,但我只想授予對執行維護服務的帳戶的個人訪問權限。使用
runas
在服務帳戶下打開命令提示符,我執行whoami /all
它給了我服務帳戶的 SID,然後在下面構造了額外的 SDDL:(A;;RPWPDTLO;;;S-x-x-xx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxx-xxxx)
然後將其添加到上面 SDDL 字元串的**D:**部分:
D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOC RRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;CR;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)(A;;RPWP DTLO;;;S-x-x-xx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxx-xxxx)S:(AU;FA;CCDCLCSWRPWPDTLOC RSDRCWDWO;;;WD)
sc sdset
然後使用以下命令(在S:
文本之前)將其應用於服務:sc sdset "Service Name" D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;; CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;CR;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU )(A;;RPWPDTLO;;;S-x-x-xx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxx-xxxx)S:(AU;FA;CCDCLCSW RPWPDTLOCRSDRCWDWO;;;WD)
如果一切按計劃進行,則服務可以啟動、停止、暫停,並由上述 SID 定義的使用者查詢其狀態。