Yönetici olmayan bir kullanıcı hesabından bir Windows Hizmetini Başlatma / Durdurma


121

Diyelim ki BST adlı bir Windows Hizmetim var. Yönetici olmayan bir kullanıcıya, KullanıcıA'ya bu belirli hizmeti Başlatma / Durdurma izinlerini vermem gerekiyor. Hizmetim, Windows Server 2003'ten Windows 7'ye kadar çeşitli Windows işletim sistemlerinde çalışıyor.

Bunu nasıl yapabilirim?

Google'da araştırdım ve [sc sdset] komutunu kullanarak izin vermeyle ilgili bazı şeyler buldum, ancak parametrelerden tam olarak emin değilim. Bir grup için izinleri ayarlamak istemiyorum, ancak YALNIZCA belirli bir kullanıcıya, bu durumda UserA'ya ayarlamak istiyorum.

Yanıtlar:


141

Herhangi birinin bilmesi gerekiyorsa, Yönetici olmayan bir kullanıcı hesabından bir Windows Hizmetini Başlatma / Durdurma hakkında öğrendiğim her şeyi aşağıda bir araya getirdim.

Öncelikle, bir Windows Hizmetini Başlatmanın / Durdurmanın iki yolu vardır. 1. Oturum açma Windows kullanıcı hesabı aracılığıyla hizmete doğrudan erişim. 2. Hizmete Ağ Hizmeti hesabını kullanarak IIS aracılığıyla erişim.

Hizmetleri başlatmak / durdurmak için komut satırı komutu:

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

Hizmetleri başlatmak / durdurmak için C # Kodu:

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

Not 1: Hizmete IIS üzerinden erişirken, bir Visual Studio C # ASP.NET Web Uygulaması oluşturun ve kodu oraya yerleştirin. Web Hizmetini IIS Kök Klasörüne (C: \ inetpub \ wwwroot \) dağıtın ve hazırsınız. URL'ye http: /// adresinden erişin.

1. Doğrudan Erişim Yöntemi

Komutu verdiğiniz veya kodu çalıştırdığınız Windows Kullanıcı Hesabı Yönetici olmayan bir hesapsa, Windows Hizmetlerini başlatma ve durdurma yeteneğine sahip olması için söz konusu kullanıcı hesabının ayrıcalıklarını ayarlamanız gerekir. Bunu nasıl yapıyorsun. Hizmeti Başlatmak / Durdurmak istediğiniz Yönetici olmayan hesaba sahip bilgisayarda bir Yönetici hesabında oturum açın. Komut istemini açın ve aşağıdaki komutu verin:

C:/>sc sdshow <SERVICE_NAME>

Bunun çıktısı şu şekilde olacaktır:

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

Bu bilgisayardaki her bir Kullanıcının / Grubun ilgili tüm izinlerini listeler.

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.

Şimdi yapmamız gereken, Windows Hizmetlerini Başlatmak / Durdurmak için uygun izinleri istediğimiz gruplara veya kullanıcılara ayarlamaktır. Bu durumda, mevcut Yönetici olmayan kullanıcının hizmeti Başlatabilmesi / Durdurmasına ihtiyacımız var, bu nedenle izinleri o kullanıcıya ayarlayacağız. Bunu yapmak için, söz konusu Windows Kullanıcı Hesabının SID'sine ihtiyacımız var. Bunu elde etmek için, Kayıt Defterini açın (Başlat> regedit) ve aşağıdaki kayıt defteri anahtarını bulun.

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

Bunun altında, bu bilgisayardaki her kullanıcı hesabı için ayrı bir Anahtar vardır ve anahtar adı, her hesabın SID'sidir. SID genellikle S-1-5-21-2103278432-2794320136-1883075150-1000 biçimindedir. Her bir Anahtar'a tıkladığınızda, sağdaki bölmede her Anahtar için bir değer listesi göreceksiniz. "ProfileImagePath" öğesini bulun ve değerine göre SID'nin ait olduğu Kullanıcı Adını bulabilirsiniz. Örneğin, hesabın kullanıcı adı SACH ise, "ProfileImagePath" değeri "C: \ Users \ Sach" gibi bir şey olacaktır. Bu nedenle, izinleri ayarlamak istediğiniz kullanıcı hesabının SID'sini not edin.

Not2: Burada, söz konusu Anahtarların ve değerlerinin bir listesini elde etmek için kullanılabilecek basit bir C # kod örneği.

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

