从c#读取文件需要时提示UAC

时间:2013-10-03 17:26:47

标签: c# uac

当我用二进制阅读器阅读文件时:

using (FileStream FilStr = new FileStream(MainPreferenceModel.Instance.PrintHeader.CompanyLogoFilePath, FileMode.Open))
{
    using (BinaryReader BinRed = new BinaryReader(FilStr))
    {
        HeaderFooterReportModel.Logo = BinRed.ReadBytes((int)BinRed.BaseStream.Length);
        BinRed.Close();
    }
    FilStr.Close();
}

没关系,但打开文件时,例如 C:\ logo.jpg 它抛出异常。 是否可以获取UAC提示只读取此文件? -user使用FileOpenDialog获取路径。

我找到了如何在启动时以管理员身份运行程序的方式,但有没有办法如何在这样的路径上访问文件?我可以通过运行命令将该文件复制到其他路径作为管理员,但它不是解决方案。

感谢您的回复

3 个答案:

答案 0 :(得分:3)

  using (FileStream FilStr = new FileStream(path, FileMode.Open))

这里真正的问题是您对文件的访问权限不够具体。你编写它的方式,你把它留给FileStream来选择文件访问。它将选择FileAccess.ReadWrite。您不会在C:\目录中获取它,它在没有UAC提升的情况下受到写访问保护。你不需要它,你只是从文件中读取。

修正:

  using (FileStream FilStr = new FileStream(path, FileMode.Open, FileAccess.Read))

答案 1 :(得分:1)

仅在流程启动时执行提升。因此,在过程的生命周期中无法提升。你必须在启动时一劳永逸地做出决定。

应用程序通常执行的操作是启动新进程以执行需要提升的特定任务。您可以启动应用程序传递命令行参数的新实例,并使用runas动词请求提升。或者,您可以使用提升的进程外COM服务器来完成工作。前者设置得更快,但后者更清晰。

答案 2 :(得分:0)

您必须创建/修改应用程序清单,就像在此Microsoft示例中一样(对于名为IsUserAdmin.exe的程序集):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
  <assemblyIdentity version="1.0.0.0"
     processorArchitecture="X86"
     name="IsUserAdmin"
     type="win32"/> 
  <description>Description of your application</description> 
  <!-- Identify the application security requirements. -->
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel
          level="requireAdministrator"
          uiAccess="false"/>
        </requestedPrivileges>
       </security>
  </trustInfo>
</assembly>

更多信息: 的 http://msdn.microsoft.com/en-us/library/bb756929.aspx