2016-08-29 145 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

制作第二个下载程序的示例。 –