共有フォルダ作成や変名を禁止する

共有フォルダを作ったけど、ユーザに好き勝手にされないためのメモ

共有フォルダの悩み

共有フォルダを作って部門に開放すると、うちの会社は子供の集、じゃなかった自由な社風なので禁止されていないことはやって良い扱いをされてしまいます。

勝手にフォルダを作られたり、フォルダの名前が知らないうちに変わっていたり。
…メンテナンスが面倒だろうが!

とういことで対策することにしました。

フォルダの変名を禁止する

フォルダの「削除」を拒否すればできます。

手動でのやり方

  1. セキュリティの詳細設定をひらく
  2. 追加
  3. 「プリンシパルの設定」を選び、設定するユーザー/グループを設定
    「種類:拒否,適用先:このフォルダーのみ」を選択
  4. 「高度なアクセス許可を表示」をクリック
    →「削除」をクリックしてその他のチェックはすべて外す。
  5. 適用

PowerShellで行う

おんなじ作業を繰り返す場合はscriptにしておきたいですね、ということでPowerShell

#設定したいユーザ/グループを指定する
$Group = "contoso\hogehoge"
#設定したい共有フォルダのパスを指定する
$TargetFolder = "\\server01.contoso.lodal\SharedFolder"

#Folderの変名を禁止する&継承しない
$AclParam = @($Group ,"Delete", "Deny")

パラメーターを使ってアクセスルールを作る
$Rule = New-Object  System.Security.AccessControl.FileSystemAccessRule  $AclParam

#現行のアクセスコントロールリストを取得する
$Acl = Get-Acl $TargetFolder
#ルールを追加する
$Acl.AddAccessRule($Rule)
#追加されたアクセスコントロールリストを反映させる
$Acl|Set-Acl $TargetFolder

フォルダ作成を禁止する

「フォルダの作成/データの追加」を拒否します。

手動でのやり方

上記と同じ手順で最後のところだけ「フォルダの作成/データの追加」にすればできます。

Powershellで行う

アクセスコントロールでCreateDirectoriesをDenyすればできます。

$AclParam = @($Group ,"CreateDirectories", "Deny")
$Rule = New-Object System.Security.AccessControl.FileSystemAccessRule $AclParam

あとの手順は同じです。

フォルダの作成とすでにあるフォルダ・ファイルの変名・削除を禁止

組織やプロジェクトの共有フォルダを管理者で作って、第一階層に勝手にフォルダを作られたり変名できないようにする、というのを一気にやるスクリプト。

$Group = "contoso\hogehoge"
$TargetFolder = "\\server01.contoso.lodal\SharedFolder"

#SharedFolder直下のフォルダ作成を禁止する
$AclParam = @($Group ,"CreateDirectories", "Deny")

$Rule = New-Object  System.Security.AccessControl.FileSystemAccessRule  $AclParam
$Acl = Get-Acl $TargetFolder
$Acl.AddAccessRule($Rule)
$Acl|Set-Acl $TargetFolder

#Folderの変名を禁止する&継承しない
$AclParam = @($Group ,"Delete", "Deny")

$Rule = New-Object  System.Security.AccessControl.FileSystemAccessRule  $AclParam
$TargetAcls = Get-ChildItem $TargetFolder | Get-Acl
foreach($Acl in $TargetAcls){
  $Acl.AddAccessRule($Rule)
  $Acl|Set-Acl $ACL.Path
  }

アクセスコントロールエントリの作り方

上で作ったアクセスコントロールの”CreateDirectories”、実際に作ってオブジェクトをみるとAppendDataと表示されます。こんな感じ。

PS C:\> $Group =".\Users"
PS C:\> $AclParam = @($Group ,"CreateDirectories", "Deny")
PS C:\> $Rule = New-Object  System.Security.AccessControl.FileSystemAccessRule  $AclParam
PS C:\> PS C:\> $Rule


FileSystemRights  : AppendData
AccessControlType : Deny
IdentityReference : .\Users
IsInherited       : False
InheritanceFlags  : None
PropagationFlags  : None

 

.netのenum値でintが4、2進数で100、Fileに適用されるとAppendData(データ追加),Folderに適用されるとCreatDirectories,ValueはAppendDataということみたいです。

InheritanceFlagsやPropagationFlagsもNoneと表示されます。

アクセスコントロールエントリのパラメーター

