WPF应用程序未获得文件访问权限

WPF应用程序未获得文件访问权限,wpf,permissions,file-permissions,Wpf,Permissions,File Permissions,我有一个WPF应用程序,它在自己的安装目录中创建一些文本文件。然而,即使在UAC提示之后,windows vista和windows 7用户也经常会出现“文件访问失败”类型的错误。解决方案是在windows资源管理器中找到可执行文件,打开“文件属性”下的“兼容性”选项卡,并选中“以管理员身份运行”。这显然是一种糟糕的用户体验,但我不知道如何确保应用程序能够在不采取该步骤的情况下保护自己的这些权限。我不想绕过UAC提示。通常,.Net希望您将应用程序生成的文件放入用户的主目录或共享用户文件夹。看看

我有一个WPF应用程序,它在自己的安装目录中创建一些文本文件。然而,即使在UAC提示之后,windows vista和windows 7用户也经常会出现“文件访问失败”类型的错误。解决方案是在windows资源管理器中找到可执行文件,打开“文件属性”下的“兼容性”选项卡,并选中“以管理员身份运行”。这显然是一种糟糕的用户体验,但我不知道如何确保应用程序能够在不采取该步骤的情况下保护自己的这些权限。我不想绕过UAC提示。

通常,.Net希望您将应用程序生成的文件放入用户的主目录或共享用户文件夹。看看这个答案:
它涉及.Net配置文件,但您可以将其他文件放在那里。

您可以通过嵌入自定义清单(项目属性->构建->清单)强制应用程序以管理员权限启动(UAC仍将显示其对话框)

清单示例(
requestedExecutionLevel
part is importaint):



谢谢,但我不同意.net的观点。原因是文件位置将根据windows版本发生变化,这会造成一点支持噩梦,因为我的用户一直在创建和共享文件。将它们指向c:\program files\myapp\etc要比说“if xp then”容易得多,但您知道程序文件目录也不是固定的,不是吗?它随64/32位系统、语言等而变化。。。当然,安装目录本身也是可变的。但无论什么最适合你…:-)
<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0"
  xmlns="urn:schemas-microsoft-com:asm.v1"
  xmlns:asmv1="urn:schemas-microsoft-com:asm.v1"
  xmlns:asmv2="urn:schemas-microsoft-com:asm.v2"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <assemblyIdentity version="1.0.0.0" name="yourappname.app"/>
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
        <security>
            <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
                <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
            </requestedPrivileges>
        </security>
    </trustInfo>
    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
        <application>
            <!-- A list of all Windows versions that this application is designed to work with. Windows will automatically select the most compatible environment.-->
            <!-- If your application is designed to work with Windows 7, uncomment the following supportedOS node-->
            <!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>-->
        </application>
    </compatibility>
</asmv1:assembly>