using System.Management.Automation; using Security2; using System.IO; using System.Linq; using System; using System.Security.AccessControl; namespace NTFSSecurity { #region Enable-Privileges [Cmdlet(VerbsLifecycle.Enable, "Privileges")] [OutputType(typeof(ProcessPrivileges.PrivilegeAndAttributes))] public class EnablePrivileges : BaseCmdletWithPrivControl { private bool enablePrivileges = false; private SwitchParameter passThru; public string[] Path { get; set; } [Parameter] public SwitchParameter PassThru { get { return passThru; } set { passThru = value; } } protected override void BeginProcessing() { base.BeginProcessing(); } protected override void ProcessRecord() { var privateData = (System.Collections.Hashtable)this.MyInvocation.MyCommand.Module.PrivateData; var psCallStack = (CallStackFrame)this.InvokeCommand.InvokeScript("Get-PSCallStack")[1].BaseObject; try { enablePrivileges = (bool)privateData["EnablePrivileges"]; } catch (Exception ex) { throw new ParseException("Could not parse the module's PrivateData field in the module's psd1 file. Please refer to the documentation for further details", ex); } //if the command is called from NTFSSecurity.Init.ps1 and EnablePrivileges is set to true in the NTFSSecurity.psd1 or if the cmdlet is called from somewhere else if ((psCallStack.InvocationInfo.MyCommand.Name == "NTFSSecurity.Init.ps1" && enablePrivileges == true)) { this.EnableFileSystemPrivileges(false); } else if (psCallStack.InvocationInfo.MyCommand.Name != "NTFSSecurity.Init.ps1") { this.EnableFileSystemPrivileges(false); } if (passThru) { this.WriteObject(this.privControl.GetPrivileges()); } } protected override void EndProcessing() { //nothing as we want to keep the privileges enabled } } #endregion Enable-Privileges #region Disable-Privileges [Cmdlet(VerbsLifecycle.Disable, "Privileges")] [OutputType(typeof(ProcessPrivileges.PrivilegeAndAttributes))] public class DisablePrivileges : BaseCmdletWithPrivControl { private SwitchParameter passThru; public string[] Path { get; set; } [Parameter] public SwitchParameter PassThru { get { return passThru; } set { passThru = value; } } protected override void BeginProcessing() { base.BeginProcessing(); } protected override void ProcessRecord() { if (this.privControl.GetPrivileges() .Where(p => p.PrivilegeState == ProcessPrivileges.PrivilegeState.Enabled) .Where(p => ( p.Privilege == ProcessPrivileges.Privilege.TakeOwnership) | (p.Privilege == ProcessPrivileges.Privilege.Restore) | (p.Privilege == ProcessPrivileges.Privilege.Backup)) .Count() == 0) { this.WriteError(new ErrorRecord(new AdjustPriviledgeException("Privileges are not enabled"), "Disable Privilege Error", ErrorCategory.SecurityError, null)); return; } this.DisableFileSystemPrivileges(); this.WriteVerbose("The privileges 'TakeOwnership', 'Restore' and 'Backup' are now enabled."); if (passThru) { this.WriteObject(this.privControl.GetPrivileges()); } } protected override void EndProcessing() { //nothing as priviliges should already been cleaned up } } #endregion Enable-Privileges #region Get-Privileges [Cmdlet(VerbsCommon.Get, "Privileges")] [OutputType(typeof(ProcessPrivileges.PrivilegeAndAttributes))] public class GetPrivileges : BaseCmdlet { public string[] Path { get; set; } protected override void BeginProcessing() { base.BeginProcessing(); } protected override void ProcessRecord() { var privControl = new PrivilegeControl(); this.WriteObject(privControl.GetPrivileges(), true); } } #endregion Get-Privileges }