ローカル SYSTEM アカウントとしてテストする方法 (Python からリモート ファイルにアクセスする)

ローカル SYSTEM アカウントとしてテストする方法 (Python からリモート ファイルにアクセスする)

Web アプリケーション サーバーからいくつかのリモート ファイルにアクセスしようとしています。これらのサーバーを M および R と呼びます。両方のサーバーで Windows Server (2008 および 2003) が実行されています。

リモート ファイルは、Everyone が読み取り可能なファイル共有 (共有権限とセキュリティ権限によりEveryone読み取りが許可される) 上のサーバー R にあります。この共有は と呼ばれます\\R\EthRelease

ウェブアプリケーションはサーバー上にありますM。私はTomcatサーブレットコンテナ(経由)の下でPython(実際はJython)スクリプトを実行しています。BSFS について) を使用して、 上のリモート ファイルにアクセスしようとしますR

しかし、私が何をしても、脚本はリモート共有フォルダを表示できません。たとえば、次のような Python コードを使用します。

# Note, R: is a mapped network drive pointing to \\R\EthRelease
for file in ['C:', 'C:\\', 'C:\\Users', 'R:', 'R:\\',
        r"\\R\EthRelease", r"\\172.x.x.x\EthRelease"]:
    output.append("  <accessCheck dir='%s' exists='%s' accessF='%s' accessR='%s'/>\n" %
        (file, os.path.exists(file), os.access(file, os.F_OK),
        os.access(file, os.R_OK)))

スクリプトで存在するとされているフォルダーは と のみC:\ですC:\Users

<accessCheck dir="C:" exists="False" accessF="False" accessR="False"/>
<accessCheck dir="C:\" exists="True" accessF="True" accessR="True"/>
<accessCheck dir="C:\Users" exists="True" accessF="True" accessR="True"/>
<accessCheck dir="R:" exists="False" accessF="False" accessR="False"/>
<accessCheck dir="R:\" exists="False" accessF="False" accessR="False"/>
<accessCheck dir="\\R\EthRelease" exists="False" accessF="True" accessR="True"/>
<accessCheck dir="\\172.x.x.x\EthRelease" exists="False" accessF="False" accessR="False"/>

dir対照的に、サーバー M の CMD プロンプトで上記のパスのいずれかを実行すると、それらは存在し、読み取り可能です。

C:\Users\me>dir r:\
 Volume in drive R is GIS
 Volume Serial Number is ...

 Directory of r:\

12/03/2012  09:18 AM    <DIR>          .
12/03/2012  09:18 AM    <DIR>          ..
07/25/2013  08:51 AM    <DIR>          EGI
12/17/2013  05:46 AM    <DIR>          maps
               0 File(s)              0 bytes
               4 Dir(s)  48,192,491,520 bytes free

C:\Users\me>

私はこれを Jython 安定版 2.5.3 と Jython ベータ版 2.7b1 の両方で試しましたが、同じ結果になりました。これは Python だけの問題ではないことはわかっています。なぜなら、私のラップトップ (Python 3.3 を使用) で同様のコマンドを実行し、同じネットワーク共有に正常にアクセスできるからです。

1 つの違いは、サーブレット コンテナー Tomcat がサーバー M 上のローカル SYSTEM ユーザーとして実行されているのに対し、CMD シェルでは別のユーザーとしてログインしていることです。ただし、前述のように、Everyoneリモート ファイル共有にアクセスできるので、違いはないはずです。SYSTEM ユーザーとしてログインし、その状態でリモート ファイル共有にアクセスできるかどうかをテストする方法はありますか?

もう 1 つの違いは、サーブレット コンテナーまたは BSF が何らかのサンドボックス制限を課し、サーブレット コンテナーの外部のファイルにアクセスできないようにする可能性があることです。ただし、 を確認できるため、これは発生しませんC:\

何かアイデアはありますか?これは私を困らせています。以前、内部から直接ファイルにアクセスしようと何度か試みましたが、、そして同じような壁にぶつかりました。最近、「やった!この問題を Python スクリプトにアウトソースできる!Python で対処できる!」と思いましたが、今のところダメです。

答え1

これらのスーパーユーザーの質問で議論されているように –管理者特権のコマンド ライン プロンプトでは Windows 7 の共有ドライブにアクセスできませんそしてWindows 7 で昇格されたプロセスからネットワーク共有にアクセスするにはどうすればよいでしょうか?– ドライブ マッピングはログインに関連付けられているため、特別な手配をしない限り、SYSTEM にはそれらがありません。リモート ファイルに対して UNC で操作するか、NET USEコードから を実行して操作する必要がある場合があります。テスト プログラムが にアクセスできることを報告していることに注意しFRください\\R\EthRelease

答え2

通常、この目的でローカル システム アカウントを使用することは考えません。このアクセスを提供するには、ネットワーク サービス アカウントまたは管理されたサービス アカウントで実行することを検討します。

これをテストするために実際にローカル システム アカウントとしてログインしたい場合は、ローカル システム アカウントとしてシェルを開く方法がいくつかあります。

使用できますPSEXEC見つかったPSツールシステム アカウントで対話型 cmd セッションを開きます。psexec -i -s cmd.exe

または、システムアカウントとしてスケジュールされたタスクを実行します(at <time> /interactive cmd.exe

関連情報