The XYZ service is marked as an interactive service. However, the system is configured to not allow interactive services. This service may not function properly. problemi

Merhaba, PFE olarak hergün farkli türde sorunlar ile karsilasiyoruz, bunlardan çok güncel bir tanesi “The XYZ service is marked as an interactive service. However, the system is configured to not allow interactive services. This service may not function properly.” hata mesaji.

Aslinda “Servis” adi altinda tanimladigimiz kod parçasi, tabiati geregi GUI (Grafiksel Kullanici Arabirimi) olmadan çalismasi için tasarlanmis bir konsol uygulamasindan baska birsey degil. Dolayisiyla bu tür bir uygulamanin logon olan kullanicinin masaüstü ile interactive olmasina yani kullaniciya grafiksel bir arabirim sunabilme yetkilerine sahip bir biçimde çalismasina gerek yok, böylelikle güvenlik olarak çok daha az saldiri alani birakmis oluyoruz (Bakiniz Windows Server Core Edition in en önemli özellikleri). Ayrica bir servis e masaüstü ile interact sekilde çalisma yetkisi verilecek ise bu uygulamanin servis mi yoksa GUI li bir uygulama olarak mi yazilmasi gerektigi detayli bir sekilde planlanmali.

Bu kadar teorik bilgiden sonra gelelim yasadigimiz soruna, birtakim (çok gizli Ninja) sebeplerden dolayi 3rd party bir servisin masaüstü ile interact edecek sekilde çalismasi gerekiyor. Bunu yapmak anlattiklarimdan sonra kulaga zor gibi gelse de aslinda çok basit, yapilmasi gereken sadece servisin özelliklerine girip Log on tabinda “Allow service to interact with desktop” adinda bir kutucuga check koymak.

image

Peki madem bu kadar basit neden blog umda bu konuda bir yazi yaziyorum? Evet çünkü sorunu çözmek için bu islem yeterli olmadi, basliktan da anlasilacagi üzere bu kez de servis i çalistirmak istedigimizde “The XYZ service is marked as an interactive service. However, the system is configured to not allow interactive services. This service may not function properly.” hatasi ile karsilastik.

image

Hata mesajini ilk okudugunuzda akliniza “Local Security Policy” den olabiliecek bir kisitlama gibi bir fikir yaratabilir. Ancak gerçek sebebin bununla hiçbir alakasi yok

Servisler ve System Process leri “Session 0” da çalisir, Vista öncesi isletim sistemlerinde ilk logon olan kullanici da ayni sekilde “Session 0” da çalisiyor, böyle bir durumda “Session 0” da olan kullanici bu servislerin yetkilerini bazi yöntemler ile ele geçirip kendisinde olmayan ama servislerde olan yükseltilmis yetkileri kendi yetkileriymis gibi kullanabiliyor. Bunun yarattigi güvenlik açigi sebebi ile Vista ve sonrasi isletim sistemlerinde “Session 0 isolation” getirildi, basitçe artik ilk logon olan kullanici “Session 1” kullaniyor ve “Session 0” kullanicilara sunulmuyor, böylelikle servisler ve kullaanicilar hiçbir zaman ayni session da olmuyor ve güvenlik riski ortadan kalkiyor.

Bu dizayn degisikligi yeni bir sorunu doguruyor, bir servis masaüstü ile interact edecek sekilde çalismasi gerekiyor ise bu nasil mümkün olacak? Belli ki “Allow service to interact with desktop” özelligini açmak yeterli olmayacak gibi gözüküyor, bu islemin gerçeklesmesi baska bir Windows servisi ile mümkün hale geliyor.

image

Bu servis “Interactive Services Detection”, adindan da anlasilacagi üzere “Session 0” da çalisan ancak masaüstü ile interact etme ihtiyaci duyan servisler “Interactive Services Detection” servisi sayesinde “session x“ (x= kullanici hangi session da ise) e yönlendiriliyor ve islev görmesini sagliyor.

Basit bir demo yapalim:

“Interactive Services Detection” servisi default olarak Manual ve stopped konumdadir.

image

Simdi Sysinternals dan Psexec komutunu kullanarak bir uygulamanin “Session 0” da çalismasini saglayalim. Buradaki amaç “Session 0” da çalisan bir servisin (bu örnekte notepad.exe olacak) “Interactive Services Detection” servisi sayesinde “Session 1“ e yönlenebilecek mi onu tespit etmek.

Bunun için notepad uygulamasini kullanacagim, asagidaki örnek komut ile notepad in “session 0” da çalismasini sagliyorum. (elbette lokal Administrator oldugum için böyle bir yetkiye sahibim)

image

Daha sonra yine bir Sysinternals tool u olan Process Explorer ile komutun sonuçlarina bakiyorum, psexec servisinin altinda “Notepad.exe” var ve session “0” daha sonra “UI0Detect.exe” çalisiyor ve yine session “0” ancak onun altinda açilan ikinci “UI0Detect.exe” gördügünüz gibi session “1”

image

“UI0Detect.exe” bahsettigim “Interactive Services Detection” servisin exe si.

image

Bu asamada taskbar da asagidaki popup çikiyor.

image

Bu popup a bastigimda asagidaki gibi bir ekranla karsilasiyorum, böylece “Interactive Services Detection” servisi bana notepad in “Session 1” de bir görüntü aktarmak istedigine dair bir bilgi veriyor.

image

Hizlica “Interactive Services Detection” servisinin durumuna baktigimda Started konuma geçtigini görüyorum.

image

Böylelikle sizlere “Interactive Services Detection” servisinin basariyla çalistigini göstermis oldum. Ancak bizim yasadigimiz senaryo da bu gerçeklesmedi ve hata aldik, hatanin sebebi “Interactive Services Detection” servisinin kendiliginden çalismamasi, servisin çalismamasinin sebebi ise mimari!!!

3 Farki senaryo mevcut:

32bit: Eger Windows isletim sisteminiz 32bit ise “Interactive Services Detection” servisi siz birsey yapmadan otomatik olarak çalisacaktir.

64bit: Eger Windows isletim sisteminiz 64bit ise ve kullanacaginiz 3rd party servis de 64bit ise “Interactive Services Detection” servisi otomatik olarak çalismayacaktir.

64bit: Eger Windows isletim sisteminiz 64bit ise ve kullanacaginiz 3rd party servis  32bit ise “Interactive Services Detection” servisi siz birsey yapmadan otomatik olarak çalisacaktir.

 

SONUÇ:

Bizim karsilastigimiz senaryo bunlardan ikinci olan ve çözüm için “Interactive Services Detection” servisini “Automatic/Started” konumuna çekmemiz yeterli oldu.