Sınırlı Kullanıcıda Servis Durdurma ve Başlatma Yetkisi

23.06.2012
4

Bazı durumlarda User yani sınırlı kullanıcı yetkileriyle çalışan oturumlara belirli bir servis için durdurma, başlatma veya yeniden başlatma hakkı vermek isteyebilirsiniz. Normal şartlarda Users grubuna üye kullanıcılar işletim sistemi servislerini yönetemezler ve genelde bu ihtiyacı karşılamak için kullanıcı grup üyeliği değiştirilerek daha yüksek yetkiler atanır. Bu pratik bir yöntem olmasına karşın genelde kullanıcı oturumuna vermek istemeyeceğiniz birçok yetkiyi de beraberinde getirir. Peki belirli bir Windows işletim sistemi servisini yönetmek üzere bir kullanıcıya veya bir gruba (administrators üyesi yapmadan) nasıl yetki verebilirsiniz?

Bu iş için  sc.exe aracını kullanabiliriz. Bu araç Windows işletim sistemi üzerinde çalışan servis altyapısını yöneten Service Controller ile konuşmanızı sağlayan bir komut satırı aracıdır. Sc.exe, services.msc gibi UI üzerinden yapabileceğiniz tüm işleri yerine getirebildiği gibi, UI’dan yapmanın mümkün olmadığı diğer birçok şeyi de sağlayabiliyor. Sc.exe’yi şuralarda bulabilirsiniz:

  • Windows XP ve Windows Server 2003 sürümleri için Resource Kit içerisinde.
  • Windows Vista, Windows 7, Windows Server 2008 ve Windows Server 2008 R2 için yerleşik olarak gelir.

Sc.exe’yi kullanarak herhangi bir object SID‘ye (security identifier), servis SDDL (security descriptor definition language) string içerisinde istediğiniz yetkiyi tanımlayabilirsiniz. SID, bazı objeleri (ki bunlardan biri de kullanıcı hesaplarıdır) işletim sistemi içerisinde tanımlayan unique obje tanımlayıcılardır. SDDL ise özel bir yetki tanımlama dilidir ve bu senaryoda servislerin üzerindeki yetki tanımlarını tutar.

Örnek senaryomuz şöyle olsun: Windows 7 işletim sistemi üzerinde Test isimli ve sadece Users grubuna üye olan, yani kısıtlı yetkiler ile çalışan bir kullanıcı var. Senaryo gereği bu kullanıcıya sadece “HP Quick Synchronization Service” için başlatma/durdurma/yeniden başlatma yetkileri atayalım. Test kullanıcısının şu an servisi yönetme hakkı yok.

Service Restart 1

1) Öncelikle kullanıcının SID’sini bulun. Bunun için çeşitli yöntemler var. Mesela tek satırlık şu WMIC sorgusunu kullanabilirsiniz: wmic useraccount get name,sid

image

Test kullanıcısı için aldığımız SID: S-1-5-21-1771203805-3482426351-2602944862-1001

2) Daha sonra sc.exe ile servisin mevcut SDDL string’ini alın. Yalnız burada servisin görünen adını kullanırsanız sc.exe servisi bulamayacaktır çünkü işletim sistemi açısından bu geçerli bir servis adı değildir: sc sdshow "HP Quick Synchronization Service"

image

DisplayName verip servisin gerçek adını şu şekilde bulabilirsiniz: sc getkeyname "HP Quick Synchronization Service"

image

SDDL string’i almak için doğru service name ile tekrar sdshow yapıyorum: sc sdshow HPDrvMntSvc.exe

image

Dönen SDDL string:

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

Eğer buradaki SDDL formatı ve bu ifade dilini oluşturan syntax hakkında daha detaylı bilgi isterseniz şuralara bakabilirsiniz:

3) Mevcut SDDL string’i, Test kullanıcısının SID bilgisi ve atamak istediğim yeni yetkiler ile birleştirerek yeni string’i oluşturuyorum.

D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;RPWPDTLO;;;S-1-5-21-1771203805-3482426351-2602944862-1001)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)

Bu string içindeki şu iki nokta önemli:

  1. Ekleyeceğiniz yeni string mutlaka S:( ‘den hemen önce yer almalı.
  2. Start/Stop/Restart için şu sabit ACE string’i SID ile birleştirerek kullanıyoruz: (A;;RPWPDTLO;;;**SID**)

ⓘ  Şayet hem yerel hem de sc.exe \\computername ... gibi bir yöntemle uzak oturumdan servisi Start/Stop/Restart yetkisi atamak için kullanmanız gereken ACE String ise: (A;;LCSWRPWP;;;**SID**)

4) Yeni SDDL string’i yine sc.exe ile gönderiyorum. SetServiceObjectSecurity SUCCESS gördüğünüz taktirde işiniz bitmiştir.

sc sdset HPDrvMntSvc.exe "D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;RPWPDTLO;;;S-1-5-21-1771203805-3482426351-2602944862-1001)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)"

image

5) Artık Test kullanıcısı ile servisi yönetebilirsiniz.

image

Bunun yanı sıra Test kullanıcısı diğer servislere müdahale edemez ve hala Users grubu yetkileri ile çalışır. Ayrıca bu işi bir user SID yerine bir group SID için yaparak daha genel bir yetkilendirme de yapmak mümkün.

image

Örneğin şirketinize ait özel bir servis için kullanıcılarınıza yönetim yetkisi vermek istiyorsunuz. Bu durumda her kullanıcı hesabının SID’si ile uğraşmak yerine, örneğin bir group SID’si alıp tüm Client OS’lere uygulayarak topluca ve daha hızlı bir şekilde devreye alabilirsiniz.

Yorumlar (4)

  1. BySvc

    Bunun tam tersini nasıl yapabiliriz hocam? Yani geçerli kullanıcının servise erişimini kapatmak? A yerine D yazmak gibi bir çok şey denedim fakat başarılı olamadım.

  2. Kemal

    o kullanıcıyı user yapmak yeterli bence @BySvc

  3. peyote

    [SC] SetServiceObjectSecurity BAŞARISIZ – 5:
    Erişim engellendi.

    hatası aldım nasıl çözebilirim?

  4. Ali

    Bu islemi domaindeki kullanicinin kendi bilgisayari uzerinden yaparsak olur mu SID a eklenecek bir sey varmidir ?

Yorum Ekle

* Gerekli

* Gerekli

* Tercihen