绕过程序文件文件夹的Windows权限限制

我用C做了一个小应用程序。它执行一些文件操作,基本上search和更改一些文件名。 但是,如果在程序文件文件夹中的Win Vista / 7中使用该程序,则表示权限被拒绝。 有反正绕过这个吗?

另外,Java可以绕过这个吗?

Solutions Collecting From Web of "绕过程序文件文件夹的Windows权限限制"

如果文件权限可以被轻易绕过,那么文件权限就没有太多的意义。

如果你编写了一个直接访问磁盘块的内核驱动程序,你可以绕过它们,但是你需要成为一个管理员来安装内核驱动程序。

在一天结束时,“绕过”文件权限的唯一方法是以管理员身份运行程序。

不要绕过,使用“应用程序数据”目录。

程序文件旨在存储在应用程序运行期间不会更改的文件。 存储在那里的文件只能在安装/更新的时候更改。

应用程序运行期间要更改的文件(配置文件,设置等)应该存储在用户文件夹中的“应用程序数据”目录中。

获取路径使用SHGetFolderPath函数传递:
CSIDL_APPDATA – 获取当前用户的“应用程序数据”目录
CSIDL_COMMON_APPDATA – 获取所有用户的“应用程序数据”目录
(并且最终) CSIDL_LOCAL_APPDATA – 获取当前用户“本地应用程序数据”目录,该目录用于存储仅针对本地机器不能移动到其他机器的信息,与“应用程序数据”(也称为“漫游应用程序数据” )文件可以自由地从机器移动到机器(即在重新安装操作系统期间可以保留它们)。

如果您的应用程序确实需要更改Program Files目录,那么向用户请求权限是您应该执行的操作。 您可以为您的应用程序提供特殊清单,以便每次运行时都会尝试获取管理员权限。 您也可以即时获得权限。

如果你正在编写特定的应用程序,几乎不干扰操作系统,那么你可以创建一个服务(守护进程)。 每次服务启动时,都将获得服务注册期间给予的权限。 有关更多信息,请参阅MSDN上的“DLL,进程和线程 – >服务”

//编辑
你也可以很容易地在.NET中创建一个服务(C#是最合适的)。 服务应用程序可以与用其他语言编写的客户端应用程 但是要注册一项服务,您需要管理员权限。 有了这种应用程序,你必须考虑所有的安全问题。

有反正绕过这个吗?

你不应该这样做。 即使有办法,那也是一个安全漏洞,最终会被修复。

如果您的软件是从非管理员帐户运行,它应该正常运行,不应该尝试混淆系统文件夹(在程序文件中重命名文件就是这样 – 可能会损坏系统)。 这就是用户和管理员之间的权限和分离点 – 从用户帐户运行的程序不应该能够破坏或破坏系统文件,除非管理员允许。

因此,如果您因权限而无法重命名文件,请向用户报告“权限被拒绝”。 让用户处理情况。 默默地绕过权限(即使有可能)是非常危险的 – 最终一些不太明亮的用户会使用你的软件杀死系统,并责怪你的问题。

正如很多人所说, 你不应该试图绕过操作系统的限制

如果您的应用程序需要更改只有管理员可以更改的文件,则您的程序需要管理员权限。 现在,如果你想考虑这个,有一些有用的API来提升应用程序的权限。

例如,在Vista / Win7 / server2k8中, 您可以使用UAC 。 我并不是在这里引用特定的API,因为通过UAC有不同的提升或获得特权的方法。 一个重要的事情要注意的是,UAC 依靠用户交互来授予这个 ,这是一个积极的事情:-)

希望这会引导你和其他人朝着正确的方向前进。

如果你正在问自己,因为你只是想运行这个应用程序,你可以做很多事情。 首先,你可以关闭UAC,因为我们都同意这是一个坏主意。 但没有人列出你的其他选项:

  • 以管理员身份登录到您的计算机。 不是作为管理员组中的用户,而是作为管理员。 你启动的所有东西都会被提升。
  • 打开提升的命令提示符,并同意一次这样做。 现在,您从那里启动的所有内容都将在没有对话的情况下升级
  • 使用计划任务在某些特定情况下运行应用程序(每周二10或每次登录时),然后选中此框以使其运行。 您需要同意UAC一次设置,然后再次设置。

只要完全关闭UAC。 我有我的关闭,我没有任何安全问题,因为我非常小心,不执行各种程序,甚至下载任何可执行文件。

离题的答案,但我需要一个地方来保存这个,所以我可以稍后再找到它。

如果您需要使用特定的文件夹(如“程序文件”),但不想每次都需要UAC提示,则一种解决方法是取得该文件夹的所有权:

  1. 将以下内容复制/粘贴到新的文本文件中:
 takeown /F %1 icacls %1 /grant %username%:F /t /q 
  1. 将其保存为“letmewrite.bat”或其他。

  2. 打开几个资源管理器窗口,以便您可以看到要访问的文件夹和“letmewrite.bat”。

  3. 将您想要访问的文件夹拖到“letmewrite.bat”