簡體   English   中英

對Program Files文件夾的寫訪問權限

[英]Write Access to Program Files folder

我的應用程序包含一個用於更新應用程序的自我更新程序可執行文件。

更新程序執行的第一步之一是檢查它是否對應用程序文件夾具有寫權限

IPermission perm = new FileIOPermission(FileIOPermissionAccess.AllAccess, _localApplicationCodebase);

  if (!SecurityManager.IsGranted(perm)) { OnProgressChanged("Security Permission Not Granted \\n The updater does not have read/write access to the application's files (" + _localApplicationCodebase + ")",MessageTypes.Error); return false; } OnProgressChanged("Updater have read/write access to local application files at " + _localApplicationCodebase); return true; 

在Win7 / Vista下執行時,此代碼通過(根據CAS的說法,該代碼確實具有寫訪問權),但是當我嘗試寫文件時,我獲得了“訪問被拒絕”(並且我確認文件未在使用中)

我了解Vista / Win7 UAC阻止用戶寫入程序文件文件夾中的文件。 但是,我不明白的是為什么在實際上不授予許可的情況下授予許可

問候,

埃里克·吉拉德

PS:如果我使用“以管理員身份運行”運行相同的代碼,則可以正常運行

有關UAC的重要信息是,默認情況下, 沒有代碼以管理員權限運行,因此無法寫入Program Files目錄。 即使您以管理員身份登錄,應用程序也將以標准用戶權限啟動。

有兩種解決方法。 您可以讓用戶使用“以管理員身份運行”菜單項啟動應用程序。 但這依賴於用戶記住一些東西。 更好的方法是將清單嵌入到您的可執行文件中,以請求管理員特權。 在清單中,將requestedExecutionLevel設置為requireAdministrator。 應用程序啟動后,這將導致UAC提示用戶輸入管理員憑據。

正如Daniel所說,最好的解決方案是將更新功能放在單獨的應用程序中。 您的主應用程序將具有一個清單,該清單將所請求的ExecutionLevel設置為“ asInvoker”,而更新器應用程序將其請求設置為“ requireAdministrator”。 您的主應用程序可以標准權限運行。 但是,當需要進行更新時,請使用Process.Start啟動需要用戶輸入管理員憑據的更新程序應用程序。

編寫自動更新程序的最佳方法是擁有輔助應用程序。 第一個程序以提升的特權調用第二個程序,提示UAC。 然后,第二個應用程序可以安裝補丁。

我不確定這是否是您要嘗試的操作,但是我發現這篇文章很有幫助。 隨附的代碼可讓您檢測您的應用程序是否在Vista上運行,是否啟用了UAC以及是否提升了用戶。

http://www.itwriting.com/blog/198-c-code-to-detect-uac-elevation-on-vista.html

然后使用runas重新啟動您的應用,以允許用戶提升權限

ProcessStartInfo processInfo = new ProcessStartInfo();
processInfo.Verb = "runas";
processInfo.FileName = Application.ExecutablePath;
Process.Start(processInfo);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM