2009-07-10 18 views
5

Hizmetin onstart() yönteminde belirtilen bir exe'yi başlatan basit bir windows hizmeti yazdım. Servisi başlattıktan sonra exe var sadece armağan içinde başlattı ama kaşif içinde görünmüyor.Windows Service'ten GUI Uygulamasını Başlatmak - Pencere Görünmüyor

Kodumdan bir calc.exe başlatmaya çalışıyorum.Anahtardaki exe'yi gösterir, ancak görüntüleyicide (yani) kaşifde görünmez. Aşağıda

Eğer bir uygulamayı başlatmak ne zaman göstermek için herhangi bir kullanıcı arabirimi öğelerini beklememelisiniz böylece

Process pr=new Process(); 
    pr.StartInfo.FileName="calc.exe"; 
    pr.StartInfo.WindowStyle=ProcessWindowStyle.Maximized; 
    pr.StartInfo.CreateNoWindow=false; 
    pr.Start(); 
// pr.WaitForExit(); 
+0

Ne bekliyorsunuz? Bunun yerine bir toplu iş dosyasını çalıştırmayı deneyin. –

+0

Ne tür bir exe başlatmaya çalışıyorsunuz? – abhilash

+0

Lütfen sorunuzu daha anlamlı bir şeye yeniden yazın. Bir soru listesi içinden geçerken pek bir şey söylemez ... – Hemant

cevap

1

Hizmetleri, tanımı gereği etkileşimli değildir onStart() yönteminde exe başlatmak için benim kodudur servis. Bu tasarım gereği var

...

4

Hizmetler farklı hesap ayrıcalıkları (LocalService/NetworkService vs) ve dolayısıyla bunlar masaüstünüze erişiminiz yoksa (sizin giriş hesabın kontrolü altında) altında çalıştırılır.

Hizmetler, işlerini sessizce yapmak ve bu nedenle ne yapmaları gerektiği anlamına gelir. (Windows olay günlüğünde bir şeyleri günlüğe kaydetme dışında önemli bir şeyleri olduğu zamanlar hariç)

+0

Ayrıca, Görev Yöneticisi varsayılan olarak sadece * giriş hesabınızın altında çalışan işlemleri gösterir. – MSalters

10

Hizmetler, diğer oturumda Vista'da veya sonrasında çalışır ve doğrudan hizmetlerden başlatılan uygulamalar varsayılan olarak aynı oturumda başlatılır. Diğer oturumlardaki uygulamaları başlatmak mümkündür - kullanıcı oturumunun kimliğini bulmanız ve CreateProcessAsUser uygulamasını kullanmanız gerekir.

Birden fazla kullanıcı oturum açtıysa ve programınızı tüm kullanıcılar için başlatmanız gerekiyorsa, tüm oturumların kimliklerini bulmanız gerekir.

İşte örnek kod:

gibi zaten bir windows hizmeti "normalde" ayrı bir hesaba ("LocalSystem" veya "NetworkService") altında çalışan diğerlerinden söz
int session = Win32.WTSGetActiveConsoleSessionId(); 
if (session == 0xFFFFFFFF) 
{ 
    return false; 
} 

IntPtr userToken; 
bool res = Win32.WTSQueryUserToken(session, out userToken); 
if (!res) 
{ 
    this.log.WriteEntry("Error WTSQueryUserToken"); 
    return false; 
} 

string path = GetPath(); 
string dir = Path.GetDirectoryName(path); 
Win32.STARTUPINFO si = new Win32.STARTUPINFO(); 
si.lpDesktop = "winsta0\\default"; 
si.cb = Marshal.SizeOf(si); 

Win32.PROCESS_INFORMATION pi = new Win32.PROCESS_INFORMATION(); 
Win32.SECURITY_ATTRIBUTES sa = new Win32.SECURITY_ATTRIBUTES(); 
sa.bInheritHandle = 0; 
sa.nLength = Marshal.SizeOf(sa); 
sa.lpSecurityDescriptor = IntPtr.Zero; 

if (!Win32.CreateProcessAsUser(userToken,  // user token 
           path,   // exexutable path 
           string.Empty, // arguments 
           ref sa,   // process security attributes (none) 
           ref sa,   // thread security attributes (none) 
           false,   // inherit handles? 
           0,    // creation flags 
           IntPtr.Zero, // environment variables 
           dir,   // current directory of the new process 
           ref si,   // startup info 
           out pi))  // receive process information in pi 
{ 
    int error = Marshal.GetLastWin32Error(); 
    this.log.WriteEntry("Error CreateProcessAsUser:" + error); 
    return false; 
} 
0

. Bu, hizmetiniz tarafından başlatılan programın kullanıcı arayüzünü görememenizin nedeni. Ayrıca hizmetlerin bir kullanıcı arabirimi olması amaçlanmamıştır, arka plan hizmeti olarak işlev görürler.

Ayrıca, bir uygulamanın bir hizmet tarafından başlatılmasının, uygulamanızın hizmetinize göre aynı ayrıcalıklarla çalıştığı için yüksek bir güvenlik riski oluşturabileceğini de unutmayın. Normalde bu yerel sistem hesabı olur.

Hizmetinizle ne elde etmeye çalıştığınızı bilmiyorum, ancak uygulamanızı çalıştırmak için bir hizmet yerine pencerelerin otomatik başlat işlevini kullanmayı düşünün.

3

Hizmetinizin özellikler penceresini açarsanız, Oturum Aç sekmesine gidin ve "Hizmetin masaüstüyle etkileşime girmesine izin ver" onay kutusunu işaretleyin, istediğiniz davranışı elde edersiniz. Ayrıca, hangi uygulamayı çalıştırmanız gerektiğine bağlı olarak, hesaptaki günlük kaydını değiştirmeniz gerekebilir.

+0

Ne yazık ki bu sadece servis hesabı için çalışıyor :( – Grzenio

İlgili konular