いろんなサーバー設定研究所

インフラエンジニアに役立つ各種設定やTipsを提供します Windows Server、Linux など

*

Powershellでフォルダやファイルのアクセス権を設定する

      2015/05/23

Powershellでスマートにできそうなのに、意外と手間取ってしまうシリーズその1

ファイルやフォルダへのアクセス権設定を行う!…簡単にできそうなのに

大まかな流れは

  1. 対象フォルダのアクセス権をオブジェクトとして取得
  2. オブジェクトに対して、変更を加える(権限付与、継承無効化etc…)
  3. 変更を加えたオブジェクトを対象フォルダの権限として書き戻す

です。

ちょっと面倒ですが、これができると共有フォルダのアクセス権設定の自動化に役立ちますね。

 


 

上位フォルダのアクセス権継承を無効化する

共有フォルダのアクセス権設定をしていると、上位フォルダのアクセス権継承を無効化したくなる時があります。フォルダのセキュリティの詳細設定の「継承の無効化」ボタンの事ですね。

Powershellで実現するには、以下の様にスクリプトを記載してください。

$folder_path = 'c:\DATA\Target'
$acl = Get-Acl $folder_path
$acl.SetAccessRuleProtection($true,$true)
$acl | Set-Acl $folder_path

ターゲットとするフォルダのアクセス権オブジェクトを取得しSetAccessRuleProtectionメソッドを利用してオブジェクトを加工し、それを最後に書き戻すといった処理です。

この例では、上位フォルダのアクセス権を維持したまま継承を無効化しています。

フォルダに対しユーザーにフルアクセス権限を付与する

では実際にフォルダに対してアクセス権の付与をPowershellから実施していきます。まずは下位フォルダ、ファイルにアクセス権を継承する形で、ユーザーにフルアクセス権限を付与しています。

$folder_path = 'c:\DATA\Target'
$fc_user_name = 'domain\username'
$acl = Get-Acl $folder_path
$permission = ($fc_user_name,"FullControl","ContainerInherit, ObjectInherit", "None","Allow")
# 引数:ユーザー名,アクセス権,下位フォルダへ継承,下位オブジェクトへ継承,継承の制限,アクセス許可
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $permission
$acl.SetAccessRule($accessRule)
$acl | Set-Acl $folder_path

キモは$permission の引数ですね、ここで定義した設定をFileSystemAccessRuleに渡して権限のオブジェクト化を行っています。渡した引数により下位フォルダ、オブジェクトに継承するかどうか等を設定する事ができます。

ターゲットとするフォルダのアクセス権オブジェクトを取得し、それとは別に権限設定用オブジェクトを作成し、最後に統合しているイメージです。スクリプトを見たほうがわかりやすいですね…

 

フォルダに対しユーザーに読み取り権限を付与する

つぎは下位フォルダ、ファイルにアクセス権を継承する形で、ユーザーにRead読み取り権限を付与します。

$folder_path = 'c:\DATA\Target'
$fc_user_name = 'domain\username'
$acl = Get-Acl $folder_path
$permission = ($fc_user_name,"ReadAndExecute","ContainerInherit, ObjectInherit", "None","Allow")
# 引数:ユーザー名,アクセス権,下位フォルダへ継承,下位オブジェクトへ継承,継承の制限,アクセス許可
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $permission
$acl.SetAccessRule($accessRule)
$acl | Set-Acl $folder_path

$permissionで渡している引数”ReadAndExecute”は読み取りと実行権限を付与しています。”Read”だけを指定するとフォルダ上に存在するexe等の実行ファイルの実行ができませんので、特別な理由がない限りは”ReadAndExecute”でよいでしょう。

 

フォルダに対しユーザーのアクセスを一切拒否する

フルアクセスの設定をすこーしだけ変えます。

$folder_path = 'c:\DATA\Target'
$fc_user_name = 'domain\username'
$acl = Get-Acl $folder_path
$permission = ($fc_user_name,"FullControl","ContainerInherit, ObjectInherit", "None","Deny")
# 引数:ユーザー名,アクセス権,下位フォルダへ継承,下位オブジェクトへ継承,継承の制限,アクセス許可
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $permission
$acl.SetAccessRule($accessRule)
$acl | Set-Acl $folder_path

$permissionの最後の変数をAllowからDenyに変えただけですが、これで指定したユーザーのアクセスを拒否する事ができます。

 - Power Shell