當前位置:
首頁 > 最新 > 經驗:解決Inno Setup 和一些應用程序在Windows 中不能訪問UNC路徑的問題

經驗:解決Inno Setup 和一些應用程序在Windows 中不能訪問UNC路徑的問題

導語

在設計Windows 的應用時,會間接地或者直接地需要訪問本地網路資源,本地網路資源當然通過IP和埠來配合服務來訪問,或者簡單地使用UNC路徑來訪問。為了保證應用程序能夠毫無障礙地訪問本地網路資源,就要在代碼中完善對上述兩種方式的支持,假如應用選擇第二種,在Windows Vista 之後的版本(Win7和Win 8 以及最新的Win10)有可能就會遇見自己應用不能訪問UNC路徑,或者嘗試訪問就會報錯的問題。即便選擇點擊滑鼠右鍵然後選擇"以管理員許可權運行"運行應用也不行,如圖。

為什麼會出現類似的問題?怎麼才能解決這個問題?這是我在使用Inno Setup 設計軟體安裝包時遇到該難題時思考過的問題。

原因

在查找資料和閱讀網上貼子之後終於找到了癥結所在。Mircosoft文檔名為"Some programs Cannot Access Network Location When UAC is Enabled"中比較詳細描述了出現該問題的原因和解決方案。

該問題的癥結在於UAC。UAC 就是用戶賬戶控制。該問題之所以會發生是因為開啟UAC之後,用戶賬戶控制組件會將管理員組的用戶視為普通用戶進行處理。

當一個管理員成員登陸到Windows Vista或者更新Windows版本時,並且UAC處於開啟狀態,該成員將被視為一個普通用戶,普通用戶,在Windows中屬於Users 組而非Administrators組。這時候如果你該成員如果執行一個任務,該任務又需要管理員的訪問令牌Token的時候。用戶賬戶管理組件就會準備一個對話窗口(User Account Control dialog 如下)來詢問你,提示你請求批准該任務的執行。例如在你執行一些安裝程序時,在程序啟動時就會遇見一個對話用於尋求使用管理員令牌來執行該安裝。

當一個管理員登陸到Windows Vista或者更新Windows版本時。當本地安全機制意識到該用戶是管理員組的成員時,本地安全機制 (Local Security Authority)會同時創建兩個訪問令牌。首先會創建一個具有完全管理員許可權的令牌,和一個刪除了部分管理員的許可權的訪問令牌,其中第二個被用於啟動用戶桌面。所以在運行一個應用程序時,在出現對話框時點擊YES。應用程序就可以完全使用管理員的訪問令牌(第一個)。

當一個用戶登陸到Windows Vista或者更新Windows版本時,而且安全機制已開啟。一個應用可以使用一個限制過的訪問令牌(即第一個)而且允許同時使用一個帶有管理員許可權的訪問令牌(即第二個)。因為本地訪問機制創建令牌是使用了單獨的會話,而且每個訪問令牌有自己單獨的ID。而映射網路共享內容時,網路共享內容只被映射到那個被限制過的訪問令牌(即第二個)上,而沒有映射到那個具有管理員許可權的(即第一個)訪問令牌,所以就會出現問題。

解決方法一

如果是要在CMD命令行中使用UNC路徑,就可以以管理員的身份啟動CMD之後鍵入以用於創建一個空鏈接:

或者,將UNC路徑映射到本地I盤,命令如下:

然後就可以使用該網路資源了。

解決方法二

作為應用的使用者,非開發人員,可以自己或者請求管理員(如果沒有許可權),可以在註冊表中添加一個名為 "EnableLinkedConnections"的鍵值來一勞永逸地解決這個問題(添加後需要重新啟動)。需要注意的是修改註冊還是具有風險的,操作時候要謹慎,步驟如下。

1. 點擊桌面,然後輸入Win + R 組合鍵,在跳出的對話框中鍵入regedit,用於啟動註冊表。

2. 然後定位到HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionPoliciesSystem的位置。

3. 然後單擊右鍵,選擇添加(New),進而選擇DWORD Value。

4. 然後鍵入EnableLinkedConnections,如圖。

5.右鍵單擊新添加的鍵,選擇修改(Modify),如圖將值修改為1。

6.保存並重新啟動。

解決方法三

該解決方案主要在用於設計或者使用安裝程序的時候,在設計安裝程序時,需要在設置[Setup]添加配置參數:"AllowNetworkDrive=yes"。而在運行安裝程序是,如果單擊Browse按鈕,在文件路徑對話框中還是沒有映射的網路資源。所以,不能單擊Browse按鈕,要在文本框中手動輸入UNC路徑,然後單擊下一步(Next)按鈕,安裝程序就獲得了UNC路徑,並能夠訪問該路徑。

對於一些特殊的安裝程序設計,例如安裝程序文件的安裝路徑大部分用到UNC路徑,並且沒有對C盤程序Program 文件的讀寫需要,就可以在iss文件中將配置參數設置為"Privilegesrequired=lowest",就可以在安裝過程中,單擊Browse按鈕然後選擇UNC路徑。

總結

總的來說,該問題沒有最優解,但是上述的內容想必會在遇到問題中提供一點不一樣的思路。也能讓人儘快地從困境出來,進而能夠有時間在解決問題之後從新思考這個問題。或者大家有不一樣的解決方案,希望能夠留言與人分享。

請長按下方的二維碼訂閱我的個人微信公眾號。原創不易,多多點贊分享支持。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 洛琳de筆記 的精彩文章:

TAG:洛琳de筆記 |