Mulai / Hentikan Layanan Windows dari akun pengguna non-Administrator

121

Saya memiliki WindowsService bernama, katakanlah, BST. Dan saya perlu memberi pengguna non-Administrator, UserA, izin untuk Memulai / Menghentikan layanan khusus ini. Layanan saya berjalan di berbagai OS Windows, mulai dari Windows Server 2003 hingga Windows 7.

Bagaimana saya bisa melakukan ini?

Saya mencari di Google dan menemukan beberapa hal tentang memberikan izin menggunakan perintah [sc sdset], tetapi saya tidak begitu yakin tentang parameternya. Saya tidak ingin mengatur izin untuk grup, tetapi HANYA untuk pengguna tertentu, UserA dalam kasus ini.

Sach
sumber

Jawaban:

141

Di bawah ini saya telah mengumpulkan semua yang saya pelajari tentang Memulai / Menghentikan Layanan Windows dari akun pengguna non-Admin, jika ada yang perlu tahu.

Pada dasarnya, ada dua cara untuk Memulai / Menghentikan Layanan Windows. 1. Langsung mengakses layanan melalui logon akun pengguna Windows. 2. Mengakses layanan melalui IIS menggunakan akun Layanan Jaringan.

Perintah baris perintah untuk memulai / menghentikan layanan:

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

C # Kode untuk memulai / menghentikan layanan:

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

Catatan 1: Saat mengakses layanan melalui IIS, buat Aplikasi Web Visual Studio C # ASP.NET dan masukkan kode di sana. Terapkan Layanan Web ke Folder Root IIS (C: \ inetpub \ wwwroot \) dan Anda siap melakukannya. Akses dengan url http: ///.

1. Metode Akses Langsung

Jika Akun Pengguna Windows tempat Anda memberikan perintah atau menjalankan kode adalah akun non-Admin, maka Anda perlu mengatur hak istimewa ke akun pengguna tersebut sehingga memiliki kemampuan untuk memulai dan menghentikan Layanan Windows. Beginilah cara Anda melakukannya. Masuk ke akun Administrator di komputer yang memiliki akun non-Admin tempat Anda ingin Memulai / Menghentikan layanan. Buka command prompt dan berikan perintah berikut:

C:/>sc sdshow <SERVICE_NAME>

Hasil dari ini akan menjadi seperti ini:

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

Ini mencantumkan semua izin yang berkaitan dengan setiap Pengguna / Grup di komputer ini.

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.

Sekarang yang perlu kita lakukan adalah mengatur izin yang sesuai untuk Memulai / Menghentikan Layanan Windows ke grup atau pengguna yang kita inginkan. Dalam hal ini kami membutuhkan pengguna non-Admin saat ini untuk dapat Memulai / Menghentikan layanan sehingga kami akan mengatur izin untuk pengguna tersebut. Untuk melakukan itu, kami memerlukan SID dari Akun Pengguna Windows tersebut. Untuk mendapatkannya, buka Registry (Start> regedit) dan temukan kunci registri berikut.

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

Di bawah itu ada Kunci terpisah untuk setiap akun pengguna di komputer ini, dan nama kunci adalah SID dari setiap akun. SID biasanya dalam format S-1-5-21-2103278432-2794320136-1883075150-1000. Klik pada setiap Kunci, dan Anda akan melihat di panel sebelah kanan daftar nilai untuk setiap Kunci. Temukan "ProfileImagePath", dan dengan nilainya Anda dapat menemukan Nama Pengguna yang dimiliki SID. Misalnya, jika nama pengguna akun adalah SACH, maka nilai "ProfileImagePath" akan menjadi seperti "C: \ Users \ Sach". Jadi catat SID akun pengguna yang ingin Anda atur izinnya.

Note2: Berikut contoh kode C # sederhana yang dapat digunakan untuk mendapatkan daftar kata kunci dan nilainya.

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

Sekarang kita memiliki SID dari akun pengguna yang ingin kita atur izinnya, mari kita mulai. Anggaplah SID akun pengguna adalah S-1-5-21-2103278432-2794320136-1883075150-1000 . Salin output dari perintah [sc sdshow] ke editor teks. Ini akan terlihat seperti ini:

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

