Bắt đầu / Dừng Dịch vụ Windows từ tài khoản người dùng không phải Quản trị viên


121

Tôi có một WindowsService tên là BST. Và tôi cần cấp cho người dùng không phải Quản trị viên, UserA, quyền để Bắt đầu / Dừng dịch vụ cụ thể này. Dịch vụ của tôi chạy trên nhiều hệ điều hành Windows, bắt đầu từ Windows Server 2003 đến Windows 7.

Tôi có thể làm cái này như thế nào?

Tôi đã lên Google và tìm thấy một số thông tin về việc cấp quyền bằng lệnh [sc sdset], nhưng tôi không chắc chắn chính xác về các tham số. Tôi không muốn đặt quyền cho một nhóm mà CHỈ cho một người dùng cụ thể, UserA trong trường hợp này.

Câu trả lời:


141

Dưới đây, tôi đã tổng hợp mọi thứ tôi đã học được về việc Bắt đầu / Dừng Dịch vụ Windows từ tài khoản người dùng không phải Quản trị viên, nếu ai đó cần biết.

Về cơ bản, có hai cách để Khởi động / Dừng Dịch vụ Windows. 1. Trực tiếp truy cập dịch vụ thông qua đăng nhập tài khoản người dùng Windows. 2. Truy cập dịch vụ thông qua IIS bằng tài khoản Dịch vụ Mạng.

Lệnh dòng lệnh để bắt đầu / dừng dịch vụ:

C:/> net start <SERVICE_NAME>
C:/> net stop <SERVICE_NAME>

Mã C # để bắt đầu / dừng dịch vụ:

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));
}

Lưu ý 1: Khi truy cập dịch vụ thông qua IIS, hãy tạo Ứng dụng Web Visual Studio C # ASP.NET và đặt mã vào đó. Triển khai WebService vào Thư mục gốc IIS (C: \ inetpub \ wwwroot \) và bạn đã sẵn sàng. Truy cập nó bằng url http: ///.

1. Phương pháp truy cập trực tiếp

Nếu Tài khoản Người dùng Windows mà từ đó bạn cung cấp lệnh hoặc chạy mã là tài khoản không phải Quản trị viên, thì bạn cần đặt các đặc quyền cho tài khoản người dùng cụ thể đó để nó có khả năng khởi động và dừng Dịch vụ Windows. Đây là cách bạn làm điều đó. Đăng nhập vào tài khoản Quản trị viên trên máy tính có tài khoản không phải Quản trị viên mà bạn muốn Khởi động / Dừng dịch vụ. Mở dấu nhắc lệnh và đưa ra lệnh sau:

C:/>sc sdshow <SERVICE_NAME>

Đầu ra của cái này sẽ như thế này:

D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)

Nó liệt kê tất cả các quyền mà mỗi Người dùng / Nhóm trên máy tính này có liên quan đến.

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.

Bây giờ những gì chúng ta cần làm là thiết lập các quyền thích hợp để Khởi động / Dừng Dịch vụ Windows cho nhóm hoặc người dùng mà chúng ta muốn. Trong trường hợp này, chúng tôi cần người dùng không phải là Quản trị viên hiện tại có thể Khởi động / Dừng dịch vụ, vì vậy chúng tôi sẽ thiết lập các quyền cho người dùng đó. Để làm điều đó, chúng tôi cần SID của Tài khoản Người dùng Windows cụ thể đó. Để lấy nó, hãy mở Sổ đăng ký (Bắt đầu> regedit) và tìm khóa đăng ký sau.

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

Dưới đó có một Khóa riêng cho mỗi tài khoản người dùng trong máy tính này và tên khóa là SID của mỗi tài khoản. SID thường có định dạng S-1-5-21-2103278432-2794320136-1883075150-1000. Nhấp vào từng Khóa, và bạn sẽ thấy trên ngăn bên phải danh sách các giá trị cho từng Khóa. Tìm "ProfileImagePath" và theo giá trị của nó, bạn có thể tìm thấy Tên người dùng mà SID thuộc về. Ví dụ: nếu tên người dùng của tài khoản là SACH, thì giá trị của "ProfileImagePath" sẽ giống như "C: \ Users \ Sach". Vì vậy, hãy ghi lại SID của tài khoản người dùng mà bạn muốn đặt quyền.

Lưu ý 2: Đây là một mẫu mã C # đơn giản có thể được sử dụng để lấy danh sách các Khóa đã nói và các giá trị của nó.

//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");
}

