ディレクトリのアクセス権を設定する

Windows10の動きが不安なので今後しばらく必要になるだろうからモジュール作っときましょ

function Get-AccessRule
{
    [OutputType([Security.AccessControl.FileSystemAccessRule])]
    [CmdletBinding()]
    param
    (
        [parameter(Mandatory,Position=0,ValueFromPipeline)]
        [string] $Path
    )
    process
    {
        return Get-Acl $Path | select -ExpandProperty Access
    }
}

function New-AccessRule
{
    [OutputType([Security.AccessControl.FileSystemAccessRule])]
    [CmdletBinding(DefaultParameterSetName='directory')]
    param
    (
        [parameter(Mandatory,ParameterSetName='directory')]
        [parameter(Mandatory,ParameterSetName='file')]
        [string] $Identity,
        [parameter(Mandatory,ParameterSetName='directory')]
        [parameter(Mandatory,ParameterSetName='file')]
        [Security.AccessControl.FileSystemRights] $FileSystemRights,
        [parameter(Mandatory,ParameterSetName='directory')]
        [Security.AccessControl.InheritanceFlags] $InheritanceFlags,
        [parameter(Mandatory,ParameterSetName='directory')]
        [Security.AccessControl.PropagationFlags] $PropagationFlags,
        [parameter(Mandatory,ParameterSetName='directory')]
        [parameter(Mandatory,ParameterSetName='file')]
        [Security.AccessControl.AccessControlType] $AccessControlType,
        [parameter(ParameterSetName='directory')]
        [switch] $Directory,
        [parameter(ParameterSetName='file')]
        [switch] $File
    )
    $params = @()
    $params += $Identity
    $params += $FileSystemRights
    if ($PSCmdlet.ParameterSetName -eq 'directory')
    {
        $params += $InheritanceFlags
        $params += $PropagationFlags
    }
    $params += $AccessControlType

    return New-Object System.Security.AccessControl.FileSystemAccessRule $params
}

function Set-AccessRule
{
    [CmdletBinding()]
    param
    (
        [parameter(Mandatory,Position=0)]
        [string] $Path,
        [parameter(Mandatory,ValueFromPipeline,ValueFromPipelineByPropertyName)]
        [Security.AccessControl.FileSystemAccessRule] $Access
    )
    begin
    {
        $acl = Get-Acl $Path
    }
    process
    {
        $acl.AddAccessRule($Access)
    }
    end
    {
        $acl | Set-Acl -Path $Path
    }
}

んでは、%LOCALAPPDATA%\Packages\ALL APPLICATION PACKAGESの読み書き権限を加えましょう

PS> Get-AccessRule $env:LOCALAPPDATA\Packages\ | ? IdentityReference -Match all
# ない
PS> $rule = New-AccessRule -Identity "ALL APPLICATION PACKAGES" -FileSystemRights ReadAndExecute -InheritanceFlags ContainerInherit,ObjectInherit -PropagationFlags None -AccessControlType Allow
PS> $rule | Set-AccessRule $env:LOCALAPPDATA\Packages\
PS> Get-AccessRule $env:LOCALAPPDATA\Packages\ | ? IdentityReference -Match all

FileSystemRights  : ReadAndExecute, Synchronize
AccessControlType : Allow
IdentityReference : APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES
IsInherited       : False
InheritanceFlags  : ContainerInherit, ObjectInherit
PropagationFlags  : None

できた
New-AccessRule-IdentityDynamicParamでユーザーやらグループやらの一覧引っ張ってきたかったんだけど、肝心のALL APPLICATION PACKAGESがどっから出てくるのかわかんなくて保留
WMIでなんとかなるのかと思ったのに…他のユーザーやグループは取ってこれるのにね
ちょっとよくわかってないんだ

Remove-AccessRuleなんかもあったほうが良かろうからあとで書き足しとこう

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中