Sekarang, salin (A ;; CCLCSWRPWPDTLOCRRC ;;; SY) bagian dari teks di atas, dan paste tepat sebelum para S: (AU; ... bagian dari teks Kemudian ubah bagian itu untuk terlihat seperti ini:. (A ;; RPWPCR ;;; S-1-5-21-2103278432-2794320136-1883075150-1000)

Kemudian tambahkan sc sdset di depan, dan tutupi bagian di atas dengan tanda kutip. Perintah terakhir Anda akan terlihat seperti berikut:

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

Sekarang jalankan ini di command prompt Anda, dan itu akan memberikan output sebagai berikut jika berhasil:

[SC] SetServiceObjectSecurity SUCCESS

Sekarang kita siap berangkat! Akun pengguna non-Admin Anda telah diberikan izin untuk Memulai / Menghentikan layanan Anda! Coba masuk ke akun pengguna dan Mulai / Hentikan layanan dan itu akan membiarkan Anda melakukan itu.

2. Akses melalui Metode IIS

Dalam kasus ini, kita perlu memberikan izin kepada pengguna IIS "Layanan Jaringan" daripada akun pengguna Windows logon. Prosedurnya sama, hanya parameter perintah yang akan diubah. Karena kami menetapkan izin ke "Layanan Jaringan", ganti SID dengan string "NS" di perintah sdset terakhir yang kami gunakan sebelumnya. Perintah terakhir akan terlihat seperti ini:

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

Jalankan di command prompt dari akun pengguna Admin, dan voila! Anda memiliki izin untuk Memulai / Menghentikan layanan dari akun pengguna mana pun (terlepas dari apakah itu akun Admin atau bukan) menggunakan WebMethod. Lihat Note1 untuk mengetahui cara melakukannya.

Sach
sumber
11
CATATAN: ** Anda HARUS menyalin hasil perintah shshow yang dijalankan di mesin Anda sendiri dan kemudian mengedit sesuai dengan yang saya tentukan. ** JANGAN hanya menyalin kode dari sini dan menjalankannya di komputer Anda apa adanya.
Sach
5
Saya mencoba pendekatan manual ini dan berhasil dengan sangat baik. Tetapi, jika Anda seperti saya, dan Anda perlu melakukan ini pada lebih dari 20 komputer maka Anda akan menginginkan sebuah program, atau skrip untuk melakukan ini. Anda dapat menggunakan panggilan API Windows QueryServiceObjectSecurity , dan SetServiceObjectSecurity . MSDN memiliki contoh
Drew Chapin
1
Pujian besar! Bekerja seperti pesona.
Horst Gutmann
2
untuk tidak mengurangi upaya & perhatian yang diberikan pada jawaban ini, saya pikir beberapa jawaban lain menawarkan solusi yang lebih sederhana dan lebih langsung. Kecuali saya kehilangan beberapa keuntungan dari ini?
Spike0xff
1
Jika Anda melakukan ini secara terprogram dan ingin memisahkan output dari sc sdshowAnda dapat menggunakan regex ini untuk memisahkan komponen: (?:\D:)?\(.+?\)lalu masukkan bagian baru dengan SID sebagai second-to-last.
PhonicUK
115

Saya menggunakan utilitas SubInACL untuk ini. Misalnya, jika saya ingin memberikan pekerjaan pengguna di komputer VMX001 kemampuan untuk memulai dan menghentikan Layanan Penerbitan World Wide Web (juga dikenal sebagai w3svc), saya akan mengeluarkan perintah berikut sebagai Administrator:

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

Izin yang dapat Anda berikan didefinisikan sebagai berikut (daftar diambil dari sini ):

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

Jadi, dengan menentukan PTO, saya memberikan hak kepada pengguna pekerjaan untuk Jeda / Lanjutkan, Mulai, dan Hentikan layanan w3svc.

arcain
sumber
18
Inilah jawaban terbaik. Ini menggunakan alat yang tepat untuk pekerjaan itu tanpa meretas registri, menerjemahkan SID, atau tergantung pada format ACL yang tidak jelas. Menyediakan semua yang diperlukan untuk menyelesaikan pekerjaan dengan cepat dan mudah dengan detail yang cukup untuk memperkirakannya ke skenario yang masuk akal.
pierce.jason
2
Apakah saya perlu memulai ulang atau keluar / masuk saat saya menggunakan ini?
David mengatakan Reinstate Monica
2
@DavidGrinberg Saya tidak ingat pernah akun yang terpengaruh harus dimatikan dan dihidupkan kembali, atau harus memulai ulang ketika hanya menggunakan subinacl seperti yang dijelaskan di sini.
arcain
1
Dapat mengkonfirmasi bahwa ini berfungsi pada server 2012 menggunakan sc \\server start|stop|query servicenamedari server jauh. Tidak perlu restart \ logoff
Stig Eide
Ini bekerja untuk memulai layanan secara lokal. Namun itu jatuh dengan CouldNotAccessDependentServicesmenggunakan remote PowerShell: Cannot access dependent services of '...'. Menambahkan E : Enumerate Dependent Serviceske hak ACL memperbaikinya.
Willem
42
  1. Masuk sebagai administrator.
  2. Unduh subinacl.exedari Microsoft:
    http://www.microsoft.com/en-us/download/details.aspx?id=23510
  3. Berikan izin ke akun pengguna biasa untuk mengelola layanan BST.
    ( subinacl.exeada di 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 atau
    subinacl /SERVICE \\MachineName\bst /GRANT=username=F
  5. Keluar dan masuk kembali sebagai pengguna. Mereka sekarang dapat meluncurkan layanan BST.
Venkat
sumber
1
Terlihat jauh lebih mudah dan lebih baik daripada memanipulasi konfigurasi secara manual.
gsk
1
Apakah logout diperlukan?
David mengatakan Reinstate Monica
waduh! Gagal ... Saya mendapat "Kesalahan OpenSCManager: Server RPC tidak tersedia. PERINGATAN: / grant = mike = f: Tidak ada objek sebelumnya yang dibuka". Layanan yang saya coba adalah MySQL. Reboot: akses ditolak, seperti biasa.
mike rodent
15

Ada GUI Tool ServiceSecurityEditor gratis

Yang memungkinkan Anda untuk mengedit izin Layanan Windows. Saya telah berhasil menggunakannya untuk memberi pengguna non-Administrator hak untuk memulai dan menghentikan layanan.

Saya telah menggunakan "sc sdset" sebelum saya mengetahui tentang alat ini.

ServiceSecurityEditor terasa seperti curang, semudah itu :)

FCW
sumber
1
Saya mencoba ServiceSecurityEditor berdasarkan rekomendasi ini dan itu luar biasa.
Guru Josh
11

Jauh lebih mudah untuk memberikan izin pengelolaan ke layanan menggunakan salah satu alat berikut:

  • Kebijakan Grup
  • Template Keamanan
  • alat baris perintah subinacl.exe.

Berikut artikel MSKB dengan instruksi untuk Windows Server 2008 / Windows 7, tetapi instruksinya sama untuk tahun 2000 dan 2003.

Ryan Fisher
sumber
1

alat baris perintah subinacl.exe mungkin satu-satunya yang layak dan sangat mudah digunakan dari apa pun di posting ini. Anda tidak dapat menggunakan GPO dengan layanan non-sistem dan opsi lainnya terlalu rumit.

JustAGuy
sumber
-2

Layanan Windows berjalan menggunakan akun sistem lokal, dapat dimulai secara otomatis saat pengguna masuk ke sistem atau dapat dimulai secara manual.Namun, layanan Windows mengatakan BST dapat dijalankan menggunakan akun pengguna tertentu di mesin. Ini dapat dilakukan sebagai berikut: mulai services.msc dan buka properti layanan windows Anda, BST. Dari sana Anda dapat memberikan parameter login dari pengguna yang diperlukan. Layanan kemudian berjalan dengan akun pengguna itu dan tidak ada pengguna lain yang dapat menjalankan layanan itu.

jack_sparrow
sumber
1
Terima kasih atas tanggapan Jack. Namun bukan itu yang ingin saya lakukan. Saya perlu layanan BST saya untuk berjalan seperti sekarang. Saya hanya membutuhkan pengguna yang bukan Admin untuk dapat Menghentikan / Memulai.
Sach