※ ChatGPTを利用し、要約された質問です(原文:CGI作成ファイル所有者をEveryone等にしたい(Windows))
CGI作成ファイルの所有者をEveryone等にしたい(Windows)
このQ&Aのポイント
Windows上でCGIで呼ばれたプログラムから作成されたファイルの所有者がSYSTEMになってしまい、他のプログラムからのアクセスが制限されてしまう問題があります。
この問題の解決策として、Perlのsystem関数を使用してファイルをコピーする際に所有者をEveryoneまたはAdministratorsにする方法があります。
また、Windowsのプロパティのセキュリティタブやcacls、icaclsコマンドを使用することで所有者を手動で変更することも可能ですが、包括的な対処方法を探しています。
CGI作成ファイル所有者をEveryone等にしたい(Windows)
CGI作成ファイル所有者をEveryone等にしたい(Windows)
Windows XP SP2パソコン上で、ブラウザで自分のマシン上のファイルを閲覧したりプログラムを起動・制御しようと、Apache/2.2.4(Win32)でローカルにhttpdを立ち上げています。
ブラウザ表示文書からCGIとして呼び出されたPerl(ActivePerl 5.005_03)プログラムで、system関数からcygwinのcpコマンドを呼び出して、NTFSフォーマットされたCドライブ上で、ファイルAを新しく(既存の上書きでも同じ)ファイルBにコピーしました。
system("c:/cygwin/bin/cp -uf '$fr_file' '$to_file'");
という感じで、正常復帰してきます。
ところが、コピー先ファイルは、その所有者がSYSTEMになってできてしまいます。
こうなると、AdministratorsやEveryoneに属している自分では属性読み取り以外許されません。
いろいろなプログラムからそのファイルを開こうとしても削除しようとしても、エラーになってしまいます(ブラウザでApache経由だけは読めます)。
CGIで呼ばれたプログラムやそこから呼ばれるサブルーチンその他のソフトがどうファイルを操作しても、作られるファイルの所有者がEveryoneまたはAdministratorsになるようにする方法か、
そうでなくても誰からでも読み書き実行等フルコントロールがつくようにする方法は何かないでしょうか?
この原因と対策がお分かりになる方、教えてください。
(chmod, chown, umask…全部関係ないですよね。Windows上で0777にしようとしても所有者が変わらないので状況は変わりません。Perlのstatでファイルを見るとuidもgidも0が返ってきます。)
(Windowsのプロパティのセキュリティタブのところで所有者を変えてパーミッションを変える方法や、Windowsのcacls, icaclsコマンドを実行して所有者を変える方法も知っていますが、そんなことをせずに、ファイルができる前に包括的に対処したいのです。)
(自分がSYSTEMに参加することもできないですよね。)
お礼
【解決しました】 ●原因 ApacheがWindowsにサービスとして登録されるときに、ローカル システム アカウントでログオンするというデフォルト設定になっていたためSIDがSYSTEMになりEveryoneやAdministratorsからはフルアクセス権がなかったこと。 ●対処手順 できればまず [Shift-Control-Esc]などの操作でWindowsのタスク マネージャを出し、 [プロセス]タブをクリックし、httpdのユーザ名が空欄(またはSYSTEM)であることを確認した方がいいでしょう。[表示]-[列の選択]をしないとユーザ名が見えないかもしれません。 Apacheにログオンさせる管理者権限をもっている(すなわちAdministratorsグループに属している)ユーザのログオン名をあらかじめ決めておきます。少なくともWindows XP以降では、購入直後に入力して作ったユーザは管理者権限をもっていますから、ひとりで使っている分にはそのログオン名を用いればよいでしょう。 では開始します。 [コンピュータの管理]-[サービスとアプリケーション]-[サービス] で右ペインにサービス一覧を出します。 Apacheのサービス名(私の場合 Apache2)を選択して開きます。 [(ローカル コンピュータ)Apache2のプロパティ] 画面で [ログオン]タブ-[ログオン] で [アカウント(T)]に 自分のログオン名 を手入力または [参照(B)]ボタンを利用して入力します(先頭に自動的に「.\」が付くようです)。 パスワード欄2カ所を正しく入力します。 いったん [適用(A)] をクリックします。 次に、[全般]タブ-[サービスの状態] で [停止(T)]をクリックし、数秒後に停止してグレーアウトされるので [開始(S)] をクリックします。この操作はタスクトレイでApacheのアイコンからモニタを開いてリスタートするのと等価です。 [OK] をクリックします。 上記Windows タスク マネージャで、ユーザ名欄が自分のログオン名に変わっていることを確認します。 この設定は、あとシステムの再起動が何度あっても保たれます。 ¶参考にした文書: http://oshiete1.watch.impress.co.jp/qa937815.html?order=ASC&by=datetime 教えて! Watch - コピーが・・・ 動的にCygwinコマンドで作るファイルのWindowsでのセキュリティを変更する際には、YkazubonY様のご紹介で読んだCygwinのntsecセクションが参考になります。ありがとうございました。
補足
YkazubonY様 調べてくださってどうもありがとうございます!! 良さそうな資料ですね。 さっそくよく読んで検討します。