2010-07-02 92 views
1

我用C做了一个小应用程序。它执行一些文件操作,基本上搜索和更改一些文件名。但是,如果它在程序文件文件夹中的Win Vista/7中使用,该程序会拒绝许可。无论如何绕过这个?绕过程序文件文件夹的Windows权限限制

另外,Java可以绕过吗?

+1

询问如何绕过安全限制的文件夹是让我的downvote的最快方式。哎呀,如果你的应用程序运行良好,你应该与系统一起玩,而不是与之竞争,并且如果ACL要被绕过,它们根本就不会被创建。 – 2010-07-03 09:16:42

+0

我对此感到抱歉,但这不是我的意思。 我想绕过的是即使你在管理员帐户中也需要“以管理员身份运行”。 你看,UAC很糟糕,即使你是管理员,你也必须以管理员身份运行。所以问题是这样的:我有一个从bat文件调用的exe文件。如果你是管理员,一切都应该顺利进行,但事实并非如此。您必须在exe属性上选中“以管理员身份运行”。这就是我想绕过的。 – user295744 2010-07-05 09:37:36

回答

6

如果文件权限可以轻松绕过,那么文件权限就不会有太大的意义。

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

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

6

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

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

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

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

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

如果您正在编写几乎不干扰操作系统的特定应用程序,那么您可以创建一个服务(守护进程)。每次服务开始时,它都将获得服务注册期间提供的权限。欲了解更多信息,请参阅"DLLs, Processes, and Threads -> Services" on MSDN

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

+1

+1。至少在早于XP的时候使用Program Files仅适用于静态代码和数据是最佳实践(也许早期的NT也是如此?)。不遵循这个建议的开发者至少对Vista早期的许多灾难负有部分责任。 ;) – Cogwheel 2010-07-04 16:33:45

+0

从Windows 2000开始,普通用户对Program Files和%windir%以及系统驱动器IIRC的根目录没有任何写权限。 Morover,我确信关于正确使用用户配置文件目录层次结构的指导原则可以追溯到早期的NT,因为配置文件目录的正确用法对于域环境中的配置文件漫游很重要。 – 2010-07-04 22:28:38

3

有没有办法绕过这个?

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

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

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

3

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

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

在Vista/Win7/Server2k8中,例如,可以使用UAC。 我并没有在这里列举特定的API,因为有不同的方式来通过UAC提升或获得特权。需要注意的一个重要的事情是,UAC 依赖于用户互动来授予此,这是一件积极的事情:-)

希望这会引导您和其他人朝着正确的方向发展。

0

刚刚完全关闭UAC。我关掉了它,并且我没有任何安全问题,因为我非常小心,并且不执行各种程序,甚至不下载任何可执行文件。

1

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

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

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

如果您需要在某处有一个特定的文件夹的工作,如“程序文件”,但是不希望UAC提示每一次,一个解决方法是把文件夹的所有权:

  1. 复制/粘贴以下到一个新的文本文件:
takeown /F %1 
icacls %1 /grant %username%:F /t /q 
  • 另存为 'letmewrite.bat' 或任何。

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

  • 拖动要访问到“letmewrite.bat”

  • +0

    但是你不能拥有没有管理员权限的所有权程序文件 – 2017-07-11 04:35:02