允许访问权限写入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文件夹的丛林可以避免。

基本的权衡是安全性与易用性。 如果你知道你在做什么,你想成为你自己的电脑上的神。 如果你必须为当地的无政府主义社会维护健康的系统,你可能想要增加一些安全性。