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

Posted

技术标签:

【中文标题】为啥“本地系统”帐户缺乏对 NTFS 文件系统的权限(将 java 作为 Windows 服务运行)【英文标题】:Why does "Local System" account lack permissions to NTFS Filesystem (running java as windows service)为什么“本地系统”帐户缺乏对 NTFS 文件系统的权限(将 java 作为 Windows 服务运行) 【发布时间】:2011-06-01 03:25:38 【问题描述】:

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

服务安装成功,但由于文件权限问题无法启动。

如果我将 windows 服务“登录”更改为我的帐户(例如域/登录),该服务运行正常。 如果我将文件系统权限从 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 文件权限是什么关系? 能否将“本地系统”添加到“我的组”中 我的本地构建过程是否有问题? (例如,windows 版本的 UMask 不好?) 还有其他将 java 作为 Windows 服务运行的问题吗? 基于 Windows NT 的操作系统已经使用了 15 年以上,为什么服务仍然如此痛苦?

更新/解决方案

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

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

解决方案,在java世界中:

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

谢谢

【问题讨论】:

"如果我将文件系统权限从 755 更改为 777,服务运行良好。"我们应该假设您使用的是cygwin吗? Windows 本身没有chmod;相反,它有cacls 是的。我使用cygwin。 Ant 用于我们的构建和 git 用于我们的 scm。 Git,fwiw,跟踪文件权限。 这听起来像是一个更适合superuser.com 或serverfault.com 的问题,顺便说一句。他们可能更了解 NTFS 权限和/或 Cygwin。 就 *** 与超级用户与 serverfault 而言,我发现区别有点模糊。这个问题显然与编程环境问题有关,而不是我的家庭 wi-fi 网络。 该问题显然与 安装 JBoss 和/或 用户、组和 NTFS 权限 和/或 的问题有关赛格温。这些都不是特定于编程的问题。 (看看你的总结;在你问的 5 个问题中,只有一半实际上与编程有关。)这不一定是编程问题,因为你在做与编程相关的事情时发现了这个问题。 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

你能澄清最后一句话吗? Linux 较新的文件系统可以支持 ACL(尽管比 NTFS 中的更简单且功能更少),并且内核本身也支持它。在 Linux 中,您可以使用 setfacl 命令修改这些 ACL 以授予其他用户和组权限。我希望,考虑到 Cygwin 旨在运行在本机支持、使用和强制 ACL 的系统上(并且旨在模拟一个可以),它能够做到这一点。【参考方案3】:

我不会为此使用 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 处理单个参数。我必须指定整行。还要注意引号转义以处理带有空格的目录(例如 Program Files)。

【讨论】:

以上是关于为啥“本地系统”帐户缺乏对 NTFS 文件系统的权限(将 java 作为 Windows 服务运行)的主要内容,如果未能解决你的问题,请参考以下文章

两个一样的硬盘(除了分区表不一样)一样的文件 占用空间为啥不一致?

“本地系统”帐户和“网络服务”帐户之间的区别?

将凭据添加到与本地系统帐户不同的帐户

如何在本地系统帐户下运行 CMD.exe?

如何激活Paragon NTFS for Mac

为啥我的苹果电脑的文件不能拷贝到移动硬盘里