使用JNA在ProgramData子文件夹上设置写权限

时间:2011-03-28 20:11:35

标签: java windows jna

我有一个用Java编写的程序,它最初使用Program Files中的目录来编写该程序的所有用户都可以访问的文件。这要求我们的用户始终以管理员身份运行。为了减轻这种影响,我们决定使用ProgramData环境变量将需要在常规使用期间写入的文件移动到%ALLUSERSPROFILE%文件夹。如果在安装过程中将其指定为可写,则使用此目录中的子文件夹可以很好地使用NSIS。

问题在于升级现有用户。 Java File API提供setWritable但在开发计算机上测试后似乎不起作用。看起来Java 7的新文件API可以解决这个问题,但是没有发布日期,我宁愿不等待。

似乎最简单的解决方案是使用JNA调用适当的Windows API调用来将此目录设置为可写。由于升级软件需要管理员权限,类似于安装,它应该让这个改变很好。但是,我不确定从哪里开始,从未使用过JNA或Windows API。关于要加载哪个Windows库以及调用哪些函数的建议将受到赞赏,特别是如果有人之前遇到过类似的问题。

2 个答案:

答案 0 :(得分:0)

嗯,我很高兴您提供了一些背景信息......您可以使用JNA,但更简单的方法是执行对命令行实用程序cacls的调用。默认情况下,它包含在Windows XP安装中,我相信它应该可以帮到你。试试Runtime.getRuntime().exec("C:\\Windows\\System32\\cacls.exe"+options)

查看此处的文档 - > http://technet.microsoft.com/en-us/library/bb490872.aspx

答案 1 :(得分:0)

我使用以下行:

Runtime.getRuntime().exec( "C:\\Windows\\System32\\icacls.exe \"%ProgramData%\my application" /grant *S-1-5-32-545:(OI)(CI)(W,M)" );

S-1-5-32-545是BUILTIN \ Users的SID,因为该名称仅适用于英语系统。 https://support.microsoft.com/de-de/kb/163846

这使BUILTIN \ Users能够对给定目录中的所有文件进行写访问,而该用户已创建该文件。