2017-05-01 21 views
-1

我想創建一個服務,並執行以下操作:如何在啓動應用程序未記錄從服務用戶的桌面上,在Windows

  1. 登錄在與指定的用戶名的用戶/密碼
  2. 運行在步驟1的登錄用戶的桌面上的應用程序

注意:在步驟1之前,用戶未登錄。 (像合適的機器重新啓動後)

預期的結果是,用戶應該能夠看到在步驟2中推出應用程序的UI,如果用戶登錄到與用戶帳戶桌面步驟

登錄

我發現了這篇文章,但是這個代碼會在當前桌面上啓動應用程序(比方說,當前以userA身份登錄)。使用userB的用戶名/密碼,該應用程序仍然會在userA桌面上啓動,但使用userB的帳戶)。

https://support.microsoft.com/en-ca/help/165194/createprocessasuser-windowstations-and-desktops


請讓我知道什麼是實現我的目標的正確方法。

IDE:Windows上的Visual Studio 2015 C++。

+1

如果你知道用戶名/密碼有什麼問題?調用'LogonUser'然後'CreateProcessAsUser' – RbMm

+0

沒有辦法在尚不存在的桌面上運行應用程序。您的服務必須等待用戶登錄,然後啓動該應用程序。請注意,服務無需知道用戶的密碼。此外,在大多數情況下,服務不是最好的方式來做到這一點。 –

+0

這假設(錯誤地)爲用戶準確地存在一個桌面。問題在於,當用戶登錄時,會創建一個新的桌面,這將成爲第二臺桌面。它不會有預期的窗口。 – MSalters

回答

0

讓我回答我的問題。

底線是:

  • 我無法不登錄的用戶在桌面上通過編程的方式記錄啓動進程

原因:

  • 調用某些函數如LogOnUser,我可以登錄和訪問資源相關的t o用戶的帳戶。
  • 但是,登錄會話與用戶從登錄屏幕登錄時將創建的會話不同。
  • 由於安全原因,一旦進程啓動,我們無法將進程移至其他會話。因此,在用戶從登錄屏幕登錄後,UI將永遠無法在桌面上顯示。

替代解決方案:

  • 使用自動登錄
  • 重新設計的應用程序,以及分割UI和它的數據。因此,一個包含數據的進程可以作爲服務運行,UI可以稍後在桌面上啓動。

的Windows會話,窗口站和桌面是如何工作的詳細情況進行說明: https://brianbondy.com/blog/100/understanding-windows-at-a-deeper-level-sessions-window-stations-and-desktops

非常感謝您對哈里·約翰斯頓在評論詳細說明。

相關問題