2011-12-01 117 views
5

我創建了一個定義爲以管理員身份登錄的服務。
該服務執行系統(「net use Z:\ .../user:user password」)併成功完成。如果通過服務映射網絡驅動器不可用

如果我(以管理員身份)運行「淨使用」,我看到Z:確實已添加,但狀態不可用。

我嘗試添加ImpersonateLoggedOnUser到服務,但沒有幫助。

OS:Win XP的

我缺少什麼?

+0

http://www.ljcreate.com/support/faqs/answers.asp?ID=1254有幫助嗎? –

+0

添加「操作系統:Win XP」,所以不是真的,但謝謝。 –

+0

這可以通過各種(複雜的)方式來完成。一個是複製與其中一個交互式進程關聯的用戶令牌,然後調用CreateProcessAsUser。另一種方法是向NetUseAdd注入一個交互過程。但是,在交互式上下文中開始運行代碼幾乎肯定會更明智。重申維爾納的問題:你想做什麼? –

回答

5

ImpersonateLoggedOnUser不會模擬登錄會話從用戶令牌,只是安全上下文。但是,CreateProcessAsUser應該能夠在與指定用戶令牌關聯的登錄會話中創建一個新進程。

請注意,調用LogonUser的以獲取CreateProcessAsUser用戶令牌是行不通的,因爲這個令牌不會在同一個登錄會話的登錄用戶。你必須找到一個用戶的進程並複製它的令牌。

登錄會話沒有很好的記錄,但您真正需要知道的是,每次用戶通過身份驗證時都會創建一個不同的登錄會話,並且每個此類登錄會話都有一組不同的網絡驅動器映射。登錄會話與終端服務會話不同。

在Windows Vista及以上時,一個管理用戶登錄使用受限令牌和一個與提升的令牌相關的關聯創建兩個登錄會話。

您可以查找與使用GetTokenInformation函數與TokenStatistics選項令牌關聯的登錄會話。登錄會話由AuthenticationId LUID標識。

爲了做到這一點,您的服務需要先確定用戶何時登錄,等待與新會話相關的進程啓動,確保它不是升級進程,然後複製訪問令牌。

相反,您最好的選擇是將應用程序拆分爲兩個組件。一個組件將以用戶身份運行(您可能會使用Run鍵自動啓動該組件)並負責映射網絡驅動器。它可以通過命名管道或註冊表鍵與服務聯繫以獲取所需的任何信息。

3

Windows登錄管理員並使用登錄令牌啓動服務。如果您以交互方式登錄,Windows將爲您創建一個登錄標記。這兩個令牌彼此不相關。映射的設備映射爲一個會話/登錄令牌,因此如果服務映射設備,則在登錄會話中不會看到它。

+0

這解釋了這個問題,但它可以解決?我可以模擬交互式令牌嗎?我可以創建更多1次會話的映射嗎?任何類型的解決方法? –

+0

也許你可以告訴你想要達到什麼目的,爲什麼認爲該服務應該爲交互式登錄的用戶創建驅動器映射!? –

相關問題