Set-Privilege.ps1

<#PSScriptInfo
.VERSION 1.1.1
 
.GUID 84990677-60ab-4984-9de1-fcfc19f5209d
 
.AUTHOR Pyprohly
 
.TAGS Security, Privilege, TokenPrivilege
 
.RELEASENOTES
    1.1.1 | 2017-03-29
        Set-Privilege 'Privilege' parameter renamed to 'Name'. 'PrivilegeName' is an alias.
 
    1.1.0 | 2017-03-26
        Set-Privilege called if script is invoked and not dot sourced
        Set-Privilege '-Privilege' argument no longer requires "Se" and "Privilege" affixes
        LookupPrivilegeValue function signature parameter 'pluid' modifier changed from 'ref' to 'out'
 
    1.0 | 2017-03-25
        Initial release
#>


<#
.DESCRIPTION
    Toggle privileges for the current PowerShell session.
#>



function Set-Privilege {
    [OutputType('System.Boolean')]
    param(
        [Parameter(Mandatory=$true)]
        [ValidateSet(
            'SeAssignPrimaryTokenPrivilege', 'AssignPrimaryToken',
            'SeAuditPrivilege', 'Audit',
            'SeBackupPrivilege', 'Backup',
            'SeChangeNotifyPrivilege', 'ChangeNotify',
            'SeCreateGlobalPrivilege', 'CreateGlobal',
            'SeCreatePagefilePrivilege', 'CreatePagefile',
            'SeCreatePermanentPrivilege', 'CreatePermanent',
            'SeCreateSymbolicLinkPrivilege', 'CreateSymbolicLink',
            'SeCreateTokenPrivilege', 'CreateToken',
            'SeDebugPrivilege', 'Debug',
            'SeEnableDelegationPrivilege', 'EnableDelegation',
            'SeImpersonatePrivilege', 'Impersonate',
            'SeIncreaseBasePriorityPrivilege', 'IncreaseBasePriority',
            'SeIncreaseQuotaPrivilege', 'IncreaseQuota',
            'SeIncreaseWorkingSetPrivilege', 'IncreaseWorkingSet',
            'SeLoadDriverPrivilege', 'LoadDriver',
            'SeLockMemoryPrivilege', 'LockMemory',
            'SeMachineAccountPrivilege', 'MachineAccount',
            'SeManageVolumePrivilege', 'ManageVolume',
            'SeProfileSingleProcessPrivilege', 'ProfileSingleProcess',
            'SeRelabelPrivilege', 'Relabel',
            'SeRemoteShutdownPrivilege', 'RemoteShutdown',
            'SeRestorePrivilege', 'Restore',
            'SeSecurityPrivilege', 'Security',
            'SeShutdownPrivilege', 'Shutdown',
            'SeSyncAgentPrivilege', 'SyncAgent',
            'SeSystemEnvironmentPrivilege', 'SystemEnvironment',
            'SeSystemProfilePrivilege', 'SystemProfile',
            'SeSystemtimePrivilege', 'SystemTime',
            'SeTakeOwnershipPrivilege', 'TakeOwnership',
            'SeTcbPrivilege', 'Tcb', 'TrustedComputingBase',
            'SeTimeZonePrivilege', 'TimeZone',
            'SeTrustedCredManAccessPrivilege', 'TrustedCredManAccess',
            'SeUndockPrivilege', 'Undock',
            'SeUnsolicitedInputPrivilege', 'UnsolicitedInput'
        )]
        [Alias('PrivilegeName')]
        [string[]]
        $Name,

        [switch]
        $Disable
    )

    begin {
        $signature = '[DllImport("ntdll.dll", EntryPoint = "RtlAdjustPrivilege")]
        public static extern IntPtr SetPrivilege(int Privilege, bool bEnablePrivilege, bool IsThreadPrivilege, out bool PreviousValue);
 
        [DllImport("advapi32.dll")]
        public static extern bool LookupPrivilegeValue(string host, string name, out long pluid);'

        Add-Type -MemberDefinition $signature -Namespace AdjPriv -Name Privilege

        function PrivConst ($str) {
            if ($str -eq 'TrustedComputingBase') {
                return 'SeTcbPrivilege'
            } elseif (($str -match '^Se.*Privilege$')) {
                return $str
            }
            "Se${str}Privilege"
        }
    }

    process {
        foreach ($priv in $Name) {
            [long]$privId = $null
            $null = [AdjPriv.Privilege]::LookupPrivilegeValue($null, (PrivConst $priv), [ref]$privId)
            ![bool][long][AdjPriv.Privilege]::SetPrivilege($privId, !$Disable, $false, [ref]$null)
        }
    }
}

if ($MyInvocation.InvocationName -ne '.') {
    Set-Privilege
}