在VB.net中删除/下载新的.exe时拒绝访问

时间:2014-08-25 20:03:58

标签: vb.net uac unauthorizedaccessexcepti

我知道有很多类似的问题,但它们似乎与AppData有关。但是,我的路径是'C:\ Program Files(x86)\ Project \ My Product Name \ Database \ Project.exe'。尝试删除此说法时出现错误消息System.UnauthorizedAccessException: Access to the path 'C:\Program Files (x86)\Project\My Product Name\Database\Project.exe' is denied.这是因为您必须拥有管理员权限才能更改程序文件中的内容吗?如果是这样,我可以创建它,以便将其安装到库/文档或其他什么?如果需要额外信息 -

我正在使用Install Shield和Visual Studio 2013。

更新------------------------------------------- ----------

我试图删除它/替换文件的方式是:

我有“主表格”和“更新表格”。接下来发生的是,MainForm打开UpdaterForm然后自行关闭。像这样......

 Private Sub UpdateBtn_Click(sender As Object, e As EventArgs) Handles UpdateBtn.Click
    Updater.Show()
    Me.Close()
End Sub

然后在UpdaterForm中发生这种情况......

Private Sub UpdateBtn_Click(sender As Object, e As EventArgs) Handles UpdateBtn.Click
    Main_Menu.Close()
    Dim Web As New WebClient
    My.Computer.FileSystem.DeleteFile(Application.StartupPath & "/Project.exe")
    My.Computer.Network.DownloadFile("MYLINK", Application.StartupPath & "/Project.exe")
End Sub

但在My.Computer.FileSystem.DeleteFile(Application.StartupPath & "/Project.exe")上,它表示我没有编辑文件路径的权限。我认为这只是将其移动到其他地方或使其成为UpdaterForm具有权限的情况。

另外,我想知道的是,UpdaterForm是一个不同的.exe会更好吗?或者我可以保持不变吗?

如果您对Install Shield有很多了解,我可以使用升级路径,并选择旧的.msi文件吗?但我不确定如何更新等等。如果您对此有更多了解,请解释一下吗?

1 个答案:

答案 0 :(得分:0)

正如我在评论中提到的:我希望这是一个UAC问题。

我知道获得更高权限的方法是在应用程序清单文件中请求更高的执行级别(app.manifest - >单击显示项目的所有文件 - >展开我的项目)。在那里,你会发现一个看起来像这样的部分:

<security>
  <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
    <!-- UAC Manifest Options
        If you want to change the Windows User Account Control level replace the 
        requestedExecutionLevel node with one of the following.

    <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
    <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
    <requestedExecutionLevel  level="highestAvailable" uiAccess="false" />

        Specifying requestedExecutionLevel node will disable file and registry virtualization.
        If you want to utilize File and Registry Virtualization for backward 
        compatibility then delete the requestedExecutionLevel node.
    -->
    <requestedExecutionLevel level="asInvoker" uiAccess="false" />
  </requestedPrivileges>
  <applicationRequestMinimum>
    <PermissionSet Unrestricted="true" ID="Custom" SameSite="site" />
    <defaultAssemblyRequest permissionSetReference="Custom" />
  </applicationRequestMinimum>
</security>

您想将requestedExecutionLevel更改为requireAdministratorhighestAvailable

这个article at Code Project似乎有一个相当不错的演练。有人问过提升已经在Stack Overflow上运行的进程。这是不可能的,但这里有很好的信息和一些有用的链接。