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

我有一个用Java编写的程序,最初使用程序文件中的目录来写入这个程序的所有用户都可以访问的文件。 这要求我们的用户始终以pipe理员身份运行。 为了缓解这个问题,我们决定将使用%ALLUSERSPROFILE%环境variables的文件移动到ProgramData文件夹中。 如果在安装过程中将子目录指定为可写入,那么在我们的应用程序的这个目录中使用子文件效果很好,这使用NSIS可以正常工作。

问题出现在升级现有的用户。 Java File API提供了setWritable但在开发机器上testing之后,这似乎不起作用。 看起来Java 7的新文件API可以解决这个问题,但是没有发布date,我宁愿不等待。

看来最简单的解决scheme是使用JNA来调用适当的Windows API调用来设置此目录可写。 由于升级软件需要pipe理权限,类似于安装,应该让这个改变通过罚款。 不过,我不确定从哪里开始,从未使用过JNA或Windows API。 有关加载哪个Windows库以及调用哪些函数的build议将值得赞赏,特别是如果有人以前遇到过类似的问题。

Apache HTTP BasicScheme.authenticate已弃用?

jar包装为.app(OSX)和(.exe)进行部署?

有趣的Shell输出:[01; 32mtestfile.txt [00m而不是testfile.txt

使用java的mv命令

如何从Java访问Windows事件查看器日志数据

监视Java垃圾收集时的cpu,RAM,I / O使用情况

从Java调用Windows颜色系统

使用Unicode文件path

在Linux上开发JavaME应用程序

如果尚未启动,则使用Bat文件启动Java应用程序

那么,我很高兴你给出了一些背景……你可以使用JNA,但更简单的方法是执行一个调用命令行工具cacls。 它是在Windows XP安装认包含,我相信,所以它应该为你做的伎俩。 尝试Runtime.getRuntime().exec("C:\Windows\System32\cacls.exe"+options)

看看这里的文档 – > http://technet.microsoft.com/en-us/library/bb490872.aspx

我使用下面的行:

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可以独立于给定目录中的所有文件创建访问权限。

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...