Aracılığıyla paylaş


Etkileşimli Hizmetler

Hizmetler genellikle grafik kullanıcı arabirimi (GUI) olmadan katılımsız çalışacak şekilde tasarlanmış konsol uygulamalarıdır. Ancak, bazı hizmetler zaman zaman bir kullanıcıyla etkileşime ihtiyaç duyuyor olabilir. Bu sayfada, bir hizmetten kullanıcıyla etkileşim kurmanın en iyi yolları açıklanır.

Önemli

Hizmetler, Windows Vista'da bir kullanıcıyla doğrudan etkileşim kuramaz. Bu nedenle, Etkileşimli Hizmet Kullanma başlıklı bölümde bahsedilen teknikler yeni kodda kullanılmamalıdır.

 

Bir Hizmetten Dolaylı Olarak Kullanıcıyla Etkileşim Kurma

Windows'un desteklenen tüm sürümlerinde bir hizmetten kullanıcıyla etkileşime geçmek için aşağıdaki teknikleri kullanabilirsiniz:

  • WTSSendMessage işlevini kullanarak kullanıcının oturumunda bir iletişim kutusu görüntüleyin.

  • Ayrı bir gizli GUI uygulaması oluşturun ve uygulamayı etkileşimli kullanıcı bağlamında çalıştırmak için CreateProcessAsUserişlevini kullanın. GUI uygulamasını, örneğin adlandırılmış kanallar gibi işlemler arası iletişim (IPC) yöntemiyle hizmetle iletişim kuracak şekilde tasarlar. Hizmet GUI uygulamasıyla iletişim kurarak GUI'nin ne zaman görüntüleneceğini bildirir. Uygulama, hizmetin uygun eylemi gerçekleştirebilmesi için kullanıcı etkileşiminin sonuçlarını hizmete geri iletir. Uygun bir erişim denetimi listesi (ACL) kullanmadığınız sürece IPC'nin hizmet arabirimlerinizi ağ üzerinden kullanıma gösterebileceğini unutmayın.

    Bu hizmet çok kullanıcılı bir sistemde çalışıyorsa, her oturumda çalıştırılması için uygulamayı aşağıdaki anahtara ekleyin: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run. Uygulama IPC için adlandırılmış kanallar kullanıyorsa, sunucu her kanala oturum kimliğine göre benzersiz bir ad vererek birden çok kullanıcı işlemini ayırt edebilir.

Aşağıdaki teknik Windows Server 2003 ve Windows XP için de kullanılabilir:

  • MessageBox işlevini MB_SERVICE_NOTIFICATIONile çağırarak bir ileti kutusu görüntüleyin. Bu, basit durum iletilerini görüntülemek için önerilir. Hizmet başlatma sırasında veya HandlerEx yordamından MessageBox çağırmayın, bunu ayrı bir iş parçacığından çağırmadığınız sürece, SCM'ye zamanında geri dönmeniz gerekir.

Etkileşimli Hizmet Kullanma

Varsayılan olarak, hizmetler etkileşimsiz bir pencere istasyonu kullanır ve kullanıcıyla etkileşim kuramaz. Ancak, etkileşimli bir hizmet bir kullanıcı arabirimi görüntüleyebilir ve kullanıcı girişi alabilir.

Dikkat

LocalSystem hesabı gibi yükseltilmiş bir güvenlik bağlamında çalışan hizmetler, etkileşimli masaüstünde bir pencere oluşturmamalıdır, çünkü etkileşimli masaüstünde çalışan diğer tüm uygulamalar bu pencereyle etkileşim kurabilir. Bu, hizmeti oturum açmış bir kullanıcının yürüttüğü tüm uygulamalar için kullanıma sunar. Ayrıca LocalSystem olarak çalışan hizmetler, OpenWindowStation veya GetThreadDesktopişlevinietkileşimli masaüstüne erişmemelidir.

 

Etkileşimli bir hizmet oluşturmak için, CreateService işlevini çağırırken aşağıdakileri yapın:

  1. hizmeti LocalSystem hesabıbağlamında çalıştırmak için lpServiceStartName parametresi için NULL belirtin.
  2. SERVICE_INTERACTIVE_PROCESS bayrağını belirtin.

Bir hizmetin etkileşimli hizmet olarak çalışıp çalışmadığını belirlemek için, pencere istasyonuna tanıtıcı almak için GetProcessWindowStationişlevini ve pencere istasyonunun WSF_VISIBLE özniteliğine sahip olup olmadığını test etmek için GetUserObjectInformationişlevini.

Ancak, aşağıdaki kayıt defteri anahtarının SERVICE_INTERACTIVE_PROCESS etkisini denetleyebilen NoInteractiveServices bir değer içerdiğini unutmayın:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows

NoInteractiveServices değeri varsayılan olarak 1'dir. Bu, SERVICE_INTERACTIVE_PROCESSolup olmadığına bakılmaksızın hiçbir hizmetin etkileşimli olarak çalışmasına izin verilmediği anlamına gelir. noInteractiveServices 0 olarak ayarlandığında, SERVICE_INTERACTIVE_PROCESS olan hizmetlerin etkileşimli olarak çalışmasına izin verilir.

Windows 7, Windows Server 2008 R2, Windows XP ve Windows Server 2003:NoInteractiveServices değeri varsayılan olarak 0'dır; bu da SERVICE_INTERACTIVE_PROCESS olan hizmetlerin etkileşimli olarak çalışmasına izin verildiği anlamına gelir. noInteractiveServices sıfır olmayan bir değere ayarlandığında, SERVICE_INTERACTIVE_PROCESSolup olmadığına bakılmaksızın, bundan sonra başlatılan hiçbir hizmetin etkileşimli olarak çalışmasına izin verilmez.

Önemli

Tüm hizmetler Terminal Hizmetleri oturumu 0'da çalışır. Bu nedenle, etkileşimli bir hizmet bir kullanıcı arabirimi görüntülerse, yalnızca oturum 0'a bağlanan kullanıcı tarafından görülebilir. Etkileşimli kullanıcının oturum 0'a bağlı olduğunu garanti etmenin bir yolu olmadığından, bir hizmeti Terminal Hizmetleri altında veya hızlı kullanıcı değiştirmeyi destekleyen bir sistemde etkileşimli bir hizmet olarak çalışacak şekilde yapılandırmayın (hızlı kullanıcı geçişi Terminal Hizmetleri kullanılarak uygulanır).