2015-05-30 90 views
1

在我的Windows服務中,我試圖在交互式用戶登錄系統時執行一些特定操作。爲此,我跟蹤WTS_SESSION_LOGON通知。不幸的是,今天我發現該通知帶有競爭條件。與WTS_SESSION_LOGON通知競爭條件

例如,如果用戶帳戶被配置密碼,系統啓動後,我的服務啓動,由用戶輸入密碼的時候,我的服務能接收WTS_SESSION_LOGON並處理它就好了。

如果只有一個用戶帳戶沒有密碼,則會發生此問題。啓動後,系統自動登錄該用戶,但我的服務可能稍後啓動,因此它不會收到交互式用戶登錄的任何通知。

任何想法,如果有辦法解決這個問題?或者至少告訴用戶會話會自動登錄?

PS。 WTS_CONSOLE_CONNECT通知發生同樣的競爭情況。

回答

1

當你的服務啓動時,它可以使用WTSEnumerateSessions()找出哪些會話已經存在和他們的當前狀態(連接,主動/登錄等),然後是什麼在其HandlerEx回調處理後續WTS_SESSION_CHANGE通知之前。

+0

謝謝。但是,我如何區別於什麼時候有人停下來,然後在服務管理器中啓動我的服務?即使交互式用戶可能在幾天前​​登錄過,它也會產生相同的結果。 – c00000fd

+0

真的很重要嗎?當你的服務啓動時,它可以看到一個用戶是否已經登錄,如果是的話,做它需要做的事情,就好像它已經收到了'WTS_SESSION_LOGON'。如果您只能在新會話開始時執行您的操作,並擔心您的服務啓動得太晚,請將其配置爲儘早啓動,而不是稍後啓動。 –