using namespace System.Security.AccessControl;
using namespace System.Security.Principal;

$null = New-Module {
    $uacOption = "EnableLUA";
    $systemPolicyPath = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System";

    $uacSetter = {
        param(
            [bool] $Value
        )

        Set-ItemProperty -Path $systemPolicyPath -Name $uacOption -Value ([int]$Value);
    };

    <#
        .SYNOPSIS
        Determines whether UAC is enabled.
    #>
    function Get-UACStatus {
        [bool](Get-ItemProperty -Path $systemPolicyPath -Name $uacOption);
    }

    <#
        .SYNOPSIS
        Enables UAC.
    #>
    function Enable-UAC {
        & $uacSetter $true;
    }

    <#
        .SYNOPSIS
        Disables UAC.
    #>
    function Disable-UAC {
        & $uacSetter $false;
    }

    <#
        .SYNOPSIS
        Sets read/write permissions for users at the specified path.

        .PARAMETER Path
        The path to allow access to users.
    #>
    function Set-UserPermissions {
        param(
            [string] $Path
        )

        $acl = Get-Acl $Path;

        $acl.AddAccessRule(
            [FileSystemAccessRule]::new(
                [SecurityIdentifier]::new([WellKnownSidType]::BuiltinUsersSid, $null),
                [FileSystemRights]::FullControl,
                (& {
                    if (Test-Path -PathType Container $Path) {
                        [InheritanceFlags]::ObjectInherit -bor [InheritanceFlags]::ContainerInherit
                    }
                    else {
                        0
                    }
                }),
                [PropagationFlags]::InheritOnly,
                [AccessControlType]::Allow));

        Set-Acl $Path $acl;
    }
};