Artık izinleri ayarlamak istediğimiz kullanıcı hesabının SID'sine sahip olduğumuza göre, aşağı inelim. Kullanıcı hesabının SID'sinin S-1-5-21-2103278432-2794320136-1883075150-1000 olduğunu varsayalım . [Sc sdshow] komutunun çıktısını bir metin düzenleyicisine kopyalayın. Bunun gibi görünecek:

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

Şimdi, kopyalama (A ;; CCLCSWRPWPDTLOCRRC ;;; SY) Yukarıdaki metnin bir kısmını ve yapıştırın hemen önce S: (AU; ... Metnin bir bölümünü Sonra böyle bakmak için o kısmı değiştirin:. (A ;; RPWPCR ;;; S-1-5-21-2103278432-2794320136-1883075150-1000)

Sonra ön tarafa sc sdset ekleyin ve yukarıdaki kısmı tırnak işaretleri içine alın. Son komutunuz aşağıdaki gibi görünmelidir:

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

Şimdi bunu komut isteminizde çalıştırın ve başarılı olursa çıktıyı aşağıdaki gibi vermelidir:

[SC] SetServiceObjectSecurity SUCCESS

Şimdi gitmeye hazırız! Yönetici olmayan kullanıcı hesabınıza, hizmetinizi Başlatma / Durdurma izinleri verildi! Kullanıcı hesabına giriş yapmayı ve hizmeti Başlat / Durdur'u deneyin ve bunu yapmanıza izin vermelidir.

2. IIS Yöntemiyle Erişim

Bu durumda, oturum açma Windows kullanıcı hesabı yerine IIS kullanıcısı "Ağ Hizmetleri" ne izin vermemiz gerekir. Prosedür aynıdır, sadece komutun parametreleri değiştirilecektir. İzni "Ağ Hizmetleri" olarak ayarladığımız için, daha önce kullandığımız son sdset komutunda SID'yi "NS" dizesi ile değiştirin . Son komut şu şekilde görünmelidir:

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

Bunu bir Yönetici kullanıcı hesabından komut isteminde çalıştırın ve işte! Hizmeti, bir WebMethod kullanarak herhangi bir kullanıcı hesabından (bir Yönetici hesabı olup olmadığına bakılmaksızın) Başlatma / Durdurma iznine sahipsiniz. Nasıl yapılacağını öğrenmek için Not1'e bakın.


11
NOT: ** Kendi makinenizde çalıştırılan shshow komutunun sonuçlarını kopyalamanız ve ardından belirttiğim şeye göre düzenlemeniz GEREKİR . ** Kodu buradan kopyalayıp, bilgisayarınızda olduğu gibi çalıştırmayın.
Sach

5
Bu manuel yaklaşımı denedim ve harika bir şekilde çalıştı. Ancak, benim gibiyseniz ve bunu 20'den fazla bilgisayarda yapmanız gerekiyorsa, bunu yapmak için bir program veya komut dosyası isteyeceksiniz. Windows API çağrıları kullanabilirsiniz QueryServiceObjectSecurity ve SetServiceObjectSecurity . MSDN'de bunu "Konuk" hesabına uygulamak için
Drew Chapin

1
Büyük tebrikler! Tılsım gibi çalıştı.
Horst Gutmann

2
Bu cevaba giden çaba ve ilgiden uzaklaşmamak için, diğer bazı cevapların daha basit ve daha doğrudan bir çözüm sunduğunu düşünüyorum. Bunun bazı avantajlarını kaçırmadıysam?
Spike0xff

1
Bunu programlı olarak yapıyorsanız ve çıktıyı sc sdshowsizden ayırmak istiyorsanız, bu regex'i bileşenleri ayırmak için kullanabilirsiniz: (?:\D:)?\(.+?\)ve ardından SID ile yeni parçayı sondan ikinci olarak ekleyin.
PhonicUK

116

Bunun için SubInACL yardımcı programını kullanıyorum . Örneğin, ben kullanıcı vermek istiyorsa işi bilgisayar üzerinde VMX001 , ben yönetici olarak aşağıdaki komutu ediyorum başlayıp, World Wide Web Publishing Service stop (ayrıca w3svc olarak bilinir) yeteneği:

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

Verebileceğiniz izinler aşağıdaki şekilde tanımlanmıştır (liste buradan alınmıştır ):

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

Bu nedenle, PTO'yu belirterek, kullanıcısına w3svc hizmetini Duraklatma / Devam Ettirme, Başlatma ve Durdurma yetkisi veriyorum .


18
Bu en iyi cevap. Kayıt defterine girmeden, SID'leri çevirmeden veya belirsiz ACL biçimlendirmesine bağlı olmadan iş için doğru aracı kullanır. İşi hızlı ve kolay bir şekilde tamamlamak için gereken her şeyi, herhangi bir makul senaryoya göre tahmin etmek için yeterli ayrıntıyla sağlar.
pierce.jason

2
Bunu kullandığımda yeniden başlatmam veya çıkış yapmam / oturum açmam gerekir mi?
David, "Reinstate Monica"

2
@DavidGrinberg Etkilenen hesabın oturumu kapatıp tekrar açması gerektiğini ya da sadece burada açıklandığı gibi subinacl kullanırken yeniden başlatmam gerektiğini hiç hatırlamıyorum.
arcain

1
Bunun 2012 sunucusunda çalıştığını sc \\server start|stop|query servicenameuzak sunucudan kullanarak doğrulayabilir. Yeniden başlatma \ oturumu kapatmaya gerek yok
Stig Eide

Bu, yerel olarak bir hizmet başlatmak için çalıştı. Ancak birlikte çöktü CouldNotAccessDependentServicesuzak powershell kullanarak: Cannot access dependent services of '...'. E : Enumerate Dependent ServicesACL haklarına eklemek bunu düzeltti.
Willem

42
  1. Yönetici olarak giriş yapın.
  2. subinacl.exeMicrosoft'tan indirin :
    http://www.microsoft.com/en-us/download/details.aspx?id=23510
  3. BST hizmetlerini yönetmek için normal kullanıcı hesabına izinler verin.
    ( subinacl.exeiçeride 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 veya
    subinacl /SERVICE \\MachineName\bst /GRANT=username=F
  5. Oturumu kapatın ve kullanıcı olarak tekrar oturum açın. Artık BST hizmetini başlatabilmelidirler.

1
Yapılandırmaları manuel olarak değiştirmekten çok daha kolay ve daha iyi görünüyor.
gsk

1
Çıkış gerekli mi?
David, "Reinstate Monica"

hoppala! Başarısız ... "Hata OpenSCManager: RPC sunucusu kullanılamıyor. UYARI: / grant = mike = f: Açılmış önceki nesne yok". Denediğim hizmet MySQL idi. Yeniden başlatma: erişim her zamanki gibi reddedildi.
mike rodent

15

Ücretsiz bir GUI Aracı ServiceSecurityEditor var

Bu, Windows Hizmet izinlerini düzenlemenizi sağlar. Yönetici olmayan bir kullanıcıya bir hizmeti başlatma ve durdurma hakları vermek için başarıyla kullandım.

Bu aracı bilmeden önce "sc sdset" kullanmıştım.

ServiceSecurityEditor hile yapıyor gibi geliyor, bu kadar kolay :)


1
ServiceSecurityEditor'ı bu öneriye dayanarak denedim ve mükemmel.
Guru Josh 18

11

Aşağıdaki araçlardan birini kullanarak bir hizmete yönetim izinleri vermek önemli ölçüde daha kolaydır:

  • Grup ilkesi
  • Güvenlik Şablonu
  • subinacl.exe komut satırı aracı.

Windows Server 2008 / Windows 7 için talimatları içeren MSKB makalesi burada , ancak talimatlar 2000 ve 2003 için aynıdır.


1

subinacl.exe komut satırı aracı muhtemelen bu yazıdaki herhangi bir şeyden kullanılabilir ve kullanımı çok kolay olan tek araçtır. Sistem dışı hizmetlerle bir GPO kullanamazsınız ve diğer seçenek çok karmaşıktır.


-2

Windows Hizmeti yerel bir sistem hesabı kullanarak çalışır.Kullanıcı sisteme giriş yaptığında otomatik olarak başlayabilir veya manuel olarak başlatılabilir.Ancak, bir Windows hizmeti BST'nin makinede belirli bir kullanıcı hesabı kullanılarak çalıştırılabileceğini söylüyor. aşağıdaki gibi: services.msc'yi başlatın ve windows servisinizin özelliklerine gidin, oradan gerekli kullanıcının oturum açma parametrelerini verebilirsiniz. Servis daha sonra o kullanıcı hesabıyla çalışır ve başka hiçbir kullanıcı bu servisi çalıştıramaz.


1
Cevap için teşekkürler Jack. Ancak yapmak istediğim bu değil. Şu anda olduğu gibi çalışması için hizmet BST'ye ihtiyacım var. Sadece Yönetici olmayan herhangi bir kullanıcının onu Durdurabilmesi / Başlatabilmesi için ihtiyacım var.
Sach
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.