web-dev-qa-db-ja.com

フォルダーのアクセス許可を設定するPowerShell

フォルダのアクセス許可を適用する際に「デフォルト」オプションを使用しようとしています。つまり、フォルダの「プロパティ」で「フルコントロール、書き込み、読み取りなど」を使用するということです。

次のスクリプトはユーザーを追加するために機能しますが、フォルダーのプロパティメニューに表示されるチェックボックスが付いているものではなく、「特別なアクセス許可」を適用します。

$Acl = Get-Acl "\\R9N2WRN\Share"

$Ar = New-Object System.Security.AccessControl.FileSystemAccessRule ("user","FullControl","Allow")

$Acl.SetAccessRule($Ar)
Set-Acl "\\R9N2WRN\Share" $Acl

私は間違って何をしていますか?

29
The Woo

FileSystemAccessRule()コンストラクターで継承を指定すると、以下の変更されたコードで示されるように、これを修正します("FullControl""Allow"の間に挿入された2つの新しいconstuctorパラメーターに注意してください).

$Acl = Get-Acl "\\R9N2WRN\Share"

$Ar = New-Object System.Security.AccessControl.FileSystemAccessRule("user", "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow")

$Acl.SetAccessRule($Ar)
Set-Acl "\\R9N2WRN\Share" $Acl

このトピック

「お持ちの方法でFileSystemAccessRuleを作成すると、InheritanceFlagsプロパティはNoneに設定されます。GUIでは、これは[このフォルダーのみ]に設定された[適用先]ボックスを持つACEに対応します。詳細設定を使用します。」

変更をテストしましたが、動作しますが、もちろん、MVPがそのトピックに回答を投稿したためです。

58
PeterK

Gamalielの答え を参照すると、$ argsは実行時にスクリプトに渡される引数の配列です。Gamalielが使用している方法では使用できないためです。これは実際に機能しています:

$myPath = 'C:\whatever.file'
# get actual Acl entry
$myAcl = Get-Acl "$myPath"
$myAclEntry = "Domain\User","FullControl","Allow"
$myAccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($myAclEntry)
# prepare new Acl
$myAcl.SetAccessRule($myAccessRule)
$myAcl | Set-Acl "$MyPath"
# check if added entry present
Get-Acl "$myPath" | fl
2
Mike L'Angelo

サブフォルダーやその他の再帰的なものを含む多くのサブフォルダーを扱う必要がある場合。 @ Mike L'Angelo の小さな改善

$mypath = "path_to_folder"
$myacl = Get-Acl $mypath
$myaclentry = "username","FullControl","Allow"
$myaccessrule = New-Object System.Security.AccessControl.FileSystemAccessRule($myaclentry)
$myacl.SetAccessRule($myaccessrule)
Get-ChildItem -Path "$mypath" -Recurse -Force | Set-Acl -AclObject $myacl -Verbose

最後の行では冗長性はオプションです

0
Vladimir
$path = "C:\DemoFolder"
$acl = Get-Acl $path
$username = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name
$Attribs = $username, "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow"
$AccessRule = New-Object System.Security.AcessControl.FileSystemAccessRule($Attribs)
$acl.SetAccessRule($AccessRule)
$acl | Set-Acl $path
Get-ChildItem -Path "$path" -Recourse -Force | Set-Acl -aclObject $acl -Verbose
0
Norman