C#编写和读取appsettings和日志文件的最佳实践(UAC Program Files x86)

时间:2013-06-01 11:58:53

标签: c# .net permissions settings

我有以下情况:

1。正在运行的Windows服务,用于收集应存储在中心位置的某些数据(文件)。要知道哪些文件必须存储,我希望有一个configuration.xml文件或类似的东西。还写了一些日志。

2. 使用小型Windows窗体应用程序,我希望能够更改该configuration.xml文件中的设置。

第一个问题:此论坛中的很多人建议使用AppData文件夹存储应用程序设置。但在我看来,我无法做到这一点,因为可能是另一个用户登录到计算机。 (不同的用户文件夹)并且每次都应将收集的文件存储在同一文件夹中,而不是存储在不同的用户文件夹中。

第二个问题:如果我尝试使用Program Files(x86)文件夹,即使用户是本地管理员组的成员,我也会收到权限被拒绝错误。

我见过许多正在做类似事情的应用程序,可以写入Program Files(x86)文件夹(例如:日志文件),而不会提示用户提升权限(清单)

任何想法如何运作?

ApplicationName:pop_consoleApp2.exe Manifest-fileName:pop_consoleApp2.exe.manifest

清单:

    <?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="pop_consoleApp2"
     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="highestAvailable"
          uiAccess="false"/>
      </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>

2 个答案:

答案 0 :(得分:1)

您可以使用通用应用程序数据文件夹(通常命名为“程序数据”,系统驱动器根目录下的隐藏文件夹)。它是一个无漫游用户独立的应用程序数据文件夹。它的位置在这个变量中给出:

System.Environment.SpecialFolder.CommonApplicationData

在那里,您可以为您的应用程序创建一个子文件夹。此外,您可以/应该在服务的设置时设置该文件夹的权限(E.G.服务帐户读/写,所有用户都读取访问权限)。

答案 1 :(得分:0)

您需要将app.manifest文件添加到项目中,以便向用户提供elevated permission -

默认情况下,如果您只是在项目中添加清单文件,您将在文件中看到以下行 -

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

level属性替换为highestAvailable -

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

有关详细信息,请参阅MSDN中的链接。