繁体   English   中英

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

[英]Set write permissions on ProgramData subfolder using JNA

我有一个用Java编写的程序,该程序最初使用程序文件中的目录编写该程序的所有用户均可访问的文件。 这要求我们的用户始终以管理员身份运行。 为了缓解这种情况,我们决定使用%ALLUSERSPROFILE%环境变量将在常规使用期间需要写入的文件移动到ProgramData文件夹中。 如果在安装过程中将其指定为可写的,则在此目录中为我们的应用程序使用子文件夹非常有用,使用NSIS可以正常工作。

问题在于升级现有用户。 Java File API提供了setWritable但在开发机器上进行测试后似乎无法正常工作。 看起来带有Java 7的新文件API可以解决此问题,但是由于没有发布日期,我宁愿不等待。

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

我使用以下代码:

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可以对给定目录中的所有文件进行写访问,而与创建它的用户无关。

好吧,很高兴为您提供一些背景知识...您可以使用JNA,但更简单的方法是执行对命令行实用程序cacls的调用。 我相信Windows XP安装中默认包含该工具,因此它可以为您解决问题。 尝试运行Runtime.getRuntime().exec("C:\\\\Windows\\\\System32\\\\cacls.exe"+options)

在此处查看文档-> http://technet.microsoft.com/zh-cn/library/bb490872.aspx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM