PowerShell で、Windows フォルダー プロパティ ウィンドウで通常行うことをエミュレートしようとしています:フォルダー プロパティ → セキュリティ → 詳細 → アクセス許可 → アクセス許可の変更...
その GUI には、次のチェック ボックスがあります。
- このオブジェクトの親から継承可能な権限を含める
- すべての子オブジェクトのアクセス許可を、このオブジェクトから継承可能なアクセス許可に置き換えます -
PropagationFlag
=に対応すると思いますNone
[追加/編集...] ボタンをクリックすると、次のオプションを含むドロップダウン リストが表示されますInheritanceFlags
。それぞれに対応するものは何ですか? 実験で見つけたものを埋めました
- このフォルダのみ -
None
- このフォルダーのサブフォルダーとファイル
- このフォルダーとサブフォルダー
- このフォルダとファイル
- サブフォルダーとファイルのみ -
ContainerInherit, ObjectInherit
- サブフォルダのみ -
ContainerInherit
- ファイルのみ -
ObjectInherit
[これらのアクセス許可を、このコンテナー内のオブジェクトやコンテナーのみに適用する]チェック ボックスに対応するフラグはどれですか?
PropagationsFlags
また、これらは次のことを意味すると判断しました。
- InheritOnly (継承するように設定されている場合にのみ、現在のすべての子オブジェクトに ACE が伝達されます)
- NoPropagateInherit (ACE は現在の子オブジェクトに伝達されません)
- なし (この ACE はすべての子オブジェクトに伝播され、以前のものを上書きし、継承をオンにします)
既存のユーザー/グループに追加のアクセス許可を追加する方法、またはフォルダーのアクセス許可に追加のユーザー/グループを追加し、それを「このフォルダーのサブフォルダーとファイル」ではなく「すべての子オブジェクトのアクセス許可を置き換える」で伝達する方法を知りたいですユーザープロファイルのシンボリックリンクフォルダーなど、正当な理由で意図的に他の特別なアクセス許可を持つサブフォルダーがある場合は、このオブジェクトから継承可能なアクセス許可」を使用してください。
私が現在取り組んでいるコードは以下のとおりです。最終的には、ユーザー プロファイルを含む複数のドメイン内の多くのコンピューターのさまざまなフォルダーで使用する予定です。c:\users\{username}
function check-permissions ( $folder ) {
$GroupName = "Domain Admins"
if ( -not (Test-Path -LiteralPath $folder) ) {
Write-Output "Cannot find $folder"
} else {
((get-acl -literalPath $folder).access).IdentityReference.Value |
findstr /i ($env:USERDOMAIN + "\"+ $GroupName) |
out-null
$result = $?
if ( -not $result ) {
write-output ($folder + ": adding permissions")
#adding new permissions
$colRights = [System.Security.AccessControl.FileSystemRights]"FullControl"
$InheritanceFlag = [System.Security.AccessControl.InheritanceFlags]::ContainerInherit, [System.Security.AccessControl.InheritanceFlags]::ObjectInherit
$PropagationFlag = [System.Security.AccessControl.PropagationFlags]::InheritOnly
$objType =[System.Security.AccessControl.AccessControlType]::Allow
$objUser = New-Object System.Security.Principal.NTAccount($env:USERDOMAIN + "\" + $GroupName)
$objACE = New-Object System.Security.AccessControl.FileSystemAccessRule ($objUser, $colRights, $InheritanceFlag, $PropagationFlag, $objType)
# output the ACE
$objACE | format-list *
#$objACL = Get-Acl -literalPath $folder # This gets the full security info but substitutes the different user as owner, which we don't want or it will overwrite the owner info with the wrong user when we use set-acl
$objACL = (Get-Item -literalPath $folder).GetAccessControl('Access')
if ( -not $? ) {
Write-Output ("Failed to get permissions on: " + $folder)
} else {
$objACL.AddAccessRule($objACE)
if ( $objACL ) { #objACL exists
#Set-ACL -literalPath ($folder) -AclObj $objACL # This tries to set the owner too
[System.IO.Directory]::SetAccessControl($folder,$objACL) # This seems to work
} else { # $objACL is null
write-output "Error developing new permissions object. Leaving folder permissions alone."
}
}
} else {
write-debug ($folder + ": Permissions OK")
}
}
}
check-permissions "c:\temp\test\a"