Microsoft Docsによるとパラメーターの作り方は3つか5つ。

FileSystemAccessRule(IdentityReference, FileSystemRights, AccessControlType)
FileSystemAccessRule(IdentityReference, FileSystemRights, InheritanceFlags, PropagationFlags, AccessControlType)
FileSystemAccessRule(String, FileSystemRights, AccessControlType)
FileSystemAccessRule(String, FileSystemRights, InheritanceFlags, PropagationFlags, AccessControlType)

3つの場合は継承なしで作られます。継承ありの場合は引数を5つにしてAccessControlTypeの間に2つFlagを指定します。

FileSystemRightsの指定

enum値の一覧はこのコマンドで出せます。

[system.enum]::getnames([System.Security.AccessControl.FileSystemRights])

enumに対応する数値はビットの立っている場所でFileSystemRightsを決定するようです。なので数値は飛び飛びになります。詳しくは下記を御覧ください。

Windows ACE の AccessMask(マスク)ビットフラグの対応関係

enumをオブジェクトで作ってbit論理和(-bor)で作るという情報もありますが、そんなことしなくてもPowerShellだと文字列で列記するだけで作れます。(C#の情報なんですかねぇ…?)

詳しくはこちら
Microsoft Docs FileSystemAccessRule Class

InheritanceFlags Enum

Microsoft Docsより

None 0 ACE は、子オブジェクトによって継承されません。

ContainerInherit 1 ACE は、子コンテナー オブジェクトによって継承されます。

ObjectInherit 2 ACE は、子リーフ オブジェクトによって継承されます。

GUIで指定する場合のDefaultは子のコンテナー&オブジェクト両方に継承されます。.Netオブジェクトを何も指定せずに作るとNone(継承しない)がDefaultです。
InheritanceFlags Enumはビット値なので1(2進数で01),2(2進数で10)のビット和は3(2進数で11)です。よくある変更権限を継承ありで作ろうとすると、下記でできます。

$AclParam = @($Group ,"Modify",3,"None", "Allow")

もしくは、下記のように列挙することでも作成できました。

$AclParam = @($Group ,"Modify","ContainerInherit, ObjectInherit","None", "Allow")

PropagationFlags Enum

Microsoft Docsより

None 0 継承フラグが設定されていないことを指定します。

NoPropagateInherit 1 ACE を子オブジェクトに反映させないことを指定します。

InheritOnly 2 ACE を子オブジェクトだけに反映させることを指定します。 この操作には、子コンテナー オブジェクトと子リーフ オブジェクトの両方が含まれます。

GUIでのdefaultは継承フラグなしです。

ユーザーに変更権限を与え、トップフォルダの変更を禁止する

$Group = "contoso\hogehoge"
$TargetFolder = "\\server01.contoso.lodal\SharedFolder"
$Acl = Get-Acl $TargetFolder

#SharedFolderの変更権限を付与する(継承させる)
$AclParam = @($Group ,"Modify","ContainerInherit, ObjectInherit","None", "Allow")
$Rule = New-Object  System.Security.AccessControl.FileSystemAccessRule  $AclParam
$Acl.AddAccessRule($Rule)
$Acl|Set-Acl $TargetFolder

#SharedFolder直下のフォルダ作成を禁止する
$AclParam = @($Group ,"AppendData", "Deny")
#継承しないことを明示的に宣言する書式(上と同等)
$AclParam = @($Group ,"AppendData","None","None", "Deny")

$Rule = New-Object  System.Security.AccessControl.FileSystemAccessRule  $AclParam
$Acl.AddAccessRule($Rule)
$Acl|Set-Acl $TargetFolder

#Folderの変名を禁止する&継承しない
$AclParam = @($Group ,"Delete", "Deny")
#継承しないことを明示的に宣言する書式(上と同等)
$AclParam = @($Group ,"Delete","None","None", "Deny")

$Rule = New-Object  System.Security.AccessControl.FileSystemAccessRule  $AclParam
$TargetAcls = Get-ChildItem $TargetFolder | Get-Acl
foreach($Acl in $TargetAcls){
  $Acl.AddAccessRule($Rule)
  $Acl|Set-Acl $ACL.Path
  }

参考URL

GUIユーザーのためのPowerShell入門
【第19回】ファイルアクセス許可の設定変更

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください