我在C中做了一个小应用程序。它做了一些文件操作,基本上搜索并更改了一些文件名。但如果它在程序文件文件夹中的Win Vista / 7中使用,程序会说权限被拒绝。无论如何都要绕过这个?
此外,Java可以绕过这个吗?
答案 0 :(得分:6)
如果可以轻易绕过文件权限,那就没有多大意义了。
如果您编写了直接访问磁盘块的内核驱动程序,则可以绕过它们,但是无论如何您都需要成为管理员才能安装内核驱动程序。
在一天结束时,“绕过”文件权限的唯一方法是以管理员身份运行程序。
答案 1 :(得分:6)
请勿绕过,使用“应用程序数据”目录。
程序文件旨在存储在应用程序运行期间不会更改的文件。存储在那里的文件只应在安装/更新期间更改。
应用程序运行期间要更改的文件(配置文件,设置等)应存储在用户文件夹中的“应用程序数据”目录中。
获取路径使用SHGetFolderPath函数传递:
CSIDL_APPDATA
- 获取当前用户“应用程序数据”目录
CSIDL_COMMON_APPDATA
- 获取所有用户“应用程序数据”目录
(并最终)CSIDL_LOCAL_APPDATA
- 获取当前用户“本地应用程序数据”目录,该目录用于存储仅针对本地计算机的信息,该信息不能移动到其他计算机,与“应用程序数据”(也称为“应用程序数据”相对)漫游应用程序数据“),文件可以在一台机器之间自由移动(即你可以在重新安装操作系统时保留它们)。
如果您的应用程序确实需要更改Program Files目录,那么请求用户许可是您应该做的。您可以为应用程序提供特殊清单,以便每次运行时都尝试获取管理员权限。您还可以即时获得权限。
如果您正在编写几乎不会干扰操作系统的特定应用程序,那么您可以创建一个服务(守护程序)。每次启动服务时,它都将获得服务注册期间给出的权限。有关详细信息,请参阅"DLLs, Processes, and Threads -> Services" on MSDN
//编辑
您还可以轻松地在.NET中创建服务(C#是最合适的)。服务应用程序可以与使用其他语言编写的客户端应用程但是要注册服务,您需要管理员权限。有了这种应用程序,您必须考虑所有安全问题。
答案 2 :(得分:3)
有没有绕过这个?
你不应该这样做。即使有办法,那也是一个安全漏洞,最终会被修复。
如果您的软件是从非管理员帐户运行的,它应该正常运行,并且不应该尝试弄乱系统文件夹(在程序文件中重命名文件正是这样 - 可能会损坏系统)。这是用户和管理员之间权限和分离的全部要点 - 从用户帐户运行的程序不应该破坏或破坏系统文件,除非管理员允许。
因此,如果由于权限而无法重命名文件,请向用户报告“权限被拒绝”。让用户处理情况。默默地绕过权限(即使可能)是非常危险的 - 最终一些不那么聪明的用户会使用你的软件杀死系统,并责怪你的问题。
答案 3 :(得分:3)
正如之前所说的那样,你不应该试图绕过操作系统强加的限制。
如果您的应用程序需要更改只有管理员可以更改的文件,则您的程序需要管理员权限。现在,如果您想考虑这个问题,可以使用一些有用的API来提升应用程序的权限。
例如,在Vista / Win7 / Server2k8中,可以使用UAC 。 我不是在这里引用特定的API,因为有不同的方法可以通过UAC提升或获得特权。需要注意的一点是,UAC 依赖于用户交互来授予此,这是一件好事: - )
希望这会引导您和其他人走向正确的方向。
答案 4 :(得分:1)
如果您要求自己,因为您只想运行此应用程序,那么您可以执行许多操作。首先,您可以关闭UAC,我们都同意这是一个坏主意。但没有人列出你的其他选择:
答案 5 :(得分:0)
完全关闭UAC。我已经关闭了,我没有任何安全问题因为我非常小心并且不执行各种程序甚至下载任何可执行文件。
答案 6 :(得分:0)
偏离主题'是答案,但我需要某处保存,以便我以后可以再次找到它。
如果您需要使用某个特定文件夹,例如“Program Files'但是每次都不想要UAC提示,一种解决方法是取得该文件夹的所有权:
takeown /F %1
icacls %1 /grant %username%:F /t /q
将其另存为' letmewrite.bat'或者其他什么。
打开几个资源管理器窗口,以便您可以看到要访问的文件夹和' letmewrite.bat'。
将您要访问的文件夹拖到' letmewrite.bat'