Bây giờ chúng ta đã có SID của tài khoản người dùng mà chúng ta muốn đặt quyền, hãy đi xuống nó. Giả sử SID của tài khoản người dùng là S-1-5-21-2103278432-2794320136-1883075150-1000 . Sao chép đầu ra của lệnh [sc sdshow] vào trình soạn thảo văn bản. Nó sẽ trông giống thế này:

D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)

Bây giờ, hãy sao chép phần (A ;; CCLCSWRPWPDTLOCRRC ;;; SY) của văn bản trên và dán nó ngay trước phần S: (AU; ... của văn bản. Sau đó, thay đổi phần đó thành như sau: (A ;; RPWPCR ;;; S-1-5-21-2103278432-2794320136-1883075150-1000)

Sau đó thêm sc sdset ở phía trước và đặt phần trên bằng dấu ngoặc kép. Lệnh cuối cùng của bạn sẽ giống như sau:

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

Bây giờ thực hiện điều này trong dấu nhắc lệnh của bạn và nó sẽ đưa ra kết quả như sau nếu thành công:

[SC] SetServiceObjectSecurity SUCCESS

Bây giờ chúng ta tốt để đi! Tài khoản người dùng không phải Quản trị viên của bạn đã được cấp quyền Bắt đầu / Dừng dịch vụ của bạn! Hãy thử đăng nhập vào tài khoản người dùng và Bắt đầu / Dừng dịch vụ và nó sẽ cho phép bạn làm điều đó.

2. Truy cập thông qua Phương pháp IIS

Trong trường hợp này, chúng tôi cần cấp quyền cho người dùng IIS "Dịch vụ mạng" thay vì tài khoản người dùng Windows đăng nhập. Quy trình vẫn giống nhau, chỉ có các tham số của lệnh sẽ được thay đổi. Vì chúng tôi đặt quyền thành "Dịch vụ mạng", hãy thay thế SID bằng chuỗi "NS" trong lệnh sdset cuối cùng mà chúng tôi đã sử dụng trước đây. Lệnh cuối cùng sẽ giống như sau:

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

Thực thi nó trong dấu nhắc lệnh từ tài khoản người dùng Admin, và thì đấy! Bạn có quyền Bắt đầu / Dừng dịch vụ từ bất kỳ tài khoản người dùng nào (bất kể đó có phải là tài khoản Quản trị viên hay không) bằng cách sử dụng WebMethod. Tham khảo Note1 để tìm hiểu cách thực hiện.


11
LƯU Ý: ** Bạn PHẢI sao chép kết quả của lệnh shshow được thực thi trong máy của chính bạn và sau đó chỉnh sửa theo những gì tôi đã chỉ định. ** KHÔNG chỉ sao chép mã từ đây và thực thi trên máy tính của bạn.
Sách

5
Tôi đã thử cách tiếp cận thủ công này và nó hoạt động hiệu quả. Nhưng, nếu bạn giống tôi và bạn cần thực hiện việc này trên hơn 20 máy tính thì bạn sẽ muốn có một chương trình hoặc tập lệnh để thực hiện việc này. Bạn có thể sử dụng lệnh gọi API Windows QueryServiceObjectSecuritySetServiceObjectSecurity . MSDN có một ví dụ
Drew Chapin

1
Kudo lớn! Làm việc như người ở.
Horst Gutmann

2
Tôi nghĩ rằng một số câu trả lời khác cung cấp một giải pháp đơn giản và trực tiếp hơn cho câu trả lời này. Trừ khi tôi đang thiếu một số lợi thế của điều này?
Spike0xff

1
Nếu bạn đang thực hiện việc này theo chương trình và muốn chia nhỏ đầu ra từ sc sdshowbạn có thể sử dụng regex này để chia nhỏ các thành phần: (?:\D:)?\(.+?\)rồi chèn phần mới với SID làm phần tử thứ hai đến cuối cùng.
PhonicUK

115

Tôi sử dụng tiện ích SubInACL cho việc này. Ví dụ: nếu tôi muốn cung cấp cho người dùng công việc trên máy tính VMX001 khả năng khởi động và dừng Dịch vụ phát hành web toàn cầu (còn được gọi là w3svc), tôi sẽ đưa ra lệnh sau với tư cách là Quản trị viên:

subinacl.exe /service w3svc /grant=VMX001\job=PTO

Các quyền bạn có thể cấp được định nghĩa như sau (danh sách được lấy từ đây ):

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

Vì vậy, bằng cách chỉ định PTO, tôi cho phép người dùng công việc Tạm dừng / Tiếp tục, Bắt đầu và Dừng dịch vụ w3svc.


18
Đây là câu trả lời tốt nhất. Nó sử dụng công cụ phù hợp cho công việc mà không cần hack xung quanh sổ đăng ký, dịch SID hoặc phụ thuộc vào định dạng ACL khó hiểu. Cung cấp tất cả những gì cần thiết để hoàn thành công việc một cách nhanh chóng và dễ dàng với đủ chi tiết để ngoại suy nó thành bất kỳ tình huống hợp lý nào.
pierce.jason

2
Tôi có cần khởi động lại hoặc đăng xuất / đăng nhập khi sử dụng cái này không?
David nói Hãy phục hồi Monica vào

2
@DavidGrinberg Tôi không nhớ là đã bao giờ cần phải đăng xuất tài khoản bị ảnh hưởng rồi bật lại hoặc phải khởi động lại khi chỉ sử dụng subinacl như được mô tả ở đây.
arcain

1
Có thể xác nhận rằng điều này hoạt động trên máy chủ 2012 sử dụng sc \\server start|stop|query servicenametừ máy chủ từ xa. Không cần khởi động lại \ đăng xuất
Stig Eide

Điều này đã hoạt động để bắt đầu một dịch vụ cục bộ. Tuy nhiên nó đã bị rơi với CouldNotAccessDependentServicessử dụng PowerShell từ xa: Cannot access dependent services of '...'. Thêm E : Enumerate Dependent Servicesvào các quyền ACL đã khắc phục điều đó.
Willem

42
  1. Đăng nhập với tư cách quản trị viên.
  2. Tải xuống subinacl.exetừ Microsoft:
    http://www.microsoft.com/en-us/download/details.aspx?id=23510
  3. Cấp quyền cho tài khoản người dùng thông thường để quản lý các dịch vụ BST.
    ( subinacl.exeđang ở 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 hoặc là
    subinacl /SERVICE \\MachineName\bst /GRANT=username=F
  5. Đăng xuất và đăng nhập lại với tư cách người dùng. Bây giờ họ có thể ra mắt dịch vụ BST.

1
Trông dễ dàng và tốt hơn nhiều so với thao tác thủ công các cấu hình.
gsk

1
Có cần đăng xuất không?
David nói Hãy phục hồi Monica vào

rất tiếc! Không thành công ... Tôi nhận được "Lỗi OpenSCManager: Máy chủ RPC không khả dụng. CẢNH BÁO: / Grant = mike = f: Không có đối tượng nào trước đó được mở". Dịch vụ tôi đã thử là MySQL. Khởi động lại: quyền truy cập bị từ chối, như mọi khi.
mike Rodent

15

Có một GUI Tool ServiceSecurityEditor miễn phí

Cho phép bạn chỉnh sửa các quyền Dịch vụ Windows. Tôi đã sử dụng thành công nó để cấp cho người dùng không phải Quản trị viên quyền để bắt đầu và dừng dịch vụ.

Tôi đã sử dụng "sc sdset" trước khi tôi biết về công cụ này.

ServiceSecurityEditor cảm thấy như gian lận, thật dễ dàng :)


1
Tôi đã thử ServiceSecurityEditor dựa trên khuyến nghị này và nó rất tuyệt vời.
Guru Josh

11

Việc cấp quyền quản lý cho một dịch vụ dễ dàng hơn đáng kể bằng cách sử dụng một trong các công cụ sau:

  • Chính sách Nhóm
  • Mẫu bảo mật
  • công cụ dòng lệnh subinacl.exe.

Đây là bài viết MSKB với hướng dẫn dành cho Windows Server 2008 / Windows 7, nhưng hướng dẫn giống nhau cho 2000 và 2003.


1

Công cụ dòng lệnh subinacl.exe có lẽ là công cụ duy nhất khả thi và rất dễ sử dụng từ bất kỳ thứ gì trong bài đăng này. Bạn không thể sử dụng GPO với các dịch vụ không thuộc hệ thống và tùy chọn khác chỉ là cách quá phức tạp.


-2

Windows Service chạy bằng tài khoản hệ thống cục bộ, có thể tự động khởi động khi người dùng đăng nhập vào hệ thống hoặc có thể khởi động theo cách thủ công.Tuy nhiên, một dịch vụ windows cho biết BST có thể được chạy bằng tài khoản người dùng cụ thể trên máy. như sau: khởi động services.msc và chuyển đến thuộc tính của dịch vụ windows của bạn, BST.


1
Cảm ơn Jack đã trả lời. Tuy nhiên đó không phải là điều tôi muốn làm. Tôi cần BST dịch vụ của mình để chạy như hiện tại. Tôi chỉ cần bất kỳ người dùng nào không phải là Quản trị viên để có thể Dừng / Khởi động nó.
Sách
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.