public override InitialSessionStateEntry Clone() { SessionStateFunctionEntry entry = new SessionStateFunctionEntry(base.Name, this._definition, this._options, base.Visibility, this._scriptBlock, this._helpFile); entry.SetModule(base.Module); return(entry); }
private static List<string> GetSingleAstRequiredModules(Ast ast, Token[] tokens) { List<string> modules = new List<string>(); List<string> resources = new List<string>(); var imports = tokens.Where(token => String.Compare(token.Text, "Import-DscResource", StringComparison.OrdinalIgnoreCase) == 0); // // Create a function with the same name as Import-DscResource keyword and use powershell // argument function binding to emulate Import-DscResource argument binding. // InitialSessionState initialSessionState = InitialSessionState.Create(); SessionStateFunctionEntry importDscResourcefunctionEntry = new SessionStateFunctionEntry( "Import-DscResource", @"param($Name, $ModuleName) if ($ModuleName) { foreach ($m in $ModuleName) { $global:modules.Add($m) } } else { foreach ($n in $Name) { $global:resources.Add($n) } } "); initialSessionState.Commands.Add(importDscResourcefunctionEntry); initialSessionState.LanguageMode = PSLanguageMode.RestrictedLanguage; var moduleVarEntry = new SessionStateVariableEntry("modules", modules, ""); var resourcesVarEntry = new SessionStateVariableEntry("resources", resources, ""); initialSessionState.Variables.Add(moduleVarEntry); initialSessionState.Variables.Add(resourcesVarEntry); using (System.Management.Automation.PowerShell powerShell = System.Management.Automation.PowerShell.Create(initialSessionState)) { foreach (var import in imports) { int startOffset = import.Extent.StartOffset; var asts = ast.FindAll(a => IsCandidateForImportDscResourceAst(a, startOffset), true); int longestLen = -1; Ast longestCandidate = null; foreach (var candidatAst in asts) { int curLen = candidatAst.Extent.EndOffset - candidatAst.Extent.StartOffset; if (curLen > longestLen) { longestCandidate = candidatAst; longestLen = curLen; } } // longestCandidate should contain AST for import-dscresource, like "Import-DSCResource -Module x -Name y". if (longestCandidate != null) { string importText = longestCandidate.Extent.Text; // We invoke-command "importText" here. Script injection is prevented: // We checked that file represents a valid AST without errors. powerShell.AddScript(importText); powerShell.Invoke(); powerShell.Commands.Clear(); } } } modules.AddRange(resources.Select(GetModuleNameForDscResource)); return modules; }
/// <summary> /// Add an new SessionState function entry to this session state object... /// </summary> /// <param name="entry">The entry to add</param> internal void AddSessionStateEntry(SessionStateFunctionEntry entry) { ScriptBlock sb = entry.ScriptBlock.Clone(); FunctionInfo fn = this.SetFunction(entry.Name, sb, null, entry.Options, false, CommandOrigin.Internal, this.ExecutionContext, entry.HelpFile, true); fn.Visibility = entry.Visibility; fn.Module = entry.Module; fn.ScriptBlock.LanguageMode = PSLanguageMode.FullLanguage; }
public override InitialSessionStateEntry Clone() { SessionStateFunctionEntry entry = new SessionStateFunctionEntry(base.Name, this._definition, this._options, base.Visibility, this._scriptBlock, this._helpFile); entry.SetModule(base.Module); return entry; }
public static InitialSessionState GetSessionStateForCommands(CommandInfo[] commands) { InitialSessionState iss = InitialSessionState.CreateDefault(); Dictionary<string, SessionStateCommandEntry> commandCache = new Dictionary<string, SessionStateCommandEntry>(); foreach (SessionStateCommandEntry ssce in iss.Commands) { commandCache[ssce.Name] = ssce; } iss.ApartmentState = ApartmentState.STA; iss.ThreadOptions = PSThreadOptions.ReuseThread; if (commands.Length == 0) { return iss; } foreach (CommandInfo cmd in commands) { if (cmd.Module != null) { if (cmd.ModuleName == "WPK") { if (cmd is AliasInfo) { SessionStateAliasEntry alias = new SessionStateAliasEntry(cmd.Name, cmd.Definition); iss.Commands.Add(alias); continue; } if (cmd is FunctionInfo) { SessionStateFunctionEntry func = new SessionStateFunctionEntry(cmd.Name, cmd.Definition); iss.Commands.Add(func); continue; } if (cmd is CmdletInfo) { CmdletInfo cmdletData = cmd as CmdletInfo; SessionStateCmdletEntry cmdlet = new SessionStateCmdletEntry(cmd.Name, cmdletData.ImplementingType, cmdletData.HelpFile); iss.Commands.Add(cmdlet); } } else { string manifestPath = cmd.Module.Path.Replace(".psm1",".psd1").Replace(".dll", ".psd1"); if (System.IO.File.Exists(manifestPath)) { iss.ImportPSModule(new string[] { manifestPath }); } else { iss.ImportPSModule(new string[] { cmd.Module.Path }); } continue; } } if (cmd is AliasInfo) { CommandInfo loopCommand = cmd; while (loopCommand is AliasInfo) { SessionStateAliasEntry alias = new SessionStateAliasEntry(loopCommand.Name, loopCommand.Definition); iss.Commands.Add(alias); loopCommand = (loopCommand as AliasInfo).ReferencedCommand; } if (loopCommand is FunctionInfo) { SessionStateFunctionEntry func = new SessionStateFunctionEntry(loopCommand.Name, loopCommand.Definition); iss.Commands.Add(func); } if (loopCommand is CmdletInfo) { CmdletInfo cmdletData = loopCommand as CmdletInfo; SessionStateCmdletEntry cmdlet = new SessionStateCmdletEntry(cmd.Name, cmdletData.ImplementingType, cmdletData.HelpFile); iss.Commands.Add(cmdlet); } } if (cmd is FunctionInfo) { SessionStateFunctionEntry func = new SessionStateFunctionEntry(cmd.Name, cmd.Definition); iss.Commands.Add(func); } if (cmd is CmdletInfo) { CmdletInfo cmdletData = cmd as CmdletInfo; SessionStateCmdletEntry cmdlet = new SessionStateCmdletEntry(cmd.Name, cmdletData.ImplementingType, cmdletData.HelpFile); iss.Commands.Add(cmdlet); } } return iss; }
internal void AddSessionStateEntry(SessionStateFunctionEntry entry) { ScriptBlock function = entry.ScriptBlock.Clone(false); if (function.IsSingleFunctionDefinition(entry.Name)) { throw PSTraceSource.NewArgumentException("entry"); } FunctionInfo info = this.SetFunction(entry.Name, function, null, entry.Options, false, CommandOrigin.Internal, this.ExecutionContext, entry.HelpFile, true); info.Visibility = entry.Visibility; info.SetModule(entry.Module); info.ScriptBlock.LanguageMode = 0; }
internal void AddBuiltInEntries(bool addSetStrictMode) { this.AddBuiltInVariables(); this.AddBuiltInFunctions(); this.AddBuiltInAliases(); if (addSetStrictMode) { SessionStateFunctionEntry entry = new SessionStateFunctionEntry("Set-StrictMode", ""); this.AddSessionStateEntry(entry); } }
/// <summary> /// Add all of the default built-in functions to this session state instance... /// </summary> internal void AddBuiltInEntries(bool addSetStrictMode) { // Other built-in variables AddBuiltInVariables(); AddBuiltInFunctions(); AddBuiltInAliases(); if (addSetStrictMode) { SessionStateFunctionEntry f = new SessionStateFunctionEntry("Set-StrictMode", ""); this.AddSessionStateEntry(f); } }