为什么“本地系统”帐户缺少NTFS文件系统的权限(将java作为Windows服务运行)

时间:2010-12-29 16:14:44

标签: java windows-services file-permissions ntfs

由于NTFS权限,我在运行java进程时遇到问题。 (http://community.jboss.org/wiki/RunJBossAsAServiceOnWindows)。

服务安装成功,但由于文件权限而导致启动时出现问题。

  • 如果我将Windows服务“登录”更改为我的帐户(例如域/登录),则该服务运行良好。
  • 如果我将文件系统permisisons从755更改为777,则服务运行正常。

示例日志

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 NTFS文件权限有什么关系?
  • 您可以将“本地系统”添加到“我的群组”
  • 我的本地构建过程是否出错了? (例如,UMask的Windows版本不好?)
  • 运行java作为Windows服务的其他任何问题?
  • 经过15年以上基于Windows NT的操作系统,为什么服务仍然如此痛苦?

更新/溶液

事实证明,在后来的Windows(Vista和Window 7)中,MSFT关闭了一个安全漏洞,允许服务获取任何人的“临时”文件。

“本地系统”帐户无法访问任何常用/预先创建的“临时”目录。

解决方案,在java世界中:

  • 创建自己的临时目录。给予足够的权利)
  • 将“-Djava.io.tmpdir = / path / to / my / temp / dir”作为jvm参数传递。

感谢

3 个答案:

答案 0 :(得分:2)

“本地系统”并不完全是root。它可以被拒绝(或不被授予)权限,就像任何其他用户一样,Windows将强制执行这些权限。 (虽然在你这样做之前你最好知道你在做什么 - 阻止它的错误可能会使你的系统无法使用。)有时,通常当你从特权位置(如桌面或其他东西)复制东西时, Windows将关闭该文件夹的“继承权限”,并且该帐户将无法获得它通常从根目录继承的权限。

确保该文件夹授予本地系统帐户权限,以便将文件添加到要创建该文件的文件夹中。至于你如何用Cygwin做到这一点......我不确定。它有类似于Linux's setfacl command的东西吗?

答案 1 :(得分:2)

NTFS权限与Ext2 / 3/4权限的工作方式略有不同。

具体来说,如果您是管理员,文件系统并不关心...如果您的SID没有Create Files permission或其他一个元权限,那么在目录中包含它(即Write),您无法创建新文件或将文件从另一个目录复制到该文件夹​​。

它为您提供的是更改任何文件夹权限的权限。

答案 2 :(得分:1)

我不会使用Cygwin。相反,我使用caclsntrights的组合(来自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="&quot;${dir.install}&quot; /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="&quot;${dir.install}&quot; /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。我必须指定整行。还要注意引用转义以处理带空格的目录(例如程序文件)。