2009-12-17 58 views
2

我編寫了一些代碼來檢測用戶代理信息。這可以直接運行程序,但如果程序被服務調用,它不起作用。該服務無法知道當前的用戶文件夾路徑來抓取用戶的Firefox設置。該程序需要由服務運行...該服務如何獲得當前的用戶配置文件來實現這個功能?從服務中獲取當前UserProfile路徑

代碼示例:

public static string FIREFOX_PROXY_PATH = @"\APPLICATION DATA\MOZILLA\FIREFOX\"; 
public static string FIREFOX_PROXY_PROFILE_FILE_NAME = "PROFILES.INI"; 

string strProfPath = System.Environment.GetEnvironmentVariable("USERPROFILE") + FIREFOX_PROXY_PATH + FIREFOX_PROXY_PROFILE_FILE_NAME; 

當從桌面我得到這個運行(工程─文件中找到):
C:\\Users\\myusername\\APPLICATION DATA\\MOZILLA\\FIREFOX\\PROFILES.INI

當從一個服務,我得到這個(沒有─文件中運行未找到):
C:\\Profiles\\NetworkService\\APPLICATION DATA\\MOZILLA\\FIREFOX\\PROFILES.INI

注意名稱:myusername被替換我的實際用戶名

+0

該服務被設置爲「與桌面交互」撥打電話......我也只是遇到了這個可能的解決方案: 顯式地加載使用Win32「LoadUserProfile」 API用戶配置文件。請注意,您需要先爲用戶創建一個登錄會話(調用LogonUser),然後才能加載用戶的配置文件。 尚未測試 – mytwocents 2009-12-17 01:53:23

回答

1

該代碼實際上按照它應該工作的方式工作。爲了獲得您的配置文件,您需要修改運行該服務的帳戶。爲此,請轉到控制面板中的服務管理管理單元並右鍵單擊您的服務,單擊屬性,然後將服務運行的帳戶更改爲您自己的帳戶(位於登錄選項卡下)。

當然,在兩次閱讀您的問題後,您似乎確實想要獲取登錄用戶的配置文件路徑。如果是這樣的話,那麼我上面描述的將不起作用。您需要採用不同的策略來獲取當前登錄的用戶,然後獲取用戶配置文件的路徑。所有這些都可以在註冊表中找到。

WindowsIdentity類可以幫助,但你必須記住,在任何給定的時間,在Windows機器上,有可能不止一個用戶登錄。我說may因爲大多數用戶計算機,有通常只有一個活動用戶會話。但這並不意味着只有一個用戶的進程正在運行。所以,取決於你想要完成什麼,可能還有其他的事情需要考慮。

+0

這將被部署到多臺機器,您可以將它設置爲CurrentUserAccount?我擔心即使創建一個新帳戶來運行也不會爲當前用戶選擇代理設置。 – mytwocents 2009-12-17 01:55:53

+0

爲了回答你的問題,你必須考慮如何在Windows下運行服務。基本上,即使用戶沒有登錄到計算機上,服務也可以並最有可能啓動並運行。它是使用服務與普通Windows應用程序的優勢之一。因此,您無法真正將服務設置爲「當前用戶」運行,因爲這並不意味着什麼。另請參閱我在答覆中的最後一段。 – 2009-12-17 02:07:19