允许访问权限写入Windows 7的程序文件
在可执行文件所在的安装目录中写入临时文件时,我的应用程序会抛出“拒绝访问”错误。 但是,它在Windows XP中运行得非常好。 如何在Windows 7中提供对Program Files目录的访问权限?
编辑:如何使程序要求用户提升权利? (即运行具有完全pipe理权限的程序)
你的程序不应该把临时文件(或其他任何东西)写到程序目录中。 任何程序都应该使用%TEMP%作为临时文件,%APPDATA%作为用户特定的应用程序数据。 从Windows 2000 / XP开始就是这样,所以你应该改变你的应用程序。
问题不在于Windows 7。
您可以要求提供appdata文件夹path:
string dir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
或TEMPpath
string dir = Path.GetTempPath()
您的程序必须使用pipe理权限运行。 您无法通过代码自动执行此操作,但您可以请求用户(在代码中)提升程序在运行时的权限。 有一个关于如何做到这一点的维基 。 或者,任何程序都可以以pipe理员身份运行,方法是右键单击其图标并单击“以pipe理员身份运行”。
但是,我不会build议这样做。 最好是使用这样的东西:
Environment.GetFolderPath(SpecialFolder.ApplicationData);
获取AppData文件夹path并为您的应用程序创build一个文件夹。 然后把临时文件放在那里。
我能想到的选项:
- 以完整pipe理权限运行整个应用程序。 使用UAC
- 运行一个subprocess作为完整的pipe理员只有那些需要访问的东西
- 在别处写入临时文件
在项目中添加新项目:应用程序清单并保存。
现在打开这个文件并寻找<requestExecutionLevel>
。 它必须设置为asInvoker
。
将其更改为highestAvailable
。 现在执行你的应用程序,会出现一个提示,要求许可。 点击yes
!
这就是所有:)现在你可以写入和读取system32或任何其他需要pipe理权限的文件
您可以通过sigcheckvalidation您的应用程序。
sigcheck.exe -m yourapp.exe
并在输出检查元素requestedExecutionLevel。
你不能让.Net应用程序提升它自己的权利。 这是不允许的。 你可以做的最好的是当你产卵另一个进程时指定提升的权利。 在这种情况下,你将有一个两阶段的应用程序启动。
第1阶段除了使用System.Diagnostics.ProcessStartInfo对象和Start()调用来准备一个提升的产卵。
第二阶段是应用程序在高架状态下运行。
如上所述,虽然,你很less想这样做。 你当然不想这样做,所以你可以写入%programfiles%的临时文件。 只有当您需要执行pipe理操作(如服务启动/停止等)时才使用此方法。将临时文件写入更好的位置,如其他答案中所述。
另一种方法是停止UAC然后重新启动它。 用下面的代码创build一个CMD文件;
Rem停止UAC%windir%\ System32 \ reg.exe添加HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Policies \ System / v EnableLUA / t REG_DWORD / d 0 / f rem强制重新启动ShutDown / R / F / T 30
您需要右键单击CMD文件并使用admin身份运行。 一旦你完成了你正在做的事情,用下面的代码重新启动UAC(这次不需要使用以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
使用此方法的不利方面是必须右键单击并使用作为pipe理员运行closuresUAC,您必须重新启动才能生效。
顺便说一句,有几个原因,你需要写入禁区…前两个想到的将是运行一个batch file来追加主机,以防止您的浏览器去恶意站点或复制许可证密钥在一个无声安装。
我认为有一个替代解决所有这些问题….做一个两级应用程序。 如上所述…
1)启动器将启动另一个主要应用程序使用的代码,如(VB)
Call ShellExecute(hwnd, "runas", App.Path & "\MainApp.exe", 0, 0, vbNormalFocus)
2)主要应用程序,这是写保护区,即Program Files文件夹
我已经成功地与Windows 7一起尝试
我也在开发一个具有在线更新function的应用程序。 但在Vista / W7中无法使用。
我同意其他人对微软政策和标准做法的看法。
但我的问题是.. 1)如何将更新应用于现有的应用程序,它可能总是保留在Program Files文件夹中。 2)可能有一些方法可以做到这一点,否则goolge更新,防病毒更新或任何软件更新工作?
我需要回答我的问题…..:o
Rajendra Khope教授(麻省理工学院,印度浦那)
如果你有这样的程序,只要将它安装在C:\
,而不是在程序文件。 我在安装Android SDK时遇到了很多问题。 我的问题解决了通过安装在C:\
。
我不同意这样的观点,如果要避免在Windows 7上以pipe理员身份运行应用程序,则最好将其他目录中的所有文件(例如,%APPDATA%)写入其中,只是无法避免。
将所有应用程序特定的数据(例如ini文件)保存在与应用程序(或子文件夹)相同的文件夹中,以便将数据全部加速到磁盘(%APPDATA%,registry以及谁知道还有其他地方) 。 这只是微软的简洁编程理念。 当然,你需要registry清理,磁盘清理,临时文件清理,而不是e +非常干净的做法 – 删除应用程序文件夹将删除所有应用程序特定的数据(exep用户数据,通常在我的文档中的某处) 。
在我的程序中,我更喜欢在应用程序目录中有ini文件,但是,我没有它们,只是因为我不能在那里(在Windows上)。
我正在处理一个将其数据正确保存到%APPDATA%的程序,但有时系统范围的设置会影响所有用户。 所以在这些情况下,它需要写入程序安装目录。
而据我现在看到,暂时不能写访问一个目录。 您只能以pipe理员身份运行整个应用程序(这应该是不可能的),或者不能保存该文件。 (全部或全部)
我猜,我只是写文件到%APPDATA%,并启动一个外部程序,将文件复制到安装文件夹,并有该程序需要pipe理员权限…愚蠢的想法,但似乎是唯一的实际解决scheme…
虽然M $“最佳实践”是不写数据到%programfiles%文件夹; 我有时候做 我不觉得写入临时文件到这样一个文件夹是明智的; 因为TEMP环境variables可能会指向一个漂亮,快速的RAM驱动器。
但是,我不喜欢将数据写入%APPDATA%。 如果窗口变得非常糟糕,以至于需要将其完全擦除并重新安装,或许将其重新安装到另一个驱动器上,那么几乎所有程序都可能会丢失所有设置。 我知道。 我做了很多次 如果它存储在%programfiles%中,1)如果我例如必须在另一个驱动器上重新安装Windows,它不会丢失,因为用户可以简单地从其目录运行该程序,2)它使其可移植,并且3)保持程序文件在一起。
通过让我的安装程序Inno Setup为我的INI文件创build一个空文件,并在[Files]部分给用户修改设置,我获得了写权限。 我现在可以随意写了。
创build一个名为“c:\ programs writable \”的文件夹并将其放在下面的应用程序将更为简单。 这样一个低c文件夹的丛林可以避免。
基本的权衡是安全性与易用性。 如果你知道你在做什么,你想成为你自己的电脑上的神。 如果你必须为当地的无政府主义社会维护健康的系统,你可能想要增加一些安全性。