2010-02-22 73 views
3

我目前使用ShellExecute「open」在用戶的瀏覽器中打開一個URL,但在Win7和Vista中遇到了一些麻煩,因爲該程序作爲服務提升。以標準用戶打開默認瀏覽器(C++)

當ShellExecute打開瀏覽器時,它似乎讀取「本地管理員」配置文件而不是用戶的配置文件。例如,如果鍵盤上的用戶將Firefox作爲默認瀏覽器,則可能會打開IE(這是管理員的默認設置)。

我知道「runas」動詞可以用來提升,但是你怎麼做到的呢?有沒有辦法在服務的標準用戶桌面上的默認瀏覽器中打開URL?

+3

「有沒有辦法在服務的標準用戶桌面上的默認瀏覽器中打開URL?」服務通常應避免與桌面交互(可能沒有用戶登錄,它會打開安全漏洞等)。更好的設計通常是針對單獨的服務和桌面應用程序(運行隱藏),並使服務和桌面應用程序通信(例如,通過WCF)。然後桌面應用程序可以啓動瀏覽器 - 桌面應用程序將以用戶身份運行並使用其個人資料。 – itowlson 2010-02-22 02:52:54

回答

4

ShellExecute將在與您正在運行的進程相同的會話和相同用戶的上下文中執行該程序。

如果您想使用不同的會話或用戶令牌,則可以使用CreateProcessAsUser Win32 API。

有幾種方法獲取用戶令牌,例如,你可以調用Win32 API:

+0

CreateProcessAsUser()不允許您像ShellExectute()那樣傳遞URL。我試過ImpersonateLoggedOnUser,但沒有運氣。 – Disco 2010-02-23 14:33:16

+0

您可以傳遞URL的命令行參數,並執行所選的瀏覽器。如果你想要的話,你可以在註冊表中查看默認瀏覽器的內容。 – 2010-02-23 14:59:58

+0

你也可以嘗試與ShellExecute ImpersonateLoggedOnUser,我不是100%確定它是否會工作,雖然http://msdn.microsoft.com/en-us/library/aa378612(VS.85).aspx – 2010-02-23 16:36:40

2

一段時間的測試後,確定默認瀏覽器的最好辦法是:

注:奇怪,但它是真實的...... 這也沒什麼好說的,一個應用程序是默認的應用程序爲 某些文件類型或Web協議,如'http'。確定默認 網絡瀏覽器的重要性正是在開始菜單項中註冊的內容(請參閱下面的註冊表項)。因此,忘記所有HKCR \ http,HKCU \ Software \ Classes \ http,HKLM \ Software \ Classes \ http及其朋友。

  1. 從 「HKEY_CURRENT_USER \ SOFTWARE \客戶\ StartMenuInternet」
  2. 讀讀命令行從 「HKEY_LOCAL_MACHINE \ SOFTWARE \客戶\ StartMenuInternet \\殼\開放\命令」
  3. 截斷命令行之後」。 exe「

當然,您需要首先模仿登錄用戶。

如果此解決方案不起作用(如使用w2k),請使用http協議的處理程序。

要真正從服務啓動默認瀏覽器,我們使用登錄的用戶上下文中的服務中的額外進程。此過程啓動上述命令行(在平臺> = Vista上使用ShellExecute)。請確保使用與默認用戶相同的完整性級別(中等)(否則IE將無法使用,因爲它使用DDE)。

HTH。