雑記+備忘録

OS中心の技術情報と趣味について(最近は主に将棋)。備忘録なのでここに書かれたことを試すのは自己責任でお願いします。

PowerShellで共有フォルダ作成、アクセス権設定(前編)

フォルダを作成、共有フォルダにし、NTFSアクセス権で初期状態で付与されている「Users」に対する権限を削除、 適切なドメイングループに「更新」の権限を与える

これをPowerShellでやりたいと思って調べると、方々にある情報を集めないといけないと分かったので、 備忘録っぽく集めておきます。
しかし覚えにくいし複雑。GUIのほうが楽な(と感じられる)設定の一つです。

まずはサンプルスクリプトを載せます。
<前半 共有フォルダ作成から「Users」権限の削除まで>

##### 変数
# 対象フォルダパス
$nW_path = "C:\share3"
# 共有名
$nW_Name = "share3"

##### 処理
# フォルダ作成
New-Item $nW_path -ItemType Directory

# フォルダ共有(共有アクセス権付与も)
New-SmbShare -Name $nW_Name -Path $nW_path -FullAccess Everyone

# 現在のフォルダアクセス権を取得
$objACL = Get-Acl $nW_path

# アクセス権の継承を解除
$objACL.SetAccessRuleProtection($true,$true)

# 変更されたフォルダアクセス権オブジェクトを実フォルダへセット
$objACL | Set-Acl $nW_path

# 現在のフォルダアクセス権を取得
$objACL = Get-Acl $nW_path

# 削除するアクセス権の選択
$objRemoveACL = ($objACL | Select -ExpandProperty Access | Where-Object {$_.IdentityReference -eq "BUILTIN\Users"})

# 複数あるので1つずつ削除を実行
foreach ($wACL1 in $objRemoveACL) {

  # 削除
  $objACL.RemoveAccessRule($wACL1)

}

# 変更されたフォルダアクセス権オブジェクトを実フォルダへセット
$objACL | Set-Acl $nW_path


段階ごとに解説していきます。

1. フォルダ作成
「New-Item」コマンドレットでフォルダを作成します。
「-ItemType Directory」がフォルダを作成するオプションです。


2. フォルダ共有

New-SmbShare フォルダ共有のコマンドレット
-Name <共有名> 共有名を指定するオプション
-Path <ファイルパス> ファイルパスを指定するオプション
-FullAccess <アクセス権対象UorG> フルコントロールを与えるオプション

「-FullAccess」のところを -ReadAccess で 読み取り許可 を、-ChangeAccess で 変更許可 を付与できます。

参考URLは以下です。(ありがとうございます)
PowerShell で共有フォルダーの作成 | blog.yottun8.com
PowerShell で smb コマンドレットで 共有 フォルダを作成する - tech.guitarrapc.cóm


3. アクセス権の上位からの継承を解除
上位からの継承があると「Users」を削除できないので継承を解除します。
「Get-Acl」で現在のフォルダアクセス権をオブジェクトとして取得、
オブジェクトのメソッド「.SetAccessRuleProtection」で継承を設定します。
設定後、「Set-Acl」で設定したアクセス権オブジェクトを実フォルダへ反映させます。
「.SetAccessRuleProtection」の2つの引数は以下の意味があります。

1番目:isProtected
このオブジェクトに関連付けられたアクセス規則を継承から保護する(=継承を無効にする)場合は true。
継承を許可する(=継承を有効にする)場合は false。

2番目:preserveInheritance
継承されたアクセス規則を保持する場合は true。
継承されたアクセス規則を削除する場合は false。
isProtected が false の場合、このパラメーターは無視されます。

参考URLは以下です。(ありがとうございます)
Powershellでフォルダやファイルのアクセス権を設定する | いろんなサーバー設定研究所
ObjectSecurity.SetAccessRuleProtection メソッド (Boolean, Boolean) (System.Security.AccessControl)


4. 「Users」へのアクセス権の削除
「Get-Acl」で現在のフォルダアクセス権をオブジェクトとして取得、
「Select-Object」の「-ExpandProperty」オプションを使用して、「Access」要素を展開しています。
「-ExpandProperty」についてはこちら
オブジェクト型変数の値について

Select-Objectはパラメータ名を指定しないと-Propertyパラメータが指定されたとみなされ、 先述のような動作をしますが、明示的に-ExpandPropertyパラメータを指定することで 「指定プロパティの値を展開したオブジェクト」を出力するようにもできます。

さらに「Where-Object」でグループ名「BUILTIN\Users」で抽出しています。

展開、抽出した値は、一つずつ削除の対象とするために「foreach」で読み込みます。
そして、オブジェクトのメソッド「.RemoveAccessRule」で権限を削除します。
設定後、「Set-Acl」で設定したアクセス権オブジェクトを実フォルダへ反映させます。

参考URLは以下です。(ありがとうございます。「素敵なおひげ」さんには毎度お世話になっております。)
Windows - PowerShellでフォルダのACLユーザを削除したい(119322)|teratail


(後編へ続く)