書き込み拒否を設定するには?

get-aclがアクセス許可の情報の取得なので、set-aclで設定できると思われます。get-help set-aclコマンドを打ってヘルプを確認してみます。

セキュリティ記述子というものを渡してあげればよいことがわかります。じゃあ、セキュリティ記述子はどこから持ってくればよいのでしょうか?再度、get-help get-aclと打って確認すると、get-aclはセキュリティ記述子を返してくれてるようです。案として、変更前のセキュリティ記述子を取得(get-acl)し、それに変更を加え、変更したセキュリティ記述子を設定する(set-acl)というものがあると思います。 そこで、セキュリティ記述子のオブジェクトのメンバーメソッドで何か変えられるものはないか探してみます。・・・しかし、すぐ出来そうなメソッドは見つかりません。こうなったら、ひな形のファイルを作成しておき、それのセキュリティ記述子をコピーするという戦法です(ヘルプのサンプルにありました)。要は以下です。

  1. ひな形ファイルを作成
  2. ひな形ファイルにアクセス拒否を手動で設定
  3. ひな形ファイルのセキュリティ識別子を取得
  4. 対象のファイルに取得したセキュリティ識別子を設定

3〜4のプログラムを作ってみました。

set-PSDebug -strict
# ---------------------------------
# ログを書き込み拒否にする
#
# ひな形ファイル:C:\Users\sinpay\Documents\work\powershell\20091205_shell\hinagata.txt
# 対象ファイル:C:\logs配下のファイル
# ---------------------------------

# ひな形ファイルのセキュリティ識別子を取得する
$hinagata_file = "C:\Users\sinpay\Documents\work\powershell\20091205_shell\hinagata.txt"
$hinagata_file_sec = get-Acl -path $hinagata_file

# ひな形ファイルのセキュリティ識別子を対象ファイルに設定する
$dir = "C:\logs"
foreach ( $file in get-ChildItem -path $dir){
    set-Acl -path $file.FullName -aclobject $hinagata_file_sec
}
trap{
    break
}