2010-12-29 3 views
4

WindowsプロセスとしてJavaプロセスをNTFS権限で実行しているときに問題があります。 (http://community.jboss.org/wiki/RunJBossAsAServiceOnWindows)。なぜ「ローカルシステム」アカウントにNTFSファイルシステム(WindowsサービスとしてJavaを実行している)へのアクセス権がないのですか?

サービスは正常にインストールされますが、ファイルのアクセス権に起因する問題があります。

  • 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) 

"ヨノーComprende" をログに記録します。私は "ローカルシステム"アカウントが "root"だと思っていました。 ( "Local System"がデフォルトのアカウントです)

"chmod -R 777 <>"はオプションではありません。 (セキュリティホール)

だから、要約する:

  • "ローカルシステム" や窓NTFSファイルアクセス許可との契約は何ですか?
  • 「マイグループ」に「ローカルシステム」を追加できますか
  • ローカルビルドプロセスに問題がありますか? (例えば、Windows版のUMaskは悪いですか?)
  • WindowsサービスとしてJavaを実行している他の問題はありますか?
  • 15年以上のWindows NTベースのOSの後、なぜサービスはまだ苦しいですか?これは、Windows(Vistaとウィンドウ7)以降であることが判明し

更新/ソリューション

は、MSFTは誰の「TEMP」のファイルを取得するためにサービスを許さセキュリティホールを閉じました。

"ローカルシステム"アカウントは、共通/事前作成された "temp"ディレクトリにアクセスできません。

Javaの世界でのソリューション、:

  • 独自の一時ディレクトリを作成します。
  • jvm引数として "-Djava.io.tmpdir =/path/to/my/temp/dir"を渡します。

おかげ

ます

+0

"ファイルシステムのパーミッションを755から777に変更すると、サービスは正常に動作します。" cygwinを使用していると仮定する必要がありますか? Windows自体には 'chmod'はありません。代わりに['cacls'](http://technet.microsoft.com/en-us/library/bb490872.aspx)があります。 – Powerlord

+0

はい。私はcygwinを使用します。私たちのビルドのためのAntと私たちのscmのためのgit。 Git、fwiw、ファイルアクセス権を追跡します。 – user331465

+0

これは、実際には、http://superuser.comやhttp://serverfault.com、BTWに適した質問のように聞こえます。彼らはおそらく、NTFSのアクセス許可やCygwinについてもっと知っているだろう。 – cHao

答えて

1

私はこれにCygwinを使用しません。代わりに、私はcaclsntrightsの組み合わせを使用します(XPリソースキットから - まだ2008/win 7で動作します)。唯一の問題は、Antを管理者として実行する必要があることです。つまり、管理者レベルのcmdプロンプトを起動するか、インストーラが昇格する必要があります。 Antので

、私は次のような何か:私はCACLSは、個々の引数で動作させることができなかった

<!-- 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> 

注意を。私は行全体を指定しなければならなかった。スペースを含むディレクトリ(プログラムファイルなど)を処理するための引用符エスケープにも注意してください。

2

"ローカルシステムは、" 正確にルートではありません。他のユーザーと同様に、アクセス許可を拒否することも、許可しないこともできます.Windowsでは、そのアクセス許可が適用されます。 (あなたがそうする前に何をやっているのかをよく知っていても、間違ったものをブロックするとシステムが使えなくなる可能性があります。)場合によっては、特権のある場所(デスクトップなど)からアイテムをコピーするときに、Windowsはフォルダの「権限を継承する」機能を無効にし、アカウントは通常継承する権限を取得しませんルートから。

ローカルシステムアカウントには、そのファイルを作成するフォルダにファイルを追加する権限が与えられていることを確認してください。 Cygwinでどうやってやっているのかは分かりません。 Linux's setfacl commandに似たものがありますか?

+0

最後の文章を明確にすることはできますか? – user331465

+0

Linuxのより新しいファイルシステムは、ACLをサポートすることができます(NTFSのものよりも単純で能力の低いものですが)。 Linuxでは、 'setfacl'コマンドを使ってこれらのACLを変更して、他のユーザーとグループのアクセス許可を与えます。私は、CygwinがネイティブにACLをサポートし、使用し、強制するシステム上で実行することを意図していることを考慮して、同じことをすることができるだろうと考えています。 – cHao

2

NTFSアクセス許可は、Ext2/3/4アクセス許可とは少し違って動作します。

あなたが管理者かいないのであれば、あなたのSIDはCreate Filespermissionまたはそれを含む他のメタのいずれかの権限がいない場合は具体的には、ファイルシステムがオン(すなわちWrite)...気にしません。新しいファイルを作成したり、別のディレクトリからそのフォルダにファイルをコピーすることはできません。

どのようなフォルダーに対してもアクセス許可を変更する権限が与えられます。

関連する問題