2011-04-27 104 views
3

如果我調用函數WNetGetUniversalName()從當前會話中映射的驅動器獲取UNC路徑,則該函數將成功。從模擬後的映射驅動器號獲取UNC路徑

但是......

  • 如果我創建通過調用LogonUser()一個新的登錄sesssion(登錄用戶是作爲創造者的過程相同)
  • 模擬與登錄用戶通過調用函數ImpersonateLoggedOnUser()
  • 並再次調用WNetGetUniversalName(),該函數返回錯誤2250(ERROR_NOT_CONNECTED

的事情是I S應該將這個過程作爲服務運行(在SYSTEM帳戶中),因此我可能需要模擬用戶以獲取該用戶的映射驅動器和關聯的網絡路徑。正如我檢查,信息不能跨用戶會話訪問。

Windows在哪裏存儲此信息,以便在用戶重新登錄時重新映射驅動器?我發現映射的網絡路徑歷史記錄保存在註冊表下的關鍵字HKEY_USERS\<User SID>\Software\Microsoft\Windows\CurrentVersion\Explorer\Map Network Drive MRU中,但它並不表示在用戶登錄時是否映射UNC路徑以及關聯的驅動器號。

請幫忙。

+0

有沒有一個地方Windows存儲此信息,這取決於您的網絡設置。 驅動器通常通過組策略或通過登錄腳本進行映射。 – gnud 2011-04-27 08:26:12

回答

0

如果我記得正確,我相信這些驅動器映射存儲在登錄會話中。由於LogonUser()創建一個新的登錄會話,它不會有驅動器映射;您必須使用帶有現有令牌的ImpersonateLoggedOnUser()。

+0

謝謝盧克。正如我所說的,這個過程將作爲服務運行(在SYSTEM帳戶中),用戶不能登錄。每當用戶映射網絡驅動器時,都會有一個選項「登錄時重新連接」。所以Windows必須保存這個信息以便下次登錄。或許,這個解決方案根本不需要冒充。我仍在尋找答案。 – 2011-04-29 06:35:36

+0

如果用戶未登錄,則他們的個人資料將不會被加載。你可以明確地加載它,但這是不好的做法,因爲在加載它時嘗試登錄將會產生不好的結果。 – Luke 2011-04-29 14:47:07