我的应用程序在可执行文件所在的安装目录中写入临时文件时会抛出“拒绝访问”错误。但是它在Windows XP中运行得非常好。如何在Windows 7中提供对Program Files目录的访问权限?
编辑: 如何让程序要求用户提升权利? (即运行具有完全管理员权限的程序)
答案 0 :(得分:87)
您的程序不应将临时文件(或其他任何内容)写入程序目录。任何程序都应将%TEMP%用于临时文件,将%APPDATA%用于特定于用户的应用程序数据。从Windows 2000 / XP开始就是这样,所以你应该改变你的应用程序。
问题不在于Windows 7.
您可以要求提供appdata文件夹路径:
string dir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
或TEMP路径
string dir = Path.GetTempPath()
答案 1 :(得分:27)
您的程序必须使用管理权限运行。您无法使用代码自动执行此操作,但您可以请求用户(在代码中)在程序运行时提升程序的权限。关于如何做到这一点有一个wiki。或者,任何程序都可以作为管理员运行,方法是右键单击其图标并单击“以管理员身份运行”。
但是,我不建议这样做。最好使用这样的东西:
Environment.GetFolderPath(SpecialFolder.ApplicationData);
获取AppData文件夹路径并为您的应用创建一个文件夹。然后将临时文件放在那里。
答案 2 :(得分:11)
我能想到的选项:
答案 3 :(得分:7)
在项目中添加新项目:Application Manifest并保存。
现在打开此文件并查找<requestExecutionLevel>
。必须将其设置为asInvoker
。
将其更改为highestAvailable
。现在,在执行您的应用程序时,将出现一个要求许可的提示。点击yes
!
多数人:)现在您可以从system32或任何其他需要管理员权限的文件中进行编写和读取
您可以sigcheck验证您的申请。
sigcheck.exe -m yourapp.exe
在输出检查元素requestedExecutionLevel。
答案 4 :(得分:3)
您不能使.Net应用程序提升自己的权限。这根本不允许。您可以做的最好的事情是在生成另一个进程时指定提升的权限。在这种情况下,您将启动两阶段应用程序。
第1阶段除了使用System.Diagnostics.ProcessStartInfo对象和Start()调用准备升高的spawn之外什么都不做。
第2阶段是应用程序在升级状态下运行。
如上所述,你很少想要这样做。你肯定不想这样做,所以你可以将临时文件写入%programfiles%。仅当您需要执行管理操作(如服务启动/停止等)时才使用此方法。将临时文件写入更好的位置,如此处的其他答案所示。
答案 5 :(得分:3)
另一种方法是停止UAC然后重新启动它。使用以下代码创建CMD文件;
Rem停止UAC %windir%\ System32 \ reg.exe添加HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Policies \ System / v EnableLUA / t REG_DWORD / d 0 / f rem force reboot 启动ShutDown / R / F / T 30
您需要右键单击CMD文件并使用run as admin。一旦你完成了你正在做的事情,用以下代码重新启动UAC(这次不需要使用run as admin);
%windir%\ System32 \ reg.exe添加HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Policies \ System / v EnableLUA / t REG_DWORD / d 1 / f
rem force reboot 启动ShutDown / R / F / T 30
使用此方法的缺点是必须右键单击并使用以管理员身份运行以关闭UAC,您必须重新启动才能使其生效。
BTW有几个原因你需要写入禁区...前两个想到的是运行一个批处理文件来追加主机以防止你的浏览器进入狡猾的网站或复制许可证静默安装中的密钥。答案 6 :(得分:3)
您可以为要在其中写入或重写的网站或Web应用程序文件夹添加对IIS用户的访问权限。
答案 7 :(得分:2)
我不同意这些论点,如果你想避免在Windows 7上以管理员身份运行应用程序,那么最好将所有文件写在其他目录中,例如%APPDATA%,它只是你无法避免它。 / p>
将所有应用程序特定数据(例如ini文件)保存在与应用程序(或子文件夹)相同的文件夹中以加快整个磁盘上的数据(%APPDATA%,注册表和谁知道)会更清晰还有哪里)。这只是微软干净编程的想法。当然,你需要注册表清理,磁盘清理,临时文件清理,...而不是e +非常干净的做法 - 删除应用程序文件夹删除所有应用程序特定数据(exep用户数据,通常在我的文档中的某处等)
在我的程序中,我更喜欢将ini文件放在应用程序目录中,但是,我没有它们,只是因为我不能在那里(在Windows上)。
答案 8 :(得分:1)
我认为所有这些问题都有另一种解决方案.... 制作两级应用程序。如上所述...
1)启动器将使用诸如(VB)
之类的代码启动另一个主应用程序Call ShellExecute(hwnd, "runas", App.Path & "\MainApp.exe", 0, 0, vbNormalFocus)
2)主应用程序,写入保护区,即Program Files文件夹
我已成功尝试使用Windows 7
我也在开发一款具有在线更新功能的应用。但它在Vista / W7中不起作用。
我同意其他人的有关Microsoft政策和标准惯例的信息。
但我的问题是...... 1)如何将更新应用于现有应用程序,该应用程序可能始终保留在Program Files文件夹中。 2)可能有一些方法可以做到这一点,否则goolge更新程序,防病毒更新程序或任何软件更新程序如何工作?
我需要回答我的问题.....:o
教授。拉金德拉霍普 (麻省理工学院,印度浦那)
答案 9 :(得分:1)
如果您有这样的程序,只需将其安装在C:\
中,而不是安装在Program Files中。我在安装Android SDK时遇到了很多问题。我的问题通过在C:\
中安装来解决。
答案 10 :(得分:1)
虽然M $“最佳做法”是不将数据写入%programfiles%文件夹;我有时会这样做。我认为将临时文件写入这样的文件夹并不明智;因为TEMP环境变量可能是例如指向一个漂亮,快速的RAM驱动器。
我不喜欢将数据写入%APPDATA%。如果窗户变得非常混乱,那么需要例如擦除它并完全重新安装,也许到不同的驱动器,您可能会丢失几乎所有程序的所有设置。我知道。我做过很多次了。如果它存储在%programfiles%中,1)它不会丢失,如果我必须在另一个驱动器上重新安装Windows,因为用户只需从其目录中运行程序,2)它使其可移植,并且3)将程序及其数据文件保存在一起。
我通过让我的安装程序Inno Setup为我的INI文件创建一个空文件,并在[Files]部分为其提供了用户修改设置,从而获得了写访问权限。我现在可以随意写。
答案 11 :(得分:1)
我一直在寻找答案。我发现只有一个。
这些都不适合我。我不是在尝试编写临时文件,除非将其定义为非系统文件。虽然我在我的用户配置文件中指定了admin,并且在UAC中指示了完全管理员权限,但我无法写入程序文件或窗口。这非常恼人。
我尝试将在线发现的图像直接保存到windows / web / wallpaper文件夹中,它不会让我。相反,我必须将它保存到我的桌面(我拒绝导航到“我的文档/图片/等”,因为我拒绝使用这些文件夹,我有自己的目录树谢谢)然后,从桌面上剪切并粘贴它到windows / web / wallpaper文件夹。你告诉我我应该这样做并微笑?作为管理员用户,我应该能够直接保存到其目标文件夹。我在驱动器属性/安全性和目录属性/安全性方面的权限说我可以写,但我不能。不要编程文件,程序文件(86)和窗口。
如何在Program Files(86)(游戏名称)文件夹中保存我刚为游戏修改过的文件。它不会让我。我打开文件来修改它,我无法保存它,无需先将其保存到桌面等,或者打开用于首先修改文件的程序作为管理员,这意味着首先导航到另一个我存储那些用户mod程序的目录树的一部分,然后在程序中选择打开文件并再次导航到我刚刚点击的文件,从我的项目文件夹中首先修改,只发现这赢了不管怎么办!它保存文件,但无法找到该文件。它在那里,但看不见。唯一的解决方案是如上所述保存到桌面。
我不应该以管理员用户身份完成所有这些操作。但是,如果我使用真正的管理员帐户一切正常。但我不想使用真正的管理员帐户。我想使用具有管理员权限的用户帐户。它说我有管理员权限,但我没有。
最后,我拒绝将我的便携式电脑存放在%appdata%中。这不是我希望浏览目录树的方式。我用作便携式设备的个人设备存储在我创建的目录中作为导航首选项。
所以,这是我发现的经过验证的真实答案:
从我到目前为止看到的......除非使用真正的管理员帐户,否则这些权限在Windows Vista和Windows 7操作系统中具有管理员权限的任何其他用户都无法真正使用。虽然在Windows XP中设置管理员权限很简单,但是后来的版本已经为所有人提供了这一权限,但是那些可以轻松破解的人。
答案 12 :(得分:0)
我正在开发一个将数据正确保存到%APPDATA%的程序,但有时,系统范围的设置会影响所有用户。所以在这些情况下,它必须写入程序安装目录。
就我现在所读到的而言,临时获取一个目录的写访问权是不可能的。您只能以管理员身份运行整个应用程序(这应该是不可能的)或者无法保存该文件。 (全有或全无)
我想,我只是将文件写入%APPDATA%并启动一个外部程序,将文件复制到安装文件夹中并拥有该程序需要管理员权限...愚蠢的想法,但似乎是唯一实用的解决方案...
答案 13 :(得分:-4)
创建一个名为“c:\ programs writable \”的文件夹并将你的应用程序放在那个文件夹下面会更简洁。这样就可以避免低c文件夹的丛林。
潜在的权衡取决于安全性与易用性。如果你知道你在做什么,你想成为自己的PC上帝。如果你必须为当地的无政府主义社会维护健康的系统,你可能想要增加一些安全性。