2010-04-06 90 views
2

我有一個在「SYSTEM」帳戶下運行的windows服務,它檢查每個登錄用戶是否運行特定的應用程序。如果應用程序沒有運行,服務將啓動它(在相應的用戶名下)。
我試圖用CreateProcessAsUser()完成我的目標。該服務確實在相應的用戶名下啓動應用程序,但未繪製GUI。 (是的,我確保啓用「允許服務與桌面交互」複選框)。CreateProcessAsUser不繪製GUI

系統:XP SP3,語言:C#

下面是一些代碼,您可能會感興趣:

PROCESS_INFORMATION processInfo = new PROCESS_INFORMATION(); 
startInfo.cb = Marshal.SizeOf(startInfo); 
startInfo.lpDesktop = "winsta0\\default"; 
bResult = Win32.CreateProcessAsUser(hToken, null, strCommand, IntPtr.Zero, IntPtr.Zero, false, 0, IntPtr.Zero, null, ref startInfo, out processInfo); 

據我瞭解,設置startInfo.lpDesktop = 「winsta0 \默認」;應該使用了相應用戶的桌面。
即使與此處所述的內容相反:http://support.microsoft.com/kb/165194,我嘗試將lpDesktop設置爲null,或者根本不設置它,兩者都給出相同的結果:進程是以預期用戶的名義啓動的,我可以看到窗口標題的一部分酒吧。 「不可見」窗口攔截鼠標點擊事件,按預期處理它們。它只是不吸引自己。

是否有人熟悉這樣的問題,並知道我做錯了什麼?

+0

我面臨同樣的問題,您是否能夠找到解決方案? – 2011-01-30 21:55:30

回答

1

MSDN對如何創建一個進程作爲另一個用戶在窗口站和桌面對象設置明確的權限樣本:

CreateProcessAsUser() windowstations and desktops

您可以將代碼移植到C#使用P/Invoke或者你可以使用C++/CLI程序集。

但是,請注意,您的方案不受支持,並可能會與Vista(和Windows 7)衝突Session-0 isolation(下載白皮書的右側)。