簡體   English   中英

允許非管理員用戶啟動或停止 Windows 服務

[英]Enable non-admin users to start or stop Windows services

我編寫了自己的 windows 服務。 我也想從非管理員帳戶啟動和停止它。 我知道我可以在系統安全設置中手動設置它。 但是,我想知道,有沒有辦法在我的 windows 服務代碼中設置它(比如使用Security_attribute )? 我想要的是 C++ 中的代碼,以包含在 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 ZC6E190B284633C48CEZ8DDZ ZC6E190B284633C48E39E應用程序代碼554633C48E39E。 將 WebService 部署到 IIS 根文件夾(C:\inetpub\wwwroot),您就可以使用 go。 通過 url http:/// 訪問它。

1.直接訪問方法

如果您發出命令或運行代碼的 Windows 用戶帳戶是非管理員帳戶,那么您需要為該特定用戶帳戶設置權限,以便它能夠啟動和停止 Windows 服務。 這就是你的做法。 登錄到計算機上的管理員帳戶,該帳戶具有您要啟動/停止服務的非管理員帳戶。 打開命令提示符並輸入以下命令:

C:/>sc sdshow <SERVICE_NAME>

Output 這將是這樣的:

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 ] 命令的 output 復制到文本編輯器。 它看起來像這樣:

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)"

現在在你的命令提示符下執行這個,如果成功,它應該給 output 如下:

[SC] SetServiceObjectSecurity SUCCESS

現在我們對 go 很好。 您的非管理員用戶帳戶已被授予啟動/停止服務的權限! 嘗試登錄用戶帳戶並啟動/停止服務,它應該可以讓你這樣做。

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 以了解如何執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM