2016-08-29 152 views
1

我想創建一個具有自我更新功能的應用程序。如何僅在需要時提升管理員權限vb.net

不幸的是,當我想點擊名爲「Update」的按鈕時,它會拋出一個錯誤消息:「Access Denied!」

這裏是我使用的代碼:

Public Sub versionfileUPDATE() 
    Try 
     If System.IO.File.Exists(My.Settings.telepitesihely & "/seemtahelperv1downloader.exe") Then 
      System.IO.File.Delete(My.Settings.telepitesihely & "/seemtahelperv1downloader.exe") 
      Threading.Thread.Sleep(500) 
      client.DownloadFileAsync(New Uri("https://dl.dropboxusercontent.com/s/azz6qundbe2rna1/SeeMta%20PK%20Generator%20V1.exe?dl=11"), My.Settings.telepitesihely & "/seemtahelperv1downloader.exe") 
     Else 
      client.DownloadFileAsync(New Uri("https://dl.dropboxusercontent.com/s/azz6qundbe2rna1/SeeMta%20PK%20Generator%20V1.exe?dl=1"), My.Settings.telepitesihely & "/seemtahelperv1downloader.exe") 
     End If 
    Catch ex As Exception 
     MsgBox(ex.Message) 
    End Try 
End Sub 

那麼,有沒有什麼解決方案需要管理員權限,當用戶點擊更新按鈕?

+0

如果當前正在運行的可執行文件將不能被刪除,因爲它將被文件系統鎖定。這可能是您收到錯誤的原因。 –

+0

我知道,它會在刪除文件之前關閉文件。 –

+0

運行'versionfileUPDATE()'的代碼在'seemtahelperv1downloader.exe'裏面,還是運行該代碼的不同程序? –

回答

3

進程必須在管理員令牌啓動時給予管理員令牌,否則他們永遠不會獲得管理員令牌。要使其「按需」工作的唯一方法是您必須製作第二個程序,該程序需要管理員權限才能執行下載,而不是其他任何操作,然後您的程序將啓動第二個程序並等待它完成。

然而,更好的方法是選擇一個不需要管理員權限來寫一個更好的保存位置,例如,你可以使用Environment.GetFolderPath找到用戶的LocalApplicationData文件夾(例如對於您將指向財產以後像C:\Users\Ntohing_Trolll\AppData\Local)並保存並從那裏的子文件夾運行exe。這就是像Chrome這樣的程序用於更新的方式,因此您不需要管理權限即可進行更新。

+0

一個什麼樣的例子? [查找用戶應用程序數據文件夾](https://msdn.microsoft.com/en-us/library/14tx8hby(v = vs.110).aspx?cs-save-lang = 1&cs-lang = vb#Anchor_3)或者製作第二個下載程序[總是以管理員身份運行](http://www.downloadinformer.com/2014/01/how-to-make-vbnet-application-always.html)? –

+0

在第一個鏈接中,您將使用'Environment.SpecialFolder.LocalApplicationData'而不是'Environment.SpecialFolder.System'作爲您的代碼 –

+0

製作第二個下載程序的示例。 –