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.