由于NTFS权限,我在运行java进程时遇到问题。 (http://community.jboss.org/wiki/RunJBossAsAServiceOnWindows)。
服务安装成功,但由于文件权限而导致启动时出现问题。
示例日志
08:58:02,250 ERROR [MainDeployer] Could not make local copy for file:/J:/projects/devtools/pe64-jboss-4.2.2.GA/server/solr/conf/jboss-service.xml
java.io.IOException: Access is denied
at java.io.WinNTFileSystem.createFileExclusively(Native Method)
“Yo No Comprende”。 我认为“本地系统”帐户是“root”。 (“本地系统”是默认帐户)
“chmod -R 777<>”不是一种选择。 (安全漏洞)
总结一下:
更新/溶液
事实证明,在后来的Windows(Vista和Window 7)中,MSFT关闭了一个安全漏洞,允许服务获取任何人的“临时”文件。
“本地系统”帐户无法访问任何常用/预先创建的“临时”目录。
解决方案,在java世界中:
感谢
将
答案 0 :(得分:2)
“本地系统”并不完全是root。它可以被拒绝(或不被授予)权限,就像任何其他用户一样,Windows将强制执行这些权限。 (虽然在你这样做之前你最好知道你在做什么 - 阻止它的错误可能会使你的系统无法使用。)有时,通常当你从特权位置(如桌面或其他东西)复制东西时, Windows将关闭该文件夹的“继承权限”,并且该帐户将无法获得它通常从根目录继承的权限。
确保该文件夹授予本地系统帐户权限,以便将文件添加到要创建该文件的文件夹中。至于你如何用Cygwin做到这一点......我不确定。它有类似于Linux's setfacl
command的东西吗?
答案 1 :(得分:2)
NTFS权限与Ext2 / 3/4权限的工作方式略有不同。
具体来说,如果您是管理员,文件系统并不关心...如果您的SID没有Create Files
permission或其他一个元权限,那么在目录中包含它(即Write
),您无法创建新文件或将文件从另一个目录复制到该文件夹。
它为您提供的是更改任何文件夹权限的权限。
答案 2 :(得分:1)
我不会使用Cygwin。相反,我使用cacls
和ntrights
的组合(来自XP资源工具包 - 仍然适用于2008 / win 7)。唯一的问题是您必须以管理员身份运行Ant。这意味着您需要确保启动管理员级别cmd提示或者安装程序必须提升。
在Ant中,我执行以下操作:
<!-- give the service user full access to install dir -->
<exec executable="cacls" failonerror="true" osfamily="winnt" output="NUL">
<arg line=""${dir.install}" /e /p ${service.username}:f" />
</exec>
<!-- remove the Users group access from the install dir -->
<exec executable="cacls" failonerror="true" osfamily="winnt" output="NUL">
<arg line=""${dir.install}" /e /t /r Users" />
</exec>
<!-- give the service user the right to log on as a service,
remove right to logon through the UI -->
<exec executable="${dir.installer}/install/ntrights">
<arg line="-u ${service.username} +r SeServiceLogonRight" />
</exec>
<exec executable="${dir.installer}/install/ntrights">
<arg line="-u ${service.username} +r SeDenyInteractiveLogonRight" />
</exec>
请注意,我无法使用cacls来处理各个args。我必须指定整行。还要注意引用转义以处理带空格的目录(例如程序文件)。