2012-05-27 52 views
3

我想從服務的Windows 7登錄屏幕上運行應用程序。在Win7登錄屏幕上運行應用程序

我一直在做這方面的長期研究,並嘗試不同的方式,但不幸的是迄今爲止還沒有完全成功。我設法在當前登錄的用戶的鎖定屏幕上運行應用程序 - 最初看起來我是基本上試圖實現的。但是,然後我意識到每個用戶和一個普通用戶都有不同的登錄屏幕(與用戶無關)。

我的猜測是,這個用戶獨立的登錄屏幕(當多個帳戶可用時或在鎖定屏幕上單擊「切換用戶」時會直接出現)在會話0中運行,而用戶1在會話1中運行,會話2中的用戶2等等。問題是如果我在會話0中運行應用程序(「winsta0 \ winlogon」),它不可見;在會話1中運行正常,但不會有太大的幫助,因爲用戶必須已經登錄。

那麼如何在用戶獨立登錄/歡迎屏幕上運行應用程序?什麼是這個目的的正確參數和功能?有沒有人有示範的工作示例? (德爾福是首選,但實際上任何其他語言也會這樣做!)

+0

您是否使用[憑證提供程序](http://msdn.microsoft.com/zh-cn/magazine/cc163489.aspx)和[ICredentialProviderCredential](http://msdn.microsoft.com/zh-cn/ us/library/windows/desktop/bb776029%28v = vs.85%29.aspx)和[ICredentialProvider](http://msdn.microsoft.com/en-us/library/windows/desktop/bb776042%28v=vs .85%29.aspx)接口? – RRUZ

回答

1

唯一受支持的方法是按照RRUZ的評論實施憑證提供程序。

如果您不介意違反規則,則作爲本地系統運行的服務應該能夠在您選擇的會話中啓動子進程。使用OpenProcessToken獲取安全令牌的句柄,使用DuplicateTokenEx複製它,使用SetTokenInformation更改令牌會話標識符,然後調用CreateProcessAsUser啓動子流程。 (最初,使用單獨的可執行文件是最簡單的,但是一旦你解決了錯誤,你可以將服務和子進程推送到單個可執行文件中,例如通過使用命令行參數或環境變量來區分這兩種情況。)

WTSGetActiveConsoleSessionId函數會告訴你哪個會話當前連接到物理控制檯。

+0

問題是,WTSGetActiveConsoleSessionId似乎只能與登錄的用戶一起使用。我根本無法設法訪問'切換用戶'屏幕,因爲這不屬於任何用戶。我可以在「鎖定」屏幕上放置某些東西,但不能放在「切換用戶」屏幕上。 另外:「打破規則」是什麼意思? – CodeX

+0

我相信在剛剛重新啓動的系統上,登錄屏幕將在會話1中運行。無論如何,您可以檢查:遠程運行tasklist與目標系統,並查找包含winlogon進程的會話。所以你可以嘗試在本次會議中啓動一個流程,作爲概念驗證。一旦你有了排序,你可以擔心如何找出在一般情況下使用哪個會話。當然,這個過程必須將自己連接到正確的桌面和/或窗口站;這應該與您在鎖定桌面上顯示內容所做的工作非常相似。 –

+0

通過「打破規則」,我的意思是說。除了通過實施憑證提供程序,您不應在登錄屏幕上顯示內容。這樣做幾乎是可以的,但不能保證相同的代碼在未來版本的操作系統中將繼續工作。即使安裝未來的修補程序也可能會使其停止工作,儘管這種情況不太可能。 –

相關問題