From 856c2af3fe473819f2d31fc477e5df9cb32437c3 Mon Sep 17 00:00:00 2001 From: Steve Lee Date: Thu, 12 Oct 2017 10:14:45 -0700 Subject: [PATCH 001/617] wrapped STA code sections in `#if STAMODE` for potential future use removed -importsystemmodules switch from powershell.exe and related code removed -consolefile parameter from powershell.exe and related code --- .../host/msh/CommandLineParameterParser.cs | 29 +++-------- .../host/msh/ConsoleHost.cs | 49 ++++++++++--------- .../host/msh/ConsoleShell.cs | 12 ----- .../engine/InitialSessionState.cs | 10 ---- 4 files changed, 33 insertions(+), 67 deletions(-) diff --git a/src/Microsoft.PowerShell.ConsoleHost/host/msh/CommandLineParameterParser.cs b/src/Microsoft.PowerShell.ConsoleHost/host/msh/CommandLineParameterParser.cs index ff02a8dbb29..02fb43d913d 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/host/msh/CommandLineParameterParser.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/host/msh/CommandLineParameterParser.cs @@ -170,11 +170,10 @@ public override void WriteWarningLine(string message) internal class CommandLineParameterParser { internal static string[] validParameters = { - "psconsoleFile", "version", "nologo", "noexit", -#if !CORECLR +#if STAMODE "sta", "mta", #endif @@ -251,14 +250,6 @@ internal bool NoExit } } - internal bool ImportSystemModules - { - get - { - return _importSystemModules; - } - } - internal bool SkipProfiles { get @@ -416,6 +407,7 @@ private void DisplayBanner() } } +#if STAMODE internal bool StaMode { get @@ -426,17 +418,14 @@ internal bool StaMode } else { -#if CORECLR // Nano doesn't support STA COM apartment, so on Nano powershell has to use MTA as the default. - return false; -#else + // return false; // Win8: 182409 PowerShell 3.0 should run in STA mode by default return true; -#endif } } } - +#endif /// /// @@ -554,10 +543,6 @@ private void ParseHelper(string[] args) _noExit = true; noexitSeen = true; } - else if (MatchSwitch(switchKey, "importsystemmodules", "imp")) - { - _importSystemModules = true; - } else if (MatchSwitch(switchKey, "noprofile", "nop")) { _skipUserInit = true; @@ -728,7 +713,8 @@ private void ParseHelper(string[] args) break; } } -#if !CORECLR // explicit setting of the ApartmentState Not supported on NanoServer +#if STAMODE + // explicit setting of the ApartmentState Not supported on NanoServer else if (MatchSwitch(switchKey, "sta", "s")) { if (_staMode.HasValue) @@ -1184,6 +1170,7 @@ private bool CollectArgs(string[] args, ref int i) private string _helpText; private bool _abortStartup; private bool _skipUserInit; +#if STAMODE // Win8: 182409 PowerShell 3.0 should run in STA mode by default // -sta and -mta are mutually exclusive..so tracking them using nullable boolean // if true, then sta is specified on the command line. @@ -1191,6 +1178,7 @@ private bool CollectArgs(string[] args, ref int i) // if null, then none is specified on the command line..use default in this case // default is sta. private bool? _staMode = null; +#endif private bool _noExit = true; private bool _explicitReadCommandsFromStdin; private bool _noPrompt; @@ -1203,7 +1191,6 @@ private bool CollectArgs(string[] args, ref int i) private Collection _collectedArgs = new Collection(); private string _file; private string _executionPolicy; - private bool _importSystemModules = false; } } // namespace diff --git a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHost.cs b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHost.cs index cb1bd8992ba..a58906c9135 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHost.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHost.cs @@ -1435,7 +1435,11 @@ private uint Run(CommandLineParameterParser cpp, bool isPrestartWarned) // NTRAID#Windows Out Of Band Releases-915506-2005/09/09 // Removed HandleUnexpectedExceptions infrastructure - exitCode = DoRunspaceLoop(cpp.InitialCommand, cpp.SkipProfiles, cpp.Args, cpp.StaMode, cpp.ImportSystemModules, cpp.ConfigurationName); +#if STAMODE + exitCode = DoRunspaceLoop(cpp.InitialCommand, cpp.SkipProfiles, cpp.Args, cpp.StaMode, cpp.ConfigurationName); +#else + exitCode = DoRunspaceLoop(cpp.InitialCommand, cpp.SkipProfiles, cpp.Args, false, cpp.ConfigurationName); +#endif } while (false); @@ -1469,14 +1473,13 @@ private uint Run(string bannerText, string helpText, bool isPrestartWarned, stri /// The process exit code to be returned by Main. /// /// - private uint DoRunspaceLoop(string initialCommand, bool skipProfiles, Collection initialCommandArgs, bool staMode, - bool importSystemModules, string configurationName) + private uint DoRunspaceLoop(string initialCommand, bool skipProfiles, Collection initialCommandArgs, bool staMode, string configurationName) { ExitCode = ExitCodeSuccess; while (!ShouldEndSession) { - RunspaceCreationEventArgs args = new RunspaceCreationEventArgs(initialCommand, skipProfiles, staMode, importSystemModules, configurationName, initialCommandArgs); + RunspaceCreationEventArgs args = new RunspaceCreationEventArgs(initialCommand, skipProfiles, staMode, configurationName, initialCommandArgs); CreateRunspace(args); if (ExitCode == ExitCodeInitFailure) { break; } @@ -1515,10 +1518,12 @@ private uint DoRunspaceLoop(string initialCommand, bool skipProfiles, Collection _runspaceRef.Runspace.Close(); _runspaceRef = null; +#if STAMODE if (staMode) // don't recycle the Runspace in STA mode { ShouldEndSession = true; } +#endif } return ExitCode; @@ -1556,7 +1561,11 @@ private void CreateRunspace(object runspaceCreationArgs) { args = runspaceCreationArgs as RunspaceCreationEventArgs; Dbg.Assert(args != null, "Event Arguments to CreateRunspace should not be null"); - DoCreateRunspace(args.InitialCommand, args.SkipProfiles, args.StaMode, args.ImportSystemModules, args.ConfigurationName, args.InitialCommandArgs); +#if STAMODE + DoCreateRunspace(args.InitialCommand, args.SkipProfiles, args.StaMode, args.ConfigurationName, args.InitialCommandArgs); +#else + DoCreateRunspace(args.InitialCommand, args.SkipProfiles, false, args.ConfigurationName, args.InitialCommandArgs); +#endif } catch (ConsoleHostStartupException startupException) { @@ -1571,7 +1580,7 @@ private void CreateRunspace(object runspaceCreationArgs) [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] private void InitializeRunspace(string initialCommand, bool skipProfiles, Collection initialCommandArgs) { - DoCreateRunspace(initialCommand, skipProfiles, staMode: false, importSystemModules: false, configurationName: null, initialCommandArgs: initialCommandArgs); + DoCreateRunspace(initialCommand, skipProfiles, staMode: false, configurationName: null, initialCommandArgs: initialCommandArgs); } private bool LoadPSReadline() @@ -1594,8 +1603,7 @@ private bool LoadPSReadline() /// /// - //private void CreateRunspace(string initialCommand, bool skipProfiles, bool staMode, Collection initialCommandArgs) - private void DoCreateRunspace(string initialCommand, bool skipProfiles, bool staMode, bool importSystemModules, string configurationName, Collection initialCommandArgs) + private void DoCreateRunspace(string initialCommand, bool skipProfiles, bool staMode, string configurationName, Collection initialCommandArgs) { Dbg.Assert(_runspaceRef == null, "runspace should be null"); #if !DEBUG @@ -1682,11 +1690,12 @@ private void DoCreateRunspace(string initialCommand, bool skipProfiles, bool sta // Record how long it took from process start to runspace open for telemetry. _readyForInputTimeInMS = (DateTime.Now - Process.GetCurrentProcess().StartTime).TotalMilliseconds; - DoRunspaceInitialization(importSystemModules, skipProfiles, initialCommand, configurationName, initialCommandArgs); + DoRunspaceInitialization(skipProfiles, initialCommand, configurationName, initialCommandArgs); } private void OpenConsoleRunspace(Runspace runspace, bool staMode) { +#if STAMODE // staMode will have following values: // On FullPS: 'true'/'false' = default('true'=STA) + possibility of overload through cmdline parameter '-mta' // On NanoPS: always 'false' = default('false'=MTA) + NO possibility of overload through cmdline parameter '-mta' @@ -1694,12 +1703,10 @@ private void OpenConsoleRunspace(Runspace runspace, bool staMode) if (staMode) { // we can't change ApartmentStates on CoreCLR -#if !CORECLR runspace.ApartmentState = ApartmentState.STA; -#endif - runspace.ThreadOptions = PSThreadOptions.ReuseThread; } - +#endif + runspace.ThreadOptions = PSThreadOptions.ReuseThread; runspace.EngineActivityId = EtwActivity.GetActivityId(); s_runspaceInitTracer.WriteLine("Calling Runspace.Open"); @@ -1707,7 +1714,7 @@ private void OpenConsoleRunspace(Runspace runspace, bool staMode) runspace.Open(); } - private void DoRunspaceInitialization(bool importSystemModules, bool skipProfiles, string initialCommand, string configurationName, Collection initialCommandArgs) + private void DoRunspaceInitialization(bool skipProfiles, string initialCommand, string configurationName, Collection initialCommandArgs) { if (_runspaceRef.Runspace.Debugger != null) { @@ -1717,12 +1724,6 @@ private void DoRunspaceInitialization(bool importSystemModules, bool skipProfile Executor exec = new Executor(this, false, false); - // Run import system modules command - if (importSystemModules) - { - Exception exception = InitializeRunspaceHelper("ImportSystemModules", exec, Executor.ExecutionOptions.None); - } - if (!string.IsNullOrEmpty(configurationName)) { // If an endpoint configuration is specified then create a loop-back remote runspace targeting @@ -3015,28 +3016,28 @@ internal sealed class RunspaceCreationEventArgs : EventArgs /// /// /// - /// /// /// internal RunspaceCreationEventArgs(string initialCommand, bool skipProfiles, bool staMode, - bool importSystemModules, string configurationName, Collection initialCommandArgs) { InitialCommand = initialCommand; SkipProfiles = skipProfiles; +#if STAMODE StaMode = staMode; - ImportSystemModules = importSystemModules; +#endif ConfigurationName = configurationName; InitialCommandArgs = initialCommandArgs; } internal string InitialCommand { get; set; } internal bool SkipProfiles { get; set; } +#if STAMODE internal bool StaMode { get; set; } - internal bool ImportSystemModules { get; set; } +#endif internal string ConfigurationName { get; set; } internal Collection InitialCommandArgs { get; set; } } diff --git a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleShell.cs b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleShell.cs index 227ee91abaf..c5e0d332c0d 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleShell.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleShell.cs @@ -25,18 +25,6 @@ public static int Start(string bannerText, string helpText, string[] args) { return Start(null, bannerText, helpText, null, args); } -#else - /// Entry point in to ConsoleShell. This method is called by main of minishell. - /// Configuration information which is used to create Runspace. - /// Banner text to be displayed by ConsoleHost - /// Help text for minishell. This is displayed on 'minishell -?'. - /// Commandline parameters specified by user. - /// An integer value which should be used as exit code for the process. - public static int Start(RunspaceConfiguration configuration, string bannerText, string helpText, string[] args) - { - return Start(configuration, bannerText, helpText, null, args); - } -#endif /// /// diff --git a/src/System.Management.Automation/engine/InitialSessionState.cs b/src/System.Management.Automation/engine/InitialSessionState.cs index e47498fdf5b..e20aa7a30ca 100644 --- a/src/System.Management.Automation/engine/InitialSessionState.cs +++ b/src/System.Management.Automation/engine/InitialSessionState.cs @@ -4162,14 +4162,6 @@ internal void ImportCmdletsFromAssembly(Assembly assembly, PSModuleInfo module) } "; - /// - /// This is the default function to use for 'Import System Modules'. - /// - /// - /// Win8: 320909. Retaining the original definition to ensure backward compatability. - /// - private static string s_importSystemModulesText = @""; - /// /// This is the default function to use for clear-host. On Windows it rewrites the /// host, and on Linux, it delegates to the native binary, 'clear'. @@ -4971,8 +4963,6 @@ internal static SessionStateAliasEntry[] BuiltInAliases SessionStateFunctionEntry.GetDelayParsedFunctionEntry("cd..", "Set-Location ..", isProductCode: true), SessionStateFunctionEntry.GetDelayParsedFunctionEntry("cd\\", "Set-Location \\", isProductCode: true), - // Win8: 320909. Retaining the original definition to ensure backward compatability. - SessionStateFunctionEntry.GetDelayParsedFunctionEntry("ImportSystemModules", s_importSystemModulesText, isProductCode: true), SessionStateFunctionEntry.GetDelayParsedFunctionEntry("Pause", string.Concat("$null = Read-Host '", CodeGeneration.EscapeSingleQuotedStringContent(RunspaceInit.PauseDefinitionString),"'"), isProductCode: true) }; From 46cdd7ec13eb6f29f0984b0278ef1f58bfb853bc Mon Sep 17 00:00:00 2001 From: Steve Lee Date: Thu, 12 Oct 2017 10:17:13 -0700 Subject: [PATCH 002/617] removed font and codepage handling code that is only applicable to Windows PowerShell replaced LengthInBufferCells() method with Unicode adapted code from PSReadline --- .../host/msh/ConsoleControl.cs | 320 ++---------------- .../host/msh/ConsoleHost.cs | 7 - 2 files changed, 27 insertions(+), 300 deletions(-) diff --git a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleControl.cs b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleControl.cs index 0f0c7f5cc4d..7b8685778bc 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleControl.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleControl.cs @@ -2608,109 +2608,6 @@ internal static void SetConsoleWindowTitle(string consoleTitle) #endregion Window -#if !CORECLR -#region Font Selection - - /// - /// UpdateLocaleSpecificFont is a helper method used to update - /// the console font based on the locale. - /// The default font face used for Powershell Console is Lucida Console. - /// However certain locales dont support Lucida Console font. Hence for such - /// locales the console font is updated to Raster dynamically. - /// - internal static void UpdateLocaleSpecificFont() - { - // Default Powershell shortcut.lnk settings. - const string defaultFontFace = "Lucida Console"; - - // Default CJK locale shortcut.lnk settings. - // Font size is hard coded here to ensure we select a supported size. - // GDI does a poor job of selecting raster font size if the requested - // size is not supported. - const string CJKFontFace = "Terminal"; - const int CJKFontFamily = 48; - const int CJKnFont = 6; - const int CJKFontWidth = 8; - const int CJKFontHeight = 12; - const int CKJFontWeight = 400; - - uint currentLocaleCodePage = (uint)ConsoleControl.NativeMethods.GetConsoleCP(); - - ConsoleHandle handle = ConsoleControl.GetActiveScreenBufferHandle(); - CONSOLE_FONT_INFO_EX fontInfo; - try - { - fontInfo = ConsoleControl.GetConsoleFontInfo(handle); - } - catch (Exception) - { - return; - } - - bool isLucidaConsoleSupportedLocale = CodePageSupportsLucida(currentLocaleCodePage); - - // The Raster font is updated for Japanese and Korean locales if the user has not manually - // altered the default settings. If the default settings are altered then the - // setting chosen by the user would be used. - if (!isLucidaConsoleSupportedLocale && - fontInfo.FontFace.Equals(defaultFontFace, StringComparison.OrdinalIgnoreCase)) - { - fontInfo.FontFace = CJKFontFace; - fontInfo.FontFamily = CJKFontFamily; - fontInfo.nFont = CJKnFont; - fontInfo.FontWidth = CJKFontWidth; - fontInfo.FontHeight = CJKFontHeight; - fontInfo.FontWeight = CKJFontWeight; - - bool result = NativeMethods.SetCurrentConsoleFontEx(handle.DangerousGetHandle(), false, ref fontInfo); - - if (result == false) - { - int err = Marshal.GetLastWin32Error(); - - HostException e = CreateHostException(err, - "SetConsoleFontInfo", - ErrorCategory.ResourceUnavailable, - ConsoleControlStrings.SetConsoleFontInfoExceptionTemplate); - - throw e; - } - } - } - - /// - /// Supported Lucida code pages obtained from Font group. - /// Contacts: alib, judysa, simonda - /// - private static HashSet LucidaSupportedCodePages = new HashSet() - { - 1251, // Latin 1 - 1250, // Latin 2 - 1251, // Cyrillic - 1253, // Greek - 1254, // Turkish - 869, // IBM Greek - 866, // MS-DOS Russian - 865, // MS-DOS Nordic - 863, // MS-DOS Canadian French - 861, // MS-DOS Icelandic - 860, // MS-DOS Portuguese - 857, // IBM Turkish - 855, // IBM Cyrillic - 852, // Latin 2 - 737, // Greek - 850, // WE/Latin 1 - 437 // US - //936, // SimplifiedChinese - According to font team this is *not* supported. - //950 // TraditionalChinese - According to font team this is *not* supported. - }; - private static bool CodePageSupportsLucida(uint currentLocaleCodePage) - { - return LucidaSupportedCodePages.Contains(currentLocaleCodePage); - } - -#endregion -#endif /// /// /// Wrap Win32 WriteConsole @@ -2821,49 +2718,6 @@ internal static void SetConsoleTextAttribute(ConsoleHandle consoleHandle, WORD a #region Dealing with CJK #if !UNIX - /// - /// From IsConsoleFullWidth in \windows\core\ntcon\server\dbcs.c - /// Gets the CharSet for a code page - /// - /// - /// The CharSet corresponding to the codePage; defaults to OEM_CHARSET (255) - private static uint CodePageToCharSet(uint codePage) - { - const uint OEM_CHARSET = 255; - // Suppress the PreFAST warning about not using Marshal.GetLastWin32Error() to - // get the error code. -#pragma warning disable 56523 -#if CORECLR // TranslateCharsetInfo exists in an extension API set 'ext-ms-win-gdi-font-l1-1-1.dll', which is not available in NanoServer. - return OEM_CHARSET; -#else - CHARSETINFO csi; - const DWORD TCI_SRCCODEPAGE = 2; - if (!NativeMethods.TranslateCharsetInfo((IntPtr)codePage, out csi, TCI_SRCCODEPAGE)) - { - csi.ciCharset = OEM_CHARSET; - } - return csi.ciCharset; -#endif - } - - // From \windows\core\ntcon\server\dbcs.c - private static bool IsAvailableFarEastCodePage(uint codePage) - { - uint charSet = CodePageToCharSet(codePage); - return IsAnyDBCSCharSet(charSet); - } - - // From \windows\core\ntcon\server\dbcs.c - private static bool IsAnyDBCSCharSet(uint charSet) - { - const uint SHIFTJIS_CHARSET = 128; - const uint HANGUL_CHARSET = 129; - const uint CHINESEBIG5_CHARSET = 136; - const uint GB2312_CHARSET = 134; - return charSet == SHIFTJIS_CHARSET || charSet == HANGUL_CHARSET || - charSet == CHINESEBIG5_CHARSET || charSet == GB2312_CHARSET; - } - /// /// From IsConsoleFullWidth in \windows\core\ntcon\server\dbcs.c /// Precondition: the current code page needs to be a Far East code page. @@ -2944,103 +2798,9 @@ private static int LengthInBufferCellsFE(char c, ref HWND hwnd, ref HDC hDC, ref /* Han Compatibility Ideographs */ return 2; } - else - { - // GetTextMetrics / GetCharWidth32 exist in an extension API set 'ext-ms-win-gdi-font-l1-1-1.dll', which is not available in NanoServer. -#if !CORECLR - /* Unknown character: need to use GDI*/ - if (hDC == (IntPtr)0) - { - hwnd = NativeMethods.GetConsoleWindow(); - if ((IntPtr)0 == hwnd) - { - int err = Marshal.GetLastWin32Error(); - //Don't throw exception so that output can continue - tracer.TraceError("Win32 Error 0x{0:X} occurred when getting the window handle to the console.", - err); - return 1; - } - hDC = NativeMethods.GetDC(hwnd); - if ((IntPtr)0 == hDC) - { - int err = Marshal.GetLastWin32Error(); - //Don't throw exception so that output can continue - tracer.TraceError("Win32 Error 0x{0:X} occurred when getting the Device Context of the console window.", - err); - return 1; - } - } - bool result = true; - if (!istmInitialized) - { - result = NativeMethods.GetTextMetrics(hDC, out tm); - if (!result) - { - int err = Marshal.GetLastWin32Error(); - //Don't throw exception so that output can continue - tracer.TraceError("Win32 Error 0x{0:X} occurred when getting the Text Metric of the console window's Device Context.", - err); - return 1; - } - istmInitialized = true; - } - int width; - result = NativeMethods.GetCharWidth32(hDC, (uint)c, (uint)c, out width); - if (!result) - { - int err = Marshal.GetLastWin32Error(); - //Don't throw exception so that output can continue - tracer.TraceError("Win32 Error 0x{0:X} occurred when getting the width of a char.", - err); - return 1; - } - if (width >= tm.tmMaxCharWidth) - { - return 2; - } -#endif - } tracer.WriteLine("failed to locate char {0}, return 1", (int)c); return 1; } - - internal static int LengthInBufferCells(char c) - { - uint codePage = NativeMethods.GetConsoleOutputCP(); - return LengthInBufferCells(c, codePage); - } - - /// - /// From IsConsoleFullWidth in \windows\core\ntcon\server\dbcs.c - /// - /// - /// - /// - [SuppressMessage("Microsoft.Usage", "CA1806:DoNotIgnoreMethodResults", - MessageId = "Microsoft.PowerShell.ConsoleControl+NativeMethods.ReleaseDC(System.IntPtr,System.IntPtr)")] - private static int LengthInBufferCells(char c, uint codePage) - { - if (!IsAvailableFarEastCodePage(codePage)) - { - return 1; - } - HWND hwnd = (HWND)0; - HDC hDC = (HDC)0; - bool istmInitialized = false; - TEXTMETRIC tm = new TEXTMETRIC(); ; - try - { - return LengthInBufferCellsFE(c, ref hwnd, ref hDC, ref istmInitialized, ref tm); - } - finally - { - if (hwnd != (IntPtr)0 && hDC != (IntPtr)0) - { - NativeMethods.ReleaseDC(hwnd, hDC); - } - } - } - #endif // Return the length of a VT100 control sequence character in str starting @@ -3108,38 +2868,7 @@ internal static int LengthInBufferCells(string str, int offset, bool checkEscape } } -#if UNIX return str.Length - offset - escapeSequenceAdjustment; -#else - uint codePage = NativeMethods.GetConsoleOutputCP(); - if (!IsAvailableFarEastCodePage(codePage)) - { - return str.Length - offset - escapeSequenceAdjustment; - } - - HWND hwnd = (HWND)0; - HDC hDC = (HDC)0; - bool istmInitialized = false; - TEXTMETRIC tm = new TEXTMETRIC(); ; - int length = 0; - try - { - int n = str.Length; - for (int i = offset; i < n; i++) - { - char c = str[i]; - length += LengthInBufferCellsFE(c, ref hwnd, ref hDC, ref istmInitialized, ref tm); - } - return length - escapeSequenceAdjustment; - } - finally - { - if (hwnd != (IntPtr)0 && hDC != (IntPtr)0) - { - NativeMethods.ReleaseDC(hwnd, hDC); - } - } -#endif } #if !UNIX @@ -3321,6 +3050,33 @@ private static HostException CreateHostException( #endregion helper +#region + + internal static int LengthInBufferCells(char c) + { + // The following is based on http://www.cl.cam.ac.uk/~mgk25/c/wcwidth.c + // which is derived from http://www.unicode.org/Public/UCD/latest/ucd/EastAsianWidth.txt + + bool isWide = c >= 0x1100 && + (c <= 0x115f || /* Hangul Jamo init. consonants */ + c == 0x2329 || c == 0x232a || + (c >= 0x2e80 && c <= 0xa4cf && + c != 0x303f) || /* CJK ... Yi */ + (c >= 0xac00 && c <= 0xd7a3) || /* Hangul Syllables */ + (c >= 0xf900 && c <= 0xfaff) || /* CJK Compatibility Ideographs */ + (c >= 0xfe10 && c <= 0xfe19) || /* Vertical forms */ + (c >= 0xfe30 && c <= 0xfe6f) || /* CJK Compatibility Forms */ + (c >= 0xff00 && c <= 0xff60) || /* Fullwidth Forms */ + (c >= 0xffe0 && c <= 0xffe6)); + // We can ignore these ranges because .Net strings use surrogate pairs + // for this range and we do not handle surrogage pairs. + // (c >= 0x20000 && c <= 0x2fffd) || + // (c >= 0x30000 && c <= 0x3fffd) + return 1 + (isWide ? 1 : 0); + } + +#endregion + #region SendInput internal static void MimicKeyPress(INPUT[] inputs) @@ -3396,9 +3152,6 @@ NakedWin32Handle templateFileWin32Handle #region Code Page - [DllImport(PinvokeDllNames.GetConsoleCPDllName, SetLastError = false, CharSet = CharSet.Unicode)] - internal static extern uint GetConsoleCP(); - [DllImport(PinvokeDllNames.GetConsoleOutputCPDllName, SetLastError = false, CharSet = CharSet.Unicode)] internal static extern uint GetConsoleOutputCP(); @@ -3413,15 +3166,6 @@ NakedWin32Handle templateFileWin32Handle [DllImport(PinvokeDllNames.ReleaseDCDllName, SetLastError = false, CharSet = CharSet.Unicode)] internal static extern int ReleaseDC(HWND hwnd, HDC hdc); - [DllImport(PinvokeDllNames.TranslateCharsetInfoDllName, SetLastError = true, CharSet = CharSet.Unicode)] - internal static extern bool TranslateCharsetInfo(IntPtr src, out CHARSETINFO Cs, DWORD options); - - [DllImport(PinvokeDllNames.GetTextMetricsDllName, SetLastError = true, CharSet = CharSet.Unicode)] - internal static extern bool GetTextMetrics(HDC hdc, out TEXTMETRIC tm); - - [DllImport(PinvokeDllNames.GetCharWidth32DllName, SetLastError = true, CharSet = CharSet.Unicode)] - internal static extern bool GetCharWidth32(HDC hdc, uint first, uint last, out int width); - [DllImport(PinvokeDllNames.FlushConsoleInputBufferDllName, SetLastError = true, CharSet = CharSet.Unicode)] internal static extern bool FlushConsoleInputBuffer(NakedWin32Handle consoleInput); @@ -3476,15 +3220,9 @@ internal enum FileType Pipe }; - [DllImport(PinvokeDllNames.GetFileTypeDllName, SetLastError = true, CharSet = CharSet.Unicode)] - internal static extern FileType GetFileType(NakedWin32Handle fileHandle); - [DllImport(PinvokeDllNames.GetLargestConsoleWindowSizeDllName, SetLastError = true, CharSet = CharSet.Unicode)] internal static extern COORD GetLargestConsoleWindowSize(NakedWin32Handle consoleOutput); - [DllImport(PinvokeDllNames.GetStdHandleDllName, SetLastError = true, CharSet = CharSet.Unicode)] - internal static extern IntPtr GetStdHandle(int handleId); - [DllImport(PinvokeDllNames.ReadConsoleDllName, SetLastError = true, CharSet = CharSet.Unicode)] internal static extern bool ReadConsole ( @@ -3563,10 +3301,6 @@ ref CHAR_INFO fill [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)] internal static extern bool GetCurrentConsoleFontEx(NakedWin32Handle consoleOutput, bool bMaximumWindow, ref CONSOLE_FONT_INFO_EX consoleFontInfo); - // There is no SetCurrentConsoleFontEx on Core - [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)] - internal static extern bool SetCurrentConsoleFontEx(NakedWin32Handle consoleOutput, bool bMaximumWindow, ref CONSOLE_FONT_INFO_EX consoleFontInfo); - [DllImport(PinvokeDllNames.GetConsoleCursorInfoDllName, SetLastError = true, CharSet = CharSet.Unicode)] internal static extern bool GetConsoleCursorInfo(NakedWin32Handle consoleOutput, out CONSOLE_CURSOR_INFO consoleCursorInfo); diff --git a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHost.cs b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHost.cs index a58906c9135..56d80e6d71e 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHost.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHost.cs @@ -251,13 +251,6 @@ internal static int Start( throw hostException; } -#if !CORECLR - // The default font face used for Powershell Console is Lucida Console. - // However certain CJK locales dont support Lucida Console font. Hence for such - // locales the console font is updated to Raster dynamically. - ConsoleControl.UpdateLocaleSpecificFont(); -#endif - s_theConsoleHost.BindBreakHandler(); PSHost.IsStdOutputRedirected = Console.IsOutputRedirected; From 5bd8dd351f68927ce22804ea64d883bb5741b987 Mon Sep 17 00:00:00 2001 From: Steve Lee Date: Thu, 12 Oct 2017 10:18:24 -0700 Subject: [PATCH 003/617] removed `#if CORECLR` statements merging code base --- .../host/msh/ConsoleHost.cs | 32 ++----------------- .../host/msh/ConsoleShell.cs | 1 - 2 files changed, 2 insertions(+), 31 deletions(-) diff --git a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHost.cs b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHost.cs index 56d80e6d71e..043dcd5b70b 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHost.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHost.cs @@ -890,11 +890,7 @@ public override System.Globalization.CultureInfo CurrentCulture { lock (hostGlobalLock) { -#if !CORECLR - return NativeCultureResolver.Culture; -#else return CultureInfo.CurrentCulture; -#endif } } } @@ -915,11 +911,7 @@ public override System.Globalization.CultureInfo CurrentUICulture { lock (hostGlobalLock) { -#if !CORECLR - return NativeCultureResolver.UICulture; -#else return CultureInfo.CurrentUICulture; -#endif } } } @@ -1115,10 +1107,8 @@ internal ConsoleHost(RunspaceConfiguration configuration) this.ui = new ConsoleHostUserInterface(this); _consoleWriter = new ConsoleTextWriter(ui); -#if !CORECLR // CurrentDomain.UnhandledException not supported on CoreCLR UnhandledExceptionEventHandler handler = new UnhandledExceptionEventHandler(UnhandledExceptionHandler); AppDomain.CurrentDomain.UnhandledException += handler; -#endif } private void BindBreakHandler() @@ -1131,7 +1121,6 @@ private void BindBreakHandler() #endif } -#if !CORECLR // Not used on NanoServer: CurrentDomain.UnhandledException not supported on CoreCLR private void UnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs args) { // FYI: sender is a reference to the source app domain @@ -1155,7 +1144,6 @@ private void UnhandledExceptionHandler(object sender, UnhandledExceptionEventArg ConsoleHostStrings.UnhandledExceptionShutdownMessage); ui.WriteLine(); } -#endif /// /// @@ -2891,7 +2879,7 @@ private class ConsoleHostStartupException : Exception base(message) { } -#if !CORECLR // ApplicationException & System.Runtime.Serialization.SerializationInfo are Not In CoreCLR + protected ConsoleHostStartupException( System.Runtime.Serialization.SerializationInfo info, @@ -2900,7 +2888,7 @@ private class ConsoleHostStartupException : Exception base(info, context) { } -#endif + internal ConsoleHostStartupException(string message, Exception innerException) : @@ -2931,23 +2919,7 @@ private class ConsoleHostStartupException : Exception private bool _isDisposed; internal ConsoleHostUserInterface ui; -#if CORECLR internal Lazy ConsoleIn { get; } = new Lazy(() => Console.In); -#else - internal Lazy ConsoleIn { get; } = new Lazy(() => - { - // This is a workaround for a full clr issue that causes a hang when calling PowerShell from ruby. - // They use named pipes instead of anonymous pipes, and for some reason that triggers a hang - // reading from Console.In. - var inputHandle = ConsoleControl.NativeMethods.GetStdHandle(-10); - var s = new FileStream(new ConsoleHandle(inputHandle, false), FileAccess.Read); - - uint codePage = (uint) ConsoleControl.NativeMethods.GetConsoleCP(); - Encoding encoding = Encoding.GetEncoding((int) codePage); - - return TextReader.Synchronized(new StreamReader(s, encoding, false)); - }); -#endif private string _savedWindowTitle = ""; private Version _ver = PSVersionInfo.PSVersion; diff --git a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleShell.cs b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleShell.cs index c5e0d332c0d..801b3dbed55 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleShell.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleShell.cs @@ -15,7 +15,6 @@ namespace Microsoft.PowerShell public static class ConsoleShell { -#if CORECLR /// Entry point in to ConsoleShell. This method is called by main of minishell. /// Banner text to be displayed by ConsoleHost /// Help text for minishell. This is displayed on 'minishell -?'. From 6ca5d517829587785df88ca7c9326adef577c11d Mon Sep 17 00:00:00 2001 From: Steve Lee Date: Thu, 12 Oct 2017 10:19:18 -0700 Subject: [PATCH 004/617] [feature] removed code to show a GUI prompt for credentials as PSCore6 prompts in console --- .../msh/ConsoleHostUserInterfacePrompt.cs | 31 +--- .../msh/ConsoleHostUserInterfaceSecurity.cs | 144 +++++------------- 2 files changed, 45 insertions(+), 130 deletions(-) diff --git a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostUserInterfacePrompt.cs b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostUserInterfacePrompt.cs index c740be6c61c..71d178ac76f 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostUserInterfacePrompt.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostUserInterfacePrompt.cs @@ -315,31 +315,12 @@ out object convertedObj { WriteLineToConsole(WrapToCurrentWindowWidth(fieldPrompt)); PSCredential credential = null; - // the earlier implementation contained null - // for caption and message in the call below - // Passing null is a potential security risk - // as any modifications made with security in - // mind is lost. This can lead to a malicious - // server prompting the user for a request - // which can appear to come from locally. - if (!PromptUsingConsole() && desc.ModifiedByRemotingProtocol) - { - credential = - PromptForCredential( - caption, - message, - null, - string.Empty); - } - else - { - credential = - PromptForCredential( - null, // caption already written - null, // message already written - null, - string.Empty); - } + credential = + PromptForCredential( + null, // caption already written + null, // message already written + null, + string.Empty); convertedObj = credential; cancelInput = (convertedObj == null); if ((credential != null) && (credential.Password.Length == 0) && listInput) diff --git a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostUserInterfaceSecurity.cs b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostUserInterfaceSecurity.cs index 10e6cacfca7..d4235985c31 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostUserInterfaceSecurity.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostUserInterfaceSecurity.cs @@ -78,127 +78,61 @@ public override PSCredential PromptForCredential( PSCredentialTypes allowedCredentialTypes, PSCredentialUIOptions options) { - if (!PromptUsingConsole()) - { - IntPtr mainWindowHandle = GetMainWindowHandle(); - return HostUtilities.CredUIPromptForCredential(caption, message, userName, targetName, allowedCredentialTypes, options, mainWindowHandle); - } - else - { - PSCredential cred = null; - SecureString password = null; - string userPrompt = null; - string passwordPrompt = null; - - if (!string.IsNullOrEmpty(caption)) - { - // Should be a skin lookup + PSCredential cred = null; + SecureString password = null; + string userPrompt = null; + string passwordPrompt = null; - WriteLineToConsole(); - WriteToConsole(PromptColor, RawUI.BackgroundColor, WrapToCurrentWindowWidth(caption)); - WriteLineToConsole(); - } - - if (!string.IsNullOrEmpty(message)) - { - WriteLineToConsole(WrapToCurrentWindowWidth(message)); - } + if (!string.IsNullOrEmpty(caption)) + { + // Should be a skin lookup - if (string.IsNullOrEmpty(userName)) - { - userPrompt = ConsoleHostUserInterfaceSecurityResources.PromptForCredential_User; + WriteLineToConsole(); + WriteToConsole(PromptColor, RawUI.BackgroundColor, WrapToCurrentWindowWidth(caption)); + WriteLineToConsole(); + } - // - // need to prompt for user name first - // - do - { - WriteToConsole(userPrompt, true); - userName = ReadLine(); - if (userName == null) - { - return null; - } - } - while (userName.Length == 0); - } + if (!string.IsNullOrEmpty(message)) + { + WriteLineToConsole(WrapToCurrentWindowWidth(message)); + } - passwordPrompt = StringUtil.Format(ConsoleHostUserInterfaceSecurityResources.PromptForCredential_Password, userName - ); + if (string.IsNullOrEmpty(userName)) + { + userPrompt = ConsoleHostUserInterfaceSecurityResources.PromptForCredential_User; // - // now, prompt for the password + // need to prompt for user name first // - WriteToConsole(passwordPrompt, true); - password = ReadLineAsSecureString(); - if (password == null) + do { - return null; + WriteToConsole(userPrompt, true); + userName = ReadLine(); + if (userName == null) + { + return null; + } } - WriteLineToConsole(); - - cred = new PSCredential(userName, password); - - return cred; + while (userName.Length == 0); } - } - private IntPtr GetMainWindowHandle() - { -#if CORECLR // No System.Diagnostics.Process.MainWindowHandle on CoreCLR; - // Returned WindowHandle is used only in 1 case - prompting for credential using GUI dialog, which is not used on Nano, - // because on Nano we prompt for credential using console (different code path in 'PromptForCredential' function) - return IntPtr.Zero; -#else - System.Diagnostics.Process currentProcess = System.Diagnostics.Process.GetCurrentProcess(); - IntPtr mainWindowHandle = currentProcess.MainWindowHandle; + passwordPrompt = StringUtil.Format(ConsoleHostUserInterfaceSecurityResources.PromptForCredential_Password, userName + ); - while ((mainWindowHandle == IntPtr.Zero) && (currentProcess != null)) + // + // now, prompt for the password + // + WriteToConsole(passwordPrompt, true); + password = ReadLineAsSecureString(); + if (password == null) { - currentProcess = PsUtils.GetParentProcess(currentProcess); - if (currentProcess != null) - { - mainWindowHandle = currentProcess.MainWindowHandle; - } + return null; } + WriteLineToConsole(); - return mainWindowHandle; -#endif - } - - // Determines whether we should prompt using the Console prompting - // APIs - private bool PromptUsingConsole() - { -#if CORECLR - // on Nano there is no other way to prompt except by using console - return true; -#else - bool promptUsingConsole = false; - // Get the configuration setting - try - { - promptUsingConsole = ConfigPropertyAccessor.Instance.GetConsolePrompting(); - } - catch (System.Security.SecurityException e) - { - s_tracer.TraceError("Could not read CredUI registry key: " + e.Message); - return promptUsingConsole; - } - catch (InvalidCastException e) - { - s_tracer.TraceError("Could not parse CredUI registry key: " + e.Message); - return promptUsingConsole; - } - catch (FormatException e) - { - s_tracer.TraceError("Could not parse CredUI registry key: " + e.Message); - return promptUsingConsole; - } + cred = new PSCredential(userName, password); - s_tracer.WriteLine("DetermineCredUIPolicy: policy == {0}", promptUsingConsole); - return promptUsingConsole; -#endif + return cred; } } } From 173380b9c7d73a767f809ccd557c9216cf0bf77d Mon Sep 17 00:00:00 2001 From: Steve Lee Date: Mon, 16 Oct 2017 16:55:50 -0700 Subject: [PATCH 005/617] Remove unncessary method --- .../host/msh/ConsoleControl.cs | 86 ------------------- 1 file changed, 86 deletions(-) diff --git a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleControl.cs b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleControl.cs index 7b8685778bc..d0a03d2aa3e 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleControl.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleControl.cs @@ -2716,92 +2716,6 @@ internal static void SetConsoleTextAttribute(ConsoleHandle consoleHandle, WORD a #endif #region Dealing with CJK -#if !UNIX - - /// - /// From IsConsoleFullWidth in \windows\core\ntcon\server\dbcs.c - /// Precondition: the current code page needs to be a Far East code page. - /// - /// char F8F8 makes this function return 1 while in CHT, CHS, and KOR it takes 2 cells. - /// I don't think we should special-case this because that ought to be a bug outside of - /// this code. - /// - /// - /// window handle - /// handle to DC; it is not released by this method - /// - /// - /// - private static int LengthInBufferCellsFE(char c, ref HWND hwnd, ref HDC hDC, ref bool istmInitialized, ref TEXTMETRIC tm) - { - if (0x20 <= c && c <= 0x7e) - { - /* ASCII */ - return 1; - } - else if (0x3041 <= c && c <= 0x3094) - { - /* Hiragana */ - return 2; - } - else if (0x30a1 <= c && c <= 0x30f6) - { - /* Katakana */ - return 2; - } - else if (0x3105 <= c && c <= 0x312c) - { - /* Bopomofo */ - return 2; - } - else if (0x3131 <= c && c <= 0x318e) - { - /* Hangul Elements */ - return 2; - } - else if (0xac00 <= c && c <= 0xd7a3) - { - /* Korean Hangul Syllables */ - return 2; - } - else if (0xff01 <= c && c <= 0xff5e) - { - /* Fullwidth ASCII variants */ - return 2; - } - else if (0xff61 <= c && c <= 0xff9f) - { - /* Halfwidth Katakana variants */ - return 1; - } - else if ((0xffa0 <= c && c <= 0xffbe) || - (0xffc2 <= c && c <= 0xffc7) || - (0xffca <= c && c <= 0xffcf) || - (0xffd2 <= c && c <= 0xffd7) || - (0xffda <= c && c <= 0xffdc)) - { - /* Halfwidth Hangul variants */ - return 1; - } - else if (0xffe0 <= c && c <= 0xffe6) - { - /* Fullwidth symbol variants */ - return 2; - } - else if (0x4e00 <= c && c <= 0x9fa5) - { - /* Han Ideographic */ - return 2; - } - else if (0xf900 <= c && c <= 0xfa2d) - { - /* Han Compatibility Ideographs */ - return 2; - } - tracer.WriteLine("failed to locate char {0}, return 1", (int)c); - return 1; - } -#endif // Return the length of a VT100 control sequence character in str starting // at the given offset. From d5445ff691c8b4cb996c4634fb98f3fba4336ad1 Mon Sep 17 00:00:00 2001 From: "James Truher [MSFT]" Date: Tue, 17 Oct 2017 13:32:21 -0700 Subject: [PATCH 006/617] Make sure that there's a statement separator after we update the path, otherwise the built script will not run (#5137) --- test/tools/OpenCover/OpenCover.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/tools/OpenCover/OpenCover.psm1 b/test/tools/OpenCover/OpenCover.psm1 index 9c765677a86..1d90f6d6551 100644 --- a/test/tools/OpenCover/OpenCover.psm1 +++ b/test/tools/OpenCover/OpenCover.psm1 @@ -667,7 +667,7 @@ function Invoke-OpenCover $testToolsExePath = (Resolve-Path(Join-Path $TestPath -ChildPath "..\tools\TestExe\bin")).Path $updatedProcessEnvPath = "${testToolsExePath};${env:PATH}" - $startupArgs = "Set-ExecutionPolicy Bypass -Force -Scope Process; `$env:PSModulePath = '${updatedEnvPath}'; `$env:Path = '${updatedProcessEnvPath}'" + $startupArgs = "Set-ExecutionPolicy Bypass -Force -Scope Process; `$env:PSModulePath = '${updatedEnvPath}'; `$env:Path = '${updatedProcessEnvPath}';" $targetArgs = "${startupArgs}", "Invoke-Pester","${TestPath}","-OutputFormat $PesterLogFormat" if ( $CIOnly ) From 17731cf6e955fc78591c995b22ff84e47e657836 Mon Sep 17 00:00:00 2001 From: Mark Kraus Date: Tue, 17 Oct 2017 18:18:54 -0500 Subject: [PATCH 007/617] Add Get-WebListenerUrl Based Examples to WebListener README.md (#4981) - Add Get-WebListenerUrl Based Examples to WebListener README.md - Fix Cert test example --- test/tools/WebListener/README.md | 33 ++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/test/tools/WebListener/README.md b/test/tools/WebListener/README.md index 6892000d954..b0c5c98b157 100644 --- a/test/tools/WebListener/README.md +++ b/test/tools/WebListener/README.md @@ -38,6 +38,12 @@ Returns a static HTML page containing links and descriptions of the available te Returns a JSON object containing the details of the Client Certificate if one is provided in the request. +```powershell +$certificate = Get-WebListenerClientCertificate +$uri = Get-WebListenerUrl -Test 'Cert' -Https +Invoke-RestMethod -Uri $uri -Certificate $certificate +``` + Response when certificate is provided in request: ```json { @@ -64,7 +70,7 @@ Returns the same results as the Get test with deflate compression. ```powershell $uri = Get-WebListenerUrl -Test 'Compression' -TestValue 'Deflate' -Invoke-RestMethod -Uri $uri -Headers $headers +Invoke-RestMethod -Uri $uri ``` ```json @@ -84,7 +90,7 @@ Returns the same results as the Get test with gzip compression. ```powershell $uri = Get-WebListenerUrl -Test 'Compression' -TestValue 'Gzip' -Invoke-RestMethod -Uri $uri -Headers $headers +Invoke-RestMethod -Uri $uri ``` ```json @@ -104,7 +110,8 @@ Invoke-RestMethod -Uri $uri -Headers $headers Returns the same results as the Get test. If a number is supplied, the server will wait that many seconds before returning a response. This can be used to test timeouts. ```powershell -Invoke-WebRequest -Uri 'http://localhost:8083/Delay/5' +$uri = Get-WebListenerUrl -Test 'Delay' -TestValue '5' +Invoke-RestMethod -Uri $uri ``` After 5 Seconds: @@ -127,13 +134,19 @@ After 5 Seconds: Returns page containing UTF-8 data. +```powershell +$uri = Get-WebListenerUrl -Test 'Encoding' -TestValue 'Utf8' +Invoke-RestMethod -Uri $uri +``` + ## /Get/ Returns a JSON object containing the Request URL, Request Headers, GET Query Fields and Values, and Origin IP. This emulates the functionality of [HttpBin's get test](https://httpbin.org/get). ```powershell -Invoke-WebRequest -Uri 'http://localhost:8083/Get/' -Body @{TestField = 'TestValue'} +$uri = Get-WebListenerUrl -Test 'Get' +Invoke-RestMethod -Uri $uri -Body @{TestField = 'TestValue'} ``` ```json @@ -159,6 +172,11 @@ Provides an HTML form for `multipart/form-data` submission. ### POST Accepts a `multipart/form-data` submission and returns a JSON object containing information about the submission including the items and files submitted. +```powershell +$uri = Get-WebListenerUrl -Test 'Multipart' +Invoke-RestMethod -Uri $uri -Body $multipartData -Method 'POST' +``` + ```json { "Files": [ @@ -199,7 +217,13 @@ Accepts a `multipart/form-data` submission and returns a JSON object containing Will 302 redirect to `/Get/`. If a number is supplied, redirect will occur that many times. Can be used to test maximum redirects. +```powershell +$uri = Get-WebListenerUrl -Test 'Redirect' -TestValue '2' +Invoke-RestMethod -Uri $uri +``` + Request 1: + ```none GET http://localhost:8083/Redirect/2 HTTP/1.1 Connection: Keep-Alive @@ -208,6 +232,7 @@ Host: localhost:8083 ``` Response 1: + ```none HTTP/1.1 302 Found Date: Fri, 15 Sep 2017 10:46:41 GMT From 2cc091115b2279a2d5efa2e8ff67fea8185a0e17 Mon Sep 17 00:00:00 2001 From: Steve Lee Date: Tue, 17 Oct 2017 17:25:11 -0700 Subject: [PATCH 008/617] Rename powershell.exe to pwsh.exe (#5101) - Rename powershell.exe to pwsh.exe - Fixe appveyor.psm1 - Update MSI to include 'pwsh' in path and app paths - Revert change for hyper-v powershell direct - Update names in packaging.psm1. - Fix check for SxS --- .spelling | 1 + assets/Product.wxs | 16 ++++- build.psm1 | 14 ++--- demos/Raspberry-Pi/README.md | 2 +- demos/SSHRemoting/README.md | 6 +- .../host/msh/ConsoleHost.cs | 2 +- .../host/msh/ConsoleHostRawUserInterface.cs | 2 +- .../host/msh/ConsoleHostUserInterface.cs | 2 +- .../msh/ConsoleHostUserInterfaceSecurity.cs | 2 +- .../ScheduledJobDefinition.cs | 2 +- .../CoreCLR/CorePsAssemblyLoadContext.cs | 2 +- .../FormatAndOutput/out-console/OutConsole.cs | 2 +- .../engine/Modules/ModuleIntrinsics.cs | 15 +++-- .../engine/hostifaces/MshHost.cs | 2 +- .../hostifaces/PowerShellProcessInstance.cs | 6 +- .../remoting/common/RunspaceConnectionInfo.cs | 8 ++- .../fanin/OutOfProcTransportManager.cs | 2 +- .../Install-PowerShellRemoting.ps1 | 2 +- src/powershell-unix/powershell-unix.csproj | 2 +- .../powershell-win-core.csproj | 2 +- .../networktest/DockerRemoting.Tests.ps1 | 6 +- test/docker/networktest/Dockerfile | 4 +- test/powershell/Host/Base-Directory.Tests.ps1 | 2 +- test/powershell/Host/ConsoleHost.Tests.ps1 | 16 ++--- test/powershell/Host/Read-Host.Tests.ps1 | 2 +- .../TabCompletion/TabCompletion.Tests.ps1 | 4 +- .../Language/Parser/Conversions.Tests.ps1 | 2 +- .../Language/Parser/UsingAssembly.Tests.ps1 | 8 +-- .../NativeCommandProcessor.Tests.ps1 | 6 +- .../NativeExecution/NativeStreams.Tests.ps1 | 2 +- .../Import-Module.Tests.ps1 | 4 +- .../Out-Default.Tests.ps1 | 2 +- .../FileSystem.Tests.ps1 | 2 +- .../Set-Service.Tests.ps1 | 14 ++--- .../Invoke-Item.Tests.ps1 | 2 +- .../Set-PSBreakpoint.Tests.ps1 | 2 +- .../Write-Host.Tests.ps1 | 2 +- .../XMLCommand.Tests.ps1 | 4 +- .../clixml.tests.ps1 | 4 +- .../object.tests.ps1 | 2 +- .../CredSSP.Tests.ps1 | 2 +- .../Pester.AutomountedDrives.Tests.ps1 | 16 ++--- test/powershell/README.md | 2 +- test/powershell/SDK/PSDebugging.Tests.ps1 | 2 +- test/powershell/engine/Job/Jobs.Tests.ps1 | 2 +- .../engine/Module/ModulePath.Tests.ps1 | 10 ++-- .../ParameterBinding.Tests.ps1 | 2 +- .../Start-CodeCoverageRun.ps1 | 2 +- test/tools/OpenCover/OpenCover.psm1 | 10 ++-- tools/appveyor.psm1 | 4 +- tools/packaging/packaging.psm1 | 58 ++++++------------- 51 files changed, 146 insertions(+), 146 deletions(-) diff --git a/.spelling b/.spelling index 3b415b9aef5..96fda43c39d 100644 --- a/.spelling +++ b/.spelling @@ -147,6 +147,7 @@ psobjects psproxyjobs PSReadline PSSessionConfiguration +pwsh redistributables Register-EngineEvent Register-PSSessionConfiguration diff --git a/assets/Product.wxs b/assets/Product.wxs index 8f2362d098f..ed98172a4a0 100644 --- a/assets/Product.wxs +++ b/assets/Product.wxs @@ -31,7 +31,7 @@ - + @@ -73,6 +73,8 @@ + + @@ -103,13 +105,23 @@ + + + + + + + + + + - diff --git a/build.psm1 b/build.psm1 index c89c4e019a6..43abc2d8c79 100644 --- a/build.psm1 +++ b/build.psm1 @@ -187,7 +187,7 @@ function Start-BuildNativeWindowsBinaries { return } - # cmake is needed to build powershell.exe + # cmake is needed to build pwsh.exe if (-not (precheck 'cmake' $null)) { throw 'cmake not found. Run "Start-PSBootstrap -BuildWindowsNative". You can also install it from https://chocolatey.org/packages/cmake' } @@ -497,7 +497,7 @@ Fix steps: Start-TypeGen } - # Get the folder path where powershell.exe is located. + # Get the folder path where pwsh.exe is located. $publishPath = Split-Path $Options.Output -Parent try { # Relative paths do not work well if cwd is not changed to project @@ -507,7 +507,7 @@ Fix steps: if ($CrossGen) { Start-CrossGen -PublishPath $publishPath -Runtime $script:Options.Runtime - log "PowerShell.exe with ngen binaries is available at: $($Options.Output)" + log "pwsh.exe with ngen binaries is available at: $($Options.Output)" } else { log "PowerShell output: $($Options.Output)" } @@ -680,9 +680,9 @@ function New-PSOptions { } $Executable = if ($Environment.IsLinux -or $Environment.IsMacOS) { - "powershell" + "pwsh" } elseif ($Environment.IsWindows) { - "powershell.exe" + "pwsh.exe" } # Build the Output path @@ -837,7 +837,7 @@ function Start-PSPester { [string[]]$Path = @("$PSScriptRoot/test/common","$PSScriptRoot/test/powershell"), [switch]$ThrowOnFailure, [string]$binDir = (Split-Path (New-PSOptions).Output), - [string]$powershell = (Join-Path $binDir 'powershell'), + [string]$powershell = (Join-Path $binDir 'pwsh'), [string]$Pester = ([IO.Path]::Combine($binDir, "Modules", "Pester")), [Parameter(ParameterSetName='Unelevate',Mandatory=$true)] [switch]$Unelevate, @@ -848,7 +848,7 @@ function Start-PSPester { [switch]$IncludeFailingTest ) - if (-not (Get-Module -ListAvailable -Name $Pester -ErrorAction SilentlyContinue)) + if (-not (Get-Module -ListAvailable -Name $Pester -ErrorAction SilentlyContinue)) { Write-Warning @" Pester module not found. diff --git a/demos/Raspberry-Pi/README.md b/demos/Raspberry-Pi/README.md index 0e528f1dfa1..6a6a5fff1c8 100644 --- a/demos/Raspberry-Pi/README.md +++ b/demos/Raspberry-Pi/README.md @@ -72,7 +72,7 @@ cp shared/Microsoft.NetCore.App/2.1.0-preview1-25719-04/* ~/powershell ## Start PowerShell ```bash -~/powershell/powershell +~/powershell/pwsh ``` Note that until arm32 is [fully supported by CoreCLR](https://github.com/dotnet/coreclr/issues/3977), it's not supported by PowerShell Core. diff --git a/demos/SSHRemoting/README.md b/demos/SSHRemoting/README.md index 25f93922f32..a0cbbf46086 100644 --- a/demos/SSHRemoting/README.md +++ b/demos/SSHRemoting/README.md @@ -46,9 +46,9 @@ In addition you will need to enable password authentication and optionally key b ```none PasswordAuthentication yes ``` - - Add a PowerShell subsystem entry, replace `c:/program files/powershell/6.0.0/powershell.exe` with the correct path to the version you want to use + - Add a PowerShell subsystem entry, replace `c:/program files/powershell/6.0.0/pwsh.exe` with the correct path to the version you want to use ```none - Subsystem powershell c:/program files/powershell/6.0.0/powershell.exe -sshs -NoLogo -NoProfile + Subsystem powershell c:/program files/powershell/6.0.0/pwsh.exe -sshs -NoLogo -NoProfile ``` - Optionally enable key authentication ```none @@ -173,7 +173,7 @@ Microsoft Windows [Version 10.0.10586] # # Windows to Windows # -C:\Users\PSUser\Documents>"C:\Program Files\PowerShell\6.0.0.17\powershell.exe" +C:\Users\PSUser\Documents>pwsh.exe PowerShell Copyright (C) Microsoft Corporation. All rights reserved. diff --git a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHost.cs b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHost.cs index 23259d4cb9e..bc7e7613724 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHost.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHost.cs @@ -86,7 +86,7 @@ internal sealed partial class ConsoleHost /// /// /// - /// Command line parameters to powershell.exe + /// Command line parameters to pwsh.exe /// /// /// diff --git a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostRawUserInterface.cs b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostRawUserInterface.cs index ff713604d3a..9dc337d0f64 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostRawUserInterface.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostRawUserInterface.cs @@ -25,7 +25,7 @@ namespace Microsoft.PowerShell { /// /// - /// implementation of RawConsole for powershell.exe + /// implementation of RawConsole for powershell /// /// diff --git a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostUserInterface.cs b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostUserInterface.cs index 07b579ae8b9..691c8925337 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostUserInterface.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostUserInterface.cs @@ -24,7 +24,7 @@ namespace Microsoft.PowerShell /// /// - /// ConsoleHostUserInterface implements console-mode user interface for powershell.exe + /// ConsoleHostUserInterface implements console-mode user interface for powershell /// /// [SuppressMessage("Microsoft.Maintainability", "CA1506:AvoidExcessiveClassCoupling")] diff --git a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostUserInterfaceSecurity.cs b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostUserInterfaceSecurity.cs index d4235985c31..fdd66e1af05 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostUserInterfaceSecurity.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostUserInterfaceSecurity.cs @@ -13,7 +13,7 @@ namespace Microsoft.PowerShell { /// /// - /// ConsoleHostUserInterface implements console-mode user interface for powershell.exe + /// ConsoleHostUserInterface implements console-mode user interface for powershell /// /// internal partial diff --git a/src/Microsoft.PowerShell.ScheduledJob/ScheduledJobDefinition.cs b/src/Microsoft.PowerShell.ScheduledJob/ScheduledJobDefinition.cs index 9f678ec597f..bde0a85e273 100644 --- a/src/Microsoft.PowerShell.ScheduledJob/ScheduledJobDefinition.cs +++ b/src/Microsoft.PowerShell.ScheduledJob/ScheduledJobDefinition.cs @@ -42,7 +42,7 @@ public sealed class ScheduledJobDefinition : ISerializable, IDisposable private bool _isDisposed; // Task Action strings. - private const string TaskExecutionPath = @"powershell.exe"; + private const string TaskExecutionPath = @"pwsh.exe"; private const string TaskArguments = @"-NoLogo -NonInteractive -WindowStyle Hidden -Command ""Import-Module PSScheduledJob; $jobDef = [Microsoft.PowerShell.ScheduledJob.ScheduledJobDefinition]::LoadFromStore('{0}', '{1}'); $jobDef.Run()"""; private static object LockObject = new object(); private static int CurrentId = 0; diff --git a/src/System.Management.Automation/CoreCLR/CorePsAssemblyLoadContext.cs b/src/System.Management.Automation/CoreCLR/CorePsAssemblyLoadContext.cs index f828906afde..f5ecd6dda8f 100644 --- a/src/System.Management.Automation/CoreCLR/CorePsAssemblyLoadContext.cs +++ b/src/System.Management.Automation/CoreCLR/CorePsAssemblyLoadContext.cs @@ -503,7 +503,7 @@ public class PowerShellAssemblyLoadContextInitializer /// /// /// This method is to be used by native host whose TPA list doesn't include PS assemblies, such as the - /// in-box Nano powershell.exe, the PS remote WinRM plugin, in-box Nano DSC and in-box Nano SCOM agent. + /// in-box Nano powershell, the PS remote WinRM plugin, in-box Nano DSC and in-box Nano SCOM agent. /// /// /// Base directory paths that are separated by semicolon ';'. diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/out-console/OutConsole.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/out-console/OutConsole.cs index f685c43f369..433176ca86c 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/out-console/OutConsole.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/out-console/OutConsole.cs @@ -39,7 +39,7 @@ protected override void ProcessRecord() /// /// implementation for the out-default command /// this command it implicitly inject by the - /// powershell.exe host at the end of the pipeline as the + /// powershell host at the end of the pipeline as the /// default sink (display to console screen) /// [Cmdlet(VerbsData.Out, "Default", HelpUri = "https://go.microsoft.com/fwlink/?LinkID=113362", RemotingCapability = RemotingCapability.None)] diff --git a/src/System.Management.Automation/engine/Modules/ModuleIntrinsics.cs b/src/System.Management.Automation/engine/Modules/ModuleIntrinsics.cs index f7b2f812098..88b716b655b 100644 --- a/src/System.Management.Automation/engine/Modules/ModuleIntrinsics.cs +++ b/src/System.Management.Automation/engine/Modules/ModuleIntrinsics.cs @@ -768,10 +768,15 @@ private static bool NeedToClearProcessModulePath(string currentProcessModulePath private static string RemoveSxSPsHomeModulePath(string currentProcessModulePath, string personalModulePath, string sharedModulePath, string psHomeModulePath) { #if UNIX - const string powershellExeName = "powershell"; + const string powershellExeName = "pwsh"; + const string oldPowershellExeName = "powershell"; #else - const string powershellExeName = "powershell.exe"; + const string powershellExeName = "pwsh.exe"; + const string oldPowershellExeName = "powershell.exe"; #endif + const string powershellDepsName = "pwsh.deps.json"; + const string oldPowershellDepsName = "powershell.deps.json"; + StringBuilder modulePathString = new StringBuilder(currentProcessModulePath.Length); char[] invalidPathChars = Path.GetInvalidPathChars(); @@ -791,8 +796,10 @@ private static string RemoveSxSPsHomeModulePath(string currentProcessModulePath, { string parentDir = Path.GetDirectoryName(trimedPath); string psExePath = Path.Combine(parentDir, powershellExeName); - string psDepsPath = Path.Combine(parentDir, "powershell.deps.json"); - if (File.Exists(psExePath) && File.Exists(psDepsPath)) + string oldExePath = Path.Combine(parentDir, oldPowershellExeName); + string psDepsPath = Path.Combine(parentDir, powershellDepsName); + string oldDepsPath = Path.Combine(parentDir, oldPowershellDepsName); + if ((File.Exists(psExePath) && File.Exists(psDepsPath)) || (File.Exists(oldExePath) && File.Exists(oldDepsPath))) { // Path is a PSHome module path from a different powershell core instance. Ignore it. continue; diff --git a/src/System.Management.Automation/engine/hostifaces/MshHost.cs b/src/System.Management.Automation/engine/hostifaces/MshHost.cs index 484cd1f9008..2256df9c36b 100644 --- a/src/System.Management.Automation/engine/hostifaces/MshHost.cs +++ b/src/System.Management.Automation/engine/hostifaces/MshHost.cs @@ -43,7 +43,7 @@ namespace System.Management.Automation.Host public abstract class PSHost { /// - /// The powershell.exe spec states that 128 is the maximum nesting depth. + /// The powershell spec states that 128 is the maximum nesting depth. /// internal const int MaximumNestedPromptLevel = 128; internal static bool IsStdOutputRedirected; diff --git a/src/System.Management.Automation/engine/hostifaces/PowerShellProcessInstance.cs b/src/System.Management.Automation/engine/hostifaces/PowerShellProcessInstance.cs index f0de5d625a8..77b1e706cf7 100644 --- a/src/System.Management.Automation/engine/hostifaces/PowerShellProcessInstance.cs +++ b/src/System.Management.Automation/engine/hostifaces/PowerShellProcessInstance.cs @@ -38,10 +38,10 @@ static PowerShellProcessInstance() { #if UNIX s_PSExePath = Path.Combine(Utils.DefaultPowerShellAppBase, - "powershell"); + "pwsh"); #else s_PSExePath = Path.Combine(Utils.DefaultPowerShellAppBase, - "powershell.exe"); + "pwsh.exe"); #endif } @@ -79,7 +79,7 @@ public PowerShellProcessInstance(Version powerShellVersion, PSCredential credent #if CORECLR string processArguments = " -s -NoLogo -NoProfile"; #else - // Adding Version parameter to powershell.exe + // Adding Version parameter to powershell // Version parameter needs to go before all other parameters because the native layer looks for Version or // PSConsoleFile parameters before parsing other parameters. // The other parameters get parsed in the managed layer. diff --git a/src/System.Management.Automation/engine/remoting/common/RunspaceConnectionInfo.cs b/src/System.Management.Automation/engine/remoting/common/RunspaceConnectionInfo.cs index 2616ed72cf3..ecb94832b0e 100644 --- a/src/System.Management.Automation/engine/remoting/common/RunspaceConnectionInfo.cs +++ b/src/System.Management.Automation/engine/remoting/common/RunspaceConnectionInfo.cs @@ -2033,11 +2033,11 @@ internal int StartSSHProcess( } #endif - // Create client ssh process that hosts powershell.exe as a subsystem and is configured + // Create client ssh process that hosts powershell as a subsystem and is configured // to be in server mode for PSRP over SSHD: - // powershell -Version 5.1 -sshs -NoLogo -NoProfile + // powershell -sshs -NoLogo -NoProfile // See sshd_configuration file, subsystems section and it will have this entry: - // Subsystem powershell C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -Version 5.1 -sshs -NoLogo -NoProfile + // Subsystem powershell C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -sshs -NoLogo -NoProfile string arguments; if (!string.IsNullOrEmpty(this.KeyFilePath)) { @@ -3164,6 +3164,8 @@ private void CreateContainerProcessInternal() // // Hyper-V container (i.e., RuntimeId is not empty) uses Hyper-V socket transport. // Windows Server container (i.e., RuntimeId is empty) uses named pipe transport for now. + // This code executes `powershell.exe` as it exists in the container which currently is + // expected to be Windows PowerShell as it's inbox in the container. // cmd = string.Format(System.Globalization.CultureInfo.InvariantCulture, @"{{""CommandLine"": ""powershell.exe {0} -NoLogo {1}"",""RestrictedToken"": {2}}}", diff --git a/src/System.Management.Automation/engine/remoting/fanin/OutOfProcTransportManager.cs b/src/System.Management.Automation/engine/remoting/fanin/OutOfProcTransportManager.cs index e1d8d3a2a5e..b15c38edf35 100644 --- a/src/System.Management.Automation/engine/remoting/fanin/OutOfProcTransportManager.cs +++ b/src/System.Management.Automation/engine/remoting/fanin/OutOfProcTransportManager.cs @@ -948,7 +948,7 @@ internal OutOfProcessClientSessionTransportManager(Guid runspaceId, #region Overrides /// - /// Launch a new Process (PowerShell.exe -s) to perform remoting. This is used by *-Job cmdlets + /// Launch a new Process (pwsh -s) to perform remoting. This is used by *-Job cmdlets /// to support background jobs without depending on WinRM (WinRM has complex requirements like /// elevation to support local machine remoting) /// diff --git a/src/powershell-native/Install-PowerShellRemoting.ps1 b/src/powershell-native/Install-PowerShellRemoting.ps1 index 0dd7d6d3f44..dbada625e8a 100644 --- a/src/powershell-native/Install-PowerShellRemoting.ps1 +++ b/src/powershell-native/Install-PowerShellRemoting.ps1 @@ -116,7 +116,7 @@ if (! ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity if ($PsCmdlet.ParameterSetName -eq "ByPath") { $targetPsHome = $PowerShellHome - $targetPsVersion = & "$targetPsHome\powershell" -NoProfile -Command '$PSVersionTable.PSVersion.ToString()' + $targetPsVersion = & "$targetPsHome\pwsh" -NoProfile -Command '$PSVersionTable.PSVersion.ToString()' } else { diff --git a/src/powershell-unix/powershell-unix.csproj b/src/powershell-unix/powershell-unix.csproj index 24834680794..0907317346d 100644 --- a/src/powershell-unix/powershell-unix.csproj +++ b/src/powershell-unix/powershell-unix.csproj @@ -4,7 +4,7 @@ PowerShell top-level project with .NET CLI host - powershell + pwsh Exe linux-x64;osx.10.12-x64; diff --git a/src/powershell-win-core/powershell-win-core.csproj b/src/powershell-win-core/powershell-win-core.csproj index fbf2b11a599..049d0531b6d 100644 --- a/src/powershell-win-core/powershell-win-core.csproj +++ b/src/powershell-win-core/powershell-win-core.csproj @@ -2,7 +2,7 @@ PowerShell Core on Windows top-level project - powershell + pwsh Exe win7-x86;win7-x64 Microsoft.PowerShell diff --git a/test/docker/networktest/DockerRemoting.Tests.ps1 b/test/docker/networktest/DockerRemoting.Tests.ps1 index 8c8184d843b..06e61b89350 100644 --- a/test/docker/networktest/DockerRemoting.Tests.ps1 +++ b/test/docker/networktest/DockerRemoting.Tests.ps1 @@ -20,7 +20,7 @@ Describe "Basic remoting test with docker" -tags @("Scenario","Slow"){ # get fullpath to installed core powershell Write-Verbose -verbose "Getting path to PowerShell core" - $powershellcorepath = docker exec $server powershell -c "(get-childitem 'c:\program files\powershell\*\powershell.exe').fullname" + $powershellcorepath = docker exec $server powershell -c "(get-childitem 'c:\program files\powershell\*\pwsh.exe').fullname" if ( ! $powershellcorepath ) { $pending = $true @@ -40,7 +40,7 @@ Describe "Basic remoting test with docker" -tags @("Scenario","Slow"){ # capture the versions of full and core PowerShell write-verbose -verbose "getting powershell full version" $fullVersion = docker exec $client powershell -c "`$psversiontable.psversion.tostring()" - if ( ! $fullVersion ) + if ( ! $fullVersion ) { $pending = $true write-warning "Cannot determine PowerShell full version, not running tests" @@ -49,7 +49,7 @@ Describe "Basic remoting test with docker" -tags @("Scenario","Slow"){ write-verbose -verbose "getting powershell core version" $coreVersion = docker exec $client "$powershellcorepath" -c "`$psversiontable.psversion.tostring()" - if ( ! $coreVersion ) + if ( ! $coreVersion ) { $pending = $true write-warning "Cannot determine PowerShell core version, not running tests" diff --git a/test/docker/networktest/Dockerfile b/test/docker/networktest/Dockerfile index e91b3cd443f..1e4f3d65ebb 100644 --- a/test/docker/networktest/Dockerfile +++ b/test/docker/networktest/Dockerfile @@ -1,7 +1,7 @@ # escape=` FROM microsoft/windowsservercore -SHELL ["powershell.exe","-command"] +SHELL ["pwsh.exe","-command"] # the source msi should change on a daily basis # the destination should not change @@ -18,7 +18,7 @@ RUN new-LocalUser -Name testuser -password (ConvertTo-SecureString 11aa!!AA -asp set-item WSMan:/localhost/client/AllowUnencrypted $true; ` Start-Process -FilePath msiexec.exe -ArgumentList '-qn', ` '-i c:\PSCore.msi','-log c:\PSCore-install.log','-norestart' -wait ; ` - $psexec = get-item -path ${ENV:ProgramFiles}/powershell/*/powershell.exe; ` + $psexec = get-item -path ${ENV:ProgramFiles}/powershell/*/pwsh.exe; ` $corehome = $psexec.directory.fullname; ` & $psexec Install-PowerShellRemoting.ps1; ` remove-item -force c:\PSCore.msi diff --git a/test/powershell/Host/Base-Directory.Tests.ps1 b/test/powershell/Host/Base-Directory.Tests.ps1 index eb4f3f4e976..c518cff84df 100644 --- a/test/powershell/Host/Base-Directory.Tests.ps1 +++ b/test/powershell/Host/Base-Directory.Tests.ps1 @@ -1,7 +1,7 @@ Describe "Configuration file locations" -tags "CI","Slow" { BeforeAll { - $powershell = Join-Path -Path $PsHome -ChildPath "powershell" + $powershell = Join-Path -Path $PsHome -ChildPath "pwsh" $profileName = "Microsoft.PowerShell_profile.ps1" } diff --git a/test/powershell/Host/ConsoleHost.Tests.ps1 b/test/powershell/Host/ConsoleHost.Tests.ps1 index 10cf59e92e3..44f7c177963 100644 --- a/test/powershell/Host/ConsoleHost.Tests.ps1 +++ b/test/powershell/Host/ConsoleHost.Tests.ps1 @@ -9,7 +9,7 @@ using namespace System.Diagnostics Describe 'minishell for native executables' -Tag 'CI' { BeforeAll { - $powershell = Join-Path -Path $PsHome -ChildPath "powershell" + $powershell = Join-Path -Path $PsHome -ChildPath "pwsh" } Context 'Streams from minishell' { @@ -51,7 +51,7 @@ Describe 'minishell for native executables' -Tag 'CI' { Describe "ConsoleHost unit tests" -tags "Feature" { BeforeAll { - $powershell = Join-Path -Path $PsHome -ChildPath "powershell" + $powershell = Join-Path -Path $PsHome -ChildPath "pwsh" $ExitCodeBadCommandLineParameter = 64 function NewProcessStartInfo([string]$CommandLine, [switch]$RedirectStdIn) @@ -152,7 +152,7 @@ Describe "ConsoleHost unit tests" -tags "Feature" { } foreach ($x in "--help", "-help", "-h", "-?", "--he", "-hel", "--HELP", "-hEl") { It "Accepts '$x' as a parameter for help" { - & $powershell -noprofile $x | Where-Object { $_ -match "PowerShell[.exe] -Help | -? | /?" } | Should Not BeNullOrEmpty + & $powershell -noprofile $x | Where-Object { $_ -match "pwsh[.exe] -Help | -? | /?" } | Should Not BeNullOrEmpty } } @@ -170,7 +170,7 @@ Describe "ConsoleHost unit tests" -tags "Feature" { @{value = "2"}, @{value = "-command 1-1"} ) { - $currentVersion = "powershell " + $PSVersionTable.GitCommitId.ToString() + $currentVersion = "PowerShell " + $PSVersionTable.GitCommitId.ToString() $observed = & $powershell -version $value 2>&1 $observed | should be $currentVersion $LASTEXITCODE | Should Be 0 @@ -487,8 +487,8 @@ foo } Context "PATH environment variable" { - It "`$PSHOME should be in front so that powershell.exe starts current running PowerShell" { - powershell -v | Should Match $psversiontable.GitCommitId + It "`$PSHOME should be in front so that pwsh.exe starts current running PowerShell" { + pwsh -v | Should Match $psversiontable.GitCommitId } It "powershell starts if PATH is not set" -Skip:($IsWindows) { @@ -568,7 +568,7 @@ public enum ShowWindowCommands : int @{WindowStyle="Maximized"} # hidden doesn't work in CI/Server Core ) { param ($WindowStyle) - $ps = Start-Process powershell -ArgumentList "-WindowStyle $WindowStyle -noexit -interactive" -PassThru + $ps = Start-Process pwsh -ArgumentList "-WindowStyle $WindowStyle -noexit -interactive" -PassThru $startTime = Get-Date $showCmd = "Unknown" while (((Get-Date) - $startTime).TotalSeconds -lt 10 -and $showCmd -ne $WindowStyle) @@ -581,7 +581,7 @@ public enum ShowWindowCommands : int } It "Invalid -WindowStyle returns error" { - powershell -WindowStyle invalid + pwsh -WindowStyle invalid $LASTEXITCODE | Should Be $ExitCodeBadCommandLineParameter } } diff --git a/test/powershell/Host/Read-Host.Tests.ps1 b/test/powershell/Host/Read-Host.Tests.ps1 index ca31ed388d4..739c4b85a02 100644 --- a/test/powershell/Host/Read-Host.Tests.ps1 +++ b/test/powershell/Host/Read-Host.Tests.ps1 @@ -1,7 +1,7 @@ Describe "Read-Host" -Tags "Slow","Feature" { Context "[Console]::ReadKey() implementation on non-Windows" { BeforeAll { - $powershell = Join-Path -Path $PsHome -ChildPath "powershell" + $powershell = Join-Path -Path $PsHome -ChildPath "pwsh" $assetsDir = Join-Path -Path $PSScriptRoot -ChildPath assets if ($IsWindows) { $ItArgs = @{ skip = $true } diff --git a/test/powershell/Host/TabCompletion/TabCompletion.Tests.ps1 b/test/powershell/Host/TabCompletion/TabCompletion.Tests.ps1 index ca77821df86..c416ee22af3 100644 --- a/test/powershell/Host/TabCompletion/TabCompletion.Tests.ps1 +++ b/test/powershell/Host/TabCompletion/TabCompletion.Tests.ps1 @@ -355,7 +355,7 @@ Describe "TabCompletion" -Tags CI { @{ inputStr = '$host.UI.WriteD'; expected = 'WriteDebugLine('; setup = $null } @{ inputStr = '$MaximumHistoryCount.'; expected = 'CompareTo('; setup = $null } @{ inputStr = '$A=[datetime]::now;$A.'; expected = 'Date'; setup = $null } - @{ inputStr = '$x= gps powershell;$x.*pm'; expected = 'NPM'; setup = $null } + @{ inputStr = '$x= gps pwsh;$x.*pm'; expected = 'NPM'; setup = $null } @{ inputStr = 'function write-output {param($abcd) $abcd};Write-Output -a'; expected = '-abcd'; setup = $null } @{ inputStr = 'function write-output {param($abcd) $abcd};Microsoft.PowerShell.Utility\Write-Output -'; expected = '-InputObject'; setup = $null } @{ inputStr = '[math]::Co'; expected = 'Cos('; setup = $null } @@ -418,7 +418,7 @@ Describe "TabCompletion" -Tags CI { @{ inputStr = 'gmo -list PackageM'; expected = 'PackageManagement'; setup = $null } @{ inputStr = 'gcm -Module PackageManagement Find-Pac'; expected = 'Find-Package'; setup = $null } @{ inputStr = 'ipmo PackageM'; expected = 'PackageManagement'; setup = $null } - @{ inputStr = 'Get-Process powersh'; expected = 'powershell'; setup = $null } + @{ inputStr = 'Get-Process pws'; expected = 'pwsh'; setup = $null } @{ inputStr = "function bar { [OutputType('System.IO.FileInfo')][OutputType('System.Diagnostics.Process')]param() }; bar | ? { `$_.ProcessN"; expected = 'ProcessName'; setup = $null } @{ inputStr = "function bar { [OutputType('System.IO.FileInfo')][OutputType('System.Diagnostics.Process')]param() }; bar | ? { `$_.LastAc"; expected = 'LastAccessTime'; setup = $null } @{ inputStr = "& 'get-comm"; expected = "'Get-Command'"; setup = $null } diff --git a/test/powershell/Language/Parser/Conversions.Tests.ps1 b/test/powershell/Language/Parser/Conversions.Tests.ps1 index b568a34fa5b..b8c75704c95 100644 --- a/test/powershell/Language/Parser/Conversions.Tests.ps1 +++ b/test/powershell/Language/Parser/Conversions.Tests.ps1 @@ -114,7 +114,7 @@ namespace TestTypeResolution { Add-Type $cmdletCode -OutputAssembly $cmdletDllPath Add-Type $dupTypeCode -OutputAssembly $dupTypeDllPath - $powershell = Join-Path $PSHOME "powershell" + $powershell = Join-Path $PSHOME "pwsh" } It "validate Type resolution should prefer the assembly loaded by Import-Module" { diff --git a/test/powershell/Language/Parser/UsingAssembly.Tests.ps1 b/test/powershell/Language/Parser/UsingAssembly.Tests.ps1 index 3e303caaeb8..da0b7be0682 100644 --- a/test/powershell/Language/Parser/UsingAssembly.Tests.ps1 +++ b/test/powershell/Language/Parser/UsingAssembly.Tests.ps1 @@ -79,26 +79,26 @@ public class ABC {} } #> It "Assembly loaded at runtime" -pending { - $assemblies = powershell -noprofile -command @" + $assemblies = pwsh -noprofile -command @" using assembly .\UsingAssemblyTest$guid.dll [Appdomain]::CurrentDomain.GetAssemblies().GetName().Name "@ $assemblies -contains "UsingAssemblyTest$guid" | Should Be $true - $assemblies = powershell -noprofile -command @" + $assemblies = pwsh -noprofile -command @" using assembly $PSScriptRoot\UsingAssemblyTest$guid.dll [Appdomain]::CurrentDomain.GetAssemblies().GetName().Name "@ $assemblies -contains "UsingAssemblyTest$guid" | Should Be $true - $assemblies = powershell -noprofile -command @" + $assemblies = pwsh -noprofile -command @" using assembly System.Drawing [Appdomain]::CurrentDomain.GetAssemblies().GetName().Name "@ $assemblies -contains "System.Drawing" | Should Be $true - $assemblies = powershell -noprofile -command @" + $assemblies = pwsh -noprofile -command @" using assembly 'System.Drawing, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' [Appdomain]::CurrentDomain.GetAssemblies().GetName().Name "@ diff --git a/test/powershell/Language/Scripting/NativeExecution/NativeCommandProcessor.Tests.ps1 b/test/powershell/Language/Scripting/NativeExecution/NativeCommandProcessor.Tests.ps1 index f9dc2880074..987c5416d94 100644 --- a/test/powershell/Language/Scripting/NativeExecution/NativeCommandProcessor.Tests.ps1 +++ b/test/powershell/Language/Scripting/NativeExecution/NativeCommandProcessor.Tests.ps1 @@ -1,7 +1,7 @@ Describe 'native commands with pipeline' -tags 'Feature' { BeforeAll { - $powershell = Join-Path -Path $PsHome -ChildPath "powershell" + $powershell = Join-Path -Path $PsHome -ChildPath "pwsh" } It "native | ps | native doesn't block" { @@ -30,8 +30,8 @@ Describe 'native commands with pipeline' -tags 'Feature' { $result = @(ping.exe | findstr.exe count | findstr.exe ping) $result[0] | Should Match "Usage: ping" } else { - $result = @(ps aux | grep powershell | grep -v grep) - $result[0] | Should Match "powershell" + $result = @(ps aux | grep pwsh | grep -v grep) + $result[0] | Should Match "pwsh" } } } diff --git a/test/powershell/Language/Scripting/NativeExecution/NativeStreams.Tests.ps1 b/test/powershell/Language/Scripting/NativeExecution/NativeStreams.Tests.ps1 index 89cb87fc3d4..7ff0bde45a5 100644 --- a/test/powershell/Language/Scripting/NativeExecution/NativeStreams.Tests.ps1 +++ b/test/powershell/Language/Scripting/NativeExecution/NativeStreams.Tests.ps1 @@ -1,5 +1,5 @@ Describe "Native streams behavior with PowerShell" -Tags 'CI' { - $powershell = Join-Path -Path $PsHome -ChildPath "powershell" + $powershell = Join-Path -Path $PsHome -ChildPath "pwsh" Context "Error stream" { # we are using powershell itself as an example of a native program. diff --git a/test/powershell/Modules/Microsoft.PowerShell.Core/Import-Module.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Core/Import-Module.Tests.ps1 index 911c74c8fae..0821e00d149 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Core/Import-Module.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Core/Import-Module.Tests.ps1 @@ -103,7 +103,7 @@ using System.Management.Automation; // Windows PowerShell namespace. namespace ModuleCmdlets { - [Cmdlet(VerbsDiagnostic.Test,"BinaryModuleCmdlet1")] + [Cmdlet(VerbsDiagnostic.Test,"BinaryModuleCmdlet1")] public class TestBinaryModuleCmdlet1Command : Cmdlet { protected override void BeginProcessing() @@ -115,7 +115,7 @@ namespace ModuleCmdlets "@ Add-Type -TypeDefinition $src -OutputAssembly $TESTDRIVE\System.dll - $results = powershell -noprofile -c "`$module = Import-Module $TESTDRIVE\System.dll -Passthru; `$module.ImplementingAssembly.Location; Test-BinaryModuleCmdlet1" + $results = pwsh -noprofile -c "`$module = Import-Module $TESTDRIVE\System.dll -Passthru; `$module.ImplementingAssembly.Location; Test-BinaryModuleCmdlet1" #Ignore slash format difference under windows/Unix $path = (Get-ChildItem $TESTDRIVE\System.dll).FullName diff --git a/test/powershell/Modules/Microsoft.PowerShell.Core/Out-Default.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Core/Out-Default.Tests.ps1 index 9da136ea0b3..b84fba88204 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Core/Out-Default.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Core/Out-Default.Tests.ps1 @@ -3,7 +3,7 @@ Describe "Out-Default Tests" -tag CI { # due to https://github.com/PowerShell/PowerShell/issues/3405, `Out-Default -Transcript` emits output to pipeline # as running in Pester effectively wraps everything in parenthesis, workaround is to use another powershell # to run the test script passed as a string - $powershell = "$PSHOME/powershell" + $powershell = "$PSHOME/pwsh" } It "'Out-Default -Transcript' shows up in transcript, but not host" { diff --git a/test/powershell/Modules/Microsoft.PowerShell.Management/FileSystem.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Management/FileSystem.Tests.ps1 index 29b6659922e..32f676d6c91 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Management/FileSystem.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Management/FileSystem.Tests.ps1 @@ -240,7 +240,7 @@ Describe "Basic FileSystem Provider Tests" -Tags "CI" { Context "Validate behavior when access is denied" { BeforeAll { - $powershell = Join-Path $PSHOME "powershell" + $powershell = Join-Path $PSHOME "pwsh" if ($IsWindows) { $protectedPath = Join-Path ([environment]::GetFolderPath("windows")) "appcompat" "Programs" diff --git a/test/powershell/Modules/Microsoft.PowerShell.Management/Set-Service.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Management/Set-Service.Tests.ps1 index 4ef784b11e0..77f3fc62667 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Management/Set-Service.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Management/Set-Service.Tests.ps1 @@ -126,7 +126,7 @@ Describe "Set/New/Remove-Service cmdlet tests" -Tags "Feature", "RequireAdminOnW $creds = [pscredential]::new(".\$startUsername", $password) $parameters = @{ Name = $servicename; - BinaryPathName = "$PSHOME\powershell.exe"; + BinaryPathName = "$PSHOME\pwsh.exe"; StartupType = "Manual"; Credential = $creds } @@ -156,7 +156,7 @@ Describe "Set/New/Remove-Service cmdlet tests" -Tags "Feature", "RequireAdminOnW try { $parameters = @{ Name = $name; - BinaryPathName = "$PSHOME\powershell.exe"; + BinaryPathName = "$PSHOME\pwsh.exe"; StartupType = $startupType; } if ($description) { @@ -200,7 +200,7 @@ Describe "Set/New/Remove-Service cmdlet tests" -Tags "Feature", "RequireAdminOnW $servicename = "testremoveservice" $parameters = @{ Name = $servicename; - BinaryPathName = "$PSHOME\powershell.exe" + BinaryPathName = "$PSHOME\pwsh.exe" } $service = New-Service @parameters $service | Should Not BeNullOrEmpty @@ -218,7 +218,7 @@ Describe "Set/New/Remove-Service cmdlet tests" -Tags "Feature", "RequireAdminOnW $servicename = "testremoveservice" $parameters = @{ Name = $servicename; - BinaryPathName = "$PSHOME\powershell.exe" + BinaryPathName = "$PSHOME\pwsh.exe" } $service = New-Service @parameters $service | Should Not BeNullOrEmpty @@ -241,7 +241,7 @@ Describe "Set/New/Remove-Service cmdlet tests" -Tags "Feature", "RequireAdminOnW $newdisplayname = "newdisplayname" $parameters = @{ Name = $servicename; - BinaryPathName = "$PSHOME\powershell.exe" + BinaryPathName = "$PSHOME\pwsh.exe" } $service = New-Service @parameters $service | Should Not BeNullOrEmpty @@ -260,7 +260,7 @@ Describe "Set/New/Remove-Service cmdlet tests" -Tags "Feature", "RequireAdminOnW $newdisplayname = "newdisplayname" $parameters = @{ Name = $servicename; - BinaryPathName = "$PSHOME\powershell.exe" + BinaryPathName = "$PSHOME\pwsh.exe" } $service = New-Service @parameters $service | Should Not BeNullOrEmpty @@ -290,7 +290,7 @@ Describe "Set/New/Remove-Service cmdlet tests" -Tags "Feature", "RequireAdminOnW param($cmdlet, $name, $parameter, $value, $errorid) $parameters = @{$parameter = $value; Name = $name; ErrorAction = "Stop"} if ($cmdlet -eq "New-Service") { - $parameters += @{Binary = "$PSHOME\powershell.exe"}; + $parameters += @{Binary = "$PSHOME\pwsh.exe"}; } { & $cmdlet @parameters } | ShouldBeErrorId $errorid } diff --git a/test/powershell/Modules/Microsoft.PowerShell.Utility/Invoke-Item.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Utility/Invoke-Item.Tests.ps1 index 416b6387e6e..d69cc02d2af 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Utility/Invoke-Item.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Utility/Invoke-Item.Tests.ps1 @@ -2,7 +2,7 @@ using namespace System.Diagnostics Describe "Invoke-Item basic tests" -Tags "Feature" { BeforeAll { - $powershell = Join-Path $PSHOME -ChildPath powershell + $powershell = Join-Path $PSHOME -ChildPath pwsh $testFile1 = Join-Path -Path $TestDrive -ChildPath "text1.txt" New-Item -Path $testFile1 -ItemType File -Force > $null diff --git a/test/powershell/Modules/Microsoft.PowerShell.Utility/Set-PSBreakpoint.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Utility/Set-PSBreakpoint.Tests.ps1 index bfc4445d9ff..a9750e92365 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Utility/Set-PSBreakpoint.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Utility/Set-PSBreakpoint.Tests.ps1 @@ -1,4 +1,4 @@ -$ps = Join-Path -Path $PsHome -ChildPath "powershell" +$ps = Join-Path -Path $PsHome -ChildPath "pwsh" Describe "Set-PSBreakpoint DRT Unit Tests" -Tags "CI" { #Set up diff --git a/test/powershell/Modules/Microsoft.PowerShell.Utility/Write-Host.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Utility/Write-Host.Tests.ps1 index e7fa3b1c6ce..a66501ff97b 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Utility/Write-Host.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Utility/Write-Host.Tests.ps1 @@ -1,7 +1,7 @@ Describe "Write-Host with default Console Host" -Tags "Slow","Feature" { BeforeAll { - $powershell = Join-Path -Path $PsHome -ChildPath "powershell" + $powershell = Join-Path -Path $PsHome -ChildPath "pwsh" $testData = @( @{ Name = '-Separator'; Command = "Write-Host a,b,c -Separator '+'"; returnCount = 1; returnValue = @("a+b+c") } diff --git a/test/powershell/Modules/Microsoft.PowerShell.Utility/XMLCommand.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Utility/XMLCommand.Tests.ps1 index e5c1de69ca1..83d0ad3c977 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Utility/XMLCommand.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Utility/XMLCommand.Tests.ps1 @@ -102,9 +102,9 @@ Describe "XmlCommand DRT basic functionality Tests" -Tags "CI" { $deserialized_one.two.three.num | Should BeNullOrEmpty } - It "Import-Clixml should work with XML serialization from powershell.exe" { + It "Import-Clixml should work with XML serialization from pwsh.exe" { # need to create separate process so that current powershell doesn't interpret clixml output - Start-Process -FilePath $pshome\powershell -RedirectStandardOutput $testfile -Args "-noprofile -nologo -outputformat xml -command get-command import-clixml" -Wait + Start-Process -FilePath $pshome\pwsh -RedirectStandardOutput $testfile -Args "-noprofile -nologo -outputformat xml -command get-command import-clixml" -Wait $out = Import-Clixml -Path $testfile $out.Name | Should Be "Import-CliXml" $out.CommandType.ToString() | Should Be "Cmdlet" diff --git a/test/powershell/Modules/Microsoft.PowerShell.Utility/clixml.tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Utility/clixml.tests.ps1 index c81740202b5..c53bced0227 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Utility/clixml.tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Utility/clixml.tests.ps1 @@ -37,7 +37,7 @@ Context "Export-CliXml" { BeforeAll { - $gpsList = Get-Process powershell + $gpsList = Get-Process pwsh $gps = $gpsList | Select-Object -First 1 $filePath = Join-Path $subFilePath 'gps.xml' @@ -213,7 +213,7 @@ Describe "Deserializing corrupted Cim classes should not instantiate non-Cim typ It "Verifies that importing the corrupted Cim class does not launch calc.exe" -skip:$skipNotWindows { Import-Clixml -Path (Join-Path $PSScriptRoot "assets\CorruptedCim.clixml") - + # Wait up to 10 seconds for calc.exe to run $calcProc = $null $count = 0 diff --git a/test/powershell/Modules/Microsoft.PowerShell.Utility/object.tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Utility/object.tests.ps1 index 70a1e16e6c3..e3493397a04 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Utility/object.tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Utility/object.tests.ps1 @@ -2,7 +2,7 @@ Context "Group-Object" { It "AsHashtable returns a hashtable" { $result = Get-Process | Group-Object -Property ProcessName -AsHashTable - $result["powershell"].Count | Should BeGreaterThan 0 + $result["pwsh"].Count | Should BeGreaterThan 0 } It "AsString returns a string" { diff --git a/test/powershell/Modules/Microsoft.WSMan.Management/CredSSP.Tests.ps1 b/test/powershell/Modules/Microsoft.WSMan.Management/CredSSP.Tests.ps1 index 5d6c310aefa..e17dabc8016 100644 --- a/test/powershell/Modules/Microsoft.WSMan.Management/CredSSP.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.WSMan.Management/CredSSP.Tests.ps1 @@ -1,7 +1,7 @@ Describe "CredSSP cmdlet tests" -Tags 'Feature','RequireAdminOnWindows' { BeforeAll { - $powershell = Join-Path $PSHOME "powershell" + $powershell = Join-Path $PSHOME "pwsh" $notEnglish = $false $IsToBeSkipped = !$IsWindows; diff --git a/test/powershell/Provider/Pester.AutomountedDrives.Tests.ps1 b/test/powershell/Provider/Pester.AutomountedDrives.Tests.ps1 index add2463864e..af71d73d6b1 100644 --- a/test/powershell/Provider/Pester.AutomountedDrives.Tests.ps1 +++ b/test/powershell/Provider/Pester.AutomountedDrives.Tests.ps1 @@ -1,4 +1,4 @@ -<############################################################################################ +<############################################################################################ # File: Pester.AutomountedDrives.Tests.ps1 # Pester.AutomountedDrives.Tests suite contains Tests that are # used for validating automounted PowerShell drives. @@ -7,8 +7,8 @@ $script:TestSourceRoot = $PSScriptRoot Describe "Test suite for validating automounted PowerShell drives" -Tags @('Feature', 'Slow', 'RequireAdminOnWindows') { BeforeAll { - $powershell = Join-Path -Path $PsHome -ChildPath "powershell" - + $powershell = Join-Path -Path $PsHome -ChildPath "pwsh" + $AutomountVHDDriveScriptPath = Join-Path $script:TestSourceRoot 'AutomountVHDDrive.ps1' $vhdPath = Join-Path $TestDrive 'TestAutomountVHD.vhd' @@ -29,24 +29,24 @@ Describe "Test suite for validating automounted PowerShell drives" -Tags @('Feat catch { $VHDToolsNotFound = $true } } - + Context "Validating automounting FileSystem drives" { - + It "Test automounting using subst.exe" -Skip:$SubstNotFound { & $powershell -noprofile -command "& '$AutomountSubstDriveScriptPath' -FullPath '$substDir'" | Should Be "Drive found" } - + It "Test automounting using New-VHD/Mount-VHD" -Skip:$VHDToolsNotFound { & $powershell -noprofile -command "& '$AutomountVHDDriveScriptPath' -VHDPath '$vhdPath'" | Should Be "Drive found" } } Context "Validating automounting FileSystem drives from modules" { - + It "Test automounting using subst.exe" -Skip:$SubstNotFound { & $powershell -noprofile -command "& '$AutomountSubstDriveScriptPath' -useModule -FullPath '$substDir'" | Should Be "Drive found" } - + It "Test automounting using New-VHD/Mount-VHD" -Skip:$VHDToolsNotFound { $vhdPath = Join-Path $TestDrive 'TestAutomountVHD.vhd' & $powershell -noprofile -command "& '$AutomountVHDDriveScriptPath' -useModule -VHDPath '$vhdPath'" | Should Be "Drive found" diff --git a/test/powershell/README.md b/test/powershell/README.md index 334f511a086..193cb5ac022 100644 --- a/test/powershell/README.md +++ b/test/powershell/README.md @@ -23,7 +23,7 @@ one on the path. Example: ```powershell - $powershell = Join-Path -Path $PsHome -ChildPath "powershell" + $powershell = Join-Path -Path $PsHome -ChildPath "pwsh" & $powershell -noprofile -command "ExampleCommand" | Should Be "ExampleOutput" ``` diff --git a/test/powershell/SDK/PSDebugging.Tests.ps1 b/test/powershell/SDK/PSDebugging.Tests.ps1 index f161bcadbfc..2f14eba077d 100644 --- a/test/powershell/SDK/PSDebugging.Tests.ps1 +++ b/test/powershell/SDK/PSDebugging.Tests.ps1 @@ -4,7 +4,7 @@ using namespace System.Management.Automation.Internal Describe "PowerShell Command Debugging" -tags "CI" { BeforeAll { - $powershell = Join-Path -Path $PsHome -ChildPath "powershell" + $powershell = Join-Path -Path $PsHome -ChildPath "pwsh" } function NewProcessStartInfo([string]$CommandLine, [switch]$RedirectStdIn) diff --git a/test/powershell/engine/Job/Jobs.Tests.ps1 b/test/powershell/engine/Job/Jobs.Tests.ps1 index 3303c803a16..eb0ac846548 100644 --- a/test/powershell/engine/Job/Jobs.Tests.ps1 +++ b/test/powershell/engine/Job/Jobs.Tests.ps1 @@ -69,7 +69,7 @@ Describe 'Basic Job Tests' -Tags 'CI' { It "Create job with native command" { try { - $nativeJob = Start-job { powershell -c 1+1 } + $nativeJob = Start-job { pwsh -c 1+1 } $nativeJob | Wait-Job $nativeJob.State | Should BeExactly "Completed" $nativeJob.HasMoreData | Should Be $true diff --git a/test/powershell/engine/Module/ModulePath.Tests.ps1 b/test/powershell/engine/Module/ModulePath.Tests.ps1 index 9d011ff468e..ade31fa71f8 100644 --- a/test/powershell/engine/Module/ModulePath.Tests.ps1 +++ b/test/powershell/engine/Module/ModulePath.Tests.ps1 @@ -4,7 +4,7 @@ Describe "SxS Module Path Basic Tests" -tags "CI" { if ($IsWindows) { - $powershell = "$PSHOME\powershell.exe" + $powershell = "$PSHOME\pwsh.exe" $ProductName = "WindowsPowerShell" if ($IsCoreCLR -and ($PSHOME -notlike "*Windows\System32\WindowsPowerShell\v1.0")) { @@ -15,7 +15,7 @@ Describe "SxS Module Path Basic Tests" -tags "CI" { } else { - $powershell = "$PSHOME/powershell" + $powershell = "$PSHOME/pwsh" $expectedUserPath = [System.Management.Automation.Platform]::SelectProductNameForDirectory("USER_MODULES") $expectedSharedPath = [System.Management.Automation.Platform]::SelectProductNameForDirectory("SHARED_MODULES") } @@ -25,7 +25,7 @@ Describe "SxS Module Path Basic Tests" -tags "CI" { $fakePSHome = Join-Path -Path $TestDrive -ChildPath 'FakePSHome' $fakePSHomeModuleDir = Join-Path -Path $fakePSHome -ChildPath 'Modules' $fakePowerShell = Join-Path -Path $fakePSHome -ChildPath (Split-Path -Path $powershell -Leaf) - $fakePSDepsFile = Join-Path -Path $fakePSHome -ChildPath "powershell.deps.json" + $fakePSDepsFile = Join-Path -Path $fakePSHome -ChildPath "pwsh.deps.json" New-Item -Path $fakePSHome -ItemType Directory > $null New-Item -Path $fakePSHomeModuleDir -ItemType Directory > $null @@ -56,7 +56,7 @@ Describe "SxS Module Path Basic Tests" -tags "CI" { It "ignore pshome module path derived from a different powershell core instance" -Skip:(!$IsCoreCLR) { - ## Create 'powershell' and 'powershell.deps.json' in the fake PSHome folder, + ## Create 'powershell' and 'pwsh.deps.json' in the fake PSHome folder, ## so that the module path calculation logic would believe it's real. New-Item -Path $fakePowerShell -ItemType File -Force > $null New-Item -Path $fakePSDepsFile -ItemType File -Force > $null @@ -75,7 +75,7 @@ Describe "SxS Module Path Basic Tests" -tags "CI" { } finally { - ## Remove 'powershell' and 'powershell.deps.json' from the fake PSHome folder + ## Remove 'powershell' and 'pwsh.deps.json' from the fake PSHome folder Remove-Item -Path $fakePowerShell -Force -ErrorAction SilentlyContinue Remove-Item -Path $fakePSDepsFile -Force -ErrorAction SilentlyContinue } diff --git a/test/powershell/engine/ParameterBinding/ParameterBinding.Tests.ps1 b/test/powershell/engine/ParameterBinding/ParameterBinding.Tests.ps1 index 591b01f2543..0bf88e86485 100644 --- a/test/powershell/engine/ParameterBinding/ParameterBinding.Tests.ps1 +++ b/test/powershell/engine/ParameterBinding/ParameterBinding.Tests.ps1 @@ -302,7 +302,7 @@ $test2File = Join-Path -Path $tempDir -ChildPath "test2.ps1" $expected = "[$tempDir]" - $psPath = "$PSHOME\powershell" + $psPath = "$PSHOME\pwsh" $null = New-Item -Path $tempDir -ItemType Directory -Force Set-Content -Path $test1File -Value $test1 -Force diff --git a/test/tools/CodeCoverageAutomation/Start-CodeCoverageRun.ps1 b/test/tools/CodeCoverageAutomation/Start-CodeCoverageRun.ps1 index 566e007c8f4..5f231278e11 100644 --- a/test/tools/CodeCoverageAutomation/Start-CodeCoverageRun.ps1 +++ b/test/tools/CodeCoverageAutomation/Start-CodeCoverageRun.ps1 @@ -238,7 +238,7 @@ try } # grab the commitID, we need this to grab the right sources - $gitCommitId = & "$psBinPath\powershell.exe" -noprofile -command { $PSVersiontable.GitCommitId } + $gitCommitId = & "$psBinPath\pwsh.exe" -noprofile -command { $PSVersiontable.GitCommitId } $commitId = $gitCommitId.substring($gitCommitId.LastIndexOf('-g') + 2) # download the src directory diff --git a/test/tools/OpenCover/OpenCover.psm1 b/test/tools/OpenCover/OpenCover.psm1 index 1d90f6d6551..ba2e52167ea 100644 --- a/test/tools/OpenCover/OpenCover.psm1 +++ b/test/tools/OpenCover/OpenCover.psm1 @@ -611,7 +611,7 @@ function Install-OpenCover .Synopsis Invoke-OpenCover runs tests under OpenCover to collect code coverage. .Description - Invoke-OpenCover runs tests under OpenCover by executing tests on PowerShell.exe located at $PowerShellExeDirectory. + Invoke-OpenCover runs tests under OpenCover by executing tests on PowerShell located at $PowerShellExeDirectory. .EXAMPLE Invoke-OpenCover -TestPath $pwd/test/powershell -PowerShellExeDirectory $pwd/src/powershell-win-core/bin/CodeCoverage/netcoreapp1.0/win7-x64 #> @@ -654,8 +654,8 @@ function Invoke-OpenCover } } - # check to be sure that powershell.exe is present - $target = "${PowerShellExeDirectory}\powershell.exe" + # check to be sure that pwsh.exe is present + $target = "${PowerShellExeDirectory}\pwsh.exe" if ( ! (test-path $target) ) { throw "$target does not exist, use 'Start-PSBuild -configuration CodeCoverage'" @@ -702,12 +702,12 @@ function Invoke-OpenCover # '&' invoke caused issues with cmdline parameters for opencover.console.exe $elevatedFile = "$env:temp\elevated.ps1" "$OpenCoverBin $cmdlineElevated" | Out-File -FilePath $elevatedFile -force - powershell.exe -file $elevatedFile + pwsh.exe -file $elevatedFile # invoke OpenCover unelevated and poll for completion $unelevatedFile = "$env:temp\unelevated.ps1" "$openCoverBin $cmdlineUnelevated" | Out-File -FilePath $unelevatedFile -Force - runas.exe /trustlevel:0x20000 "powershell.exe -file $unelevatedFile" + runas.exe /trustlevel:0x20000 "pwsh.exe -file $unelevatedFile" # poll for process exit every 60 seconds # timeout of 6 hours # Runs currently take about 2.5 - 3 hours, we picked 6 hours to be substantially larger. diff --git a/tools/appveyor.psm1 b/tools/appveyor.psm1 index 58a9ee4025e..359f7c85079 100644 --- a/tools/appveyor.psm1 +++ b/tools/appveyor.psm1 @@ -323,9 +323,9 @@ function Invoke-AppVeyorTest Write-Host -Foreground Green 'Run CoreCLR tests' $testResultsNonAdminFile = "$pwd\TestsResultsNonAdmin.xml" $testResultsAdminFile = "$pwd\TestsResultsAdmin.xml" - if(!(Test-Path "$env:CoreOutput\powershell.exe")) + if(!(Test-Path "$env:CoreOutput\pwsh.exe")) { - throw "CoreCLR PowerShell.exe was not built" + throw "CoreCLR pwsh.exe was not built" } if(-not (Test-DailyBuild)) diff --git a/tools/packaging/packaging.psm1 b/tools/packaging/packaging.psm1 index bb587e9a12b..9f9ad26ac61 100644 --- a/tools/packaging/packaging.psm1 +++ b/tools/packaging/packaging.psm1 @@ -437,7 +437,7 @@ function New-UnixPackage { # Setup staging directory so we don't change the original source directory $Staging = "$PSScriptRoot/staging" if ($pscmdlet.ShouldProcess("Create staging folder")) { - New-StagingFolder -StagingPath $Staging -Name $Name + New-StagingFolder -StagingPath $Staging } # Follow the Filesystem Hierarchy Standard for Linux and macOS @@ -456,7 +456,7 @@ function New-UnixPackage { if($pscmdlet.ShouldProcess("Create package file system")) { - New-Item -Force -ItemType SymbolicLink -Path "/tmp/$Name" -Target "$Destination/$Name" >$null + New-Item -Force -ItemType SymbolicLink -Path "/tmp/pwsh" -Target "$Destination/pwsh" >$null if ($Environment.IsRedHatFamily) { # add two symbolic links to system shared libraries that libmi.so is dependent on to handle @@ -468,14 +468,14 @@ function New-UnixPackage { $AfterInstallScript = [io.path]::GetTempFileName() $AfterRemoveScript = [io.path]::GetTempFileName() - $packagingStrings.RedHatAfterInstallScript -f "$Link/$Name" | Out-File -FilePath $AfterInstallScript -Encoding ascii - $packagingStrings.RedHatAfterRemoveScript -f "$Link/$Name" | Out-File -FilePath $AfterRemoveScript -Encoding ascii + $packagingStrings.RedHatAfterInstallScript -f "$Link/pwsh" | Out-File -FilePath $AfterInstallScript -Encoding ascii + $packagingStrings.RedHatAfterRemoveScript -f "$Link/pwsh" | Out-File -FilePath $AfterRemoveScript -Encoding ascii } elseif ($Environment.IsUbuntu -or $Environment.IsDebian) { $AfterInstallScript = [io.path]::GetTempFileName() $AfterRemoveScript = [io.path]::GetTempFileName() - $packagingStrings.UbuntuAfterInstallScript -f "$Link/$Name" | Out-File -FilePath $AfterInstallScript -Encoding ascii - $packagingStrings.UbuntuAfterRemoveScript -f "$Link/$Name" | Out-File -FilePath $AfterRemoveScript -Encoding ascii + $packagingStrings.UbuntuAfterInstallScript -f "$Link/pwsh" | Out-File -FilePath $AfterInstallScript -Encoding ascii + $packagingStrings.UbuntuAfterRemoveScript -f "$Link/pwsh" | Out-File -FilePath $AfterRemoveScript -Encoding ascii } @@ -483,7 +483,7 @@ function New-UnixPackage { # if the target of the powershell symlink exists, `fpm` aborts # with a `utime` error on macOS. # so we move it to make symlink broken - $symlink_dest = "$Destination/$Name" + $symlink_dest = "$Destination/pwsh" $hack_dest = "./_fpm_symlink_hack_powershell" if ($Environment.IsMacOS) { if (Test-Path $symlink_dest) { @@ -501,10 +501,8 @@ function New-UnixPackage { Start-NativeExecution { ronn --roff $RonnFile } # Setup for side-by-side man pages (noop if primary package) - $FixedRoffFile = $RoffFile -replace "powershell.1$", "$Name.1" - if ($Name -ne "powershell") { - Move-Item $RoffFile $FixedRoffFile - } + $FixedRoffFile = $RoffFile -replace "powershell.1$", "pwsh.1" + Move-Item $RoffFile $FixedRoffFile # gzip in assets directory $GzipFile = "$FixedRoffFile.gz" @@ -517,7 +515,7 @@ function New-UnixPackage { find $Staging -type d | xargs chmod 755 find $Staging -type f | xargs chmod 644 chmod 644 $GzipFile - chmod 755 "$Staging/$Name" # only the executable should be executable + chmod 755 "$Staging/pwsh" # only the executable should be executable } } @@ -576,15 +574,15 @@ function New-UnixPackage { $Arguments += @("--depends", $Dependency) } if ($AfterInstallScript) { - $Arguments += @("--after-install", $AfterInstallScript) + $Arguments += @("--after-install", $AfterInstallScript) } if ($AfterRemoveScript) { - $Arguments += @("--after-remove", $AfterRemoveScript) + $Arguments += @("--after-remove", $AfterRemoveScript) } $Arguments += @( "$Staging/=$Destination/", "$GzipFile=$ManFile", - "/tmp/$Name=$Link" + "/tmp/pwsh=$Link" ) # Build package try { @@ -600,11 +598,12 @@ function New-UnixPackage { } } if ($AfterInstallScript) { - Remove-Item -erroraction 'silentlycontinue' $AfterInstallScript + Remove-Item -erroraction 'silentlycontinue' $AfterInstallScript } if ($AfterRemoveScript) { - Remove-Item -erroraction 'silentlycontinue' $AfterRemoveScript + Remove-Item -erroraction 'silentlycontinue' $AfterRemoveScript } + Remove-Item -Path $GzipFile -Force -ErrorAction SilentlyContinue } # Magic to get path output @@ -639,32 +638,11 @@ function New-StagingFolder param( [Parameter(Mandatory)] [string] - $StagingPath, - - # Must start with 'powershell' but may have any suffix - [Parameter(Mandatory)] - [ValidatePattern("^powershell")] - [string] - $Name + $StagingPath ) Remove-Item -Recurse -Force -ErrorAction SilentlyContinue $StagingPath Copy-Item -Recurse $PackageSourcePath $StagingPath - - # Rename files to given name if not "powershell" - if ($Name -ne "powershell") { - $Files = @("powershell", - "powershell.dll", - "powershell.deps.json", - "powershell.pdb", - "powershell.runtimeconfig.json", - "powershell.xml") - - foreach ($File in $Files) { - $NewName = $File -replace "^powershell", $Name - Move-Item "$StagingPath/$File" "$StagingPath/$NewName" - } - } } # Function to create a zip file for Nano Server and xcopy deployment @@ -790,7 +768,7 @@ function New-NugetPackage $stagingRoot = New-SubFolder -Path $PSScriptRoot -ChildPath 'nugetStaging' -Clean $contentFolder = Join-Path -path $stagingRoot -ChildPath 'content' if ($pscmdlet.ShouldProcess("Create staging folder")) { - New-StagingFolder -StagingPath $contentFolder -Name $Name + New-StagingFolder -StagingPath $contentFolder } $projectFolder = Join-Path $PSScriptRoot -ChildPath 'project' From 7c9bddfa3d2d6ee158c831db38268860cf43d88c Mon Sep 17 00:00:00 2001 From: Mark Kraus Date: Tue, 17 Oct 2017 21:08:06 -0500 Subject: [PATCH 009/617] Add Authentication Parameter to Web Cmdlets for Basic and OAuth (#5052) Closes #4274 Adds an -Authentication parameter to Invoke-RestMethod and Invoke-WebRequest Adds an -Token parameter to Invoke-RestMethod and Invoke-WebRequest Adds an -AllowUnencryptedAuthentication parameter to Invoke-RestMethod and Invoke-WebRequest Adds tests for various -Authorization uses -Authentication Parameter has 3 options: Basic, OAuth, and Bearer Basic requires -Credential and provides RFC-7617 Basic Authorization credentials to the remote server OAuth and Bearer require the -Token which is a SecureString containing the bearer token to send to the remote server If any authentication is provided for any transport scheme other than HTTPS, the request will result in an error. A user may use the -AllowUnencryptedAuthentication switch to bypass this behavior and send their secrets unencrypted at their own risk. -Authentication does not work with -UseDefaultCredentials and will result in an error. The existing behavior with -Credential is left untouched. When not supplying -Authentication, A user will not receive an error when using -Credential over unencrypted connections. Code design choice is meant to accommodate more Authentication types in the future. Documentation Needed The 3 new parameters will need to be added to the Invoke-RestMethod and Invoke-WebRequest documentation along with examples. Syntax will need to be updated. --- .../Common/WebRequestPSCmdlet.Common.cs | 115 +++++++++- .../resources/WebCmdletStrings.resx | 15 ++ .../WebCmdlets.Tests.ps1 | 215 ++++++++++++++++++ 3 files changed, 344 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/WebRequestPSCmdlet.Common.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/WebRequestPSCmdlet.Common.cs index e9eb8f77e56..a63d0e4c39b 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/WebRequestPSCmdlet.Common.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/WebRequestPSCmdlet.Common.cs @@ -10,6 +10,7 @@ using System.Text; using System.Collections; using System.Globalization; +using System.Security; using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; #if !CORECLR @@ -19,6 +20,32 @@ namespace Microsoft.PowerShell.Commands { + /// + /// The valid values for the -Authentication parameter for Invoke-RestMethod and Invoke-WebRequest + /// + public enum WebAuthenticationType + { + /// + /// No authentication. Default. + /// + None, + + /// + /// RFC-7617 Basic Authentication. Requires -Credential + /// + Basic, + + /// + /// RFC-6750 OAuth 2.0 Bearer Authentication. Requires -Token + /// + Bearer, + + /// + /// RFC-6750 OAuth 2.0 Bearer Authentication. Requires -Token + /// + OAuth, + } + /// /// Base class for Invoke-RestMethod and Invoke-WebRequest commands. /// @@ -61,6 +88,22 @@ public abstract partial class WebRequestPSCmdlet : PSCmdlet #region Authorization and Credentials + /// + /// Gets or sets the AllowUnencryptedAuthentication property + /// + [Parameter] + public virtual SwitchParameter AllowUnencryptedAuthentication { get; set; } + + /// + /// Gets or sets the Authentication property used to determin the Authentication method for the web session. + /// Authentication does not work with UseDefaultCredentials. + /// Authentication over unencrypted sessions requires AllowUnencryptedAuthentication. + /// Basic: Requires Credential + /// OAuth/Bearer: Requires Token + /// + [Parameter] + public virtual WebAuthenticationType Authentication { get; set; } = WebAuthenticationType.None; + /// /// gets or sets the Credential property /// @@ -94,6 +137,12 @@ public abstract partial class WebRequestPSCmdlet : PSCmdlet [Parameter] public virtual SwitchParameter SkipCertificateCheck { get; set; } + /// + /// Gets or sets the Token property. Token is required by Authentication OAuth and Bearer. + /// + [Parameter] + public virtual SecureString Token { get; set; } + #endregion #region Headers @@ -274,6 +323,38 @@ internal virtual void ValidateParameters() ThrowTerminatingError(error); } + // Authentication + if (UseDefaultCredentials && (Authentication != WebAuthenticationType.None)) + { + ErrorRecord error = GetValidationError(WebCmdletStrings.AuthenticationConflict, + "WebCmdletAuthenticationConflictException"); + ThrowTerminatingError(error); + } + if ((Authentication != WebAuthenticationType.None) && (null != Token) && (null != Credential)) + { + ErrorRecord error = GetValidationError(WebCmdletStrings.AuthenticationTokenConflict, + "WebCmdletAuthenticationTokenConflictException"); + ThrowTerminatingError(error); + } + if ((Authentication == WebAuthenticationType.Basic) && (null == Credential)) + { + ErrorRecord error = GetValidationError(WebCmdletStrings.AuthenticationCredentialNotSupplied, + "WebCmdletAuthenticationCredentialNotSuppliedException"); + ThrowTerminatingError(error); + } + if ((Authentication == WebAuthenticationType.OAuth || Authentication == WebAuthenticationType.Bearer) && (null == Token)) + { + ErrorRecord error = GetValidationError(WebCmdletStrings.AuthenticationTokenNotSupplied, + "WebCmdletAuthenticationTokenNotSuppliedException"); + ThrowTerminatingError(error); + } + if (!AllowUnencryptedAuthentication && (Authentication != WebAuthenticationType.None) && (Uri.Scheme != "https")) + { + ErrorRecord error = GetValidationError(WebCmdletStrings.AllowUnencryptedAuthenticationRequired, + "WebCmdletAllowUnencryptedAuthenticationRequiredException"); + ThrowTerminatingError(error); + } + // credentials if (UseDefaultCredentials && (null != Credential)) { @@ -389,7 +470,7 @@ internal virtual void PrepareSession() // // handle credentials // - if (null != Credential) + if (null != Credential && Authentication == WebAuthenticationType.None) { // get the relevant NetworkCredential NetworkCredential netCred = Credential.GetNetworkCredential(); @@ -398,6 +479,10 @@ internal virtual void PrepareSession() // supplying a credential overrides the UseDefaultCredentials setting WebSession.UseDefaultCredentials = false; } + else if ((null != Credential || null!= Token) && Authentication != WebAuthenticationType.None) + { + ProcessAuthentication(); + } else if (UseDefaultCredentials) { WebSession.UseDefaultCredentials = true; @@ -666,6 +751,34 @@ private bool IsCustomMethodSet() return (ParameterSetName == "CustomMethod"); } + private string GetBasicAuthorizationHeader() + { + string unencoded = String.Format("{0}:{1}", Credential.UserName, Credential.GetNetworkCredential().Password); + Byte[] bytes = Encoding.UTF8.GetBytes(unencoded); + return String.Format("Basic {0}", Convert.ToBase64String(bytes)); + } + + private string GetBearerAuthorizationHeader() + { + return String.Format("Bearer {0}", new NetworkCredential(String.Empty, Token).Password); + } + + private void ProcessAuthentication() + { + if(Authentication == WebAuthenticationType.Basic) + { + WebSession.Headers["Authorization"] = GetBasicAuthorizationHeader(); + } + else if (Authentication == WebAuthenticationType.Bearer || Authentication == WebAuthenticationType.OAuth) + { + WebSession.Headers["Authorization"] = GetBearerAuthorizationHeader(); + } + else + { + Diagnostics.Assert(false, String.Format("Unrecognized Authentication value: {0}", Authentication)); + } + } + #endregion Helper Methods } } diff --git a/src/Microsoft.PowerShell.Commands.Utility/resources/WebCmdletStrings.resx b/src/Microsoft.PowerShell.Commands.Utility/resources/WebCmdletStrings.resx index 17fccac5f44..5ee6d6baf8c 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/resources/WebCmdletStrings.resx +++ b/src/Microsoft.PowerShell.Commands.Utility/resources/WebCmdletStrings.resx @@ -120,6 +120,21 @@ Access to the path '{0}' is denied. + + The cmdlet cannot protect plain text secrets sent over unencrypted connections. To supress this warning and send plain text secrets over unencrypted networks, reissue the command specifying the AllowUnencryptedAuthentication parameter. + + + The cmdlet cannot run because the following conflicting parameters are specified: Authentication and UseDefaultCredentials. Authentication does not support Default Credentials. Specify either Authentication or UseDefaultCredentials, then retry. + + + The cmdlet cannot run because the following parameter is not specified: Credential. The supplied Authentication type requires a Credential. Specify Credential, then retry. + + + The cmdlet cannot run because the following parameter is not specified: Token. The supplied Authentication type requires a Token. Specify Token, then retry. + + + The cmdlet cannot run because the following conflicting parameters are specified: Credential and Token. Specify either Credential or Token, then retry. + The cmdlet cannot run because the following conflicting parameters are specified: Body and InFile. Specify either Body or Infile, then retry. diff --git a/test/powershell/Modules/Microsoft.PowerShell.Utility/WebCmdlets.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Utility/WebCmdlets.Tests.ps1 index a91875f8e08..927f2151c58 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Utility/WebCmdlets.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Utility/WebCmdlets.Tests.ps1 @@ -1286,6 +1286,115 @@ Describe "Invoke-WebRequest tests" -Tags "Feature" { } } + Context "Invoke-WebRequest -Authentication tests" { + BeforeAll { + #[SuppressMessage("Microsoft.Security", "CS002:SecretInNextLine", Justification="Demo/doc/test secret.")] + $token = "testpassword" | ConvertTo-SecureString -AsPlainText -Force + $credential = [pscredential]::new("testuser",$token) + $httpUri = Get-WebListenerUrl -Test 'Get' + $httpsUri = Get-WebListenerUrl -Test 'Get' -Https + $testCases = @( + @{Authentication = "bearer"} + @{Authentication = "OAuth"} + ) + } + + It "Verifies Invoke-WebRequest -Authentication Basic" { + $params = @{ + Uri = $httpsUri + Authentication = "Basic" + Credential = $credential + SkipCertificateCheck = $true + } + $Response = Invoke-WebRequest @params + $result = $response.Content | ConvertFrom-Json + + $result.Headers.Authorization | Should BeExactly "Basic dGVzdHVzZXI6dGVzdHBhc3N3b3Jk" + } + + It "Verifies Invoke-WebRequest -Authentication " -TestCases $testCases { + param($Authentication) + $params = @{ + Uri = $httpsUri + Authentication = $Authentication + Token = $token + SkipCertificateCheck = $true + } + $Response = Invoke-WebRequest @params + $result = $response.Content | ConvertFrom-Json + + $result.Headers.Authorization | Should BeExactly "Bearer testpassword" + } + + It "Verifies Invoke-WebRequest -Authentication does not support -UseDefaultCredentials" { + $params = @{ + Uri = $httpsUri + Token = $token + Authentication = "OAuth" + UseDefaultCredentials = $true + ErrorAction = 'Stop' + SkipCertificateCheck = $true + } + { Invoke-WebRequest @params } | ShouldBeErrorId "WebCmdletAuthenticationConflictException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand" + } + + It "Verifies Invoke-WebRequest -Authentication does not support Both -Credential and -Token" { + $params = @{ + Uri = $httpsUri + Token = $token + Credential = $credential + Authentication = "OAuth" + ErrorAction = 'Stop' + SkipCertificateCheck = $true + } + { Invoke-WebRequest @params } | ShouldBeErrorId "WebCmdletAuthenticationTokenConflictException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand" + } + + It "Verifies Invoke-WebRequest -Authentication requires -Token" -TestCases $testCases { + param($Authentication) + $params = @{ + Uri = $httpsUri + Authentication = $Authentication + ErrorAction = 'Stop' + SkipCertificateCheck = $true + } + { Invoke-WebRequest @params } | ShouldBeErrorId "WebCmdletAuthenticationTokenNotSuppliedException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand" + } + + It "Verifies Invoke-WebRequest -Authentication Basic requires -Credential" { + $params = @{ + Uri = $httpsUri + Authentication = "Basic" + ErrorAction = 'Stop' + SkipCertificateCheck = $true + } + { Invoke-WebRequest @params } | ShouldBeErrorId "WebCmdletAuthenticationCredentialNotSuppliedException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand" + } + + It "Verifies Invoke-WebRequest -Authentication Requires HTTPS" { + $params = @{ + Uri = $httpUri + Token = $token + Authentication = "OAuth" + ErrorAction = 'Stop' + } + { Invoke-WebRequest @params } | ShouldBeErrorId "WebCmdletAllowUnencryptedAuthenticationRequiredException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand" + } + + It "Verifies Invoke-WebRequest -Authentication Can use HTTP with -AllowUnencryptedAuthentication" { + $params = @{ + Uri = $httpUri + Token = $token + Authentication = "OAuth" + AllowUnencryptedAuthentication = $true + } + $Response = Invoke-WebRequest @params + $result = $response.Content | ConvertFrom-Json + + $result.Headers.Authorization | Should BeExactly "Bearer testpassword" + } + } + BeforeEach { if ($env:http_proxy) { $savedHttpProxy = $env:http_proxy @@ -2097,6 +2206,112 @@ Describe "Invoke-RestMethod tests" -Tags "Feature" { } } + Context "Invoke-RestMethod -Authentication tests" { + BeforeAll { + #[SuppressMessage("Microsoft.Security", "CS002:SecretInNextLine", Justification="Demo/doc/test secret.")] + $token = "testpassword" | ConvertTo-SecureString -AsPlainText -Force + $credential = [pscredential]::new("testuser",$token) + $httpUri = Get-WebListenerUrl -Test 'Get' + $httpsUri = Get-WebListenerUrl -Test 'Get' -Https + $testCases = @( + @{Authentication = "bearer"} + @{Authentication = "OAuth"} + ) + } + + It "Verifies Invoke-RestMethod -Authentication Basic" { + $params = @{ + Uri = $httpsUri + Authentication = "Basic" + Credential = $credential + SkipCertificateCheck = $true + } + $result = Invoke-RestMethod @params + + $result.Headers.Authorization | Should BeExactly "Basic dGVzdHVzZXI6dGVzdHBhc3N3b3Jk" + } + + It "Verifies Invoke-RestMethod -Authentication " -TestCases $testCases { + param($Authentication) + $params = @{ + Uri = $httpsUri + Authentication = $Authentication + Token = $token + SkipCertificateCheck = $true + } + $result = Invoke-RestMethod @params + + $result.Headers.Authorization | Should BeExactly "Bearer testpassword" + } + + It "Verifies Invoke-RestMethod -Authentication does not support -UseDefaultCredentials" { + $params = @{ + Uri = $httpsUri + Token = $token + Authentication = "OAuth" + UseDefaultCredentials = $true + ErrorAction = 'Stop' + SkipCertificateCheck = $true + } + { Invoke-RestMethod @params } | ShouldBeErrorId "WebCmdletAuthenticationConflictException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand" + } + + It "Verifies Invoke-RestMethod -Authentication does not support Both -Credential and -Token" { + $params = @{ + Uri = $httpsUri + Token = $token + Credential = $credential + Authentication = "OAuth" + ErrorAction = 'Stop' + SkipCertificateCheck = $true + } + { Invoke-RestMethod @params } | ShouldBeErrorId "WebCmdletAuthenticationTokenConflictException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand" + } + + It "Verifies Invoke-RestMethod -Authentication requires -Token" -TestCases $testCases { + param($Authentication) + $params = @{ + Uri = $httpsUri + Authentication = $Authentication + ErrorAction = 'Stop' + SkipCertificateCheck = $true + } + { Invoke-RestMethod @params } | ShouldBeErrorId "WebCmdletAuthenticationTokenNotSuppliedException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand" + } + + It "Verifies Invoke-RestMethod -Authentication Basic requires -Credential" { + $params = @{ + Uri = $httpsUri + Authentication = "Basic" + ErrorAction = 'Stop' + SkipCertificateCheck = $true + } + { Invoke-RestMethod @params } | ShouldBeErrorId "WebCmdletAuthenticationCredentialNotSuppliedException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand" + } + + It "Verifies Invoke-RestMethod -Authentication Requires HTTPS" { + $params = @{ + Uri = $httpUri + Token = $token + Authentication = "OAuth" + ErrorAction = 'Stop' + } + { Invoke-RestMethod @params } | ShouldBeErrorId "WebCmdletAllowUnencryptedAuthenticationRequiredException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand" + } + + It "Verifies Invoke-RestMethod -Authentication Can use HTTP with -AllowUnencryptedAuthentication" { + $params = @{ + Uri = $httpUri + Token = $token + Authentication = "OAuth" + AllowUnencryptedAuthentication = $true + } + $result = Invoke-RestMethod @params + + $result.Headers.Authorization | Should BeExactly "Bearer testpassword" + } + } + BeforeEach { if ($env:http_proxy) { $savedHttpProxy = $env:http_proxy From 81c46c6e518d5bb1f3fc3889946f30e4f4e97200 Mon Sep 17 00:00:00 2001 From: Dominic Date: Tue, 17 Oct 2017 23:53:29 -0400 Subject: [PATCH 010/617] Fix MatchInfoContext clone implementation (#5121) The old implementation always set the new object's properties to null. --- .../commands/utility/MatchString.cs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/MatchString.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/MatchString.cs index 88fac123a4a..deaa37323db 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/MatchString.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/MatchString.cs @@ -61,12 +61,13 @@ internal MatchInfoContext() /// public object Clone() { - MatchInfoContext clone = new MatchInfoContext(); - clone.PreContext = (clone.PreContext != null) ? (string[])PreContext.Clone() : null; - clone.PostContext = (clone.PostContext != null) ? (string[])PostContext.Clone() : null; - clone.DisplayPreContext = (clone.DisplayPreContext != null) ? (string[])DisplayPreContext.Clone() : null; - clone.DisplayPostContext = (clone.DisplayPostContext != null) ? (string[])DisplayPostContext.Clone() : null; - return clone; + return new MatchInfoContext() + { + PreContext = (string[])PreContext?.Clone(), + PostContext = (string[])PostContext?.Clone(), + DisplayPreContext = (string[])DisplayPreContext?.Clone(), + DisplayPostContext = (string[])DisplayPostContext?.Clone() + }; } } From 6177d28410cd6c41eeae67d2c3dc621d20668e1b Mon Sep 17 00:00:00 2001 From: Steve Lee Date: Wed, 18 Oct 2017 09:12:23 -0700 Subject: [PATCH 011/617] removed RunspaceConfiguration support (#4942) For PSCore 6, we are only supporting InitialSessionState. The RunspaceConfiguration APIs were already made internal. This PR removes all the code related to RunspaceConfiguration. This also means that some public APIs have changed. Was deciding between leaving the RunspaceConfiguration parameters and throwing Unsupported, but thought it was better to have it a compile-time error. This should simplify the code base. --- .../commands/utility/Update-TypeData.cs | 129 +-- .../host/msh/ConsoleHost.cs | 147 +-- .../host/msh/ConsoleShell.cs | 44 +- .../host/msh/ManagedEntrance.cs | 48 +- .../engine/AutomationEngine.cs | 53 +- .../engine/CommandDiscovery.cs | 200 +--- .../engine/CommandSearcher.cs | 110 +- .../engine/ExecutionContext.cs | 156 +-- .../engine/InitialSessionState.cs | 23 +- .../engine/Modules/ModuleCmdletBase.cs | 168 +-- .../engine/ProviderNames.cs | 83 -- .../RunspaceConfigurationEntry.cs | 41 + .../engine/SessionState.cs | 30 +- .../engine/SessionStateProviderAPIs.cs | 105 +- .../engine/SpecialVariables.cs | 3 - .../engine/TypeTable.cs | 2 - .../engine/hostifaces/Connection.cs | 155 ++- .../engine/hostifaces/ConnectionBase.cs | 24 +- .../engine/hostifaces/ConnectionFactory.cs | 123 +-- .../engine/hostifaces/LocalConnection.cs | 46 +- .../engine/hostifaces/RunspaceInit.cs | 18 - .../engine/hostifaces/RunspaceInvoke.cs | 59 +- .../engine/hostifaces/RunspacePool.cs | 10 +- .../engine/hostifaces/RunspacePoolInternal.cs | 39 +- .../engine/remoting/client/remoterunspace.cs | 16 - .../help/HelpProvider.cs | 11 - .../help/HelpProviderWithFullCache.cs | 10 +- .../help/HelpSystem.cs | 18 - .../help/MUIFileSearcher.cs | 5 +- .../minishell/api/RunspaceConfiguration.cs | 791 --------------- ...RunspaceConfigurationAttributeException.cs | 194 ---- .../RunspaceConfigurationEntryCollection.cs | 434 -------- .../api/RunspaceConfigurationHelper.cs | 29 - .../api/RunspaceConfigurationTypeAttribute.cs | 31 - .../api/RunspaceConfigurationTypeException.cs | 181 ---- .../resources/MiniShellErrors.resx | 12 - .../singleshell/Commands/ConsoleCommands.cs | 602 ----------- .../singleshell/Commands/MshSnapinCommands.cs | 850 ---------------- .../singleshell/config/MshConsoleInfo.cs | 959 ------------------ .../config/MshConsoleLoadException.cs | 92 +- .../config/RegistryStringResourceIndirect.cs | 611 ----------- .../config/RunspaceConfigForSingleShell.cs | 754 -------------- .../singleshell/installer/CustomMshSnapin.cs | 122 --- .../singleshell/installer/MshCoreMshSnapin.cs | 113 --- .../singleshell/installer/MshInstaller.cs | 220 ---- .../singleshell/installer/MshSnapin.cs | 88 -- .../installer/MshSnapinInstaller.cs | 159 --- .../api => utils}/FormatAndTypeDataHelper.cs | 84 +- .../Update-FormatData.Tests.ps1 | 14 + .../engine/Api/BasicEngine.Tests.ps1 | 2 +- 50 files changed, 296 insertions(+), 7922 deletions(-) rename src/System.Management.Automation/{minishell/api => engine}/RunspaceConfigurationEntry.cs (95%) delete mode 100644 src/System.Management.Automation/minishell/api/RunspaceConfiguration.cs delete mode 100644 src/System.Management.Automation/minishell/api/RunspaceConfigurationAttributeException.cs delete mode 100644 src/System.Management.Automation/minishell/api/RunspaceConfigurationEntryCollection.cs delete mode 100644 src/System.Management.Automation/minishell/api/RunspaceConfigurationHelper.cs delete mode 100644 src/System.Management.Automation/minishell/api/RunspaceConfigurationTypeAttribute.cs delete mode 100644 src/System.Management.Automation/minishell/api/RunspaceConfigurationTypeException.cs delete mode 100644 src/System.Management.Automation/singleshell/Commands/ConsoleCommands.cs delete mode 100644 src/System.Management.Automation/singleshell/Commands/MshSnapinCommands.cs delete mode 100644 src/System.Management.Automation/singleshell/config/MshConsoleInfo.cs delete mode 100644 src/System.Management.Automation/singleshell/config/RegistryStringResourceIndirect.cs delete mode 100644 src/System.Management.Automation/singleshell/config/RunspaceConfigForSingleShell.cs delete mode 100644 src/System.Management.Automation/singleshell/installer/CustomMshSnapin.cs delete mode 100644 src/System.Management.Automation/singleshell/installer/MshCoreMshSnapin.cs delete mode 100644 src/System.Management.Automation/singleshell/installer/MshInstaller.cs delete mode 100644 src/System.Management.Automation/singleshell/installer/MshSnapin.cs delete mode 100644 src/System.Management.Automation/singleshell/installer/MshSnapinInstaller.cs rename src/System.Management.Automation/{minishell/api => utils}/FormatAndTypeDataHelper.cs (63%) diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Update-TypeData.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Update-TypeData.cs index daef516bbd1..53ec744bceb 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Update-TypeData.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Update-TypeData.cs @@ -366,17 +366,13 @@ private void ProcessStrongTypeData() else { // Update successfully, we add the TypeData into cache - if (Context.RunspaceConfiguration != null) - { - Context.RunspaceConfiguration.Types.Append(new TypeConfigurationEntry(type, false)); - } - else if (Context.InitialSessionState != null) + if (Context.InitialSessionState != null) { Context.InitialSessionState.Types.Add(new SessionStateTypeEntry(type, false)); } else { - Dbg.Assert(false, "Either RunspaceConfiguration or InitialSessionState must be non-null for Update-Typedata to work"); + Dbg.Assert(false, "InitialSessionState must be non-null for Update-Typedata to work"); } } } @@ -484,17 +480,13 @@ private void ProcessDynamicType() else { // Update successfully, we add the TypeData into cache - if (Context.RunspaceConfiguration != null) - { - Context.RunspaceConfiguration.Types.Append(new TypeConfigurationEntry(type, false)); - } - else if (Context.InitialSessionState != null) + if (Context.InitialSessionState != null) { Context.InitialSessionState.Types.Add(new SessionStateTypeEntry(type, false)); } else { - Dbg.Assert(false, "Either RunspaceConfiguration or InitialSessionState must be non-null for Update-Typedata to work"); + Dbg.Assert(false, "InitialSessionState must be non-null for Update-Typedata to work"); } } } @@ -757,38 +749,7 @@ private void ProcessTypeFiles() // filename is available string target = UpdateDataStrings.UpdateTarget; - if (Context.RunspaceConfiguration != null) - { - for (int i = prependPathTotal.Count - 1; i >= 0; i--) - { - string formattedTarget = string.Format(CultureInfo.InvariantCulture, target, prependPathTotal[i]); - - if (ShouldProcess(formattedTarget, action)) - { - this.Context.RunspaceConfiguration.Types.Prepend(new TypeConfigurationEntry(prependPathTotal[i])); - } - } - - foreach (string appendPathTotalItem in appendPathTotal) - { - string formattedTarget = string.Format(CultureInfo.InvariantCulture, target, appendPathTotalItem); - - if (ShouldProcess(formattedTarget, action)) - { - this.Context.RunspaceConfiguration.Types.Append(new TypeConfigurationEntry(appendPathTotalItem)); - } - } - - try - { - this.Context.CurrentRunspace.RunspaceConfiguration.Types.Update(true); - } - catch (RuntimeException e) - { - this.WriteError(new ErrorRecord(e, "TypesXmlUpdateException", ErrorCategory.InvalidOperation, null)); - } - } - else if (Context.InitialSessionState != null) + if (Context.InitialSessionState != null) { // This hashSet is to detect if there are duplicate type files var fullFileNameHash = new HashSet(StringComparer.CurrentCultureIgnoreCase); @@ -887,7 +848,7 @@ private void ProcessTypeFiles() } else { - Dbg.Assert(false, "Either RunspaceConfiguration or InitialSessionState must be non-null for Update-Typedata to work"); + Dbg.Assert(false, "InitialSessionState must be non-null for Update-Typedata to work"); } } @@ -931,38 +892,7 @@ protected override void ProcessRecord() // filename is available string target = UpdateDataStrings.UpdateTarget; - if (Context.RunspaceConfiguration != null) - { - for (int i = prependPathTotal.Count - 1; i >= 0; i--) - { - string formattedTarget = string.Format(CultureInfo.CurrentCulture, target, prependPathTotal[i]); - - if (ShouldProcess(formattedTarget, action)) - { - this.Context.RunspaceConfiguration.Formats.Prepend(new FormatConfigurationEntry(prependPathTotal[i])); - } - } - - foreach (string appendPathTotalItem in appendPathTotal) - { - string formattedTarget = string.Format(CultureInfo.CurrentCulture, target, appendPathTotalItem); - - if (ShouldProcess(formattedTarget, action)) - { - this.Context.RunspaceConfiguration.Formats.Append(new FormatConfigurationEntry(appendPathTotalItem)); - } - } - - try - { - this.Context.CurrentRunspace.RunspaceConfiguration.Formats.Update(true); - } - catch (RuntimeException e) - { - this.WriteError(new ErrorRecord(e, "FormatXmlUpdateException", ErrorCategory.InvalidOperation, null)); - } - } - else if (Context.InitialSessionState != null) + if (Context.InitialSessionState != null) { if (Context.InitialSessionState.DisableFormatUpdates) { @@ -1055,12 +985,11 @@ protected override void ProcessRecord() if (entries.Count > 0) { Context.FormatDBManager.UpdateDataBase(entries, this.Context.AuthorizationManager, this.Context.EngineHostInterface, false); - FormatAndTypeDataHelper.ThrowExceptionOnError( - "ErrorsUpdatingFormats", - null, - entries, - RunspaceConfigurationCategory.Formats); - } + FormatAndTypeDataHelper.ThrowExceptionOnError( "ErrorsUpdatingFormats", + null, + entries, + RunspaceConfigurationCategory.Formats); + } } catch (RuntimeException e) { @@ -1069,7 +998,7 @@ protected override void ProcessRecord() } else { - Dbg.Assert(false, "Either RunspaceConfiguration or InitialSessionState must be non-null for Update-FormatData to work"); + Dbg.Assert(false, "InitialSessionState must be non-null for Update-FormatData to work"); } } } @@ -1154,17 +1083,7 @@ protected override void ProcessRecord() Dictionary> fileToIndexMap = new Dictionary>(StringComparer.OrdinalIgnoreCase); List indicesToRemove = new List(); - if (Context.RunspaceConfiguration != null) - { - for (int index = 0; index < Context.RunspaceConfiguration.Types.Count; index++) - { - string fileName = Context.RunspaceConfiguration.Types[index].FileName; - if (fileName == null) { continue; } - - ConstructFileToIndexMap(fileName, index, fileToIndexMap); - } - } - else if (Context.InitialSessionState != null) + if (Context.InitialSessionState != null) { for (int index = 0; index < Context.InitialSessionState.Types.Count; index++) { @@ -1200,11 +1119,7 @@ protected override void ProcessRecord() indicesToRemove.Sort(); for (int i = indicesToRemove.Count - 1; i >= 0; i--) { - if (Context.RunspaceConfiguration != null) - { - Context.RunspaceConfiguration.Types.RemoveItem(indicesToRemove[i]); - } - else if (Context.InitialSessionState != null) + if (Context.InitialSessionState != null) { Context.InitialSessionState.Types.RemoveItem(indicesToRemove[i]); } @@ -1212,11 +1127,7 @@ protected override void ProcessRecord() try { - if (Context.RunspaceConfiguration != null) - { - Context.RunspaceConfiguration.Types.Update(); - } - else if (Context.InitialSessionState != null) + if (Context.InitialSessionState != null) { bool oldRefreshTypeFormatSetting = Context.InitialSessionState.RefreshTypeAndFormatSetting; try @@ -1279,17 +1190,13 @@ protected override void ProcessRecord() else { // Type is removed successfully, add it into the cache - if (Context.RunspaceConfiguration != null) - { - Context.RunspaceConfiguration.Types.Append(new TypeConfigurationEntry(type, true)); - } - else if (Context.InitialSessionState != null) + if (Context.InitialSessionState != null) { Context.InitialSessionState.Types.Add(new SessionStateTypeEntry(type, true)); } else { - Dbg.Assert(false, "Either RunspaceConfiguration or InitialSessionState must be non-null for Remove-Typedata to work"); + Dbg.Assert(false, "InitialSessionState must be non-null for Remove-Typedata to work"); } } } diff --git a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHost.cs b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHost.cs index bc7e7613724..2064dee6b37 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHost.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHost.cs @@ -66,10 +66,6 @@ internal sealed partial class ConsoleHost /// /// /// - /// - /// Configuration information to use for creating runspace. - /// - /// /// /// Banner text to be displayed by ConsoleHost /// @@ -78,12 +74,6 @@ internal sealed partial class ConsoleHost /// Help text for minishell. This is displayed on 'minishell -?'. /// /// - /// - /// - /// Warning occurred prior to this point, for example, a snap-in fails to load beforehand. - /// This string will be printed out. - /// - /// /// /// /// Command line parameters to pwsh.exe @@ -118,10 +108,8 @@ internal sealed partial class ConsoleHost /// /// internal static int Start( - RunspaceConfiguration configuration, string bannerText, string helpText, - string preStartWarning, string[] args) { #if DEBUG @@ -178,7 +166,7 @@ internal static int Start( HostException hostException = null; try { - s_theConsoleHost = ConsoleHost.CreateSingletonInstance(configuration); + s_theConsoleHost = ConsoleHost.CreateSingletonInstance(); } catch (HostException e) { @@ -257,11 +245,6 @@ internal static int Start( s_theConsoleHost.BindBreakHandler(); PSHost.IsStdOutputRedirected = Console.IsOutputRedirected; - if (!string.IsNullOrEmpty(preStartWarning)) - { - s_theConsoleHost.UI.WriteWarningLine(preStartWarning); - } - // Send startup telemetry for ConsoleHost startup ApplicationInsightsTelemetry.SendPSCoreStartupTelemetry(); @@ -269,7 +252,7 @@ internal static int Start( s_theConsoleHost.LoadPSReadline() ? "StartupProfileData-Interactive" : "StartupProfileData-NonInteractive"); - exitCode = s_theConsoleHost.Run(s_cpp, !string.IsNullOrEmpty(preStartWarning)); + exitCode = s_theConsoleHost.Run(s_cpp, false); } } finally @@ -415,10 +398,6 @@ private static void SpinUpBreakHandlerThread(bool shouldEndSession) lock (host.hostGlobalLock) { - if (host._isCtrlCDisabled) - { - return; - } bht = host._breakHandlerThread; if (!host.ShouldEndSession && shouldEndSession) { @@ -517,10 +496,10 @@ private static bool StopPipeline(Pipeline cmd) /// /// Create single instance of ConsoleHost. /// - internal static ConsoleHost CreateSingletonInstance(RunspaceConfiguration configuration) + internal static ConsoleHost CreateSingletonInstance() { Dbg.Assert(s_theConsoleHost == null, "CreateSingletonInstance should not be called multiple times"); - s_theConsoleHost = new ConsoleHost(configuration); + s_theConsoleHost = new ConsoleHost(); return s_theConsoleHost; } @@ -1080,7 +1059,7 @@ bool IHostProvidesTelemetryData.HostIsInteractive /// Constructs a new instance /// /// - internal ConsoleHost(RunspaceConfiguration configuration) + internal ConsoleHost() { #if !UNIX try @@ -1106,7 +1085,6 @@ internal ConsoleHost(RunspaceConfiguration configuration) InDebugMode = false; _displayDebuggerBanner = true; - _configuration = configuration; this.ui = new ConsoleHostUserInterface(this); _consoleWriter = new ConsoleTextWriter(ui); @@ -1590,10 +1568,7 @@ private bool LoadPSReadline() private void DoCreateRunspace(string initialCommand, bool skipProfiles, bool staMode, string configurationName, Collection initialCommandArgs) { Dbg.Assert(_runspaceRef == null, "runspace should be null"); -#if !DEBUG - Dbg.Assert(_configuration != null, "configuration should be set"); -#endif - + Dbg.Assert(DefaultInitialSessionState != null, "DefaultInitialSessionState should not be null"); s_runspaceInitTracer.WriteLine("Calling RunspaceFactory.CreateRunspace"); try @@ -1601,50 +1576,41 @@ private void DoCreateRunspace(string initialCommand, bool skipProfiles, bool sta Runspace consoleRunspace = null; bool psReadlineFailed = false; - // Use InitialSessionState if available. - if (DefaultInitialSessionState != null) - { - // Load PSReadline by default unless there is no use: - // - we're running a command/file and just exiting - // - stdin is redirected by a parent process - // - we're not interactive - // - we're explicitly reading from stdin (the '-' argument) - // It's also important to have a scenario where PSReadline is not loaded so it can be updated, e.g. - // powershell -command "Update-Module PSReadline" - // This should work just fine as long as no other instances of PowerShell are running. - ReadOnlyCollection defaultImportModulesList = null; - if (LoadPSReadline()) + // Load PSReadline by default unless there is no use: + // - we're running a command/file and just exiting + // - stdin is redirected by a parent process + // - we're not interactive + // - we're explicitly reading from stdin (the '-' argument) + // It's also important to have a scenario where PSReadline is not loaded so it can be updated, e.g. + // powershell -command "Update-Module PSReadline" + // This should work just fine as long as no other instances of PowerShell are running. + ReadOnlyCollection defaultImportModulesList = null; + if (LoadPSReadline()) + { + // Create and open Runspace with PSReadline. + defaultImportModulesList = DefaultInitialSessionState.Modules; + DefaultInitialSessionState.ImportPSModule(new[] { "PSReadLine" }); + consoleRunspace = RunspaceFactory.CreateRunspace(this, DefaultInitialSessionState); + try { - // Create and open Runspace with PSReadline. - defaultImportModulesList = DefaultInitialSessionState.Modules; - DefaultInitialSessionState.ImportPSModule(new[] { "PSReadLine" }); - consoleRunspace = RunspaceFactory.CreateRunspace(this, DefaultInitialSessionState); - try - { - OpenConsoleRunspace(consoleRunspace, staMode); - } - catch (Exception) - { - consoleRunspace = null; - psReadlineFailed = true; - } + OpenConsoleRunspace(consoleRunspace, staMode); } - - if (consoleRunspace == null) + catch (Exception) { - if (psReadlineFailed) - { - // Try again but without importing the PSReadline module. - DefaultInitialSessionState.ClearPSModules(); - DefaultInitialSessionState.ImportPSModule(defaultImportModulesList); - } - consoleRunspace = RunspaceFactory.CreateRunspace(this, DefaultInitialSessionState); - OpenConsoleRunspace(consoleRunspace, staMode); + consoleRunspace = null; + psReadlineFailed = true; } } - else + + if (consoleRunspace == null) { - consoleRunspace = RunspaceFactory.CreateRunspace(this, _configuration); + if (psReadlineFailed) + { + // Try again but without importing the PSReadline module. + DefaultInitialSessionState.ClearPSModules(); + DefaultInitialSessionState.ImportPSModule(defaultImportModulesList); + } + consoleRunspace = RunspaceFactory.CreateRunspace(this, DefaultInitialSessionState); OpenConsoleRunspace(consoleRunspace, staMode); } @@ -1728,46 +1694,7 @@ private void DoRunspaceInitialization(bool skipProfiles, string initialCommand, } else { - // Run the built-in scripts - RunspaceConfigurationEntryCollection scripts = new RunspaceConfigurationEntryCollection(); - if (_configuration != null) - scripts = _configuration.InitializationScripts; - - if ((scripts == null) || (scripts.Count == 0)) - { - s_runspaceInitTracer.WriteLine("There are no built-in scripts to run"); - } - else - { - foreach (ScriptConfigurationEntry s in scripts) - { - s_runspaceInitTracer.WriteLine("Running script: '{0}'", s.Name); - - // spec claims that Ctrl-C is not supposed to stop these. - - try - { - _isCtrlCDisabled = true; - Exception e = InitializeRunspaceHelper(s.Definition, exec, Executor.ExecutionOptions.AddOutputter); - if (e != null) - { - throw new ConsoleHostStartupException(ConsoleHostStrings.InitScriptFailed, e); - } - } - finally - { - _isCtrlCDisabled = false; - } - } - } - - // If -iss has been specified, then there won't be a runspace - // configuration to get the shell ID from, so we'll use the default... - string shellId = null; - if (_configuration != null) - shellId = _configuration.ShellId; - else - shellId = "Microsoft.PowerShell"; // TODO: what will happen for custom shells built using Make-Shell.exe + string shellId = "Microsoft.PowerShell"; // If the system lockdown policy says "Enforce", do so. Do this after types / formatting, default functions, etc // are loaded so that they are trusted. (Validation of their signatures is done in F&O) @@ -2928,11 +2855,9 @@ private class ConsoleHostStartupException : Exception private Version _ver = PSVersionInfo.PSVersion; private int _exitCodeFromRunspace; private bool _noExit = true; - private bool _isCtrlCDisabled; private bool _setShouldExitCalled; private bool _isRunningPromptLoop; private bool _wasInitialCommandEncoded; - private RunspaceConfiguration _configuration; // hostGlobalLock is used to sync public method calls (in case multiple threads call into the host) and access to // state that persists across method calls, like progress data. It's internal because the ui object also diff --git a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleShell.cs b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleShell.cs index 801b3dbed55..064ff33d7a3 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleShell.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleShell.cs @@ -21,55 +21,13 @@ class ConsoleShell /// Commandline parameters specified by user. /// An integer value which should be used as exit code for the process. public static int Start(string bannerText, string helpText, string[] args) - { - return Start(null, bannerText, helpText, null, args); - } - - /// - /// - /// Entry point in to ConsoleShell. This method is called from the native or managed exe host application - /// - /// - /// - /// Configuration information which is used to create Runspace. - /// - /// - /// - /// Banner text to be displayed by ConsoleHost - /// - /// - /// - /// Help text for minishell. This is displayed on 'minishell -?'. - /// - /// - /// - /// Warning occurred prior to this point, for example, a snap-in fails to load beforehand. - /// This string will be printed out. - /// - /// - /// - /// Commandline parameters specified by user. - /// - /// - /// - /// An integer value which should be used as exit code for the - /// process. - /// - - internal static - int - Start(RunspaceConfiguration configuration, - string bannerText, - string helpText, - string preStartWarning, - string[] args) { if (args == null) { throw PSTraceSource.NewArgumentNullException("args"); } - return ConsoleHost.Start(configuration, bannerText, helpText, preStartWarning, args); + return ConsoleHost.Start(bannerText, helpText, args); } } } diff --git a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ManagedEntrance.cs b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ManagedEntrance.cs index 380fa7e0d41..4e78975644d 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ManagedEntrance.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ManagedEntrance.cs @@ -23,7 +23,7 @@ public sealed class UnmanagedPSEntry /// Starts managed MSH /// /// - /// Console file used to create a runspace configuration to start MSH + /// Deprecated: Console file used to create a runspace configuration to start MSH /// /// /// Command line arguments to the managed MSH @@ -55,54 +55,26 @@ public static int Start(string consoleFilePath, [MarshalAs(UnmanagedType.LPArray Thread.CurrentThread.CurrentUICulture = NativeCultureResolver.UICulture; Thread.CurrentThread.CurrentCulture = NativeCultureResolver.Culture; - RunspaceConfigForSingleShell configuration = null; - PSConsoleLoadException warning = null; - // PSSnapInException will cause the control to return back to the native code - // and stuff the EXCEPINFO field with the message of the exception. - // The native code will print this out and exit the process. - if (string.IsNullOrEmpty(consoleFilePath)) - { #if DEBUG -// Special switches for debug mode to allow self-hosting on InitialSessionState instead -// of runspace configuration... - if (args.Length > 0 && !String.IsNullOrEmpty(args[0]) && args[0].Equals("-iss", StringComparison.OrdinalIgnoreCase)) - { - ConsoleHost.DefaultInitialSessionState = InitialSessionState.CreateDefault2(); - configuration = null; - } - else if (args.Length > 0 && !String.IsNullOrEmpty(args[0]) && args[0].Equals("-isswait", StringComparison.OrdinalIgnoreCase)) - { - Console.WriteLine("Attach the debugger and hit enter to continue:"); - Console.ReadLine(); - ConsoleHost.DefaultInitialSessionState = InitialSessionState.CreateDefault2(); - configuration = null; - } - else - { - ConsoleHost.DefaultInitialSessionState = InitialSessionState.CreateDefault2(); - configuration = null; - } -#else - ConsoleHost.DefaultInitialSessionState = InitialSessionState.CreateDefault2(); - configuration = null; -#endif - } - else + if (args.Length > 0 && !String.IsNullOrEmpty(args[0]) && args[0].Equals("-isswait", StringComparison.OrdinalIgnoreCase)) { - //TODO : Deprecate RunspaceConfiguration and use InitialSessionState - configuration = - RunspaceConfigForSingleShell.Create(consoleFilePath, out warning); + Console.WriteLine("Attach the debugger to continue..."); + while (!System.Diagnostics.Debugger.IsAttached) { + Thread.Sleep(100); + } + System.Diagnostics.Debugger.Break(); } +#endif + ConsoleHost.DefaultInitialSessionState = InitialSessionState.CreateDefault2(); + int exitCode = 0; try { var banner = ManagedEntranceStrings.ShellBannerNonWindowsPowerShell; var formattedBanner = string.Format(CultureInfo.InvariantCulture, banner, PSVersionInfo.GitCommitId); exitCode = Microsoft.PowerShell.ConsoleShell.Start( - configuration, formattedBanner, ManagedEntranceStrings.ShellHelp, - warning == null ? null : warning.Message, args); } catch (System.Management.Automation.Host.HostException e) diff --git a/src/System.Management.Automation/engine/AutomationEngine.cs b/src/System.Management.Automation/engine/AutomationEngine.cs index fde88bea9a9..a088121d037 100644 --- a/src/System.Management.Automation/engine/AutomationEngine.cs +++ b/src/System.Management.Automation/engine/AutomationEngine.cs @@ -37,60 +37,15 @@ internal class AutomationEngine /// an instance of the automation engine. It allows you to pass in an /// instance of PSHost that provides the host-specific I/O routines, etc. /// - internal AutomationEngine(PSHost hostInterface, RunspaceConfiguration runspaceConfiguration, InitialSessionState iss) + internal AutomationEngine(PSHost hostInterface, InitialSessionState iss) { -#if !CORECLR// There is no control panel items in CSS - // Update the env variable PathEXT to contain .CPL - var pathext = Environment.GetEnvironmentVariable("PathEXT"); - pathext = pathext ?? string.Empty; - bool cplExist = false; - if (pathext != string.Empty) - { - string[] entries = pathext.Split(Utils.Separators.Semicolon); - foreach (string entry in entries) - { - string ext = entry.Trim(); - if (ext.Equals(".CPL", StringComparison.OrdinalIgnoreCase)) - { - cplExist = true; - break; - } - } - } - if (!cplExist) - { - pathext = (pathext == string.Empty) ? ".CPL" : - pathext.EndsWith(";", StringComparison.OrdinalIgnoreCase) - ? (pathext + ".CPL") : (pathext + ";.CPL"); - Environment.SetEnvironmentVariable("PathEXT", pathext); - } -#endif - if (runspaceConfiguration != null) - { - Context = new ExecutionContext(this, hostInterface, runspaceConfiguration); - } - else - { - Context = new ExecutionContext(this, hostInterface, iss); - } + Context = new ExecutionContext(this, hostInterface, iss); EngineParser = new Language.Parser(); CommandDiscovery = new CommandDiscovery(Context); - // Initialize providers before loading types so that any ScriptBlocks in the - // types.ps1xml file can be parsed. - - // Bind the execution context with RunspaceConfiguration. - // This has the side effect of initializing cmdlet cache and providers from runspace configuration. - if (runspaceConfiguration != null) - { - runspaceConfiguration.Bind(Context); - } - else - { - // Load the iss, resetting everything to it's defaults... - iss.Bind(Context, /*updateOnly*/ false); - } + // Load the iss, resetting everything to it's defaults... + iss.Bind(Context, /*updateOnly*/ false); InitialSessionState.SetSessionStateDrive(Context, true); } diff --git a/src/System.Management.Automation/engine/CommandDiscovery.cs b/src/System.Management.Automation/engine/CommandDiscovery.cs index 5ee174bc14b..d8d4a1c8fd4 100644 --- a/src/System.Management.Automation/engine/CommandDiscovery.cs +++ b/src/System.Management.Automation/engine/CommandDiscovery.cs @@ -138,13 +138,6 @@ internal CommandDiscovery(ExecutionContext context) Context = context; discoveryTracer.ShowHeaders = false; - - // Cache the ScriptInfo for the scripts defined in the RunspaceConfiguration - - _cachedScriptInfo = - new Dictionary(StringComparer.OrdinalIgnoreCase); - - LoadScriptInfo(); } private void AddCmdletToCache(CmdletConfigurationEntry entry) @@ -274,28 +267,6 @@ internal void AddSessionStateCmdletEntryToCache(SessionStateCmdletEntry entry, b } } - private void LoadScriptInfo() - { - if (Context.RunspaceConfiguration != null) - { - foreach (ScriptConfigurationEntry entry in Context.RunspaceConfiguration.Scripts) - { - try - { - _cachedScriptInfo.Add(entry.Name, new ScriptInfo(entry.Name, ScriptBlock.Create(Context, entry.Definition), Context)); - } - catch (ArgumentException) - { - PSNotSupportedException notSupported = - PSTraceSource.NewNotSupportedException( - DiscoveryExceptions.DuplicateScriptName, - entry.Name); - - throw notSupported; - } - } - } - } #endregion ctor #region internal methods @@ -358,56 +329,6 @@ internal CommandProcessorBase LookupCommandProcessor(string commandName, return processor; } - //Minishell ExternalScriptInfo scriptInfo - - internal CommandProcessorBase CreateScriptProcessorForMiniShell(ExternalScriptInfo scriptInfo, bool useLocalScope, SessionStateInternal sessionState) - { - VerifyScriptRequirements(scriptInfo, Context); - - if (String.IsNullOrEmpty(scriptInfo.RequiresApplicationID)) - { - if (scriptInfo.RequiresPSSnapIns != null && scriptInfo.RequiresPSSnapIns.Any()) - { - Collection requiresMissingPSSnapIns = GetPSSnapinNames(scriptInfo.RequiresPSSnapIns); - - ScriptRequiresException scriptRequiresException = - new ScriptRequiresException( - scriptInfo.Name, - requiresMissingPSSnapIns, - "ScriptRequiresMissingPSSnapIns", - true); - throw scriptRequiresException; - } - - return CreateCommandProcessorForScript(scriptInfo, Context, useLocalScope, sessionState); - } - else - { - if (String.Equals( - Context.ShellID, - scriptInfo.RequiresApplicationID, - StringComparison.OrdinalIgnoreCase)) - { - return CreateCommandProcessorForScript(scriptInfo, Context, useLocalScope, sessionState); - } - else - { - // Throw a runtime exception - - string shellPath = GetShellPathFromRegistry(scriptInfo.RequiresApplicationID); - - ScriptRequiresException sre = - new ScriptRequiresException( - scriptInfo.Name, - scriptInfo.RequiresApplicationID, - shellPath, - "ScriptRequiresUnmatchedShellId"); - - throw sre; - } - } - } - internal static void VerifyRequiredModules(ExternalScriptInfo scriptInfo, ExecutionContext context) { // Check Required Modules @@ -492,33 +413,12 @@ private CommandProcessorBase CreateScriptProcessorForSingleShell(ExternalScriptI private static void VerifyRequiredSnapins(IEnumerable requiresPSSnapIns, ExecutionContext context, out Collection requiresMissingPSSnapIns) { requiresMissingPSSnapIns = null; - bool isHostedWithInitialSessionState = false; - RunspaceConfigForSingleShell rs = null; - if (context.InitialSessionState != null) - { - isHostedWithInitialSessionState = true; - } - else if (context.RunspaceConfiguration != null) - { - rs = context.RunspaceConfiguration as RunspaceConfigForSingleShell; - Dbg.Assert(rs != null, "RunspaceConfiguration should not be null"); - } - else - { - Dbg.Assert(false, "PowerShell should be hosted with either InitialSessionState or RunspaceConfiguration"); - } + Dbg.Assert(context.InitialSessionState != null, "PowerShell should be hosted with InitialSessionState"); foreach (var requiresPSSnapIn in requiresPSSnapIns) { IEnumerable loadedPSSnapIns = null; - if (isHostedWithInitialSessionState) - { - loadedPSSnapIns = context.InitialSessionState.GetPSSnapIn(requiresPSSnapIn.Name); - } - else - { - loadedPSSnapIns = rs.ConsoleInfo.GetPSSnapIn(requiresPSSnapIn.Name, false); - } + loadedPSSnapIns = context.InitialSessionState.GetPSSnapIn(requiresPSSnapIn.Name); if (loadedPSSnapIns == null || loadedPSSnapIns.Count() == 0) { if (requiresMissingPSSnapIns == null) @@ -758,16 +658,7 @@ internal CommandProcessorBase LookupCommandProcessor(CommandInfo commandInfo, scriptInfo.SignatureChecked = true; try { - if (!Context.IsSingleShell) - { - // in minishell mode - processor = CreateScriptProcessorForMiniShell(scriptInfo, useLocalScope ?? true, sessionState); - } - else - { - // single shell mode - processor = CreateScriptProcessorForSingleShell(scriptInfo, Context, useLocalScope ?? true, sessionState); - } + processor = CreateScriptProcessorForSingleShell(scriptInfo, Context, useLocalScope ?? true, sessionState); } catch (ScriptRequiresSyntaxException reqSyntaxException) { @@ -1724,51 +1615,6 @@ internal IEnumerator GetCmdletInfo(string cmdletName, bool searchAll } } // GetCmdletInfo - private bool _cmdletCacheInitialized = false; - - /// - /// Called by the RunspaceConfiguration when a PSSnapIn gets added to the - /// console to update the list of available cmdlets. - /// - /// - internal void UpdateCmdletCache() - { - if (!_cmdletCacheInitialized) - { - foreach (CmdletConfigurationEntry entry in Context.RunspaceConfiguration.Cmdlets) - { - AddCmdletToCache(entry); - } - - _cmdletCacheInitialized = true; - - return; - } - - foreach (CmdletConfigurationEntry entry in Context.RunspaceConfiguration.Cmdlets.UpdateList) - { - if (entry == null) - { - continue; - } - - switch (entry.Action) - { - case UpdateAction.Add: - AddCmdletToCache(entry); - break; - - case UpdateAction.Remove: - RemoveCmdletFromCache(entry); - break; - - default: - break; - } - } - } // UpdateCmdletCache - - /// /// Removes a cmdlet from the cmdlet cache. /// @@ -1814,46 +1660,6 @@ private int GetCmdletRemovalIndex(List cacheEntry, string PSSnapin) return removalIndex; } - - /// - /// Gets the cached ScriptInfo for a command using the script name. - /// - /// - /// - /// The name of the script. - /// - /// - /// - /// A reference to the ScriptInfo for the command if its in the cache, - /// or null otherwise. - /// - /// - internal ScriptInfo GetScriptInfo(string name) - { - Dbg.Assert( - !String.IsNullOrEmpty(name), - "The caller should verify the name"); - - ScriptInfo result; - _cachedScriptInfo.TryGetValue(name, out result); - return result; - } // GetScriptInfo - - /// - /// Gets the script cache - /// - /// - internal Dictionary ScriptCache - { - get { return _cachedScriptInfo; } - } - - /// - /// The cache for the ScriptInfo. - /// - /// - private Dictionary _cachedScriptInfo; - internal ExecutionContext Context { get; } /// diff --git a/src/System.Management.Automation/engine/CommandSearcher.cs b/src/System.Management.Automation/engine/CommandSearcher.cs index 65ac77eb577..05fcb272554 100644 --- a/src/System.Management.Automation/engine/CommandSearcher.cs +++ b/src/System.Management.Automation/engine/CommandSearcher.cs @@ -132,18 +132,6 @@ public bool MoveNext() return true; } - // Advance the state - _currentState = SearchState.SearchingBuiltinScripts; - } - - if (_currentState == SearchState.SearchingBuiltinScripts) - { - _currentMatch = SearchForBuiltinScripts(); - if (_currentMatch != null) - { - return true; - } - // Advance the state _currentState = SearchState.StartSearchingForExternalCommands; } @@ -301,18 +289,6 @@ private CommandInfo SearchForCmdlets() return currentMatch; } - private CommandInfo SearchForBuiltinScripts() - { - CommandInfo currentMatch = null; - - if ((_commandTypes & CommandTypes.Script) != 0) - { - currentMatch = GetNextBuiltinScript(); - } - - return currentMatch; - } - private CommandInfo ProcessBuiltinScriptState() { CommandInfo currentMatch = null; @@ -1043,7 +1019,7 @@ private CmdletInfo GetNextCmdlet() if (!_matchingCmdlet.MoveNext()) { // Advance the state - _currentState = SearchState.SearchingBuiltinScripts; + _currentState = SearchState.StartSearchingForExternalCommands; _matchingCmdlet = null; } @@ -1068,86 +1044,6 @@ private static CmdletInfo traceResult(CmdletInfo result) return result; } - /// - /// Gets the next builtin script from the collection of matching scripts. - /// If the collection doesn't exist yet it is created and the - /// enumerator is moved to the first item in the collection. - /// - /// - /// - /// A ScriptInfo for the next matching script or null if there are - /// no more matches. - /// - /// - private ScriptInfo GetNextBuiltinScript() - { - ScriptInfo result = null; - - if ((_commandResolutionOptions & SearchResolutionOptions.CommandNameIsPattern) != 0) - { - if (_matchingScript == null) - { - // Generate the enumerator of matching script names - - Collection matchingScripts = - new Collection(); - - WildcardPattern scriptMatcher = - WildcardPattern.Get( - _commandName, - WildcardOptions.IgnoreCase); - - WildcardPattern scriptExtensionMatcher = - WildcardPattern.Get( - _commandName + StringLiterals.PowerShellScriptFileExtension, - WildcardOptions.IgnoreCase); - - // Get the script cache enumerator. This acquires the cache lock, - // so be sure to dispose. - - foreach (string scriptName in _context.CommandDiscovery.ScriptCache.Keys) - { - if (scriptMatcher.IsMatch(scriptName) || - scriptExtensionMatcher.IsMatch(scriptName)) - { - matchingScripts.Add(scriptName); - } - } - _matchingScript = matchingScripts.GetEnumerator(); - } - - if (!_matchingScript.MoveNext()) - { - // Advance the state - _currentState = SearchState.StartSearchingForExternalCommands; - - _matchingScript = null; - } - else - { - result = _context.CommandDiscovery.GetScriptInfo(_matchingScript.Current); - } - } - else - { - // Advance the state - _currentState = SearchState.StartSearchingForExternalCommands; - - result = _context.CommandDiscovery.GetScriptInfo(_commandName) ?? - _context.CommandDiscovery.GetScriptInfo(_commandName + StringLiterals.PowerShellScriptFileExtension); - } - - if (result != null) - { - CommandDiscovery.discoveryTracer.WriteLine( - "Script found: {0}", - result.Name); - } - return result; - } - private IEnumerator _matchingScript; - - private string DoPowerShellRelativePathLookup() { string result = null; @@ -1632,7 +1528,6 @@ public void Reset() _currentState = SearchState.SearchingAliases; _matchingAlias = null; _matchingCmdlet = null; - _matchingScript = null; } // Reset internal CommandOrigin CommandOrigin @@ -1676,9 +1571,6 @@ private enum SearchState // the searcher has finished function resolution and is now searching for cmdlets SearchingCmdlets, - // the search has finished cmdlet resolution and is now searching for builtin scripts - SearchingBuiltinScripts, - // the search has finished builtin script resolution and is now searching for external commands StartSearchingForExternalCommands, diff --git a/src/System.Management.Automation/engine/ExecutionContext.cs b/src/System.Management.Automation/engine/ExecutionContext.cs index 72ea7fcb6d8..f39fdbb7ee5 100644 --- a/src/System.Management.Automation/engine/ExecutionContext.cs +++ b/src/System.Management.Automation/engine/ExecutionContext.cs @@ -169,26 +169,8 @@ internal bool ShouldTraceStatement /// internal AutomationEngine Engine { get; private set; } - /// - /// Get the RunspaceConfiguration instance - /// - internal RunspaceConfiguration RunspaceConfiguration { get; } - internal InitialSessionState InitialSessionState { get; } - /// - /// True if the RunspaceConfiguration/InitialSessionState is for a single shell or false otherwise. - /// - /// - internal bool IsSingleShell - { - get - { - RunspaceConfigForSingleShell runSpace = RunspaceConfiguration as RunspaceConfigForSingleShell; - return runSpace != null || InitialSessionState != null; - } - } - /// /// Added for Win8: 336382 /// Contains the name of the previous module that was processed. This @@ -259,14 +241,7 @@ internal ProviderNames ProviderNames { if (_providerNames == null) { - if (IsSingleShell) - { - _providerNames = new SingleShellProviderNames(); - } - else - { - _providerNames = new CustomShellProviderNames(); - } + _providerNames = new SingleShellProviderNames(); } return _providerNames; } @@ -293,11 +268,6 @@ internal string ShellID { _shellId = AuthorizationManager.ShellId; } - else if (RunspaceConfiguration != null && !String.IsNullOrEmpty(RunspaceConfiguration.ShellId)) - { - // Otherwise fall back to the runspace shell id if it's there... - _shellId = RunspaceConfiguration.ShellId; - } else { // Finally fall back to the default shell id... @@ -1090,13 +1060,8 @@ internal ConfirmImpact ConfirmPreferenceVariable internal void RunspaceClosingNotification() { - if (this.RunspaceConfiguration != null) - { - this.RunspaceConfiguration.Unbind(this); - } - EngineSessionState.RunspaceClosingNotification(); - + if (_debugger != null) { _debugger.Dispose(); @@ -1114,10 +1079,7 @@ internal void RunspaceClosingNotification() } /// - /// Gets the type table instance for this engine. This is somewhat - /// complicated by the need to have a single type table in RunspaceConfig - /// shared across all bound runspaces, as well as individual tables for - /// instances created from InitialSessionState. + /// Gets the type table instance for this engine. /// internal TypeTable TypeTable { @@ -1125,22 +1087,15 @@ internal TypeTable TypeTable { if (_typeTable == null) { - // Always use the type table from the RunspaceConfig if there is one, otherwise create a default one - _typeTable = (this.RunspaceConfiguration != null && RunspaceConfiguration.TypeTable != null) - ? RunspaceConfiguration.TypeTable - : new TypeTable(); + _typeTable = new TypeTable(); _typeTableWeakReference = new WeakReference(_typeTable); } return _typeTable; } - // This needs to exist so that RunspaceConfiguration can - // push it's shared type table into ExecutionContext set { - if (this.RunspaceConfiguration != null) - throw new NotImplementedException("set_TypeTable()"); _typeTable = value; - _typeTableWeakReference = value != null ? new WeakReference(value) : null; + _typeTableWeakReference = (value != null) ? new WeakReference(value) : null; } } @@ -1163,21 +1118,12 @@ internal WeakReference TypeTableWeakReference private WeakReference _typeTableWeakReference; /// - /// Gets the format info database for this engine. This is significantly - /// complicated by the need to have a single type table in RunspaceConfig - /// shared across all bound runspaces, as well as individual tables for - /// instances created from InitialSessionState. + /// Gets the format info database for this engine. /// internal TypeInfoDataBaseManager FormatDBManager { get { - // Use the format DB from the RunspaceConfig if there is one. - if (this.RunspaceConfiguration != null && RunspaceConfiguration.FormatDBManager != null) - { - return RunspaceConfiguration.FormatDBManager; - } - if (_formatDBManager == null) { // If no Formatter database has been created, then @@ -1193,13 +1139,9 @@ internal TypeInfoDataBaseManager FormatDBManager } return _formatDBManager; } - - // This needs to exist so that RunspaceConfiguration can - // push it's shared format database table into ExecutionContext + set { - if (this.RunspaceConfiguration != null) - throw new NotImplementedException("set_FormatDBManager()"); _formatDBManager = value; } } @@ -1218,69 +1160,6 @@ internal PSTransactionManager TransactionManager } internal PSTransactionManager transactionManager; - - private bool _assemblyCacheInitialized = false; - - /// - /// This function is called by RunspaceConfiguration.Assemblies.Update call back. - /// It's not used when constructing a runspace from an InitialSessionState object. - /// - internal void UpdateAssemblyCache() - { - string errors = ""; - - if (this.RunspaceConfiguration != null) - { - if (!_assemblyCacheInitialized) - { - foreach (AssemblyConfigurationEntry entry in this.RunspaceConfiguration.Assemblies) - { - Exception error = null; - AddAssembly(entry.Name, entry.FileName, out error); - - if (error != null) - { - errors += "\n" + error.Message; - } - } - - _assemblyCacheInitialized = true; - } - else - { - foreach (AssemblyConfigurationEntry entry in this.RunspaceConfiguration.Assemblies.UpdateList) - { - switch (entry.Action) - { - case UpdateAction.Add: - Exception error = null; - AddAssembly(entry.Name, entry.FileName, out error); - - if (error != null) - { - errors += "\n" + error.Message; - } - - break; - - case UpdateAction.Remove: - RemoveAssembly(entry.Name); - break; - - default: - break; - } - } - } - - if (!String.IsNullOrEmpty(errors)) - { - string message = StringUtil.Format(MiniShellErrors.UpdateAssemblyErrors, errors); - throw new RuntimeException(message); - } - } - } - internal Assembly AddAssembly(string name, string filename, out Exception error) { Assembly loadedAssembly = LoadAssembly(name, filename, out error); @@ -1537,27 +1416,6 @@ private bool IsModuleCommandCurrentlyRunning(out Cmdlet command, out string erro return result; } - /// - /// Constructs an Execution context object for Automation Engine - /// - /// - /// - /// Engine that hosts this execution context - /// - /// - /// Interface that should be used for interaction with host - /// - /// - /// RunspaceConfiguration information - /// - internal ExecutionContext(AutomationEngine engine, PSHost hostInterface, RunspaceConfiguration runspaceConfiguration) - { - RunspaceConfiguration = runspaceConfiguration; - AuthorizationManager = runspaceConfiguration.AuthorizationManager; - - InitializeCommon(engine, hostInterface); - } - /// /// Constructs an Execution context object for Automation Engine /// diff --git a/src/System.Management.Automation/engine/InitialSessionState.cs b/src/System.Management.Automation/engine/InitialSessionState.cs index e20aa7a30ca..1576ce2b744 100644 --- a/src/System.Management.Automation/engine/InitialSessionState.cs +++ b/src/System.Management.Automation/engine/InitialSessionState.cs @@ -1600,6 +1600,7 @@ public static InitialSessionState CreateDefault() /// /// Creates the default PowerShell one with default cmdlets, provider etc. /// The default cmdlets, provider, etc are loaded via Modules + /// For loading Microsoft.PowerShell.Core module only. /// /// public static InitialSessionState CreateDefault2() @@ -3704,7 +3705,6 @@ internal PSSnapInInfo ImportCorePSSnapIn() return coreSnapin; } - // WARNING: THIS CODE IS COMPLETELY DUPLICATED IN RunspaceConfigForSingleShell internal PSSnapInInfo ImportPSSnapIn(PSSnapInInfo psSnapInInfo, out PSSnapInException warning) { // See if the snapin is already loaded. If has been then there will be an entry in the @@ -4766,10 +4766,6 @@ internal static SessionStateAliasEntry[] BuiltInAliases "Clear-Host", "", ScopedItemOptions.AllScope), //#if !CORECLR is used to disable aliases for cmdlets which are not available on OneCore #if !CORECLR - new SessionStateAliasEntry("asnp", - "Add-PSSnapIn", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("gsnp", - "Get-PSSnapIn", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), new SessionStateAliasEntry("gwmi", "Get-WmiObject", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), new SessionStateAliasEntry("iwmi", @@ -5048,22 +5044,6 @@ internal static string GetNestedModuleDllName(string moduleName) return result; } - - internal void SaveAsConsoleFile(string path) - { - if (null == path) - { - throw PSTraceSource.NewArgumentNullException("path"); - } - - if (!path.EndsWith(StringLiterals.PowerShellConsoleFileExtension, StringComparison.OrdinalIgnoreCase)) - { - throw PSTraceSource.NewArgumentException("path", ConsoleInfoErrorStrings.BadConsoleExtension); - } - - //ConsoleFileElement will write to file - PSConsoleFileElement.WriteToFile(path, PSVersionInfo.PSVersion, this.ImportedSnapins.Values); - } } /// @@ -5083,7 +5063,6 @@ internal static Assembly LoadPSSnapInAssembly(PSSnapInInfo psSnapInInfo, try { - // WARNING: DUPLICATE CODE see RunspaceConfigForSingleShell assembly = Assembly.Load(new AssemblyName(psSnapInInfo.AssemblyName)); } catch (BadImageFormatException e) diff --git a/src/System.Management.Automation/engine/Modules/ModuleCmdletBase.cs b/src/System.Management.Automation/engine/Modules/ModuleCmdletBase.cs index 1269b141a3a..896ef6bda08 100644 --- a/src/System.Management.Automation/engine/Modules/ModuleCmdletBase.cs +++ b/src/System.Management.Automation/engine/Modules/ModuleCmdletBase.cs @@ -2150,8 +2150,6 @@ internal PSModuleInfo LoadModuleManifest( // Indicates the ISS.Bind() should be called... bool doBind = false; - // Indicates that RunspaceConfig.Update() should be called. - bool doUpdate = false; // Set up to load any required assemblies that have been specified... List tmpAssemblyList; @@ -2233,37 +2231,29 @@ internal PSModuleInfo LoadModuleManifest( string loadMessage = StringUtil.Format(Modules.LoadingFile, "TypesToProcess", fileName); WriteVerbose(loadMessage); - if (Context.RunspaceConfiguration != null) + bool isAlreadyLoaded = false; + string resolvedFileName = ResolveRootedFilePath(fileName, Context) ?? fileName; + foreach (var entry in Context.InitialSessionState.Types) { - this.Context.RunspaceConfiguration.Types.Append(new TypeConfigurationEntry(fileName)); - doUpdate = true; - } - else - { - bool isAlreadyLoaded = false; - string resolvedFileName = ResolveRootedFilePath(fileName, Context) ?? fileName; - foreach (var entry in Context.InitialSessionState.Types) + if (entry.FileName == null) { - if (entry.FileName == null) - { - continue; - } - - string resolvedEntryFileName = ResolveRootedFilePath(entry.FileName, Context) ?? - entry.FileName; - if (resolvedEntryFileName.Equals(resolvedFileName, StringComparison.OrdinalIgnoreCase)) - { - isAlreadyLoaded = true; - break; - } + continue; } - if (!isAlreadyLoaded) + string resolvedEntryFileName = ResolveRootedFilePath(entry.FileName, Context) ?? + entry.FileName; + if (resolvedEntryFileName.Equals(resolvedFileName, StringComparison.OrdinalIgnoreCase)) { - iss.Types.Add(new SessionStateTypeEntry(fileName)); - doBind = true; + isAlreadyLoaded = true; + break; } } + + if (!isAlreadyLoaded) + { + iss.Types.Add(new SessionStateTypeEntry(fileName)); + doBind = true; + } } } } @@ -2286,33 +2276,25 @@ internal PSModuleInfo LoadModuleManifest( string loadMessage = StringUtil.Format(Modules.LoadingFile, "FormatsToProcess", fileName); WriteVerbose(loadMessage); - if (Context.RunspaceConfiguration != null) - { - this.Context.RunspaceConfiguration.Formats.Append(new FormatConfigurationEntry(fileName)); - doUpdate = true; - } - else + bool isAlreadyLoaded = false; + foreach (var entry in Context.InitialSessionState.Formats) { - bool isAlreadyLoaded = false; - foreach (var entry in Context.InitialSessionState.Formats) + if (entry.FileName == null) { - if (entry.FileName == null) - { - continue; - } - if (entry.FileName.Equals(fileName, StringComparison.OrdinalIgnoreCase)) - { - isAlreadyLoaded = true; - break; - } + continue; } - - if (!isAlreadyLoaded) + if (entry.FileName.Equals(fileName, StringComparison.OrdinalIgnoreCase)) { - iss.Formats.Add(new SessionStateFormatEntry(fileName)); - doBind = true; + isAlreadyLoaded = true; + break; } } + + if (!isAlreadyLoaded) + { + iss.Formats.Add(new SessionStateFormatEntry(fileName)); + doBind = true; + } } } } @@ -2422,30 +2404,6 @@ internal PSModuleInfo LoadModuleManifest( } } } - - // Do the runspaceconfig binding... - if (doUpdate) - { - try - { - this.Context.CurrentRunspace.RunspaceConfiguration.Types.Update(true); - this.Context.CurrentRunspace.RunspaceConfiguration.Formats.Update(true); - } - catch (Exception e) - { - this.RemoveTypesAndFormatting(exportedFormatFiles, exportedTypeFiles); - ErrorRecord er = new ErrorRecord(e, "FormatXmlUpdateException", ErrorCategory.InvalidOperation, - null); - if (bailOnFirstError) - { - this.ThrowTerminatingError(er); - } - else if (writingErrors) - { - this.WriteError(er); - } - } - } } // Create a PSModuleInfo for psd1 file or take one from ModuleToProcess manifest field @@ -4039,7 +3997,7 @@ internal static object IsModuleLoaded(ExecutionContext context, ModuleSpecificat } } - // If the RequiredModule is one of the Engine modules, then they could have been loaded as snapins (using RunspaceConfiguration or InitialSessionState.CreateDefault()) + // If the RequiredModule is one of the Engine modules, then they could have been loaded as snapins (using InitialSessionState.CreateDefault()) if (result == null && InitialSessionState.IsEngineModule(requiredModule.Name)) { result = ModuleCmdletBase.GetEngineSnapIn(context, requiredModule.Name); @@ -5082,68 +5040,18 @@ private void RemoveTypesAndFormatting( { try { - if (this.Context.InitialSessionState != null) - { - if (((formatFilesToRemove != null) && formatFilesToRemove.Count > 0) || - ((typeFilesToRemove != null) && typeFilesToRemove.Count > 0)) - { - bool oldRefreshTypeFormatSetting = this.Context.InitialSessionState.RefreshTypeAndFormatSetting; - try - { - this.Context.InitialSessionState.RefreshTypeAndFormatSetting = true; - InitialSessionState.RemoveTypesAndFormats(this.Context, formatFilesToRemove, typeFilesToRemove); - } - finally - { - this.Context.InitialSessionState.RefreshTypeAndFormatSetting = oldRefreshTypeFormatSetting; - } - } - } - else // RunspaceConfiguration + if (((formatFilesToRemove != null) && formatFilesToRemove.Count > 0) || + ((typeFilesToRemove != null) && typeFilesToRemove.Count > 0)) { - if (formatFilesToRemove != null && formatFilesToRemove.Count > 0) + bool oldRefreshTypeFormatSetting = this.Context.InitialSessionState.RefreshTypeAndFormatSetting; + try { - HashSet formatRemoveSet = new HashSet(formatFilesToRemove, StringComparer.OrdinalIgnoreCase); - List formatIndicesToRemove = new List(); - - for (int index = 0; index < this.Context.RunspaceConfiguration.Formats.Count; index++) - { - string fileName = Context.RunspaceConfiguration.Formats[index].FileName; - if (fileName != null && formatRemoveSet.Contains(fileName)) - { - formatIndicesToRemove.Add(index); - } - } - - for (int i = formatIndicesToRemove.Count - 1; i >= 0; i--) - { - Context.RunspaceConfiguration.Formats.RemoveItem(formatIndicesToRemove[i]); - } - - this.Context.RunspaceConfiguration.Formats.Update(); + this.Context.InitialSessionState.RefreshTypeAndFormatSetting = true; + InitialSessionState.RemoveTypesAndFormats(this.Context, formatFilesToRemove, typeFilesToRemove); } - - // Remove the imported types.ps1xml files - if (typeFilesToRemove != null && typeFilesToRemove.Count > 0) + finally { - HashSet typeRemoveSet = new HashSet(typeFilesToRemove, StringComparer.OrdinalIgnoreCase); - List typeIndicesToRemove = new List(); - - for (int index = 0; index < this.Context.RunspaceConfiguration.Types.Count; index++) - { - string fileName = Context.RunspaceConfiguration.Types[index].FileName; - if (fileName != null && typeRemoveSet.Contains(fileName)) - { - typeIndicesToRemove.Add(index); - } - } - - for (int i = typeIndicesToRemove.Count - 1; i >= 0; i--) - { - Context.RunspaceConfiguration.Types.RemoveItem(typeIndicesToRemove[i]); - } - - this.Context.RunspaceConfiguration.Types.Update(); + this.Context.InitialSessionState.RefreshTypeAndFormatSetting = oldRefreshTypeFormatSetting; } } } diff --git a/src/System.Management.Automation/engine/ProviderNames.cs b/src/System.Management.Automation/engine/ProviderNames.cs index c78aaf56484..56bf1d65fde 100644 --- a/src/System.Management.Automation/engine/ProviderNames.cs +++ b/src/System.Management.Automation/engine/ProviderNames.cs @@ -49,89 +49,6 @@ internal abstract class ProviderNames internal abstract string Registry { get; } } - /// - /// The provider names for custom shells - /// - internal class CustomShellProviderNames : ProviderNames - { - /// - /// Gets the name of the EnvironmentProvider - /// - internal override string Environment - { - get - { - return "Environment"; - } - } - - /// - /// Gets the name of the Certificate - /// - internal override string Certificate - { - get - { - return "Certificate"; - } - } - - /// - /// Gets the name of the VariableProvider - /// - internal override string Variable - { - get - { - return "Variable"; - } - } - - /// - /// Gets the name of the AliasProvider - /// - internal override string Alias - { - get - { - return "Alias"; - } - } - - /// - /// Gets the name of the FunctionProvider - /// - internal override string Function - { - get - { - return "Function"; - } - } - - /// - /// Gets the name of the FileSystemProvider - /// - internal override string FileSystem - { - get - { - return "FileSystem"; - } - } - - /// - /// Gets the name of the RegistryProvider - /// - internal override string Registry - { - get - { - return "Registry"; - } - } - } - /// /// The provider names for the single shell /// diff --git a/src/System.Management.Automation/minishell/api/RunspaceConfigurationEntry.cs b/src/System.Management.Automation/engine/RunspaceConfigurationEntry.cs similarity index 95% rename from src/System.Management.Automation/minishell/api/RunspaceConfigurationEntry.cs rename to src/System.Management.Automation/engine/RunspaceConfigurationEntry.cs index b0e8a80d705..97932f2465a 100644 --- a/src/System.Management.Automation/minishell/api/RunspaceConfigurationEntry.cs +++ b/src/System.Management.Automation/engine/RunspaceConfigurationEntry.cs @@ -7,6 +7,47 @@ namespace System.Management.Automation.Runspaces { + /// + /// Enum for describing different kind information that can be configured in runspace configuration. + /// + internal enum RunspaceConfigurationCategory + { + /// + /// Cmdlets + /// + Cmdlets, + + /// + /// Providers + /// + Providers, + + /// + /// Assemblies + /// + Assemblies, + + /// + /// Scripts + /// + Scripts, + + /// + /// Initialization scripts + /// + InitializationScripts, + + /// + /// Types + /// + Types, + + /// + /// Formats + /// + Formats, + } + /// /// Define class for runspace configuration entry. /// diff --git a/src/System.Management.Automation/engine/SessionState.cs b/src/System.Management.Automation/engine/SessionState.cs index 9070f0e2071..4745143511c 100644 --- a/src/System.Management.Automation/engine/SessionState.cs +++ b/src/System.Management.Automation/engine/SessionState.cs @@ -379,28 +379,6 @@ internal void InitializeFixedVariables() RunspaceInit.PSHOMEDescription); this.GlobalScope.SetVariable(v.Name, v, false, true, this, CommandOrigin.Internal, fastPath: true); - - // $Console - set the console file for this shell, if there is one, "" otherwise... - SetConsoleVariable(); - } - - /// - /// Set the $Console variable in this session state instance... - /// - internal void SetConsoleVariable() - { - // $Console - set the console file for this shell, if there is one, "" otherwise... - string consoleFileName = string.Empty; - RunspaceConfigForSingleShell rcss = ExecutionContext.RunspaceConfiguration as RunspaceConfigForSingleShell; - if (rcss != null && rcss.ConsoleInfo != null && !string.IsNullOrEmpty(rcss.ConsoleInfo.Filename)) - { - consoleFileName = rcss.ConsoleInfo.Filename; - } - PSVariable v = new PSVariable(SpecialVariables.ConsoleFileName, - consoleFileName, - ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope, - RunspaceInit.ConsoleDescription); - this.GlobalScope.SetVariable(v.Name, v, false, true, this, CommandOrigin.Internal, fastPath: true); } /// @@ -500,13 +478,7 @@ internal void RunspaceClosingNotification() CmdletProviderContext context = new CmdletProviderContext(this.ExecutionContext); - Collection keys = new Collection(); - foreach (string key in Providers.Keys) - { - keys.Add(key); - } - - foreach (string providerName in keys) + foreach (string providerName in Providers.Keys) { // All errors are ignored. diff --git a/src/System.Management.Automation/engine/SessionStateProviderAPIs.cs b/src/System.Management.Automation/engine/SessionStateProviderAPIs.cs index 311be3a90b6..54721d48771 100644 --- a/src/System.Management.Automation/engine/SessionStateProviderAPIs.cs +++ b/src/System.Management.Automation/engine/SessionStateProviderAPIs.cs @@ -52,48 +52,6 @@ internal Dictionary ProvidersCurrentWorkingDrive } private Dictionary _providersCurrentWorkingDrive = new Dictionary(); - private bool _providersInitialized = false; - - /// - /// Gets called by the RunspaceConfiguration when a PSSnapin gets added or removed. - /// - /// - internal void UpdateProviders() - { - // This should only be called from Update() on a runspace configuration q.e.d. runspace configuration - // should never be null when this gets called... - if (this.ExecutionContext.RunspaceConfiguration == null) - throw PSTraceSource.NewInvalidOperationException(); - - if (this == ExecutionContext.TopLevelSessionState && !_providersInitialized) - { - foreach (ProviderConfigurationEntry providerConfig in this.ExecutionContext.RunspaceConfiguration.Providers) - { - AddProvider(providerConfig); - } - - _providersInitialized = true; - return; - } - - foreach (ProviderConfigurationEntry providerConfig in this.ExecutionContext.RunspaceConfiguration.Providers.UpdateList) - { - switch (providerConfig.Action) - { - case UpdateAction.Add: - AddProvider(providerConfig); - break; - - case UpdateAction.Remove: - RemoveProvider(providerConfig); - break; - - default: - break; - } - } - } - /// /// Entrypoint used by to add a provider to the current session state /// based on a SessionStateProviderEntry. @@ -109,20 +67,6 @@ internal void AddSessionStateEntry(SessionStateProviderEntry providerEntry) ); } - /// - /// Internal method used by RunspaceConfig for updating providers. - /// - /// - private ProviderInfo AddProvider(ProviderConfigurationEntry providerConfig) - { - return AddProvider(providerConfig.ImplementingType, - providerConfig.Name, - providerConfig.HelpFileName, - providerConfig.PSSnapIn, - null - ); - } - private ProviderInfo AddProvider(Type implementingType, string name, string helpFileName, PSSnapInInfo psSnapIn, PSModuleInfo module) { ProviderInfo provider = null; @@ -1028,7 +972,7 @@ internal Collection GetProvider(PSSnapinQualifiedName providerName } } - if (ExecutionContext.IsSingleShell && !String.IsNullOrEmpty(providerName.PSSnapInName)) + if (!String.IsNullOrEmpty(providerName.PSSnapInName)) { // Be sure the PSSnapin/Module name matches @@ -1234,8 +1178,6 @@ internal void InitializeProvider( } } // InitializeProvider - - /// /// Creates and adds a provider to the provider container /// @@ -1512,51 +1454,6 @@ private void NewProviderEntry(ProviderInfo provider) #region Remove Provider - private void RemoveProvider(ProviderConfigurationEntry entry) - { - try - { - CmdletProviderContext context = new CmdletProviderContext(this.ExecutionContext); - - string providerName = GetProviderName(entry); - RemoveProvider(providerName, true, context); - - context.ThrowFirstErrorOrDoNothing(); - } - catch (LoopFlowException) - { - throw; - } - catch (PipelineStoppedException) - { - throw; - } - catch (ActionPreferenceStopException) - { - throw; - } - catch (Exception e) // Catch-all OK, 3rd party callout - { - // NTRAID#Windows OS Bugs-1009281-2004/02/11-JeffJon - this.ExecutionContext.ReportEngineStartupError(e); - } - } - - private string GetProviderName(ProviderConfigurationEntry entry) - { - string name = entry.Name; - if (entry.PSSnapIn != null) - { - name = - string.Format( - System.Globalization.CultureInfo.InvariantCulture, - "{0}\\{1}", - entry.PSSnapIn.Name, - entry.Name); - } - return name; - } - /// /// Removes the provider of the given name. /// diff --git a/src/System.Management.Automation/engine/SpecialVariables.cs b/src/System.Management.Automation/engine/SpecialVariables.cs index 90b9585976c..5c837976f7c 100644 --- a/src/System.Management.Automation/engine/SpecialVariables.cs +++ b/src/System.Management.Automation/engine/SpecialVariables.cs @@ -217,7 +217,6 @@ internal static class SpecialVariables #region AllScope variables created in every session - internal const string ConsoleFileName = "ConsoleFileName"; internal const string ExecutionContext = "ExecutionContext"; internal const string Home = "HOME"; internal const string Host = "Host"; @@ -232,7 +231,6 @@ internal static class SpecialVariables internal static List AllScopeSessionVariables = new List { - ConsoleFileName, ExecutionContext, Home, Host, @@ -297,7 +295,6 @@ internal static class SpecialVariables // also exists. internal static readonly string[] AllScopeVariables = { SpecialVariables.Question, - SpecialVariables.ConsoleFileName, SpecialVariables.ExecutionContext, SpecialVariables.False, SpecialVariables.Home, diff --git a/src/System.Management.Automation/engine/TypeTable.cs b/src/System.Management.Automation/engine/TypeTable.cs index 35ef970d80f..1b2fba40da3 100644 --- a/src/System.Management.Automation/engine/TypeTable.cs +++ b/src/System.Management.Automation/engine/TypeTable.cs @@ -4218,7 +4218,6 @@ public void AddType(TypeData typeData) Update(errors, typeData, false); StandardMembersUpdated(); - // Throw exception if there are any errors FormatAndTypeDataHelper.ThrowExceptionOnError("ErrorsUpdatingTypes", errors, RunspaceConfigurationCategory.Types); } @@ -4245,7 +4244,6 @@ public void RemoveType(string typeName) Update(errors, typeData, true); StandardMembersUpdated(); - // Throw exception if there are any errors FormatAndTypeDataHelper.ThrowExceptionOnError("ErrorsUpdatingTypes", errors, RunspaceConfigurationCategory.Types); } diff --git a/src/System.Management.Automation/engine/hostifaces/Connection.cs b/src/System.Management.Automation/engine/hostifaces/Connection.cs index 40973e81f6c..8828d3d5477 100644 --- a/src/System.Management.Automation/engine/hostifaces/Connection.cs +++ b/src/System.Management.Automation/engine/hostifaces/Connection.cs @@ -16,7 +16,7 @@ namespace System.Management.Automation.Runspaces #region Exceptions /// - /// Exception thrown when state of the runspace is different from + /// Exception thrown when state of the runspace is different from /// expected state of runspace. /// [Serializable] @@ -34,10 +34,10 @@ public InvalidRunspaceStateException() } /// - /// Initializes a new instance of InvalidRunspaceStateException with a specified error message. + /// Initializes a new instance of InvalidRunspaceStateException with a specified error message. /// /// - /// The message that describes the error. + /// The message that describes the error. /// public InvalidRunspaceStateException(string message) : base(message) @@ -45,12 +45,12 @@ public InvalidRunspaceStateException(string message) } /// - /// Initializes a new instance of the InvalidRunspaceStateException class - /// with a specified error message and a reference to the inner exception - /// that is the cause of this exception. + /// Initializes a new instance of the InvalidRunspaceStateException class + /// with a specified error message and a reference to the inner exception + /// that is the cause of this exception. /// /// - /// The message that describes the error. + /// The message that describes the error. /// /// /// The exception that is the cause of the current exception. @@ -61,7 +61,7 @@ public InvalidRunspaceStateException(string message, Exception innerException) } /// - /// Initializes a new instance of the InvalidRunspaceStateException + /// Initializes a new instance of the InvalidRunspaceStateException /// with a specified error message and current and expected state. /// /// The message that describes the error. @@ -90,11 +90,11 @@ RunspaceState expectedState /// class with serialized data. /// /// - /// The that holds the serialized object + /// The that holds the serialized object /// data about the exception being thrown. /// /// - /// The that contains contextual information + /// The that contains contextual information /// about the source or destination. /// protected InvalidRunspaceStateException(SerializationInfo info, StreamingContext context) @@ -214,13 +214,13 @@ public enum PSThreadOptions UseNewThread = 1, /// - /// Creates a new thread for the first invocation and then re-uses + /// Creates a new thread for the first invocation and then re-uses /// that thread in subsequent invocations. /// ReuseThread = 2, /// - /// Doesn't create a new thread; the execution occurs on the + /// Doesn't create a new thread; the execution occurs on the /// thread that calls Invoke. /// /// @@ -250,7 +250,7 @@ internal RunspaceStateInfo(RunspaceState state) /// Constructor for state changes with an optional error /// /// The state of runspace. - /// A non-null exception if the state change was + /// A non-null exception if the state change was /// caused by an error, otherwise; null. /// internal RunspaceStateInfo(RunspaceState state, Exception reason) @@ -263,7 +263,7 @@ internal RunspaceStateInfo(RunspaceState state, Exception reason) /// /// Copy constructor to support cloning. /// - /// The source + /// The source /// RunspaceStateInfo /// internal RunspaceStateInfo(RunspaceStateInfo runspaceStateInfo) @@ -284,8 +284,8 @@ internal RunspaceStateInfo(RunspaceStateInfo runspaceStateInfo) /// The reason for the state change, if caused by an error. /// /// - /// The value of this property is non-null if the state - /// changed due to an error. Otherwise, the value of this + /// The value of this property is non-null if the state + /// changed due to an error. Otherwise, the value of this /// property is null. /// public Exception Reason { get; } @@ -326,7 +326,7 @@ public sealed class RunspaceStateEventArgs : EventArgs /// /// Constructs RunspaceStateEventArgs using RunspaceStateInfo /// - /// The information about + /// The information about /// current state of the runspace. /// runspaceStateInfo is null /// @@ -347,8 +347,8 @@ internal RunspaceStateEventArgs(RunspaceStateInfo runspaceStateInfo) /// Information about state of the runspace /// /// - /// This value indicates the state of the runspace after the - /// change. + /// This value indicates the state of the runspace after the + /// change. /// public RunspaceStateInfo RunspaceStateInfo { get; } @@ -647,19 +647,6 @@ public abstract RunspaceAvailability RunspaceAvailability protected set; } - /// - /// RunspaceConfiguration information for this runspace. - /// -#if CORECLR - internal -#else - public -#endif - abstract RunspaceConfiguration RunspaceConfiguration - { - get; - } - /// /// InitialSessionState information for this runspace. /// @@ -669,7 +656,7 @@ public abstract InitialSessionState InitialSessionState } /// - /// Get unique id for this instance of runspace. It is primarily used + /// Get unique id for this instance of runspace. It is primarily used /// for logging purposes /// public Guid InstanceId { get; @@ -941,7 +928,7 @@ internal void UpdateRunspaceAvailability(PipelineState pipelineState, bool raise ((pipelineState == PipelineState.Stopped) && (this.RunspaceStateInfo.State == RunspaceState.Opened))) && (remoteCommand != null) && (cmdInstanceId != null) && (remoteCommand.CommandId == cmdInstanceId)) { - // Completed, Failed, and Stopped with Runspace.Opened states are command finish states and we know + // Completed, Failed, and Stopped with Runspace.Opened states are command finish states and we know // that the command is finished on the server. // Setting ConnectCommands to null indicates that the runspace is free to run other // commands. @@ -1255,12 +1242,12 @@ public static Runspace GetRunspace(RunspaceConnectionInfo connectionInfo, Guid s /// Disconnects the runspace synchronously. /// /// - /// Disconnects the remote runspace and any running command from the server + /// Disconnects the remote runspace and any running command from the server /// machine. Any data generated by the running command on the server is /// cached on the server machine. This runspace object goes to the disconnected - /// state. This object can be reconnected to the server by calling the + /// state. This object can be reconnected to the server by calling the /// Connect() method. - /// If the remote runspace on the server remains disconnected for the IdleTimeout + /// If the remote runspace on the server remains disconnected for the IdleTimeout /// value (as defined in the WSManConnectionInfo object) then it is closed and /// torn down on the server. /// @@ -1273,12 +1260,12 @@ public static Runspace GetRunspace(RunspaceConnectionInfo connectionInfo, Guid s /// Disconnects the runspace asynchronously. /// /// - /// Disconnects the remote runspace and any running command from the server + /// Disconnects the remote runspace and any running command from the server /// machine. Any data generated by the running command on the server is /// cached on the server machine. This runspace object goes to the disconnected - /// state. This object can be reconnected to the server by calling the + /// state. This object can be reconnected to the server by calling the /// Connect() method. - /// If the remote runspace on the server remains disconnected for the IdleTimeout + /// If the remote runspace on the server remains disconnected for the IdleTimeout /// value (as defined in the WSManConnectionInfo object) then it is closed and /// torn down on the server. /// @@ -1316,8 +1303,8 @@ public static Runspace GetRunspace(RunspaceConnectionInfo connectionInfo, Guid s public abstract void ConnectAsync(); /// - /// Creates a PipeLine object in the disconnected state for the currently disconnected - /// remote running command associated with this runspace. + /// Creates a PipeLine object in the disconnected state for the currently disconnected + /// remote running command associated with this runspace. /// /// Pipeline object in disconnected state. public abstract Pipeline CreateDisconnectedPipeline(); @@ -1370,7 +1357,7 @@ public static Runspace GetRunspace(RunspaceConnectionInfo connectionInfo, Guid s /// Close the runspace Asynchronously. /// /// - /// Attempts to execute pipelines after a call to + /// Attempts to execute pipelines after a call to /// close will fail. /// /// @@ -1410,7 +1397,7 @@ public static Runspace GetRunspace(RunspaceConnectionInfo connectionInfo, Guid s public abstract Pipeline CreatePipeline(string command, bool addToHistory); /// - /// Creates a nested pipeline. + /// Creates a nested pipeline. /// /// /// Nested pipelines are needed for nested prompt scenario. Nested @@ -1420,7 +1407,7 @@ public static Runspace GetRunspace(RunspaceConnectionInfo connectionInfo, Guid s public abstract Pipeline CreateNestedPipeline(); /// - /// Creates a nested pipeline. + /// Creates a nested pipeline. /// /// A valid command string /// if true command is added to history @@ -1438,14 +1425,14 @@ public static Runspace GetRunspace(RunspaceConnectionInfo connectionInfo, Guid s internal abstract Pipeline GetCurrentlyRunningPipeline(); /// - /// Private data to be used by applications built on top of PowerShell. - /// + /// Private data to be used by applications built on top of PowerShell. + /// /// Local runspace is created with application private data set to an empty . - /// - /// Remote runspace gets its application private data from the server (set when creating a remote runspace pool) - /// Calling this method on a remote runspace will block until the data is received from the server. + /// + /// Remote runspace gets its application private data from the server (set when creating a remote runspace pool) + /// Calling this method on a remote runspace will block until the data is received from the server. /// The server will send application private data before reaching state. - /// + /// /// Runspaces that are part of a inherit application private data from the pool. /// public abstract PSPrimitiveDictionary GetApplicationPrivateData(); @@ -1639,7 +1626,7 @@ internal long GeneratePipelineId() } /// - /// This class provides subset of functionality provided by + /// This class provides subset of functionality provided by /// session state. /// public class SessionStateProxy @@ -1658,23 +1645,23 @@ internal SessionStateProxy(RunspaceBase runspace) /// /// Set a variable in session state. /// - /// + /// /// /// The name of the item to set. /// - /// + /// /// /// The new value of the item being set. /// - /// + /// /// /// name is null /// - /// + /// /// /// Runspace is not open. /// - /// + /// /// /// Another SessionStateProxy call or another pipeline is in progress. /// @@ -1688,25 +1675,25 @@ public virtual void SetVariable(string name, object value) } /// - /// Get a variable out of session state. + /// Get a variable out of session state. /// - /// + /// /// /// name of variable to look up /// - /// + /// /// /// The value of the specified variable. /// - /// + /// /// /// name is null /// - /// + /// /// /// Runspace is not open. /// - /// + /// /// /// Another SessionStateProxy call or another pipeline is in progress. /// @@ -1727,11 +1714,11 @@ public virtual object GetVariable(string name) /// /// Get the list of applications out of session state. /// - /// + /// /// /// Runspace is not open. /// - /// + /// /// /// Another SessionStateProxy call or another pipeline is in progress. /// @@ -1746,11 +1733,11 @@ public virtual List Applications /// /// Get the list of scripts out of session state. /// - /// + /// /// /// Runspace is not open. /// - /// + /// /// /// Another SessionStateProxy call or another pipeline is in progress. /// @@ -1765,11 +1752,11 @@ public virtual List Scripts /// /// Get the APIs to access drives out of session state /// - /// + /// /// /// Runspace is not open. /// - /// + /// /// /// Another SessionStateProxy call or another pipeline is in progress. /// @@ -1781,11 +1768,11 @@ public virtual DriveManagementIntrinsics Drive /// /// Get/Set the language mode out of session state. /// - /// + /// /// /// Runspace is not open. /// - /// + /// /// /// Another SessionStateProxy call or another pipeline is in progress. /// @@ -1798,11 +1785,11 @@ public virtual PSLanguageMode LanguageMode /// /// Get the module info out of session state. /// - /// + /// /// /// Runspace is not open. /// - /// + /// /// /// Another SessionStateProxy call or another pipeline is in progress. /// @@ -1815,11 +1802,11 @@ public virtual PSModuleInfo Module /// /// Get the APIs to access paths and locations out of session state. /// - /// + /// /// /// Runspace is not open. /// - /// + /// /// /// Another SessionStateProxy call or another pipeline is in progress. /// @@ -1831,11 +1818,11 @@ public virtual PathIntrinsics Path /// /// Get the APIs to access a provider out of session state. /// - /// + /// /// /// Runspace is not open. /// - /// + /// /// /// Another SessionStateProxy call or another pipeline is in progress. /// @@ -1847,11 +1834,11 @@ public virtual CmdletProviderManagementIntrinsics Provider /// /// Get the APIs to access variables out of session state. /// - /// + /// /// /// Runspace is not open. /// - /// + /// /// /// Another SessionStateProxy call or another pipeline is in progress. /// @@ -1863,14 +1850,14 @@ public virtual PSVariableIntrinsics PSVariable /// /// Get the APIs to build script blocks and execute script out of session state. /// - /// + /// /// /// Runspace is not open. /// - /// + /// /// /// Another SessionStateProxy call or another pipeline is in progress. - /// + /// public virtual CommandInvocationIntrinsics InvokeCommand { get { return _runspace.InvokeCommand; } @@ -1879,11 +1866,11 @@ public virtual CommandInvocationIntrinsics InvokeCommand /// /// Gets the instance of the provider interface APIs out of session state. /// - /// + /// /// /// Runspace is not open. /// - /// + /// /// /// Another SessionStateProxy call or another pipeline is in progress. /// diff --git a/src/System.Management.Automation/engine/hostifaces/ConnectionBase.cs b/src/System.Management.Automation/engine/hostifaces/ConnectionBase.cs index e32dfc6a289..152075ff89c 100644 --- a/src/System.Management.Automation/engine/hostifaces/ConnectionBase.cs +++ b/src/System.Management.Automation/engine/hostifaces/ConnectionBase.cs @@ -37,22 +37,14 @@ internal abstract class RunspaceBase : Runspace /// /// host is null. /// - /// - /// configuration information for this minshell. - /// - protected RunspaceBase(PSHost host, RunspaceConfiguration runspaceConfiguration) + protected RunspaceBase(PSHost host) { if (host == null) { throw PSTraceSource.NewArgumentNullException("host"); } - if (runspaceConfiguration == null) - { - throw PSTraceSource.NewArgumentNullException("runspaceConfiguration"); - } - + InitialSessionState = InitialSessionState.CreateDefault(); Host = host; - RunspaceConfiguration = runspaceConfiguration; } /// @@ -143,17 +135,7 @@ protected RunspaceBase(PSHost host, InitialSessionState initialSessionState, boo protected PSHost Host { get; } /// - /// runspaceConfiguration information for this runspace - /// -#if CORECLR - internal -#else - public -#endif - override RunspaceConfiguration RunspaceConfiguration { get; } - - /// - /// runspaceConfiguration information for this runspace + /// InitialSessionState information for this runspace /// public override InitialSessionState InitialSessionState { get; } diff --git a/src/System.Management.Automation/engine/hostifaces/ConnectionFactory.cs b/src/System.Management.Automation/engine/hostifaces/ConnectionFactory.cs index 5a17b72da58..5a1630cec68 100644 --- a/src/System.Management.Automation/engine/hostifaces/ConnectionFactory.cs +++ b/src/System.Management.Automation/engine/hostifaces/ConnectionFactory.cs @@ -34,8 +34,6 @@ static RunspaceFactory() /// /// Creates a runspace using host of type . - /// This runspace is created using the information - /// from EntryAssembly. /// /// /// A runspace object. @@ -67,69 +65,9 @@ public static Runspace CreateRunspace(PSHost host) throw PSTraceSource.NewArgumentNullException("host"); } - return CreateRunspace(host, RunspaceConfiguration.Create()); + return new LocalRunspace(host, InitialSessionState.CreateDefault()); } - /// - /// Creates a runspace using - /// - /// - /// RunspaceConfiguration information for the runspace. - /// - /// - /// A runspace object - /// - /// - /// Thrown when runspaceConfiguration is null - /// - internal static Runspace CreateRunspace(RunspaceConfiguration runspaceConfiguration) - { - if (runspaceConfiguration == null) - { - throw PSTraceSource.NewArgumentNullException("runspaceConfiguration"); - } - - PSHost host = new DefaultHost(CultureInfo.CurrentCulture, CultureInfo.CurrentUICulture); - - return CreateRunspace(host, runspaceConfiguration); - } - - /// - /// Creates a runspace using specified PSHost and RunspaceConfiguration - /// - /// - /// Host implementation for runspace. - /// - /// - /// RunspaceConfiguration information for the runspace. - /// - /// - /// A runspace object - /// - /// - /// Thrown when host is null - /// - /// - /// Thrown when runspaceConfiguration is null - /// - internal static Runspace CreateRunspace(PSHost host, RunspaceConfiguration runspaceConfiguration) - { - if (host == null) - { - throw PSTraceSource.NewArgumentNullException("host"); - } - - if (runspaceConfiguration == null) - { - throw PSTraceSource.NewArgumentNullException("runspaceConfiguration"); - } - - return new LocalRunspace(host, runspaceConfiguration); - } - - //========================================================= - // Create runspaces with InitialSessionState instead of RunspaceConfig objects... - /// /// Creates a runspace using /// @@ -228,22 +166,15 @@ internal static Runspace CreateRunspaceFromSessionStateNoClone(PSHost host, Init #region RunspacePool Factory /// - /// Creates a RunspacePool using default RunspaceConfiguration - /// with MaxRunspaces 1 and MinRunspaces 1. + /// Creates a RunspacePool with MaxRunspaces 1 and MinRunspaces 1. /// public static RunspacePool CreateRunspacePool() { - return CreateRunspacePool(1, 1, - RunspaceConfiguration.Create(), - new DefaultHost - ( - CultureInfo.CurrentCulture, - CultureInfo.CurrentUICulture - )); + return CreateRunspacePool(1, 1); } /// - /// Creates a RunspacePool using default RunspaceConfiguration. + /// Creates a RunspacePool /// /// limits the number of Runspaces that can exist in this /// pool. The minimum pool size is set to . @@ -263,7 +194,6 @@ public static RunspacePool CreateRunspacePool() public static RunspacePool CreateRunspacePool(int minRunspaces, int maxRunspaces) { return CreateRunspacePool(minRunspaces, maxRunspaces, - RunspaceConfiguration.Create(), new DefaultHost ( CultureInfo.CurrentCulture, @@ -281,7 +211,7 @@ public static RunspacePool CreateRunspacePool(int minRunspaces, int maxRunspaces /// Runspace in the pool. /// /// - /// RunspaceConfiguration is null. + /// InitialSessionState is null. /// [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Runspace")] public static RunspacePool CreateRunspacePool(InitialSessionState initialSessionState) @@ -318,44 +248,7 @@ public static RunspacePool CreateRunspacePool(InitialSessionState initialSession [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Runspaces")] public static RunspacePool CreateRunspacePool(int minRunspaces, int maxRunspaces, PSHost host) { - return CreateRunspacePool(minRunspaces, maxRunspaces, RunspaceConfiguration.Create(), host); - } - - /// - /// Creates a RunspacePool using the supplied , - /// and - /// - /// - /// The minimum number of Runspaces that can exist in this pool. - /// Should be greater than or equal to 1. - /// - /// - /// The maximum number of Runspaces that can exist in this pool. - /// Should be greater than or equal to 1. - /// - /// - /// RunspaceConfiguration to use when creating a new Runspace in the - /// pool. - /// - /// - /// RunspaceConfiguration is null. - /// - /// - /// The explicit PSHost implementation. - /// - /// - /// is null. - /// is null. - /// - /// - /// Maximum runspaces is less than 1. - /// Minimum runspaces is less than 1. - /// - private static RunspacePool CreateRunspacePool(int minRunspaces, int maxRunspaces, - RunspaceConfiguration runspaceConfiguration, PSHost host) - { - return new RunspacePool(minRunspaces, - maxRunspaces, runspaceConfiguration, host); + return new RunspacePool(minRunspaces, maxRunspaces, host); } /// @@ -375,13 +268,13 @@ private static RunspacePool CreateRunspacePool(int minRunspaces, int maxRunspace /// pool. /// /// - /// RunspaceConfiguration is null. + /// InitialSessionState is null. /// /// /// The explicit PSHost implementation. /// /// - /// is null. + /// is null. /// is null. /// /// diff --git a/src/System.Management.Automation/engine/hostifaces/LocalConnection.cs b/src/System.Management.Automation/engine/hostifaces/LocalConnection.cs index 550d55b5e56..d58876ac92d 100644 --- a/src/System.Management.Automation/engine/hostifaces/LocalConnection.cs +++ b/src/System.Management.Automation/engine/hostifaces/LocalConnection.cs @@ -31,22 +31,6 @@ internal sealed partial class LocalRunspace : RunspaceBase { #region constructors - /// - /// Construct an instance of an Runspace using a custom implementation - /// of PSHost. - /// - /// - /// The explicit PSHost implementation - /// - /// - /// configuration information for this minshell. - /// - [SuppressMessage("Microsoft.Maintainability", "CA1505:AvoidUnmaintainableCode")] - internal LocalRunspace(PSHost host, RunspaceConfiguration runspaceConfig) - : base(host, runspaceConfig) - { - } - /// /// Construct an instance of an Runspace using a custom implementation /// of PSHost. @@ -641,6 +625,7 @@ private void OpenThreadProc() /// private void DoOpenHelper() { + Dbg.Assert(InitialSessionState != null, "InitialSessionState should not be null"); // NTRAID#Windows Out Of Band Releases-915851-2005/09/13 if (_disposed) { @@ -653,17 +638,10 @@ private void DoOpenHelper() { _transcriptionData = new TranscriptionData(); - if (InitialSessionState != null) - { - // All ISS-based configuration of the engine itself is done by AutomationEngine, - // which calls InitialSessionState.Bind(). Anything that doesn't - // require an active and open runspace should be done in ISS.Bind() - _engine = new AutomationEngine(Host, null, InitialSessionState); - } - else - { - _engine = new AutomationEngine(Host, RunspaceConfiguration, null); - } + // All ISS-based configuration of the engine itself is done by AutomationEngine, + // which calls InitialSessionState.Bind(). Anything that doesn't + // require an active and open runspace should be done in ISS.Bind() + _engine = new AutomationEngine(Host, InitialSessionState); _engine.Context.CurrentRunspace = this; //Log engine for start of engine life @@ -773,14 +751,7 @@ internal void LogEngineHealthEvent(Exception exception, logContext.HostVersion = Host.Version.ToString(); logContext.RunspaceId = InstanceId.ToString(); logContext.Severity = severity.ToString(); - if (this.RunspaceConfiguration == null) - { - logContext.ShellId = Utils.DefaultPowerShellShellID; - } - else - { - logContext.ShellId = this.RunspaceConfiguration.ShellId; - } + logContext.ShellId = Utils.DefaultPowerShellShellID; MshLog.LogEngineHealthEvent( logContext, id, @@ -867,7 +838,7 @@ private void DoCloseHelper() } if ((hostRunspace == null) || (this == hostRunspace)) - { + { // We should close transcripting only if we are closing the last opened runspace. foreach (Runspace runspace in RunspaceList) { @@ -883,7 +854,6 @@ private void DoCloseHelper() { host.StopAllTranscribing(); } - AmsiUtils.Uninitialize(); } } @@ -929,7 +899,7 @@ private void DoCloseHelper() //Log engine lifecycle event. MshLog.LogEngineLifecycleEvent(_engine.Context, EngineState.Stopped); - + //All pipelines have been canceled. Close the runspace. _engine = null; _commandFactory = null; diff --git a/src/System.Management.Automation/engine/hostifaces/RunspaceInit.cs b/src/System.Management.Automation/engine/hostifaces/RunspaceInit.cs index 46cb04c4e48..fab00557327 100644 --- a/src/System.Management.Automation/engine/hostifaces/RunspaceInit.cs +++ b/src/System.Management.Automation/engine/hostifaces/RunspaceInit.cs @@ -31,24 +31,6 @@ private void InitializeDefaults() // Add the variables that must always be there... ss.InitializeFixedVariables(); - - // If this is being built from a runspace configuration, then - // add all of the default entries. When initializing from an InitialSessionState - // object, it will contain the defaults if so desired. - if (this.RunspaceConfiguration != null) - { - bool addSetStrictMode = true; - foreach (RunspaceConfigurationEntry entry in this.RunspaceConfiguration.Cmdlets) - { - if (entry.Name.Equals("Set-StrictMode", StringComparison.OrdinalIgnoreCase)) - { - addSetStrictMode = false; - break; - } - } - // Add all of the built-in variable, function and alias definitions... - ss.AddBuiltInEntries(addSetStrictMode); - } } } } diff --git a/src/System.Management.Automation/engine/hostifaces/RunspaceInvoke.cs b/src/System.Management.Automation/engine/hostifaces/RunspaceInvoke.cs index abbc841ef35..e364b62514d 100644 --- a/src/System.Management.Automation/engine/hostifaces/RunspaceInvoke.cs +++ b/src/System.Management.Automation/engine/hostifaces/RunspaceInvoke.cs @@ -27,64 +27,7 @@ public class RunspaceInvoke : IDisposable /// public RunspaceInvoke() { - RunspaceConfiguration rc = RunspaceConfiguration.Create(); - _runspace = RunspaceFactory.CreateRunspace(rc); - _runspace.Open(); - if (Runspace.DefaultRunspace == null) - { - Runspace.DefaultRunspace = _runspace; - } - } - - /// - /// Creates a RunspaceInvoke for invoking commands. Underlying Runspace is created using - /// specified RunspaceConfiguration - /// - /// RunspaceConfiguration used for creating the runspace - /// - /// - /// Thrown when runspaceConfiguration is null - /// - public RunspaceInvoke(RunspaceConfiguration runspaceConfiguration) - { - if (runspaceConfiguration == null) - { - throw PSTraceSource.NewArgumentNullException("runspaceConfiguration"); - } - _runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration); - _runspace.Open(); - if (Runspace.DefaultRunspace == null) - { - Runspace.DefaultRunspace = _runspace; - } - } - - /// - /// Creates a RunspaceInvoke for invoking commands. Underlying Runspace is created using the - /// specified console file. - /// - /// Console file used for creating the underlying - /// runspace. - /// - /// Thrown when consoleFilePath is null - /// - /// - /// Thrown when errors occurs in loading one or more PSSnapins. - /// - public RunspaceInvoke(string consoleFilePath) - { - if (consoleFilePath == null) - { - throw PSTraceSource.NewArgumentNullException("consoleFilePath"); - } - - PSConsoleLoadException warnings; - RunspaceConfiguration rc = RunspaceConfiguration.Create(consoleFilePath, out warnings); - if (warnings != null) - { - throw warnings; - } - _runspace = RunspaceFactory.CreateRunspace(rc); + _runspace = RunspaceFactory.CreateRunspace(); _runspace.Open(); if (Runspace.DefaultRunspace == null) { diff --git a/src/System.Management.Automation/engine/hostifaces/RunspacePool.cs b/src/System.Management.Automation/engine/hostifaces/RunspacePool.cs index 78dc8d777d6..7d938b51722 100644 --- a/src/System.Management.Automation/engine/hostifaces/RunspacePool.cs +++ b/src/System.Management.Automation/engine/hostifaces/RunspacePool.cs @@ -528,29 +528,23 @@ public sealed class RunspacePool : IDisposable /// The maximum number of Runspaces that can exist in this pool. /// Should be greater than or equal to 1. /// - /// - /// RunspaceConfiguration to use when creating a new Runspace. - /// /// /// The explicit PSHost implementation. /// /// - /// RunspaceConfiguration is null. /// Host is null. /// /// /// Maximum runspaces is less than 1. /// Minimum runspaces is less than 1. /// - internal RunspacePool(int minRunspaces, int maxRunspaces, - RunspaceConfiguration runspaceConfiguration, PSHost host) + internal RunspacePool(int minRunspaces, int maxRunspaces, PSHost host) { // Currently we support only Local Runspace Pool.. // this needs to be changed once remote runspace pool // is implemented - _internalPool = new RunspacePoolInternal(minRunspaces, - maxRunspaces, runspaceConfiguration, host); + _internalPool = new RunspacePoolInternal(minRunspaces, maxRunspaces, host); } /// diff --git a/src/System.Management.Automation/engine/hostifaces/RunspacePoolInternal.cs b/src/System.Management.Automation/engine/hostifaces/RunspacePoolInternal.cs index bd43333cde2..9aa7442b27d 100644 --- a/src/System.Management.Automation/engine/hostifaces/RunspacePoolInternal.cs +++ b/src/System.Management.Automation/engine/hostifaces/RunspacePoolInternal.cs @@ -31,7 +31,6 @@ internal class RunspacePoolInternal // pool services on this queue. protected Queue ultimateRequestQueue; protected RunspacePoolStateInfo stateInfo; - protected RunspaceConfiguration rsConfig; protected InitialSessionState _initialSessionState; protected PSHost host; protected Guid instanceId; @@ -52,9 +51,6 @@ internal class RunspacePoolInternal /// supplied , /// and /// - /// - /// RunspaceConfiguration to use when creating a new Runspace. - /// /// /// The maximum number of Runspaces that can exist in this pool. /// Should be greater than or equal to 1. @@ -76,25 +72,19 @@ internal class RunspacePoolInternal /// public RunspacePoolInternal(int minRunspaces, int maxRunspaces, - RunspaceConfiguration runspaceConfiguration, PSHost host) : this(minRunspaces, maxRunspaces) { - if (runspaceConfiguration == null) - { - throw PSTraceSource.NewArgumentNullException("runspaceConfiguration"); - } - if (host == null) { throw PSTraceSource.NewArgumentNullException("host"); } - rsConfig = runspaceConfiguration; this.host = host; pool = new Stack(); runspaceRequestQueue = new Queue(); ultimateRequestQueue = new Queue(); + _initialSessionState = InitialSessionState.CreateDefault(); } /// @@ -262,18 +252,6 @@ internal virtual void PropagateApplicationPrivateData(Runspace runspace) private PSPrimitiveDictionary _applicationPrivateData; - /// - /// Gets the RunspaceConfiguration object that this pool uses - /// to create the runspaces. - /// - public RunspaceConfiguration RunspaceConfiguration - { - get - { - return rsConfig; - } - } - /// /// Gets the InitialSessionState object that this pool uses /// to create the runspaces. @@ -1272,21 +1250,10 @@ internal void AssertPoolIsOpen() /// protected Runspace CreateRunspace() { + Dbg.Assert(null != _initialSessionState, "_initialSessionState should not be null"); // TODO: exceptions thrown here need to be documented // runspace.Open() did not document all the exceptions. - Runspace result = null; - - // if host is null we are already throwing an - // exception, hence a check is not required at this - // point - if (rsConfig != null) - { - result = RunspaceFactory.CreateRunspace(host, rsConfig); - } - else - { - result = RunspaceFactory.CreateRunspaceFromSessionStateNoClone(host, _initialSessionState); - } + Runspace result = RunspaceFactory.CreateRunspaceFromSessionStateNoClone(host, _initialSessionState); result.ThreadOptions = this.ThreadOptions == PSThreadOptions.Default ? PSThreadOptions.ReuseThread : this.ThreadOptions; #if !CORECLR // No ApartmentState In CoreCLR diff --git a/src/System.Management.Automation/engine/remoting/client/remoterunspace.cs b/src/System.Management.Automation/engine/remoting/client/remoterunspace.cs index 6499ec7cad7..96c1f0eb0df 100644 --- a/src/System.Management.Automation/engine/remoting/client/remoterunspace.cs +++ b/src/System.Management.Automation/engine/remoting/client/remoterunspace.cs @@ -217,22 +217,6 @@ private void SetEventHandlers() #region Properties - /// - /// runspaceConfiguration information for this runspace - /// - internal override RunspaceConfiguration RunspaceConfiguration - { - get - { -#pragma warning disable 56503 - - throw PSTraceSource.NewNotImplementedException(); - -#pragma warning restore 56503 - } - } - - /// /// initialsessionstate information for this runspace /// diff --git a/src/System.Management.Automation/help/HelpProvider.cs b/src/System.Management.Automation/help/HelpProvider.cs index 34608348745..d9a40346dcf 100644 --- a/src/System.Management.Automation/help/HelpProvider.cs +++ b/src/System.Management.Automation/help/HelpProvider.cs @@ -240,17 +240,6 @@ internal string GetDefaultShellSearchPath() return returnValue; } - /// - /// Helper function which checks whether PSSnapIns are supported in current invocation. - /// - /// true if supported,false otherwise. - internal bool AreSnapInsSupported() - { - RunspaceConfigForSingleShell runspace = _helpSystem.ExecutionContext.RunspaceConfiguration as RunspaceConfigForSingleShell; - - return (null == runspace ? false : true); - } - /// /// Gets the search paths. If the current shell is single-shell based, then the returned /// search path contains all the directories of currently active PSSnapIns diff --git a/src/System.Management.Automation/help/HelpProviderWithFullCache.cs b/src/System.Management.Automation/help/HelpProviderWithFullCache.cs index b6aabb34ea0..ee6a0f49718 100644 --- a/src/System.Management.Automation/help/HelpProviderWithFullCache.cs +++ b/src/System.Management.Automation/help/HelpProviderWithFullCache.cs @@ -34,10 +34,7 @@ internal HelpProviderWithFullCache(HelpSystem helpSystem) : base(helpSystem) /// The HelpInfo found. Null if nothing is found internal sealed override IEnumerable ExactMatchHelp(HelpRequest helpRequest) { - // If the current invocation is a singleshell based - // then we have to constantly update the cache as - // snapins might get added / removed. - if (!this.CacheFullyLoaded || AreSnapInsSupported()) + if (!this.CacheFullyLoaded) { LoadCache(); } @@ -69,10 +66,7 @@ internal sealed override void DoExactMatchHelp(HelpRequest helpRequest) /// a collection of help info objects internal sealed override IEnumerable SearchHelp(HelpRequest helpRequest, bool searchOnlyContent) { - // If the current invocation is a singleshell based - // then we have to constantly update the cache as - // snapins might get added / removed. - if (!this.CacheFullyLoaded || AreSnapInsSupported()) + if (!this.CacheFullyLoaded) { LoadCache(); } diff --git a/src/System.Management.Automation/help/HelpSystem.cs b/src/System.Management.Automation/help/HelpSystem.cs index 66813e93e9f..13aaf69551a 100644 --- a/src/System.Management.Automation/help/HelpSystem.cs +++ b/src/System.Management.Automation/help/HelpSystem.cs @@ -254,24 +254,6 @@ internal Collection GetSearchPaths() } _searchPaths = new Collection(); - RunspaceConfigForSingleShell runspace = this.ExecutionContext.RunspaceConfiguration as RunspaceConfigForSingleShell; - - if (null != runspace) - { - // SingleShell case. Check active snapins... - MshConsoleInfo currentConsole = runspace.ConsoleInfo; - - if ((null == currentConsole) || (null == currentConsole.ExternalPSSnapIns)) - { - return _searchPaths; - } - - foreach (PSSnapInInfo snapin in currentConsole.ExternalPSSnapIns) - { - _searchPaths.Add(snapin.ApplicationBase); - } - } - // add loaded modules paths to the search path if (null != ExecutionContext.Modules) { diff --git a/src/System.Management.Automation/help/MUIFileSearcher.cs b/src/System.Management.Automation/help/MUIFileSearcher.cs index bac0b7b30a4..798ca01b44d 100644 --- a/src/System.Management.Automation/help/MUIFileSearcher.cs +++ b/src/System.Management.Automation/help/MUIFileSearcher.cs @@ -138,7 +138,7 @@ private string[] GetFiles(string path, string pattern) { string fileName = Path.GetFileName(filePath); if (wildcardPattern.IsMatch(fileName)) - { + { result.Add(filePath); } } @@ -335,8 +335,7 @@ internal static string LocateFile(string file) /// Get the file in different search paths corresponding to current culture. /// /// The file name to search is the filename part of path parameter. (Normally path - /// parameter should contain only the filename part. But it is possible for - /// RunspaceConfiguration to directly specify a hard coded path for help file there). + /// parameter should contain only the filename part). /// /// /// This is the path to the file. If it has a path, we need to search under that path first diff --git a/src/System.Management.Automation/minishell/api/RunspaceConfiguration.cs b/src/System.Management.Automation/minishell/api/RunspaceConfiguration.cs deleted file mode 100644 index 2bfa8ad6fc1..00000000000 --- a/src/System.Management.Automation/minishell/api/RunspaceConfiguration.cs +++ /dev/null @@ -1,791 +0,0 @@ -/********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. ---********************************************************************/ - -#pragma warning disable 1634, 1691 - -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Reflection; -using System.Security; -using System.Management.Automation.Host; -using Microsoft.PowerShell.Commands.Internal.Format; - -namespace System.Management.Automation.Runspaces -{ - /// - /// Defines configuration information for runspace. - /// - /// - /// - /// - /// Developers may want to derive from this class when writing their own - /// host to host monad engine. This will allow host to control the behaviour - /// of monad engine through customized runspace configuration. - /// - /// - /// - /// - internal abstract class RunspaceConfiguration - { - #region RunspaceConfiguration Factory - - /// - /// Create an instance of RunspaceConfiguration type implemented from an assembly. - /// - /// Assembly name from which to find runspace configuration implementation - /// Runspace configuration instance created - /// - /// Exception thrown when is null or empty. - /// - /// - public static RunspaceConfiguration Create(string assemblyName) - { - if (String.IsNullOrEmpty(assemblyName)) - { - throw PSTraceSource.NewArgumentNullException("assemblyName"); - } - - // If this assembly can't be loaded, Assembly.Load will throw an exception. - // Just let the exception bubble up. - - Assembly assembly = null; - foreach (Assembly asm in ClrFacade.GetAssemblies()) - { - if (string.Equals(asm.GetName().Name, assemblyName, StringComparison.OrdinalIgnoreCase)) - { - assembly = asm; - break; - } - } - - if (assembly == null) - { - assembly = Assembly.Load(new AssemblyName(assemblyName)); - } - - return Create(assembly); - } - - /// - /// Create one single shell runspace configuration object from console file - /// - /// - /// - /// - public static RunspaceConfiguration Create(string consoleFilePath, out PSConsoleLoadException warnings) - { - return RunspaceConfigForSingleShell.Create(consoleFilePath, out warnings); - } - - /// - /// Create one single shell runspace configuration object for a msh version. - /// - /// - public static RunspaceConfiguration Create() - { - return RunspaceConfigForSingleShell.CreateDefaultConfiguration(); - } - -#if V2 - /// - /// This is a RunspaceConfiguration factory function which will create an instance - /// based on a type specified in a particular assembly. - /// - /// This function will likely being exposed as a public interface in v2. - /// - /// - /// - /// - private static RunspaceConfiguration Create(string assemblyName, string runspaceConfigTypeName) - { - // If this assembly can't be loaded, Assembly.Load will throw an exception. - // Just let the exception bubble up. - Assembly assembly = Assembly.Load(assemblyName); - - try - { - Type runspaceConfigType = assembly.GetType(runspaceConfigTypeName, true); - return Create(runspaceConfigType); - } - catch (SecurityException) - { - throw new RunspaceConfigurationTypeException(assembly.FullName, runspaceConfigTypeName); - } - } -#endif - - /// - /// Create an RunspaceConfiguration-derived instance based an RunspaceConfiguration-derived type - /// in specified assembly. The type name is defined by assembly attribute: - /// RunspaceConfigurationTypeAttribute. - /// - /// - /// Runspace configuration instance created - /// - /// Exception thrown when is null or empty. - /// - private static RunspaceConfiguration Create(Assembly assembly) - { - if (assembly == null) - throw PSTraceSource.NewArgumentNullException("assembly"); - - object[] attributes = assembly.GetCustomAttributes(typeof(RunspaceConfigurationTypeAttribute), false); - - if (attributes == null || attributes.Length == 0) - { - throw new RunspaceConfigurationAttributeException("RunspaceConfigurationAttributeNotExist", assembly.FullName); - } - - if (attributes.Length > 1) - { - throw new RunspaceConfigurationAttributeException("RunspaceConfigurationAttributeDuplicate", assembly.FullName); - } - - RunspaceConfigurationTypeAttribute runspaceConfigTypeAttribute = (RunspaceConfigurationTypeAttribute)attributes[0]; - - try - { - Type runspaceConfigType = assembly.GetType(runspaceConfigTypeAttribute.RunspaceConfigurationType, true, false); - return Create(runspaceConfigType); - } - catch (SecurityException) - { - throw new RunspaceConfigurationTypeException(assembly.FullName, runspaceConfigTypeAttribute.RunspaceConfigurationType); - } - } - - /// - /// Create RunspaceConfiguration-derived instance based on a derived type. - /// - /// A type that is derived from RunspaceConfiguration - /// - private static RunspaceConfiguration Create(Type runspaceConfigType) - { - MethodInfo method = - runspaceConfigType.GetMethod("Create", BindingFlags.Public | BindingFlags.Static); - - if (method == null) - return null; - - return (RunspaceConfiguration)method.Invoke(null, null); - } - - #endregion RunspaceConfiguration Factory - - #region Shell Id - - /// - /// Gets the shell id for current runspace configuration. - /// - public abstract string ShellId - { - get; - } - - #endregion - - #region PSSnapin Api's - - /// - /// Add a PSSnapin to runspace configuration. - /// - /// - /// This member provides logic for adding PSSnapin. - /// - /// RunspaceConfiguration derived class should not override this member. - /// - /// - /// name of the PSSnapin - /// warning message - /// - public PSSnapInInfo AddPSSnapIn(string name, out PSSnapInException warning) - { - return DoAddPSSnapIn(name, out warning); - } - - internal virtual PSSnapInInfo DoAddPSSnapIn(string name, out PSSnapInException warning) - { - throw PSTraceSource.NewNotSupportedException(); - } - - /// - /// Remove a PSSnapin from runspace configuration. - /// - /// - /// This member provides logic for removing PSSnapin. - /// - /// RunspaceConfiguration derived class should not override this member. - /// - /// name of the PSSnapin - /// warning message - /// - public PSSnapInInfo RemovePSSnapIn(string name, out PSSnapInException warning) - { - return DoRemovePSSnapIn(name, out warning); - } - - internal virtual PSSnapInInfo DoRemovePSSnapIn(string name, out PSSnapInException warning) - { - throw PSTraceSource.NewNotSupportedException(); - } - - #endregion - - #region Cmdlet, Provider, Relationship - - private RunspaceConfigurationEntryCollection _cmdlets; - - /// - /// Gets the cmdlets defined in runspace configuration. - /// - /// - /// RunspaceConfiguration derived class can override this member to provide its own cmdlet list. - /// - public virtual RunspaceConfigurationEntryCollection Cmdlets - { - get { - return _cmdlets ?? (_cmdlets = new RunspaceConfigurationEntryCollection()); - } - } - - private RunspaceConfigurationEntryCollection _providers; - - /// - /// Gets the providers defined in runspace configuration. - /// - /// - /// RunspaceConfiguration derived class can override this member to provide its own provider list. - /// - public virtual RunspaceConfigurationEntryCollection Providers - { - get { - return _providers ?? - (_providers = new RunspaceConfigurationEntryCollection()); - } - } - - /* - /// - /// Gets the relationships defined in runspace configuration. - /// - public virtual Collection RelationshipData - { - get; - } - */ - - #endregion - - #region Types and Formats - - /// - /// types.ps1xml information - /// - /// - internal TypeTable TypeTable - { - get { return _typeTable ?? (_typeTable = new TypeTable()); } - } - private TypeTable _typeTable; - - private RunspaceConfigurationEntryCollection _types; - - /// - /// Gets the type data files defined in runspace configuration. - /// - /// - /// RunspaceConfiguration derived class can override this member to provide its own types to be - /// loaded at engine start up. - /// - public virtual RunspaceConfigurationEntryCollection Types - { - get { return _types ?? (_types = new RunspaceConfigurationEntryCollection()); } - } - - private RunspaceConfigurationEntryCollection _formats; - - /// - /// Gets the format data files defined in runspace configuration. - /// - /// - /// RunspaceConfiguration derived class can override this member to provide its own formats to be - /// loaded at engine start up. - /// - public virtual RunspaceConfigurationEntryCollection Formats - { - get { - return _formats ?? (_formats = new RunspaceConfigurationEntryCollection()); - } - } - - internal TypeInfoDataBaseManager FormatDBManager { get; } = new TypeInfoDataBaseManager(); - - #endregion - - #region Script Data - - private RunspaceConfigurationEntryCollection _scripts; - - /// - /// Gets the scripts defined in runspace configuration. - /// - /// - /// RunspaceConfiguration derived class can override this member to provide its own scripts - /// to be include in monad engine. - /// - public virtual RunspaceConfigurationEntryCollection Scripts - { - get { - return _scripts ?? (_scripts = new RunspaceConfigurationEntryCollection()); - } - } - - #endregion - - #region Profile configuration - - private RunspaceConfigurationEntryCollection _initializationScripts; - - /// - /// Gets the initialization scripts defined in runspace configuration. - /// - /// - /// RunspaceConfiguration derived class can override this member to provide its own initialization scripts - /// to be run at the start up of monad engine. - /// - public virtual RunspaceConfigurationEntryCollection InitializationScripts - { - get { - return _initializationScripts ?? - (_initializationScripts = new RunspaceConfigurationEntryCollection()); - } - } - - #endregion - - #region Assemblies - - private RunspaceConfigurationEntryCollection _assemblies; - - /// - /// Gets the assemblies defined in runspace configuration. - /// - /// - /// RunspaceConfiguration derived class can override this member to provide its own assemblies - /// to be loaded at the start up of monad engine. - /// - public virtual RunspaceConfigurationEntryCollection Assemblies - { - get { - return _assemblies ?? - (_assemblies = new RunspaceConfigurationEntryCollection()); - } - } - - #endregion - - #region Security Manager - - private AuthorizationManager _authorizationManager = null; - - /// - /// Gets the authorization manager to be used for runspace. - /// - /// - /// RunspaceConfiguration derived class can override this member to provide its own authorization - /// manager for monad engine. - /// - public virtual AuthorizationManager AuthorizationManager - { - get { - return _authorizationManager ?? - (_authorizationManager = new Microsoft.PowerShell.PSAuthorizationManager(this.ShellId)); - } - } - - #endregion - - #region Configuration Update - - private PSHost _host = null; - internal void Bind(ExecutionContext executionContext) - { - _host = executionContext.EngineHostInterface; - - Initialize(executionContext); - - this.Assemblies.OnUpdate += executionContext.UpdateAssemblyCache; - - s_runspaceInitTracer.WriteLine("initializing assembly list"); - try - { - this.Assemblies.Update(true); - } - catch (RuntimeException e) - { - s_runspaceInitTracer.WriteLine("assembly list initialization failed"); - MshLog.LogEngineHealthEvent( - executionContext, - MshLog.EVENT_ID_CONFIGURATION_FAILURE, - e, - Severity.Error); - executionContext.ReportEngineStartupError(e.Message); - - throw; - } - - if (executionContext.CommandDiscovery != null) - { - this.Cmdlets.OnUpdate += executionContext.CommandDiscovery.UpdateCmdletCache; - - // Force an update here so that cmdlet cache is updated in engine. - s_runspaceInitTracer.WriteLine("initializing cmdlet list"); - try - { - this.Cmdlets.Update(true); - } - catch (PSNotSupportedException e) - { - s_runspaceInitTracer.WriteLine("cmdlet list initialization failed"); - MshLog.LogEngineHealthEvent( - executionContext, - MshLog.EVENT_ID_CONFIGURATION_FAILURE, - e, - Severity.Error); - executionContext.ReportEngineStartupError(e.Message); - throw; - } - } - - if (executionContext.EngineSessionState != null) - { - this.Providers.OnUpdate += executionContext.EngineSessionState.UpdateProviders; - - // Force an update here so that provider cache is updated in engine. - s_runspaceInitTracer.WriteLine("initializing provider list"); - try - { - this.Providers.Update(true); - } - catch (PSNotSupportedException e) - { - s_runspaceInitTracer.WriteLine("provider list initialization failed"); - MshLog.LogEngineHealthEvent( - executionContext, - MshLog.EVENT_ID_CONFIGURATION_FAILURE, - e, - Severity.Error); - executionContext.ReportEngineStartupError(e.Message); - throw; - } - } - } - - internal void Unbind(ExecutionContext executionContext) - { - if (executionContext == null) - return; - - if (executionContext.CommandDiscovery != null) - { - this.Cmdlets.OnUpdate -= executionContext.CommandDiscovery.UpdateCmdletCache; - } - - if (executionContext.EngineSessionState != null) - { - this.Providers.OnUpdate -= executionContext.EngineSessionState.UpdateProviders; - } - - this.Assemblies.OnUpdate -= executionContext.UpdateAssemblyCache; - } - - private bool _initialized = false; - private Object _syncObject = new Object(); - internal void Initialize(ExecutionContext executionContext) - { -#pragma warning disable 56517 - - lock (_syncObject) - { - if (!_initialized) - { - _initialized = true; - - this.Types.OnUpdate += this.UpdateTypes; - this.Formats.OnUpdate += this.UpdateFormats; - - s_runspaceInitTracer.WriteLine("initializing types information"); - try - { - this.UpdateTypes(); - } - catch (RuntimeException e) - { - s_runspaceInitTracer.WriteLine("type information initialization failed"); - MshLog.LogEngineHealthEvent( - executionContext, - MshLog.EVENT_ID_CONFIGURATION_FAILURE, - e, - Severity.Warning); - executionContext.ReportEngineStartupError(e.Message); - } - - s_runspaceInitTracer.WriteLine("initializing format information"); - try - { - this.UpdateFormats(true); - } - catch (RuntimeException e) - { - s_runspaceInitTracer.WriteLine("format information initialization failed"); - MshLog.LogEngineHealthEvent( - executionContext, - MshLog.EVENT_ID_CONFIGURATION_FAILURE, - e, - Severity.Warning); - executionContext.ReportEngineStartupError(e.Message); - } - } - } - -#pragma warning restore 56517 - } - - internal void UpdateTypes() - { - Collection independentErrors = new Collection(); - Collection entryIndicesToRemove = new Collection(); - Collection PSSnapinFiles = FormatAndTypeDataHelper.GetFormatAndTypesErrors( - this, - _host, - this.Types, - independentErrors, - entryIndicesToRemove); - - if (entryIndicesToRemove.Count > 0) - { - RemoveNeedlessEntries(RunspaceConfigurationCategory.Types, entryIndicesToRemove); - } - - this.TypeTable.Update(PSSnapinFiles, _authorizationManager, _host); - FormatAndTypeDataHelper.ThrowExceptionOnError( - "ErrorsUpdatingTypes", - independentErrors, - PSSnapinFiles, - RunspaceConfigurationCategory.Types); - } - - internal void UpdateFormats() - { - UpdateFormats(false); - } - - private void UpdateFormats(bool preValidated) - { - Collection independentErrors = new Collection(); - Collection entryIndicesToRemove = new Collection(); - Collection PSSnapinFiles = FormatAndTypeDataHelper.GetFormatAndTypesErrors( - this, - _host, - this.Formats, - independentErrors, - entryIndicesToRemove); - - if (entryIndicesToRemove.Count > 0) - { - RemoveNeedlessEntries(RunspaceConfigurationCategory.Formats, entryIndicesToRemove); - } - - this.FormatDBManager.UpdateDataBase(PSSnapinFiles, this.AuthorizationManager, _host, preValidated); - FormatAndTypeDataHelper.ThrowExceptionOnError( - "ErrorsUpdatingFormats", - independentErrors, - PSSnapinFiles, - RunspaceConfigurationCategory.Formats); - } - - /// - /// Remove duplicate entries and entries with files that cannot be loaded from the Types and Formats - /// - /// - /// - private void RemoveNeedlessEntries(RunspaceConfigurationCategory category, IList entryIndicesToRemove) - { - for (int i = entryIndicesToRemove.Count - 1; i >= 0; i--) - { - if (category == RunspaceConfigurationCategory.Types) - { - this.Types.RemoveItem(entryIndicesToRemove[i]); - } - else if (category == RunspaceConfigurationCategory.Formats) - { - this.Formats.RemoveItem(entryIndicesToRemove[i]); - } - } - } - - #endregion - - [TraceSource("RunspaceInit", "Initialization code for Runspace")] - private static PSTraceSource s_runspaceInitTracer = PSTraceSource.GetTracer("RunspaceInit", "Initialization code for Runspace", false); - } - - /// - /// Enum for describing different kind information that can be configured in runspace configuration. - /// - /// - /// - internal enum RunspaceConfigurationCategory - { - /// - /// Cmdlets - /// - Cmdlets, - - /// - /// Providers - /// - Providers, - - /// - /// Assemblies - /// - Assemblies, - - /// - /// Scripts - /// - Scripts, - - /// - /// Initialization scripts - /// - InitializationScripts, - - /// - /// Types - /// - Types, - - /// - /// Formats - /// - Formats, - } - -#if V2 - - /// - /// Defines enum for runspace constraints - /// - [Flags] - public enum RunspaceConstraints - { - /// - /// No constraint. - /// - None, - - /// - /// Allow console applications. - /// - AllowConsoleApplication, - - /// - /// Allow user interaction. - /// - AllowUserInteraction, - - /// - /// For GUI cases. - /// - AllowGUIDesktop - } - -#endif -} diff --git a/src/System.Management.Automation/minishell/api/RunspaceConfigurationAttributeException.cs b/src/System.Management.Automation/minishell/api/RunspaceConfigurationAttributeException.cs deleted file mode 100644 index 01231c44cf6..00000000000 --- a/src/System.Management.Automation/minishell/api/RunspaceConfigurationAttributeException.cs +++ /dev/null @@ -1,194 +0,0 @@ -/********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. ---********************************************************************/ - -using System.Runtime.Serialization; -using System.Reflection; -using System.Security.Permissions; - -namespace System.Management.Automation.Runspaces -{ - /// - /// Defines exception thrown when runspace configuration attribute is not defined correctly. - /// - /// - [Serializable] - public class RunspaceConfigurationAttributeException : SystemException, IContainsErrorRecord - { - /// - /// Initiate an instance of RunspaceConfigurationAttributeException. - /// - /// Error detail for the exception - /// Assembly on which runspace configuration attribute is defined or should be defined. - internal RunspaceConfigurationAttributeException(string error, string assemblyName) : base() - { - _error = error; - _assemblyName = assemblyName; - CreateErrorRecord(); - } - - /// - /// Initiate an instance of RunspaceConfigurationAttributeException. - /// - public RunspaceConfigurationAttributeException() : base() - { - } - - /// - /// Initiate an instance of RunspaceConfigurationAttributeException. - /// - /// Error message - public RunspaceConfigurationAttributeException(string message) - : base(message) - { - } - - /// - /// Initiate an instance of RunspaceConfigurationAttributeException. - /// - /// Error message - /// Inner exception - public RunspaceConfigurationAttributeException(string message, Exception innerException) - : base(message, innerException) - { - } - - /// - /// Initiate an instance of RunspaceConfigurationAttributeException. - /// - /// Error detail - /// Assembly on which runspace configuration attribute is defined or should be defined. - /// The inner exception of this exception - internal RunspaceConfigurationAttributeException(string error, string assemblyName, Exception innerException) : base(innerException.Message, innerException) - { - _error = error; - _assemblyName = assemblyName; - CreateErrorRecord(); - } - - /// - /// Create the internal error record based on helpTopic. - /// The ErrorRecord created will be stored in the _errorRecord member. - /// - private void CreateErrorRecord() - { - // if _error is empty, this exception is created using default - // constructor. Don't create the error record since there is - // no useful information anyway. - if (!String.IsNullOrEmpty(_error) && !String.IsNullOrEmpty(_assemblyName)) - { - _errorRecord = new ErrorRecord(new ParentContainsErrorRecordException(this), _error, ErrorCategory.ResourceUnavailable, null); - _errorRecord.ErrorDetails = new ErrorDetails(typeof(RunspaceConfigurationAttributeException).GetTypeInfo().Assembly, "MiniShellErrors", _error, _assemblyName); - } - } - - private ErrorRecord _errorRecord; - - /// - /// Gets error record embedded in this exception. - /// - /// - public ErrorRecord ErrorRecord - { - get - { - return _errorRecord; - } - } - - private string _error = ""; - - /// - /// Get localized error message. - /// - /// error - public string Error - { - get - { - return _error; - } - } - - private string _assemblyName = ""; - - /// - /// Gets assembly name on which runspace configuration attribute is defined or should be defined. - /// - /// error - public string AssemblyName - { - get - { - return _assemblyName; - } - } - - /// - /// Gets message for this exception. - /// - public override string Message - { - get - { - if (_errorRecord != null) - { - return _errorRecord.ToString(); - } - - return base.Message; - } - } - - #region Serialization - - /// - /// Initiate a RunspaceConfigurationAttributeException instance. - /// - /// Serialization information - /// Streaming context - protected RunspaceConfigurationAttributeException(SerializationInfo info, - StreamingContext context) - : base(info, context) - { - _error = info.GetString("Error"); - _assemblyName = info.GetString("AssemblyName"); - - CreateErrorRecord(); - } - - /// - /// Get object data from serialization information. - /// - /// Serialization information - /// Streaming context - [SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)] - public override void GetObjectData(SerializationInfo info, StreamingContext context) - { - if (info == null) - { - throw PSTraceSource.NewArgumentNullException("info"); - } - - base.GetObjectData(info, context); - - info.AddValue("Error", _error); - info.AddValue("AssemblyName", _assemblyName); - } - - #endregion Serialization - } -} - diff --git a/src/System.Management.Automation/minishell/api/RunspaceConfigurationEntryCollection.cs b/src/System.Management.Automation/minishell/api/RunspaceConfigurationEntryCollection.cs deleted file mode 100644 index ca02629b7c0..00000000000 --- a/src/System.Management.Automation/minishell/api/RunspaceConfigurationEntryCollection.cs +++ /dev/null @@ -1,434 +0,0 @@ -/********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. ---********************************************************************/ - -#pragma warning disable 1634, 1691 -#pragma warning disable 56517 - -using System.Collections; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using Dbg = System.Management.Automation.Diagnostics; - -namespace System.Management.Automation.Runspaces -{ - internal delegate void RunspaceConfigurationEntryUpdateEventHandler(); - - /// - /// Define class for runspace configuration entry collection. - /// - /// -#if CORECLR - internal -#else - public -#endif - sealed class RunspaceConfigurationEntryCollection : IEnumerable where T : RunspaceConfigurationEntry - { - /// - /// Constructor - /// - public RunspaceConfigurationEntryCollection() - { - } - - /// - /// Constructor - /// - /// - public RunspaceConfigurationEntryCollection(IEnumerable items) - { - if (items == null) - { - throw PSTraceSource.NewArgumentNullException("item"); - } - AddBuiltInItem(items); - } - - private Collection _data = new Collection(); - private int _builtInEnd = 0; // this is the index of first after item. - - private Collection _updateList = new Collection(); - internal Collection UpdateList - { - get - { - return _updateList; - } - } - - /// - /// Get items at a index position. - /// - /// - /// - public T this[int index] - { - get - { - lock (_syncObject) - { - return _data[index]; - } - } - } - - /// - /// Get number of items in the collection. - /// - public int Count - { - get - { - lock (_syncObject) - { - return _data.Count; - } - } - } - - /// - /// Reset items in the collection - /// - public void Reset() - { - lock (_syncObject) - { - for (int i = _data.Count - 1; i >= 0; i--) - { - if (!_data[i].BuiltIn) - { - RecordRemove(_data[i]); - - _data.RemoveAt(i); - } - } - - _builtInEnd = _data.Count; - } - } - - /// - /// Remove one item from the collection - /// - /// - /// when is out of range. - public void RemoveItem(int index) - { - lock (_syncObject) - { - if (index < 0 || index >= _data.Count) - { - throw PSTraceSource.NewArgumentOutOfRangeException("index", index); - } - - RecordRemove(_data[index]); - - _data.RemoveAt(index); - - if (index < _builtInEnd) - _builtInEnd--; - - return; - } - } - - /// - /// Remove multiple items in the collection. - /// - /// - /// - /// when is out of range. - public void RemoveItem(int index, int count) - { - lock (_syncObject) - { - if (index < 0 || index + count > _data.Count) - { - throw PSTraceSource.NewArgumentOutOfRangeException("index", index); - } - - for (int i = index + count - 1; i >= index; i--) - { - RecordRemove(_data[i]); - - _data.RemoveAt(i); - } - - int _numBeforeBuiltInEnd = Math.Min(count, _builtInEnd - index); - - if (_numBeforeBuiltInEnd > 0) - _builtInEnd -= _numBeforeBuiltInEnd; - - return; - } - } - - /// - /// Remove one item from the collection - /// - /// - internal void Remove(T item) - { - lock (_syncObject) - { - int index = _data.IndexOf(item); - - if (index < 0 || index >= _data.Count) - { - Dbg.Assert(false, "Index from which to remove the item is out of range."); - throw PSTraceSource.NewArgumentOutOfRangeException("index", index); - } - - RecordRemove(item); - _data.Remove(item); - - if (index < _builtInEnd) - _builtInEnd--; - - return; - } - } - - /// - /// Prepend an item to the collection. - /// - /// - public void Prepend(T item) - { - lock (_syncObject) - { - RecordAdd(item); - - item._builtIn = false; - _data.Insert(0, item); - _builtInEnd++; - } - } - - /// - /// Prepend items into the collection - /// - /// - public void Prepend(IEnumerable items) - { - if (items == null) - { - throw new ArgumentNullException("items"); - } - - lock (_syncObject) - { - int i = 0; - foreach (T t in items) - { - RecordAdd(t); - - t._builtIn = false; - _data.Insert(i++, t); - _builtInEnd++; - } - } - } - - /// - /// Append one item to the collection - /// - /// - public void Append(T item) - { - lock (_syncObject) - { - RecordAdd(item); - - item._builtIn = false; - _data.Add(item); - } - } - - /// - /// Append items to the collection. - /// - /// - public void Append(IEnumerable items) - { - if (items == null) - { - throw new ArgumentNullException("items"); - } - - lock (_syncObject) - { - foreach (T t in items) - { - RecordAdd(t); - - t._builtIn = false; - _data.Add(t); - } - } - } - - internal void AddBuiltInItem(T item) - { - lock (_syncObject) - { - item._builtIn = true; - - RecordAdd(item); - - _data.Insert(_builtInEnd, item); - _builtInEnd++; - } - } - - internal void AddBuiltInItem(IEnumerable items) - { - lock (_syncObject) - { - foreach (T t in items) - { - t._builtIn = true; - - RecordAdd(t); - - _data.Insert(_builtInEnd, t); - _builtInEnd++; - } - } - } - - internal void RemovePSSnapIn(string PSSnapinName) - { - lock (_syncObject) - { - for (int i = _data.Count - 1; i >= 0; i--) - { - if (_data[i].PSSnapIn != null) - { - if (_data[i].PSSnapIn.Name.Equals(PSSnapinName, StringComparison.Ordinal)) - { - RecordRemove(_data[i]); - - _data.RemoveAt(i); - - if (i < _builtInEnd) - _builtInEnd--; - } - } - } - } - } - - /// - /// Get enumerator for this collection. - /// - /// - /// - IEnumerator System.Collections.IEnumerable.GetEnumerator() - { - return _data.GetEnumerator(); - } - - /// - /// Get enumerator for this collection. - /// - /// - /// - IEnumerator System.Collections.Generic.IEnumerable.GetEnumerator() - { - return _data.GetEnumerator(); - } - - /// - /// Update others about the collection change. - /// - public void Update() - { - Update(false); - } - - internal void Update(bool force) - { - lock (_syncObject) - { - if (OnUpdate != null && (force || _updateList.Count > 0)) - { - OnUpdate(); - - // Here we need to clear the Action for each item - // since _updateList is sharing data with _data. - foreach (T t in _updateList) - { - t._action = UpdateAction.None; - } - - _updateList.Clear(); - } - } - } - - private void RecordRemove(T t) - { - // if this item was added recently, simply remove the add action. - if (t.Action == UpdateAction.Add) - { - t._action = UpdateAction.None; - _updateList.Remove(t); - } - else - { - t._action = UpdateAction.Remove; - _updateList.Add(t); - } - } - - private void RecordAdd(T t) - { - // if this item was removed recently, simply remove the add action. - if (t.Action == UpdateAction.Remove) - { - t._action = UpdateAction.None; - _updateList.Remove(t); - } - else - { - t._action = UpdateAction.Add; - _updateList.Add(t); - } - } - - //object to use for locking - private object _syncObject = new object(); - - /// - /// OnUpdate handler should lock the object itself. - /// - internal event RunspaceConfigurationEntryUpdateEventHandler OnUpdate; - } -} - -#pragma warning restore 56517 diff --git a/src/System.Management.Automation/minishell/api/RunspaceConfigurationHelper.cs b/src/System.Management.Automation/minishell/api/RunspaceConfigurationHelper.cs deleted file mode 100644 index 472c7705ea2..00000000000 --- a/src/System.Management.Automation/minishell/api/RunspaceConfigurationHelper.cs +++ /dev/null @@ -1,29 +0,0 @@ -/********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. ---********************************************************************/ - -namespace System.Management.Automation.Runspaces -{ - /// - /// RunspaceConfigurationHelper define some constants to be used by - /// both Minishell api and makekit. - /// - /// Be very careful when trying to change values for strings below since - /// it will be used by makekit process also. - /// - /// This file will be built with both monad engine and makekit. - /// - internal static class RunspaceConfigurationHelper - { - internal const string IntrinsicTypeResourceName = "intrinsicTypes"; - internal const string BuiltInTypeResourceName = "builtInTypes"; - internal const string IntrinsicFormatResourceName = "intrinsicFormats"; - internal const string BuiltInFormatResourceName = "builtInFormats"; - internal const string ScriptResourceName = "script"; - internal const string ProfileResourceName = "initialization"; - internal const string HelpResourceName = "help"; - internal const string ShellHelpResourceKey = "ShellHelp"; - internal const string ShellBannerResourceKey = "ShellBanner"; - internal const string ResourceListKey = "__resourceList__"; - } -} diff --git a/src/System.Management.Automation/minishell/api/RunspaceConfigurationTypeAttribute.cs b/src/System.Management.Automation/minishell/api/RunspaceConfigurationTypeAttribute.cs deleted file mode 100644 index d090ffe5095..00000000000 --- a/src/System.Management.Automation/minishell/api/RunspaceConfigurationTypeAttribute.cs +++ /dev/null @@ -1,31 +0,0 @@ -/********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. ---********************************************************************/ - -namespace System.Management.Automation.Runspaces -{ - /// - /// Define the class for runspace configuration type attribute. - /// - /// - [AttributeUsage(AttributeTargets.Assembly)] - internal sealed class RunspaceConfigurationTypeAttribute : Attribute - { - /// - /// Initiate an instance of RunspaceConfigurationTypeAttribute. - /// - /// Runspace configuration type - public RunspaceConfigurationTypeAttribute(string runspaceConfigurationType) - { - RunspaceConfigurationType = runspaceConfigurationType; - } - - /// - /// Get runspace configuration type - /// - public string RunspaceConfigurationType { get; } - } -} diff --git a/src/System.Management.Automation/minishell/api/RunspaceConfigurationTypeException.cs b/src/System.Management.Automation/minishell/api/RunspaceConfigurationTypeException.cs deleted file mode 100644 index 34315b89833..00000000000 --- a/src/System.Management.Automation/minishell/api/RunspaceConfigurationTypeException.cs +++ /dev/null @@ -1,181 +0,0 @@ -/********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. ---********************************************************************/ - -using System.Runtime.Serialization; -using System.Reflection; -using System.Security.Permissions; - -namespace System.Management.Automation.Runspaces -{ - /// - /// Define class for runspace configuration type. - /// - /// - [Serializable] - internal class RunspaceConfigurationTypeException : SystemException, IContainsErrorRecord - { - /// - /// Initiate an instance for RunspaceConfigurationTypeException - /// - /// Name of the assembly where is defined. - /// Runspace configuration type - internal RunspaceConfigurationTypeException(string assemblyName, string typeName) : base() - { - _assemblyName = assemblyName; - _typeName = typeName; - CreateErrorRecord(); - } - - /// - /// Initiate an instance for RunspaceConfigurationTypeException - /// - public RunspaceConfigurationTypeException() : base() - { - } - - /// - /// Initiate an instance for RunspaceConfigurationTypeException - /// - /// Name of the assembly where is defined. - /// Runspace configuration type defined in - /// Inner exception of this exception - internal RunspaceConfigurationTypeException(string assemblyName, string typeName, Exception innerException) : base(innerException.Message, innerException) - { - _assemblyName = assemblyName; - _typeName = typeName; - CreateErrorRecord(); - } - - /// - /// Initiate an instance for RunspaceConfigurationTypeException - /// - /// Error message - public RunspaceConfigurationTypeException(string message) - : base(message) - { - } - - /// - /// Initiate an instance for RunspaceConfigurationTypeException - /// - /// Error message - /// Inner exception of this exception - public RunspaceConfigurationTypeException(string message, Exception innerException) - : base(message, innerException) - { - } - - /// - /// Create the internal error record based on assembly name and type. - /// The ErrorRecord created will be stored in the _errorRecord member. - /// - private void CreateErrorRecord() - { - if (!String.IsNullOrEmpty(_assemblyName) && !String.IsNullOrEmpty(_typeName)) - { - _errorRecord = new ErrorRecord(new ParentContainsErrorRecordException(this), "UndefinedRunspaceConfigurationType", ErrorCategory.ResourceUnavailable, null); - _errorRecord.ErrorDetails = new ErrorDetails(typeof(RunspaceConfigurationTypeException).GetTypeInfo().Assembly, "MiniShellErrors", "UndefinedRunspaceConfigurationType", _assemblyName, _typeName); - } - } - - private ErrorRecord _errorRecord; - - /// - /// Get the error record embedded in this exception. - /// - public ErrorRecord ErrorRecord - { - get - { - return _errorRecord; - } - } - - private string _assemblyName = ""; - - /// - /// Get name of the assembly where runspace configuration type is defined. - /// - public string AssemblyName - { - get - { - return _assemblyName; - } - } - - private string _typeName = ""; - - /// - /// Get the runspace configuration type. - /// - public string TypeName - { - get - { - return _typeName; - } - } - - /// - /// Get message for this exception. - /// - public override string Message - { - get - { - if (_errorRecord != null) - { - return _errorRecord.ToString(); - } - - return base.Message; - } - } - - #region Serialization - - /// - /// Initiate a RunspaceConfigurationAttributeException instance. - /// - /// Serialization information - /// Streaming context - protected RunspaceConfigurationTypeException(SerializationInfo info, - StreamingContext context) - : base(info, context) - { - _typeName = info.GetString("TypeName"); - _assemblyName = info.GetString("AssemblyName"); - } - - /// - /// Get object data from serialization information. - /// - /// Serialization information - /// Streaming context - [SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)] - public override void GetObjectData(SerializationInfo info, StreamingContext context) - { - if (info == null) - { - throw PSTraceSource.NewArgumentNullException("info"); - } - - base.GetObjectData(info, context); - - info.AddValue("TypeName", _typeName); - info.AddValue("AssemblyName", _assemblyName); - } - - #endregion Serialization - } -} - diff --git a/src/System.Management.Automation/resources/MiniShellErrors.resx b/src/System.Management.Automation/resources/MiniShellErrors.resx index 6df5009313b..152a8f7ad69 100644 --- a/src/System.Management.Automation/resources/MiniShellErrors.resx +++ b/src/System.Management.Automation/resources/MiniShellErrors.resx @@ -117,18 +117,6 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - The RunspaceConfiguration-derived type {1} is not defined in assembly {0}. - - - Cannot create the RunspaceConfiguration object because an assembly attribute of type RunspaceConfigurationType is not defined in assembly {0}. - - - Cannot create the RunspaceConfiguration object because there is more than one assembly attribute of the type RunspaceConfigurationType defined in the assembly {0}. - - - Cannot reflect on the entry assembly and determine the value of the RunspaceConfigurationType attribute. - The update is not supported for the runspace configuration category {0}. diff --git a/src/System.Management.Automation/singleshell/Commands/ConsoleCommands.cs b/src/System.Management.Automation/singleshell/Commands/ConsoleCommands.cs deleted file mode 100644 index 8f4303d7267..00000000000 --- a/src/System.Management.Automation/singleshell/Commands/ConsoleCommands.cs +++ /dev/null @@ -1,602 +0,0 @@ -/********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. ---********************************************************************/ - -using System; -using System.IO; -using System.Collections.ObjectModel; -using System.Management.Automation; -using System.Management.Automation.Runspaces; -using System.Management.Automation.Internal; -using Dbg = System.Management.Automation.Diagnostics; - -#pragma warning disable 1634, 1691 // Stops compiler from warning about unknown warnings - -namespace Microsoft.PowerShell.Commands -{ - #region ConsoleCmdletsBase - /// - /// Base class for all the Console related cmdlets. - /// - public abstract class ConsoleCmdletsBase : PSCmdlet - { - /// - /// Runspace configuration for the current engine - /// - /// - /// Console cmdlets need object to work with. - /// - internal RunspaceConfigForSingleShell Runspace - { - get - { - RunspaceConfigForSingleShell runSpace = Context.RunspaceConfiguration as RunspaceConfigForSingleShell; - return runSpace; - } - } - - /// - /// InitialSessionState for the current engine - /// - internal InitialSessionState InitialSessionState - { - get - { - return Context.InitialSessionState; - } - } - - /// - /// Throws a terminating error. - /// - /// Object which caused this exception. - /// ErrorId for this error. - /// Complete exception object. - /// ErrorCategory for this exception. - internal void ThrowError( - Object targetObject, - string errorId, - Exception innerException, - ErrorCategory category) - { - ThrowTerminatingError(new ErrorRecord(innerException, errorId, category, targetObject)); - } - } - #endregion - - #region export-console - - /// - /// Class that implements export-console cmdlet. - /// - [Cmdlet(VerbsData.Export, "Console", SupportsShouldProcess = true, HelpUri = "https://go.microsoft.com/fwlink/?LinkID=113298")] - public sealed class ExportConsoleCommand : ConsoleCmdletsBase - { - #region Parameters - - /// - /// Property that gets/sets console file name. - /// - /// - /// If a parameter is not supplied then the file represented by $console - /// will be used for saving. - /// - [Parameter(Position = 0, Mandatory = false, ValueFromPipeline = true, - ValueFromPipelineByPropertyName = true)] - [Alias("PSPath")] - public string Path - { - get - { - return _fileName; - } - - set - { - _fileName = value; - } - } - private string _fileName; - - /// - /// Property that sets force parameter. This will reset the read-only - /// attribute on an existing file before deleting it. - /// - [Parameter()] - public SwitchParameter Force - { - get - { - return _force; - } - set - { - _force = value; - } - } - private bool _force; - - /// - /// Property that prevents file overwrite. - /// - [Parameter()] - [Alias("NoOverwrite")] - public SwitchParameter NoClobber - { - get - { - return _noclobber; - } - set - { - _noclobber = value; - } - } - private bool _noclobber; - - #endregion - - #region Overrides - - /// - /// Saves the current console info into a file. - /// - protected override void ProcessRecord() - { - // Get filename.. - string file = GetFileName(); - - // if file is null or empty..prompt the user for filename - if (string.IsNullOrEmpty(file)) - { - file = PromptUserForFile(); - } - - // if file is still empty..write error and back out.. - if (string.IsNullOrEmpty(file)) - { - PSArgumentException ae = PSTraceSource.NewArgumentException("file", ConsoleInfoErrorStrings.FileNameNotResolved); - ThrowError(file, "FileNameNotResolved", ae, ErrorCategory.InvalidArgument); - } - - if (WildcardPattern.ContainsWildcardCharacters(file)) - { - ThrowError(file, "WildCardNotSupported", - PSTraceSource.NewInvalidOperationException(ConsoleInfoErrorStrings.ConsoleFileWildCardsNotSupported, - file), ErrorCategory.InvalidOperation); - } - - // Ofcourse, you cant write to a file from HKLM: etc.. - string resolvedPath = ResolveProviderAndPath(file); - - // If resolvedPath is empty just return.. - if (string.IsNullOrEmpty(resolvedPath)) - { - return; - } - - // Check whether the file ends with valid extension - if (!resolvedPath.EndsWith(StringLiterals.PowerShellConsoleFileExtension, - StringComparison.OrdinalIgnoreCase)) - { - // file does not end with proper extension..create one.. - resolvedPath = resolvedPath + StringLiterals.PowerShellConsoleFileExtension; - } - - if (!ShouldProcess(this.Path)) // should this be resolvedPath? - return; - - //check if destination file exists. - if (File.Exists(resolvedPath)) - { - if (NoClobber) - { - string message = StringUtil.Format( - ConsoleInfoErrorStrings.FileExistsNoClobber, - resolvedPath, - "NoClobber"); // prevents localization - Exception uae = new UnauthorizedAccessException(message); - ErrorRecord errorRecord = new ErrorRecord( - uae, "NoClobber", ErrorCategory.ResourceExists, resolvedPath); - // NOTE: this call will throw - ThrowTerminatingError(errorRecord); - } - // Check if the file is read-only - System.IO.FileAttributes attrib = System.IO.File.GetAttributes(resolvedPath); - if ((attrib & System.IO.FileAttributes.ReadOnly) == System.IO.FileAttributes.ReadOnly) - { - if (Force) - { - RemoveFileThrowIfError(resolvedPath); - // Note, we do not attempt to set read-only on the new file - } - else - { - ThrowError(file, "ConsoleFileReadOnly", - PSTraceSource.NewArgumentException(file, ConsoleInfoErrorStrings.ConsoleFileReadOnly, resolvedPath), - ErrorCategory.InvalidArgument); - } - } - } - - try - { - if (this.Runspace != null) - { - this.Runspace.SaveAsConsoleFile(resolvedPath); - } - else if (InitialSessionState != null) - { - this.InitialSessionState.SaveAsConsoleFile(resolvedPath); - } - else - { - Dbg.Assert(false, "Both RunspaceConfiguration and InitialSessionState should not be null"); - throw PSTraceSource.NewInvalidOperationException(ConsoleInfoErrorStrings.CmdletNotAvailable); - } - } - catch (PSArgumentException mae) - { - ThrowError(resolvedPath, - "PathNotAbsolute", mae, ErrorCategory.InvalidArgument); - } - catch (PSArgumentNullException mane) - { - ThrowError(resolvedPath, - "PathNull", mane, ErrorCategory.InvalidArgument); - } - catch (ArgumentException ae) - { - ThrowError(resolvedPath, - "InvalidCharactersInPath", ae, ErrorCategory.InvalidArgument); - } - - // looks like saving succeeded. - // Now try changing $console - Exception e = null; - try - { - //Update $Console variable - Context.EngineSessionState.SetConsoleVariable(); - } - catch (ArgumentNullException ane) - { - e = ane; - } - catch (ArgumentOutOfRangeException aor) - { - e = aor; - } - catch (ArgumentException ae) - { - e = ae; - } - catch (SessionStateUnauthorizedAccessException sue) - { - e = sue; - } - catch (ProviderNotFoundException pnf) - { - e = pnf; - } - catch (System.Management.Automation.DriveNotFoundException dnfe) - { - e = dnfe; - } - catch (NotSupportedException ne) - { - e = ne; - } - catch (ProviderInvocationException pin) - { - e = pin; - } - - if (e != null) - { - throw PSTraceSource.NewInvalidOperationException(e, - ConsoleInfoErrorStrings.ConsoleVariableCannotBeSet, resolvedPath); - } - } - - #endregion - - #region Private Methods - - /// - /// Removes file specified by destination - /// - /// Absolute path of the file to be removed. - private void RemoveFileThrowIfError(string destination) - { - Diagnostics.Assert(System.IO.Path.IsPathRooted(destination), - "RemoveFile expects an absolute path"); - - System.IO.FileInfo destfile = new System.IO.FileInfo(destination); - if (destfile != null) - { - Exception e = null; - try - { - //Make sure the file is not read only - destfile.Attributes = destfile.Attributes & ~(FileAttributes.ReadOnly | FileAttributes.Hidden); - destfile.Delete(); - } - catch (FileNotFoundException fnf) - { - e = fnf; - } - catch (DirectoryNotFoundException dnf) - { - e = dnf; - } - catch (UnauthorizedAccessException uac) - { - e = uac; - } - catch (System.Security.SecurityException se) - { - e = se; - } - catch (ArgumentNullException ane) - { - e = ane; - } - catch (ArgumentException ae) - { - e = ae; - } - catch (PathTooLongException pe) - { - e = pe; - } - catch (NotSupportedException ns) - { - e = ns; - } - catch (IOException ioe) - { - e = ioe; - } - - if (e != null) - { - throw PSTraceSource.NewInvalidOperationException(e, - ConsoleInfoErrorStrings.ExportConsoleCannotDeleteFile, - destfile); - } - } - } - - /// - /// Resolves the specified path and verifies the path belongs to - /// FileSystemProvider. - /// - /// Path to resolve - /// A fully qualified string representing filename. - private string ResolveProviderAndPath(string path) - { - // Construct cmdletprovidercontext - CmdletProviderContext cmdContext = new CmdletProviderContext(this); - // First resolve path - PathInfo resolvedPath = ResolvePath(path, true, cmdContext); - - // Check whether this is FileSystemProvider.. - if (resolvedPath != null) - { - if (resolvedPath.Provider.ImplementingType == typeof(FileSystemProvider)) - { - return resolvedPath.Path; - } - - throw PSTraceSource.NewInvalidOperationException(ConsoleInfoErrorStrings.ProviderNotSupported, resolvedPath.Provider.Name); - } - - return null; - } - - /// - /// Resolves the specified path to PathInfo objects - /// - /// - /// - /// The path to be resolved. Each path may contain glob characters. - /// - /// - /// - /// If true, resolves the path even if it doesn't exist. - /// - /// - /// - /// The context under which the command is running. - /// - /// - /// - /// A string representing the resolved path. - /// - /// - private PathInfo ResolvePath( - string pathToResolve, - bool allowNonexistingPaths, - CmdletProviderContext currentCommandContext) - { - Collection results = new Collection(); - - try - { - // First resolve path - Collection pathInfos = - SessionState.Path.GetResolvedPSPathFromPSPath( - pathToResolve, - currentCommandContext); - - foreach (PathInfo pathInfo in pathInfos) - { - results.Add(pathInfo); - } - } - catch (PSNotSupportedException notSupported) - { - WriteError( - new ErrorRecord( - notSupported.ErrorRecord, - notSupported)); - } - catch (System.Management.Automation.DriveNotFoundException driveNotFound) - { - WriteError( - new ErrorRecord( - driveNotFound.ErrorRecord, - driveNotFound)); - } - catch (ProviderNotFoundException providerNotFound) - { - WriteError( - new ErrorRecord( - providerNotFound.ErrorRecord, - providerNotFound)); - } - catch (ItemNotFoundException pathNotFound) - { - if (allowNonexistingPaths) - { - ProviderInfo provider = null; - System.Management.Automation.PSDriveInfo drive = null; - string unresolvedPath = - SessionState.Path.GetUnresolvedProviderPathFromPSPath( - pathToResolve, - currentCommandContext, - out provider, - out drive); - - PathInfo pathInfo = - new PathInfo( - drive, - provider, - unresolvedPath, - SessionState); - results.Add(pathInfo); - } - else - { - WriteError( - new ErrorRecord( - pathNotFound.ErrorRecord, - pathNotFound)); - } - } - - if (results.Count == 1) - { - return results[0]; - } - else if (results.Count > 1) - { - Exception e = PSTraceSource.NewNotSupportedException(); - WriteError( - new ErrorRecord(e, - "NotSupported", - ErrorCategory.NotImplemented, - results)); - return null; - } - else - { - return null; - } - } // ResolvePath - - /// - /// Gets the filename for the current operation. If Name parameter is empty - /// checks $console. If $console is not present, prompts user? - /// - /// - /// A string representing filename. - /// If filename cannot be deduced returns null. - /// - /// - /// 1. $console points to an PSObject that cannot be converted to string. - /// - private string GetFileName() - { - if (!string.IsNullOrEmpty(_fileName)) - { - // if user specified input..just return - return _fileName; - } - // no input is specified.. - // check whether $console is set - PSVariable consoleVariable = Context.SessionState.PSVariable.Get(SpecialVariables.ConsoleFileName); - if (consoleVariable == null) - { - return string.Empty; - } - - string consoleValue = consoleVariable.Value as string; - - if (consoleValue == null) - { - // $console is not in string format - // Check whether it is in PSObject format - PSObject consolePSObject = consoleVariable.Value as PSObject; - - if ((consolePSObject != null) && ((consolePSObject.BaseObject as string) != null)) - { - consoleValue = consolePSObject.BaseObject as string; - } - } - - if (consoleValue != null) - { - // ConsoleFileName variable is found.. - return consoleValue; - } - - throw PSTraceSource.NewArgumentException("fileName", ConsoleInfoErrorStrings.ConsoleCannotBeConvertedToString); - } - - /// - /// Prompt user for filename. - /// - /// - /// User input in string format. - /// If user chooses not to export, an empty string is returned. - /// - /// No exception is thrown - private string PromptUserForFile() - { - // ask user what to do.. - if (ShouldContinue( - ConsoleInfoErrorStrings.PromptForExportConsole, - null)) - { - string caption = StringUtil.Format(ConsoleInfoErrorStrings.FileNameCaptionForExportConsole, "export-console"); - string message = ConsoleInfoErrorStrings.FileNamePromptMessage; - - // Construct a field description object of required parameters - Collection desc = new Collection(); - desc.Add(new System.Management.Automation.Host.FieldDescription("Name")); - - // get user input from the host - System.Collections.Generic.Dictionary returnValue = - this.PSHostInternal.UI.Prompt(caption, message, desc); - - if ((returnValue != null) && (returnValue["Name"] != null)) - { - return (returnValue["Name"].BaseObject as string); - } - - // We dont have any input.. - return string.Empty; - } - - // If user chooses not to export, return empty string. - return string.Empty; - } - - #endregion - } - - #endregion -} - diff --git a/src/System.Management.Automation/singleshell/Commands/MshSnapinCommands.cs b/src/System.Management.Automation/singleshell/Commands/MshSnapinCommands.cs deleted file mode 100644 index 5e8890a31c9..00000000000 --- a/src/System.Management.Automation/singleshell/Commands/MshSnapinCommands.cs +++ /dev/null @@ -1,850 +0,0 @@ -/********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. ---********************************************************************/ - -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Management.Automation; -using System.Management.Automation.Runspaces; - -#pragma warning disable 1634, 1691 // Stops compiler from warning about unknown warnings - -namespace Microsoft.PowerShell.Commands -{ - #region PSSnapInCommandBase - /// - /// Base class for all the pssnapin related cmdlets. - /// - public abstract class PSSnapInCommandBase : PSCmdlet, IDisposable - { - #region IDisposable Members - - /// - /// Set to true when object is disposed - /// - /// - private bool _disposed; - - /// - /// Dispose method unloads the app domain and the - /// resource reader if it was created. - /// - /// - public void Dispose() - { - if (_disposed == false) - { - if (_resourceReader != null) - { - _resourceReader.Dispose(); - _resourceReader = null; - } - GC.SuppressFinalize(this); - } - _disposed = true; - } - - #endregion IDisposable Members - - #region Cmdlet Methods - - /// - /// Disposes the resource reader. - /// - /// - protected override void EndProcessing() - { - if (_resourceReader != null) - { - _resourceReader.Dispose(); - _resourceReader = null; - } - } - - #endregion CmdletMethods - - #region Internal Methods - - /// - /// Runspace configuration for the current engine - /// - /// - /// PSSnapIn cmdlets need object to work with. - /// - internal RunspaceConfigForSingleShell Runspace - { - get - { - RunspaceConfigForSingleShell runSpace = Context.RunspaceConfiguration as RunspaceConfigForSingleShell; - - if (runSpace == null) - { - return null; - } - - return runSpace; - } - } - - /// - /// Writes a non-terminating error onto the pipeline. - /// - /// Object which caused this exception. - /// ErrorId for this error. - /// Complete exception object. - /// ErrorCategory for this exception. - internal void WriteNonTerminatingError( - Object targetObject, - string errorId, - Exception innerException, - ErrorCategory category) - { - WriteError(new ErrorRecord(innerException, errorId, category, targetObject)); - } - - - /// - /// Searches the input list for the pattern supplied. - /// - /// Input list - /// pattern with wildcards - /// - /// A collection of string objects (representing PSSnapIn name) - /// that match the pattern. - /// - /// - /// Please note that this method will use WildcardPattern class. - /// So it wont support all the 'regex' patterns - /// - internal Collection - SearchListForPattern(Collection searchList, - string pattern) - { - Collection listToReturn = new Collection(); - - if (null == searchList) - { - // return an empty list - return listToReturn; - } - - WildcardPattern matcher = WildcardPattern.Get(pattern, WildcardOptions.IgnoreCase); - // We are doing WildCard search - foreach (PSSnapInInfo psSnapIn in searchList) - { - if (matcher.IsMatch(psSnapIn.Name)) - { - listToReturn.Add(psSnapIn.Name); - } - } - - // the returned list might contain 0 objects - return listToReturn; - } - - /// - /// See if the snapin is already loaded..returns load snapin info if true, null otherwise. - /// - /// - internal static PSSnapInInfo IsSnapInLoaded(Collection loadedSnapins, PSSnapInInfo psSnapInInfo) - { - if (null == loadedSnapins) - { - return null; - } - - foreach (PSSnapInInfo loadedPSSnapInInfo in loadedSnapins) - { - // See if the assembly-qualified names match and return the existing PSSnapInInfo - // if they do. - string loadedSnapInAssemblyName = loadedPSSnapInInfo.AssemblyName; - if (string.Equals(loadedPSSnapInInfo.Name, psSnapInInfo.Name, StringComparison.OrdinalIgnoreCase) && - !string.IsNullOrEmpty(loadedSnapInAssemblyName) - && string.Equals(loadedSnapInAssemblyName, psSnapInInfo.AssemblyName, System.StringComparison.OrdinalIgnoreCase)) - { - return loadedPSSnapInInfo; - } - } - - return null; - } - - /// - /// Routine to get the list of loaded snapins... - /// - /// - protected internal Collection GetSnapIns(string pattern) - { - // If RunspaceConfiguration is not null, then return the list that it has - if (Runspace != null) - { - if (pattern != null) - return Runspace.ConsoleInfo.GetPSSnapIn(pattern, _shouldGetAll); - else - return Runspace.ConsoleInfo.PSSnapIns; - } - - WildcardPattern matcher = null; - if (!String.IsNullOrEmpty(pattern)) - { - bool doWildCardSearch = WildcardPattern.ContainsWildcardCharacters(pattern); - - if (!doWildCardSearch) - { - // Verify PSSnapInID.. - // This will throw if it not a valid name - PSSnapInInfo.VerifyPSSnapInFormatThrowIfError(pattern); - } - matcher = WildcardPattern.Get(pattern, WildcardOptions.IgnoreCase); - } - - Collection snapins = new Collection(); - if (_shouldGetAll) - { - foreach (PSSnapInInfo snapinKey in PSSnapInReader.ReadAll()) - { - if (matcher == null || matcher.IsMatch(snapinKey.Name)) - snapins.Add(snapinKey); - } - } - else - { - // Otherwise, just scan through the list of cmdlets and rebuild the table. - List cmdlets = InvokeCommand.GetCmdlets(); - Dictionary snapinTable = new Dictionary(); - foreach (CmdletInfo cmdlet in cmdlets) - { - PSSnapInInfo snapin = cmdlet.PSSnapIn; - if (snapin != null && !snapinTable.ContainsKey(snapin)) - snapinTable.Add(snapin, true); - } - - foreach (PSSnapInInfo snapinKey in snapinTable.Keys) - { - if (matcher == null || matcher.IsMatch(snapinKey.Name)) - snapins.Add(snapinKey); - } - } - return snapins; - } - - /// - /// Use to indicate if all registered snapins should be listed by GetSnapins... - /// - protected internal bool ShouldGetAll - { - get { return _shouldGetAll; } - set { _shouldGetAll = value; } - } - private bool _shouldGetAll; - - /// - /// A single instance of the resource indirect reader. This is used to load the - /// managed resource assemblies in a different app-domain so that they can be unloaded. - /// For perf reasons we only want to create one instance for the duration of the command - /// and be sure it gets disposed when the command completes. - /// - /// - internal RegistryStringResourceIndirect ResourceReader - { - get { - return _resourceReader ?? (_resourceReader = RegistryStringResourceIndirect.GetResourceIndirectReader()); - } - } - private RegistryStringResourceIndirect _resourceReader; - #endregion - } - - #endregion - - #region Add-PSSnapIn - - /// - /// Class that implements add-pssnapin cmdlet. - /// - [Cmdlet(VerbsCommon.Add, "PSSnapin", HelpUri = "https://go.microsoft.com/fwlink/?LinkID=113281")] - [OutputType(typeof(PSSnapInInfo))] - public sealed class AddPSSnapinCommand : PSSnapInCommandBase - { - #region Parameters - - /// - /// Property that gets/sets PSSnapIn Ids for the cmdlet. - /// - /// An array of strings representing PSSnapIn ids. - [Parameter( - Position = 0, - Mandatory = true, - ValueFromPipelineByPropertyName = true)] - public string[] Name - { - get - { - return _pssnapins; - } - - set - { - _pssnapins = value; - } - } - private string[] _pssnapins; - - /// - /// Gets or sets the Passthru flag for the operation. - /// If true, the PSSnapInInfo object is passed down the - /// output pipeline. - /// - [Parameter()] - public SwitchParameter PassThru - { - get - { - return _passThru; - } - set - { - _passThru = value; - } - } - private bool _passThru; - - #endregion - - #region Overrides - - /// - /// Adds pssnapins to console file and loads the pssnapin dlls into - /// the current monad runtime. - /// - /// - /// The new pssnapin information is not stored in the console file until - /// the file is saved. - /// - protected override void ProcessRecord() - { - // Cache for the information stored in the registry - // update the cache the first time a wildcard is found.. - Collection listToSearch = null; - - foreach (string pattern in _pssnapins) - { - Exception exception = null; - Collection listToAdd = new Collection(); - - try - { - // check whether there are any wildcard characters - bool doWildCardSearch = WildcardPattern.ContainsWildcardCharacters(pattern); - if (doWildCardSearch) - { - // wildcard found in the pattern - // Get all the possible candidates for current monad version - if (listToSearch == null) - { - // cache snapin registry information... - - // For 3.0 PowerShell, we still use "1" as the registry version key for - // Snapin and Custom shell lookup/discovery. - // For 3.0 PowerShell, we use "3" as the registry version key only for Engine - // related data like ApplicationBase etc. - listToSearch = PSSnapInReader.ReadAll(PSVersionInfo.RegistryVersion1Key); - } - - listToAdd = SearchListForPattern(listToSearch, pattern); - - // listToAdd wont be null.. - Diagnostics.Assert(listToAdd != null, "Pattern matching returned null"); - if (listToAdd.Count == 0) - { - if (_passThru) - { - // passThru is specified and we have nothing to add... - WriteNonTerminatingError(pattern, "NoPSSnapInsFound", - PSTraceSource.NewArgumentException(pattern, - MshSnapInCmdletResources.NoPSSnapInsFound, pattern), - ErrorCategory.InvalidArgument); - } - - continue; - } - } - else - { - listToAdd.Add(pattern); - } - - // now add all the snapins for this pattern... - AddPSSnapIns(listToAdd); - } - catch (PSArgumentException ae) - { - exception = ae; - } - catch (System.Security.SecurityException se) - { - exception = se; - } - - if (exception != null) - { - WriteNonTerminatingError(pattern, - "AddPSSnapInRead", - exception, - ErrorCategory.InvalidArgument); - } - } - } - - #endregion - - #region Private Methods - - /// - /// Adds one or more snapins - /// - /// List of snapin IDs - /// - /// This is a helper method and should not throw any - /// exceptions. All exceptions are caught and displayed - /// to the user using write* methods - /// - private void AddPSSnapIns(Collection snapInList) - { - if (snapInList == null) - { - // nothing to add - return; - } - - //BUGBUG TODO - brucepay - this is a workaround for not being able to dynamically update - // the set of cmdlets in a runspace if there is no RunspaceConfiguration object. - // This is a temporary fix to unblock remoting tests and need to be corrected/completed - // before we can ship... - - // If there is no RunspaceConfig object, then - // use an InitialSessionState object to gather and - // bind the cmdlets from the snapins... - if (Context.RunspaceConfiguration == null) - { - Collection loadedSnapins = base.GetSnapIns(null); - InitialSessionState iss = InitialSessionState.Create(); - bool isAtleastOneSnapinLoaded = false; - foreach (string snapIn in snapInList) - { - if (InitialSessionState.IsEngineModule(snapIn)) - { - WriteNonTerminatingError(snapIn, "LoadSystemSnapinAsModule", - PSTraceSource.NewArgumentException(snapIn, - MshSnapInCmdletResources.LoadSystemSnapinAsModule, snapIn), - ErrorCategory.InvalidArgument); - } - else - { - PSSnapInException warning; - try - { - // Read snapin data - PSSnapInInfo newPSSnapIn = PSSnapInReader.Read(Utils.GetCurrentMajorVersion(), snapIn); - PSSnapInInfo psSnapInInfo = IsSnapInLoaded(loadedSnapins, newPSSnapIn); - - // that means snapin is not already loaded ..so load the snapin - // now. - if (null == psSnapInInfo) - { - psSnapInInfo = iss.ImportPSSnapIn(snapIn, out warning); - isAtleastOneSnapinLoaded = true; - Context.InitialSessionState.ImportedSnapins.Add(psSnapInInfo.Name, psSnapInInfo); - } - // Write psSnapInInfo object only if passthru is specified. - if (_passThru) - { - // Load the pssnapin info properties that are localizable and redirected in the registry - psSnapInInfo.LoadIndirectResources(ResourceReader); - WriteObject(psSnapInInfo); - } - } - - catch (PSSnapInException pse) - { - WriteNonTerminatingError(snapIn, "AddPSSnapInRead", pse, ErrorCategory.InvalidData); - } - } - } - - if (isAtleastOneSnapinLoaded) - { - // Now update the session state with the new stuff... - iss.Bind(Context, /*updateOnly*/ true); - } - - return; - } - - foreach (string psSnapIn in snapInList) - { - Exception exception = null; - - try - { - PSSnapInException warning = null; - - PSSnapInInfo psSnapInInfo = this.Runspace.AddPSSnapIn(psSnapIn, out warning); - - if (warning != null) - { - WriteNonTerminatingError(psSnapIn, "AddPSSnapInRead", warning, ErrorCategory.InvalidData); - } - - // Write psSnapInInfo object only if passthru is specified. - if (_passThru) - { - // Load the pssnapin info properties that are localizable and redirected in the registry - psSnapInInfo.LoadIndirectResources(ResourceReader); - WriteObject(psSnapInInfo); - } - } - catch (PSArgumentException ae) - { - exception = ae; - } - catch (PSSnapInException sle) - { - exception = sle; - } - catch (System.Security.SecurityException se) - { - exception = se; - } - - if (exception != null) - { - WriteNonTerminatingError(psSnapIn, - "AddPSSnapInRead", - exception, - ErrorCategory.InvalidArgument); - } - } - } - - #endregion - } - - #endregion - - #region Remove-PSSnapIn - - /// - /// Class that implements remove-pssnapin cmdlet. - /// - [Cmdlet(VerbsCommon.Remove, "PSSnapin", SupportsShouldProcess = true, HelpUri = "https://go.microsoft.com/fwlink/?LinkID=113378")] - [OutputType(typeof(PSSnapInInfo))] - public sealed class RemovePSSnapinCommand : PSSnapInCommandBase - { - #region Parameters - - /// - /// Property that gets/sets PSSnapIn Ids for the cmdlet. - /// - /// An array of strings representing PSSnapIn ids. - [Parameter( - Position = 0, - Mandatory = true, - ValueFromPipelineByPropertyName = true)] - public string[] Name - { - get - { - return _pssnapins; - } - - set - { - _pssnapins = value; - } - } - private string[] _pssnapins; - - - /// - /// Gets or sets the Passthru flag for the operation. - /// If true, the PSSnapInInfo object is also passed - /// down the output pipeline. - /// - [Parameter()] - public SwitchParameter PassThru - { - get - { - return _passThru; - } - set - { - _passThru = value; - } - } - private bool _passThru; - - #endregion - - #region Overrides - - /// - /// Removes pssnapins from the current console file. - /// - /// - /// The pssnapin is not unloaded from the current engine. So all the cmdlets that are - /// represented by this pssnapin will continue to work. - /// - protected override void ProcessRecord() - { - foreach (string psSnapIn in _pssnapins) - { - Collection snapIns = GetSnapIns(psSnapIn); - - // snapIns won't be null.. - Diagnostics.Assert(snapIns != null, "GetSnapIns() returned null"); - if (snapIns.Count == 0) - { - WriteNonTerminatingError(psSnapIn, "NoPSSnapInsFound", - PSTraceSource.NewArgumentException(psSnapIn, - MshSnapInCmdletResources.NoPSSnapInsFound, psSnapIn), - ErrorCategory.InvalidArgument); - - continue; - } - - foreach (PSSnapInInfo snapIn in snapIns) - { - // confirm the operation first - // this is always false if WhatIf is set - if (ShouldProcess(snapIn.Name)) - { - Exception exception = null; - - if (this.Runspace == null && this.Context.InitialSessionState != null) - { - try - { - // Check if this snapin can be removed - - // Monad has specific restrictions on the mshsnapinid like - // mshsnapinid should be A-Za-z0-9.-_ etc. - PSSnapInInfo.VerifyPSSnapInFormatThrowIfError(snapIn.Name); - - if (MshConsoleInfo.IsDefaultPSSnapIn(snapIn.Name, this.Context.InitialSessionState.defaultSnapins)) - { - throw PSTraceSource.NewArgumentException(snapIn.Name, ConsoleInfoErrorStrings.CannotRemoveDefault, snapIn.Name); - } - - // Handle the initial session state case... - InitialSessionState iss = InitialSessionState.Create(); - PSSnapInException warning; - - // Get the snapin information... - iss.ImportPSSnapIn(snapIn, out warning); - iss.Unbind(Context); - Context.InitialSessionState.ImportedSnapins.Remove(snapIn.Name); - } - catch (PSArgumentException ae) - { - exception = ae; - } - - if (exception != null) - { - WriteNonTerminatingError(psSnapIn, "RemovePSSnapIn", exception, ErrorCategory.InvalidArgument); - } - } - else - { - try - { - PSSnapInException warning = null; - - PSSnapInInfo psSnapInInfo = this.Runspace.RemovePSSnapIn(snapIn.Name, out warning); - - if (warning != null) - { - WriteNonTerminatingError(snapIn.Name, "RemovePSSnapInRead", warning, ErrorCategory.InvalidData); - } - - if (_passThru) - { - // Load the pssnapin info properties that are localizable and redirected in the registry - psSnapInInfo.LoadIndirectResources(ResourceReader); - WriteObject(psSnapInInfo); - } - } - catch (PSArgumentException ae) - { - exception = ae; - } - - if (exception != null) - { - WriteNonTerminatingError(psSnapIn, "RemovePSSnapIn", exception, ErrorCategory.InvalidArgument); - } - } - } // ShouldContinue - } - } - } - - #endregion - } - - #endregion - - #region Get-PSSnapIn - - /// - /// Class that implements get-pssnapin cmdlet. - /// - [Cmdlet(VerbsCommon.Get, "PSSnapin", HelpUri = "https://go.microsoft.com/fwlink/?LinkID=113330")] - [OutputType(typeof(PSSnapInInfo))] - public sealed class GetPSSnapinCommand : PSSnapInCommandBase - { - #region Parameters - - /// - /// Name(s) of PSSnapIn(s). - /// - [Parameter(Position = 0, Mandatory = false)] - [ValidateNotNullOrEmpty()] - public string[] Name - { - get - { - return _pssnapins; - } - set - { - _pssnapins = value; - } - } - private string[] _pssnapins; - - /// - /// Property that determines whether to get all pssnapins that are currently - /// registered ( in registry ). - /// - /// - /// A boolean that determines whether to get all pssnapins that are currently - /// registered ( in registry ). - /// - [Parameter(Mandatory = false)] - public SwitchParameter Registered - { - get - { - return ShouldGetAll; - } - set - { - ShouldGetAll = value; - } - } - - - #endregion - - #region Overrides - - /// - /// Constructs PSSnapInfo objects as requested by the user and writes them to the - /// output buffer. - /// - protected override void BeginProcessing() - { - if (_pssnapins != null) - { - foreach (string psSnapIn in _pssnapins) - { - Exception exception = null; - - try - { - Collection psSnapInInfoList = GetSnapIns(psSnapIn); - - // psSnapInInfoList wont be null.. - Diagnostics.Assert(psSnapInInfoList != null, "ConsoleInfo.GetPSSnapIn returned null"); - if (psSnapInInfoList.Count == 0) - { - WriteNonTerminatingError(psSnapIn, "NoPSSnapInsFound", - PSTraceSource.NewArgumentException(psSnapIn, - MshSnapInCmdletResources.NoPSSnapInsFound, psSnapIn), - ErrorCategory.InvalidArgument); - - continue; - } - - foreach (PSSnapInInfo pssnapinInfo in psSnapInInfoList) - { - // Load the pssnapin info properties that are localizable and redirected in the registry - pssnapinInfo.LoadIndirectResources(ResourceReader); - WriteObject(pssnapinInfo); - } - } - catch (System.Security.SecurityException se) - { - exception = se; - } - catch (PSArgumentException ae) - { - exception = ae; - } - - if (exception != null) - { - WriteNonTerminatingError(psSnapIn, "GetPSSnapInRead", exception, ErrorCategory.InvalidArgument); - } - } - } - else if (ShouldGetAll) - { - Exception exception = null; - - try - { - Collection psSnapInInfoList = PSSnapInReader.ReadAll(); - foreach (PSSnapInInfo pssnapinInfo in psSnapInInfoList) - { - // Load the pssnapin info properties that are localizable and redirected in the registry - pssnapinInfo.LoadIndirectResources(ResourceReader); - WriteObject(pssnapinInfo); - } - } - catch (System.Security.SecurityException se) - { - exception = se; - } - catch (PSArgumentException ae) - { - exception = ae; - } - - if (exception != null) - { - WriteNonTerminatingError(this, "GetPSSnapInRead", exception, ErrorCategory.InvalidArgument); - } - } - else - { - // this should never throw.. - Collection psSnapInInfoList = GetSnapIns(null); - foreach (PSSnapInInfo pssnapinInfo in psSnapInInfoList) - { - // Load the pssnapin info properties that are localizable and redirected in the registry - pssnapinInfo.LoadIndirectResources(ResourceReader); - WriteObject(pssnapinInfo); - } - } - } - - #endregion - } - - #endregion -} diff --git a/src/System.Management.Automation/singleshell/config/MshConsoleInfo.cs b/src/System.Management.Automation/singleshell/config/MshConsoleInfo.cs deleted file mode 100644 index 064e071f90a..00000000000 --- a/src/System.Management.Automation/singleshell/config/MshConsoleInfo.cs +++ /dev/null @@ -1,959 +0,0 @@ -/********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. ---********************************************************************/ - -using System.Globalization; -using System.IO; -using System.Xml; -using System.Text; -using System.Collections.ObjectModel; -using System.Management.Automation.Internal; -using System.Collections.Generic; - -namespace System.Management.Automation.Runspaces -{ - /// - /// Class that understands Monad Console File Format. The format for the console - /// file is applied/read by this class only. - /// - /// Functionality: - /// 1. Schema version verification check. - /// 2. Data values for the content represented by Console file. Later this data - /// is used by other components ( MshConsoleInfo ) to construct Monad Types ( like - /// PSSnapInInfo ). - /// 3. Owns responsibility to read/write Files. - /// - /// Risk: - /// File Acces related security issues. - /// - /// Requires: - /// Might require Permissions to read/write into files. - /// - /// - internal class PSConsoleFileElement - { - #region Console format (xml) tags - // Create constants for each of the xml tags - private const string MSHCONSOLEFILE = "PSConsoleFile"; - private const string CSCHEMAVERSION = "ConsoleSchemaVersion"; - private const string CSCHEMAVERSIONNUMBER = "1.0"; - private const string PSVERSION = "PSVersion"; - private const string SNAPINS = "PSSnapIns"; - private const string SNAPIN = "PSSnapIn"; - private const string SNAPINNAME = "Name"; - - #endregion - - #region Data - - /// - /// MonadVersion from the console file - /// - internal string MonadVersion { get; } - - /// - /// List of MshSnapin IDs from the console file - /// - internal Collection PSSnapIns { get; } - - #endregion - - #region Constructor - - private PSConsoleFileElement(string version) - { - MonadVersion = version; - // Dont make collections null... - // making them null, wont be good for foreach statements - PSSnapIns = new Collection(); - } - - #endregion - - #region tracer - - private static readonly PSTraceSource s_mshsnapinTracer = PSTraceSource.GetTracer("MshSnapinLoadUnload", "Loading and unloading mshsnapins", false); - #endregion - - #region Static Methods - - /// - /// Writes MshConsoleInfo object in Monad Console format into the file specified by the . - /// - /// The absolute path of the file into which the content is saved. - /// The version of PowerShell. - /// The external snapins that are loaded in the console - /// - /// The path value is null. - /// - /// - internal static void WriteToFile(string path, Version version, IEnumerable snapins) - { - Diagnostics.Assert(path != null, "Filename should not be null"); - - s_mshsnapinTracer.WriteLine("Saving console info to file {0}.", path); - - XmlWriterSettings settings = new XmlWriterSettings(); - settings.Indent = true; - settings.Encoding = Encoding.UTF8; - - using (Stream stream = new FileStream(path, FileMode.OpenOrCreate)) - { - // Generate xml for the consoleinfo object. - using (XmlWriter writer = XmlWriter.Create(stream, settings)) - { - writer.WriteStartDocument(); - writer.WriteStartElement(MSHCONSOLEFILE); - writer.WriteAttributeString(CSCHEMAVERSION, CSCHEMAVERSIONNUMBER); - - writer.WriteStartElement(PSVERSION); - writer.WriteString(version.ToString()); - writer.WriteEndElement(); // MonadVersion - - writer.WriteStartElement(SNAPINS); - foreach (PSSnapInInfo mshSnapIn in snapins) - { - writer.WriteStartElement(SNAPIN); - writer.WriteAttributeString(SNAPINNAME, mshSnapIn.Name); - writer.WriteEndElement(); - } - writer.WriteEndElement(); // MshSnapins - - writer.WriteEndElement(); // Monad_ConsoleFile - writer.WriteEndDocument(); - } - } - - s_mshsnapinTracer.WriteLine("Saving console info succeeded."); - } - - /// - /// Reads a Monad Console file specified by and constructs - /// a PSConsoleFileElement. - /// - /// The absolute path of the file to read from. - /// A MShConsoleFileElement object that represents content of the console file. - /// The return object wont be null. - /// - /// There is a load or parser error in the XML. - /// - /// - internal static PSConsoleFileElement CreateFromFile(string path) - { - Diagnostics.Assert(path != null, "Filename should not be null"); - - s_mshsnapinTracer.WriteLine("Loading console info from file {0}.", path); - - XmlDocument doc = InternalDeserializer.LoadUnsafeXmlDocument( - new FileInfo(path), - false, /* ignore whitespace, comments, etc. */ - null); /* default maxCharactersInDocument */ - - // Validate content - if (doc[MSHCONSOLEFILE] == null) - { - s_mshsnapinTracer.TraceError("Console file {0} doesn't contain tag {1}.", path, MSHCONSOLEFILE); - - throw new XmlException( - StringUtil.Format(ConsoleInfoErrorStrings.MonadConsoleNotFound, path)); - } - - if ((doc[MSHCONSOLEFILE][PSVERSION] == null) || - (string.IsNullOrEmpty(doc[MSHCONSOLEFILE][PSVERSION].InnerText))) - { - s_mshsnapinTracer.TraceError("Console file {0} doesn't contain tag {1}.", path, PSVERSION); - - throw new XmlException( - StringUtil.Format(ConsoleInfoErrorStrings.MonadVersionNotFound, path)); - } - - // This will never be null.. - XmlElement xmlElement = (XmlElement)doc[MSHCONSOLEFILE]; - - if (xmlElement.HasAttribute(CSCHEMAVERSION)) - { - if (!xmlElement.GetAttribute(CSCHEMAVERSION).Equals(CSCHEMAVERSIONNUMBER, StringComparison.OrdinalIgnoreCase)) - { - string resourceTemplate = - StringUtil.Format(ConsoleInfoErrorStrings.BadConsoleVersion, path); - string message = string.Format(CultureInfo.CurrentCulture, - resourceTemplate, CSCHEMAVERSIONNUMBER); - - s_mshsnapinTracer.TraceError(message); - - throw new XmlException(message); - } - } - else - { - s_mshsnapinTracer.TraceError("Console file {0} doesn't contain tag schema version.", path); - - throw new XmlException( - StringUtil.Format(ConsoleInfoErrorStrings.BadConsoleVersion, path)); - } - - //process MonadVersion - //This will never be null.. - xmlElement = (XmlElement)doc[MSHCONSOLEFILE][PSVERSION]; - - // Construct PSConsoleFileElement as we seem to have valid data - PSConsoleFileElement consoleFileElement = new PSConsoleFileElement(xmlElement.InnerText.Trim()); - - bool isPSSnapInsProcessed = false; - bool isPSVersionProcessed = false; - - for (XmlNode mshSnapInsNode = doc["PSConsoleFile"].FirstChild; mshSnapInsNode != null; mshSnapInsNode = mshSnapInsNode.NextSibling) - { - if (mshSnapInsNode.NodeType == XmlNodeType.Comment) - { - // support comments inside a PSConsoleFile Element - continue; - } - - //populate mshsnapin information - xmlElement = mshSnapInsNode as XmlElement; - - if (null == xmlElement) - { - throw new XmlException(ConsoleInfoErrorStrings.BadXMLFormat); - } - - if (xmlElement.Name == PSVERSION) - { - if (isPSVersionProcessed) - { - s_mshsnapinTracer.TraceError("Console file {0} contains more than one msh versions", path); - - throw new XmlException(StringUtil.Format(ConsoleInfoErrorStrings.MultipleMshSnapinsElementNotSupported, PSVERSION)); - } - - isPSVersionProcessed = true; - continue; - } - - if (xmlElement.Name != SNAPINS) - { - s_mshsnapinTracer.TraceError("Tag {0} is not supported in console file", xmlElement.Name); - - throw new XmlException(StringUtil.Format(ConsoleInfoErrorStrings.BadXMLElementFound, xmlElement.Name, MSHCONSOLEFILE, PSVERSION, SNAPINS)); - } - - // PSSnapIns element is already processed. We dont support multiple - // PSSnapIns elements - if (isPSSnapInsProcessed) - { - s_mshsnapinTracer.TraceError("Console file {0} contains more than one mshsnapin lists", path); - - throw new XmlException(StringUtil.Format(ConsoleInfoErrorStrings.MultipleMshSnapinsElementNotSupported, SNAPINS)); - } - - // We are about to process mshsnapins element..so we should not - // process some more mshsnapins elements..this boolean keeps track - // of this. - isPSSnapInsProcessed = true; - - // decode all the child nodes of node... - for (XmlNode mshSnapInNode = xmlElement.FirstChild; mshSnapInNode != null; mshSnapInNode = mshSnapInNode.NextSibling) - { - XmlElement mshSnapInElement = mshSnapInNode as XmlElement; - - if ((null == mshSnapInElement) || (mshSnapInElement.Name != SNAPIN)) - { - throw new XmlException( - StringUtil.Format(ConsoleInfoErrorStrings.PSSnapInNotFound, mshSnapInNode.Name)); - } - - string id = mshSnapInElement.GetAttribute(SNAPINNAME); - - if (string.IsNullOrEmpty(id)) - { - throw new XmlException(ConsoleInfoErrorStrings.IDNotFound); - } - - consoleFileElement.PSSnapIns.Add(id); - - s_mshsnapinTracer.WriteLine("Found in mshsnapin {0} in console file {1}", id, path); - } - } - - return consoleFileElement; - } - - #endregion - } - - /// - /// Class that manages(reads/writes) Monad Console files and constructs objects - /// that represent data in the console files. - /// - /// Functionality: - /// 1. Access point to the console files for Runspace and cmdlets - /// 2. Depends on PSConsoleFileElement for reading/writing files - /// - /// - internal class MshConsoleInfo - { - #region Private Data - - // Monad Version that this console file depends on. - // MshSnapins that are not shipped with monad. - private readonly Collection _externalPSSnapIns; - // Monad specific mshsnapins - private Collection _defaultPSSnapIns; - // An internal representation that tells whether a console file is modified. - // A string that stores fileName of the current consoleinfo object - - #endregion - - #region Class specific data - - private static readonly PSTraceSource s_mshsnapinTracer = PSTraceSource.GetTracer("MshSnapinLoadUnload", "Loading and unloading mshsnapins", false); - - #endregion - - #region Properties - - /// - /// Monad Version that the console file depends on. - /// - internal Version PSVersion { get; } - - /// - /// Returns the major version of current console. - /// - internal string MajorVersion - { - get - { - Diagnostics.Assert(PSVersion != null, - "PSVersion is null"); - - return PSVersion.Major.ToString(System.Globalization.CultureInfo.InvariantCulture); - } - } - - /// - /// List of mshsnapins that are available. This includes both the monad - /// default mshsnapins as well as external mshsnapins as represented by the - /// console file. - /// - /// - /// The list returned is an ordered-list with default mshsnapins at the - /// start followed by external mshsnapins in the order represented by the - /// console file. - /// - internal Collection PSSnapIns - { - get - { - return MergeDefaultExternalMshSnapins(); - } - } - - /// - /// List of external mshsnapins, as represented by the console file and cmdlets - /// add-pssnapin,remove-pssnapin, that are available. - /// - internal Collection ExternalPSSnapIns - { - get - { - // externalPSSnapIns is never null - Diagnostics.Assert(_externalPSSnapIns != null, "externalPSSnapIns is null"); - - return _externalPSSnapIns; - } - } - - /// - /// A boolean which tells whether the console file is modified after it is read - /// or created. - /// - /// - /// Modification refers to addition/deletion operations of the external mshsnapins. - /// - internal bool IsDirty { get; private set; } - - /// - /// A string representing the console file name of the current MshConsoleInfo object. - /// If the filename is relative path, an absolute path will be constructed using - /// Path.GetFullPath() - /// - /// - /// Once a MshConsoleInfo object is constructed, a user may update the object by - /// adding,removing mshsnapins. These operations directly effect the state of the - /// MshConsoleInfo object but not update the console file. - /// - internal string Filename { get; private set; } - - #endregion - - #region Constructors - - /// - /// Construct a MshConsoleInfo object for the Monad version specified. - /// - /// Monad Version. - private MshConsoleInfo(Version version) - { - PSVersion = version; - IsDirty = false; - Filename = null; - - // Initialize list of mshsnapins.. - _defaultPSSnapIns = new Collection(); - _externalPSSnapIns = new Collection(); - } - - #endregion - - #region Staic Methods - - /// - /// Constructs a object for the - /// current Monad version which is already started. - /// - /// - /// One or more default mshsnapins cannot be loaded because the - /// registry is not populated correctly. - /// - internal static MshConsoleInfo CreateDefaultConfiguration() - { - // Steps: - // 1. Get the current Monad Version - // 2. Create MshConsoleInfo object. - // 3. Read default mshsnapins. - - MshConsoleInfo consoleInfo = new MshConsoleInfo(PSVersionInfo.PSVersion); - try - { - consoleInfo._defaultPSSnapIns = PSSnapInReader.ReadEnginePSSnapIns(); - } - catch (PSArgumentException ae) - { - string message = ConsoleInfoErrorStrings.CannotLoadDefaults; - // If we were unable to load default mshsnapins throw PSSnapInException - - s_mshsnapinTracer.TraceError(message); - - throw new PSSnapInException(message, ae); - } - catch (System.Security.SecurityException se) - { - string message = ConsoleInfoErrorStrings.CannotLoadDefaults; - // If we were unable to load default mshsnapins throw PSSnapInException - - s_mshsnapinTracer.TraceError(message); - - throw new PSSnapInException(message, se); - } - - return consoleInfo; - } - - /// - /// Constructs a object from a - /// Monad console file. - /// - /// - /// Monad console file name. If the filename is not absolute path. Then absolute path is - /// constructed by using Path.GetFullPath() API. - /// - /// - /// PSConsoleLoadException occurred while loading this console file. This object - /// also contains specific PSSnapInExceptions that occurred while loading. - /// - /// - /// One or more default mshsnapins cannot be loaded because the - /// registry is not populated correctly. - /// - /// - /// fileName is null. - /// - /// - /// 1. fileName does not specify proper file extension. - /// - /// - /// fileName contains one or more of the invalid characters defined in System.IO.Path.InvalidPathChars. - /// - /// - /// Unable to load/parse the file specified by fileName. - /// - internal static MshConsoleInfo CreateFromConsoleFile(string fileName, out PSConsoleLoadException cle) - { - s_mshsnapinTracer.WriteLine("Creating console info from file {0}", fileName); - - // Construct default mshsnapins - MshConsoleInfo consoleInfo = CreateDefaultConfiguration(); - - // Check whether the filename specified is an absolute path. - string absolutePath = Path.GetFullPath(fileName); - consoleInfo.Filename = absolutePath; - - // Construct externalPSSnapIns by loading file. - consoleInfo.Load(absolutePath, out cle); - - s_mshsnapinTracer.WriteLine("Console info created successfully"); - - return consoleInfo; - } - - #endregion - - #region Internal Instance Methods - - /// - /// Saves the current object to a file specified - /// by . IsDirty is set to false once file is saved. - /// - /// - /// If path is not an absolute path, then an absolute path is constructed by - /// using Path.GetFullPath() API. - /// - /// - /// 1.Path does not specify proper file extension. - /// - /// - /// 1. Path is null. - /// - /// - /// path contains one or more of the invalid characters defined in System.IO.Path.InvalidPathChars. - /// - internal void SaveAsConsoleFile(string path) - { - if (null == path) - { - throw PSTraceSource.NewArgumentNullException("path"); - } - - // Check whether the filename specified is an absolute path. - string absolutePath = path; - - if (!Path.IsPathRooted(absolutePath)) - { - absolutePath = Path.GetFullPath(Filename); - } - - // Ignore case when looking for file extension. - if (!absolutePath.EndsWith(StringLiterals.PowerShellConsoleFileExtension, StringComparison.OrdinalIgnoreCase)) - { - s_mshsnapinTracer.TraceError("Console file {0} doesn't have the right extension {1}.", path, StringLiterals.PowerShellConsoleFileExtension); - throw PSTraceSource.NewArgumentException("absolutePath", ConsoleInfoErrorStrings.BadConsoleExtension); - } - - //ConsoleFileElement will write to file - PSConsoleFileElement.WriteToFile(absolutePath, this.PSVersion, this.ExternalPSSnapIns); - //update the console file variable - Filename = absolutePath; - IsDirty = false; - } - - /// - /// Saves the current object to its console file. - /// IsDirty is set to false once file is saved. - /// - /// - /// Msh is loaded with default mshsnapins. $console is currently empty. - /// - internal void Save() - { - if (null == Filename) - { - throw PSTraceSource.NewInvalidOperationException(ConsoleInfoErrorStrings.SaveDefaultError); - } - - PSConsoleFileElement.WriteToFile(Filename, this.PSVersion, this.ExternalPSSnapIns); - IsDirty = false; - } - - /// - /// Adds a mshsnapin specified by to the current list of - /// mshsnapins. If the mshsnapin is successfully added, IsDirty property is set to true. - /// - /// ID of the mshsnapin which needs to be added. - /// A object corresponding to mshSnapInID. - /// PSSnapIn information must be present in the registry for this call to succeed. - /// - /// mshSnapInID is empty or null. - /// - /// - /// PSSnapIn is already loaded. - /// No PSSnapIn with given id found. - /// PSSnapIn cannot be loaded. - /// - /// - /// Caller doesn't have permission to read keys. - /// - internal PSSnapInInfo AddPSSnapIn(string mshSnapInID) - { - if (string.IsNullOrEmpty(mshSnapInID)) - { - PSTraceSource.NewArgumentNullException("mshSnapInID"); - } - - // Check whether the mshsnapin is already present in defaultmshsnapins/externalMshSnapins - if (IsDefaultPSSnapIn(mshSnapInID, _defaultPSSnapIns)) - { - s_mshsnapinTracer.TraceError("MshSnapin {0} can't be added since it is a default mshsnapin", mshSnapInID); - - throw PSTraceSource.NewArgumentException("mshSnapInID", ConsoleInfoErrorStrings.CannotLoadDefault); - } - - if (IsActiveExternalPSSnapIn(mshSnapInID)) - { - s_mshsnapinTracer.TraceError("MshSnapin {0} is already loaded.", mshSnapInID); - - throw PSTraceSource.NewArgumentException("mshSnapInID", ConsoleInfoErrorStrings.PSSnapInAlreadyExists, mshSnapInID); - } - - // Check whether the mshsnapin is present in the registry. - PSSnapInInfo newPSSnapIn = PSSnapInReader.Read(this.MajorVersion, mshSnapInID); - - if (!Utils.IsPSVersionSupported(newPSSnapIn.PSVersion.ToString())) - { - s_mshsnapinTracer.TraceError("MshSnapin {0} and current monad engine's versions don't match.", mshSnapInID); - - throw PSTraceSource.NewArgumentException("mshSnapInID", - ConsoleInfoErrorStrings.AddPSSnapInBadMonadVersion, - newPSSnapIn.PSVersion.ToString(), - PSVersion.ToString()); - } - - // new mshsnapin will never be null - //if this is a valid new mshsnapin,add this to external mshsnapins - _externalPSSnapIns.Add(newPSSnapIn); - s_mshsnapinTracer.WriteLine("MshSnapin {0} successfully added to consoleinfo list.", mshSnapInID); - //Set IsDirty to true - IsDirty = true; - - return newPSSnapIn; - } - - /// - /// Removes a mshsnapin specified by from the current - /// list. - /// - /// ID of the mshsnapin which needs to be removed - /// PSSnapInInfo object for the mshsnapin that is removed. - /// MshSnapin is removed only from the console file. Registry entry - /// is not touched. - /// - /// mshSnapInID is null. - /// - /// - /// 1. mshSnapInID is either a default mshsnapin or not loaded. - /// 2. mshSnapInId is not valid. - /// - internal PSSnapInInfo RemovePSSnapIn(string mshSnapInID) - { - if (string.IsNullOrEmpty(mshSnapInID)) - { - PSTraceSource.NewArgumentNullException("mshSnapInID"); - } - - // Monad has specific restrictions on the mshsnapinid like - // mshsnapinid should be A-Za-z0-9.-_ etc. - PSSnapInInfo.VerifyPSSnapInFormatThrowIfError(mshSnapInID); - - PSSnapInInfo removedPSSnapIn = null; - // Check external mshsnapins - foreach (PSSnapInInfo mshSnapIn in _externalPSSnapIns) - { - if (string.Equals(mshSnapInID, mshSnapIn.Name, System.StringComparison.OrdinalIgnoreCase)) - { - // We found the mshsnapin..remove from the list and break - removedPSSnapIn = mshSnapIn; - _externalPSSnapIns.Remove(mshSnapIn); - - // The state of console file is changing..so set - // dirty flag. - IsDirty = true; - break; - } - } - - if (removedPSSnapIn == null) - { - if (IsDefaultPSSnapIn(mshSnapInID, _defaultPSSnapIns)) - { - s_mshsnapinTracer.WriteLine("MshSnapin {0} can't be removed since it is a default mshsnapin.", mshSnapInID); - - throw PSTraceSource.NewArgumentException("mshSnapInID", ConsoleInfoErrorStrings.CannotRemoveDefault, mshSnapInID); - } - - throw PSTraceSource.NewArgumentException("mshSnapInID", ConsoleInfoErrorStrings.CannotRemovePSSnapIn, mshSnapInID); - } - - return removedPSSnapIn; - } - - /// - /// Searches for mshsnapin in either current console or registry as determined - /// by . - /// - /// - /// Id/WildcardPattern of the mshsnapin to search for. This can contain wildcard characters as - /// represented by WildCardPattern. - /// - /// - /// A boolean which determines whether to search in the current console or registry. - /// - /// A collection of mshsnapininfo objects. - /// - /// 1.Unable to read registry entries for mshsnapins. - /// 2.Pattern specified is not valid. If pattern doesnt contain - /// wildcard characters, this function checks for the validity - /// of the mshsnapin name. - /// - /// - /// Caller doesn't have permission to read keys. - /// - internal Collection GetPSSnapIn(string pattern, bool searchRegistry) - { - // We want to improve the search speed by noting whether we want - // to perform wildcard search. - bool doWildCardSearch = WildcardPattern.ContainsWildcardCharacters(pattern); - - if (!doWildCardSearch) - { - // Verify PSSnapInID.. - // This will throw if it not a valid name - PSSnapInInfo.VerifyPSSnapInFormatThrowIfError(pattern); - } - - // Build the list to search..If searchRegistry is true get all mshsnapins available - // from the registry, otherwise get mshsnapins from the current console. - Collection listToSearch = searchRegistry ? - PSSnapInReader.ReadAll() : PSSnapIns; - - // Create a list to return.. - Collection listToReturn = new Collection(); - - // If there is nothing to search.. - if (listToSearch == null) - return listToReturn; - - if (!doWildCardSearch) - { - // We are not doing wildcard search.. - foreach (PSSnapInInfo mshSnapIn in listToSearch) - { - if (string.Equals(mshSnapIn.Name, pattern, StringComparison.OrdinalIgnoreCase)) - { - listToReturn.Add(mshSnapIn); - } - } - } - else - { - WildcardPattern matcher = WildcardPattern.Get(pattern, WildcardOptions.IgnoreCase); - // We are doing WildCard search - foreach (PSSnapInInfo mshSnapIn in listToSearch) - { - if (matcher.IsMatch(mshSnapIn.Name)) - { - listToReturn.Add(mshSnapIn); - } - } - } - - // return whatever we found..may be 0.. - return listToReturn; - } - - #endregion - - #region Private Methods - - /// - /// Loads a Monad Console file specified by - /// - /// - /// The absolute path from which the content is loaded. - /// - /// - /// PSConsoleLoadException occurred while loading this console file. This object - /// also contains specific PSSnapInExceptions that occurred while loading. - /// - /// - /// A list of objects specified in the console file. - /// - /// - /// Path is null. - /// - /// - /// 1. Path does not specify proper file extension. - /// 2. PSSnapInId doesnt contain valid characters. - /// 3. Path is not an Absolute Path. - /// Example of valid paths:"\\MyDir\\MyFile.txt" and "C:\\MyDir". - /// - /// - /// path contains one or more of the invalid characters defined in System.IO.Path.InvalidPathChars. - /// - /// - /// Unable to load/parse the file specified by path. - /// - private Collection Load(string path, out PSConsoleLoadException cle) - { - // Initialize the out parameter.. - cle = null; - - s_mshsnapinTracer.WriteLine("Load mshsnapins from console file {0}", path); - - if (string.IsNullOrEmpty(path)) - { - throw PSTraceSource.NewArgumentNullException("path"); - } - - // Check whether the path is an absolute path - if (!Path.IsPathRooted(path)) - { - s_mshsnapinTracer.TraceError("Console file {0} needs to be a absolute path.", path); - - throw PSTraceSource.NewArgumentException("path", ConsoleInfoErrorStrings.PathNotAbsolute, path); - } - - if (!path.EndsWith(StringLiterals.PowerShellConsoleFileExtension, StringComparison.OrdinalIgnoreCase)) - { - s_mshsnapinTracer.TraceError("Console file {0} needs to have {1} extension.", path, StringLiterals.PowerShellConsoleFileExtension); - - throw PSTraceSource.NewArgumentException("path", ConsoleInfoErrorStrings.BadConsoleExtension); - } - - PSConsoleFileElement consoleFileElement; - - // exceptions are thrown to the caller - consoleFileElement = PSConsoleFileElement.CreateFromFile(path); - - // consoleFileElement will never be null.. - if (!Utils.IsPSVersionSupported(consoleFileElement.MonadVersion)) - { - s_mshsnapinTracer.TraceError("Console version {0} is not supported in current monad session.", consoleFileElement.MonadVersion); - - throw PSTraceSource.NewArgumentException("PSVersion", ConsoleInfoErrorStrings.BadMonadVersion, consoleFileElement.MonadVersion, - PSVersion.ToString()); - } - - // Create a store for exceptions - Collection exceptions = new Collection(); - - foreach (string mshsnapin in consoleFileElement.PSSnapIns) - { - try - { - this.AddPSSnapIn(mshsnapin); - } - catch (PSArgumentException ae) - { - PSSnapInException sle = new PSSnapInException(mshsnapin, ae.Message, ae); - - // Eat ArgumentException and continue.. - exceptions.Add(sle); - } - catch (System.Security.SecurityException se) - { - string message = ConsoleInfoErrorStrings.PSSnapInReadError; - PSSnapInException sle = new PSSnapInException(mshsnapin, message, se); - // Eat SecurityException and continue.. - - exceptions.Add(sle); - } - } - - // Before returning check whether there are any exceptions - if (exceptions.Count > 0) - { - cle = new PSConsoleLoadException(this, exceptions); - } - - // We are able to load console file and currently monad engine - // can service this. So mark the isdirty flag. - IsDirty = false; - - return _externalPSSnapIns; - } - - /// - /// Checks whether the mshsnapin is a default mshsnapin - /// - /// Id of the mshsnapin - /// List of default mshsnapins - /// True if PSSnapIn is default.False otherwise. - internal static bool IsDefaultPSSnapIn(string mshSnapInID, IEnumerable defaultSnapins) - { - // Check whether the mshsnapin is present in defaultmshsnapins. - foreach (PSSnapInInfo mshSnapIn in defaultSnapins) - { - if (string.Equals(mshSnapInID, mshSnapIn.Name, System.StringComparison.OrdinalIgnoreCase)) - { - return true; - } - } - - return false; - } - - /// - /// Checks whether the mshsnapin is already loaded - /// - /// Id of the mshsnapin - /// True if PSSnapIn is loaded.False otherwise. - private bool IsActiveExternalPSSnapIn(string mshSnapInID) - { - // Check whether the mshsnapin is present in externalmshsnapins. - foreach (PSSnapInInfo mshSnapIn in _externalPSSnapIns) - { - if (string.Equals(mshSnapInID, mshSnapIn.Name, System.StringComparison.OrdinalIgnoreCase)) - { - return true; - } - } - - return false; - } - - - /// - /// Constructs a new list of mshsnapins from default mshsnapins and external mshsnapins. - /// - /// A list of mshsnapins represented by the current console file - private Collection MergeDefaultExternalMshSnapins() - { - //Default mshsnapins should never be null - Diagnostics.Assert(_defaultPSSnapIns != null, "Default MshSnapins for the current console is empty"); - Collection mshSnapIns = new Collection(); - - foreach (PSSnapInInfo mshSnapIn in _defaultPSSnapIns) - { - mshSnapIns.Add(mshSnapIn); - } - - foreach (PSSnapInInfo mshSnapIn in _externalPSSnapIns) - { - mshSnapIns.Add(mshSnapIn); - } - - return mshSnapIns; - } - #endregion - } -} diff --git a/src/System.Management.Automation/singleshell/config/MshConsoleLoadException.cs b/src/System.Management.Automation/singleshell/config/MshConsoleLoadException.cs index 7eeb95dd965..ee252cd112a 100644 --- a/src/System.Management.Automation/singleshell/config/MshConsoleLoadException.cs +++ b/src/System.Management.Automation/singleshell/config/MshConsoleLoadException.cs @@ -24,25 +24,6 @@ namespace System.Management.Automation.Runspaces [Serializable] public class PSConsoleLoadException : SystemException, IContainsErrorRecord { - /// - /// Initiate an instance of PSConsoleLoadException. - /// - /// Console info object for the exception - /// A collection of PSSnapInExceptions. - internal PSConsoleLoadException(MshConsoleInfo consoleInfo, Collection exceptions) - : base() - { - if (!String.IsNullOrEmpty(consoleInfo.Filename)) - _consoleFileName = consoleInfo.Filename; - - if (exceptions != null) - { - _PSSnapInExceptions = exceptions; - } - - CreateErrorRecord(); - } - /// /// Initiate an instance of PSConsoleLoadException. /// @@ -69,6 +50,23 @@ public PSConsoleLoadException(string message, Exception innerException) { } + private ErrorRecord _errorRecord; + + /// + /// Gets error record embedded in this exception. + /// + /// + public ErrorRecord ErrorRecord + { + get + { + return _errorRecord; + } + } + /// /// Create the internal error record. /// The ErrorRecord created will be stored in the _errorRecord member. @@ -87,28 +85,8 @@ private void CreateErrorRecord() } _errorRecord = new ErrorRecord(new ParentContainsErrorRecordException(this), "ConsoleLoadFailure", ErrorCategory.ResourceUnavailable, null); - _errorRecord.ErrorDetails = new ErrorDetails(String.Format(ConsoleInfoErrorStrings.ConsoleLoadFailure, _consoleFileName, sb.ToString())); - } - - private ErrorRecord _errorRecord; - - /// - /// Gets error record embedded in this exception. - /// - /// - public ErrorRecord ErrorRecord - { - get - { - return _errorRecord; - } } - private string _consoleFileName = ""; - private Collection _PSSnapInExceptions = new Collection(); internal Collection PSSnapInExceptions { @@ -135,42 +113,6 @@ public override string Message } } } - - #region Serialization - - /// - /// Initiate a PSConsoleLoadException instance. - /// - /// Serialization information - /// Streaming context - protected PSConsoleLoadException(SerializationInfo info, - StreamingContext context) - : base(info, context) - { - _consoleFileName = info.GetString("ConsoleFileName"); - - CreateErrorRecord(); - } - - /// - /// Get object data from serialization information. - /// - /// Serialization information - /// Streaming context - [SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)] - public override void GetObjectData(SerializationInfo info, StreamingContext context) - { - if (info == null) - { - throw PSTraceSource.NewArgumentNullException("info"); - } - - base.GetObjectData(info, context); - - info.AddValue("ConsoleFileName", _consoleFileName); - } - - #endregion Serialization } } diff --git a/src/System.Management.Automation/singleshell/config/RegistryStringResourceIndirect.cs b/src/System.Management.Automation/singleshell/config/RegistryStringResourceIndirect.cs deleted file mode 100644 index ef3ab91732b..00000000000 --- a/src/System.Management.Automation/singleshell/config/RegistryStringResourceIndirect.cs +++ /dev/null @@ -1,611 +0,0 @@ -/********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. ---********************************************************************/ - -using System.Collections; -using System.Globalization; -using System.IO; -using System.Reflection; -using System.Resources; -using System.Security; -using Microsoft.Win32; -using Dbg = System.Management.Automation.Diagnostics; - -namespace System.Management.Automation -{ - /// - /// This class is responsible for loading resources using the PSSnapin dll and - /// associated registry entries. - /// - /// - /// - /// The class creates an app-domain to load the resource assemblies in. Upon dispose - /// the class unloads the app-domain to ensure the assemblies get unloaded. It uses - /// ReflectionOnlyLoad and ReflectionOnlyLoadFrom to ensure that no code can execute - /// and that dependencies are not loaded. This allows us to load assemblies that were - /// built with different version of the CLR. - /// - /// - internal sealed class RegistryStringResourceIndirect : IDisposable - { - /// - /// Creates an instance of the RegistryStringResourceIndirect class. - /// - /// - /// - /// A new instance of the RegistryStringResourceIndirect class. - /// - /// - internal static RegistryStringResourceIndirect GetResourceIndirectReader() - { - return new RegistryStringResourceIndirect(); - } - - #region IDisposable Members - - /// - /// Set to true when object is disposed - /// - /// - private bool _disposed; - - /// - /// Dispose method unloads the app domain that was - /// created in the constructor. - /// - /// - public void Dispose() - { - if (_disposed == false) - { - if (_domain != null) - { - AppDomain.Unload(_domain); - _domain = null; - _resourceRetriever = null; - } - } - _disposed = true; - } - - #endregion IDisposable Members - - /// - /// The app-domain in which the resources will be loaded. - /// - /// - private AppDomain _domain; - - /// - /// The class that is created in the app-domain which does the resource loading. - /// - /// - private ResourceRetriever _resourceRetriever; - - /// - /// Creates the app-domain and the instance of the ResourceRetriever and - /// sets the private fields with the references. - /// - /// - private void CreateAppDomain() - { - if (_domain == null) - { - // Create an app-domain to load the resource assemblies in so that they can be - // unloaded. - - _domain = AppDomain.CreateDomain("ResourceIndirectDomain"); - _resourceRetriever = - (ResourceRetriever)_domain.CreateInstanceAndUnwrap( - Assembly.GetExecutingAssembly().FullName, - "System.Management.Automation.ResourceRetriever"); - } - } - - /// - /// Retrieves a resource string based on a resource reference stored in the specified - /// registry key. - /// - /// - /// - /// The key in which there is a value that contains the reference to the resource - /// to retrieve. - /// - /// - /// - /// The name of the value in the registry key that contains the reference to the resource. - /// - /// - /// - /// The full name of the assembly from which to load the resource. - /// - /// - /// - /// The full path of the assembly from which to load the resource. - /// - /// - /// - /// The resource string that was loaded or null if it could not be found. - /// - /// - /// - /// This method ensures that an appropriate registry entry exists and that it contains - /// a properly formatted resource reference ("BaseName,ResourceID"). It then creates an - /// app-domain (or uses and existing one if it already exists on the instance of the class) - /// and an instance of the ResourceRetriever in that app-domain. It then calls the ResourceRetriever - /// to load the specified assembly and retrieve the resource. The assembly is loaded using ReflectionOnlyLoad - /// or ReflectionOnlyLoadFrom using the assemblyName or moduleName (respectively) so that - /// no code can be executed. - /// - /// The app-domain is unloaded when this class instance is disposed. - /// - /// - internal string GetResourceStringIndirect( - RegistryKey key, - string valueName, - string assemblyName, - string modulePath) - { - if (_disposed) - { - throw PSTraceSource.NewInvalidOperationException(MshSnapinInfo.ResourceReaderDisposed); - } - - if (key == null) - { - throw PSTraceSource.NewArgumentNullException("key"); - } - - if (String.IsNullOrEmpty(valueName)) - { - throw PSTraceSource.NewArgumentException("valueName"); - } - - if (String.IsNullOrEmpty(assemblyName)) - { - throw PSTraceSource.NewArgumentException("assemblyName"); - } - - if (String.IsNullOrEmpty(modulePath)) - { - throw PSTraceSource.NewArgumentException("modulePath"); - } - - string result = null; - - do // false loop - { - // Read the resource reference from the registry - string regValue = GetRegKeyValueAsString(key, valueName); - - if (regValue == null) - { - break; - } - - result = GetResourceStringIndirect(assemblyName, modulePath, regValue); - } while (false); - - return result; - } - - /// - /// Retrieves a resource string based on a resource reference supplied in . - /// - /// - /// - /// The full name of the assembly from which to load the resource. - /// - /// - /// - /// The full path of the assembly from which to load the resource. - /// - /// - /// - /// A comma separated basename and resource id pair. - /// - /// - /// - /// The resource string that was loaded or null if it could not be found. - /// - /// - /// - /// This method ensures that is a properly formatted - /// resource reference ("BaseName,ResourceID"). It then creates an app-domain (or uses - /// an existing one if it already exists on the instance of the class) and an instance - /// of the ResourceRetriever in that app-domain. It then calls the ResourceRetriever - /// to load the specified assembly and retrieve the resource. The assembly is loaded using ReflectionOnlyLoad - /// or ReflectionOnlyLoadFrom using the assemblyName or moduleName (respectively) so that - /// no code can be executed. - /// - /// The app-domain is unloaded when this class instance is disposed. - /// - /// - internal string GetResourceStringIndirect( - string assemblyName, - string modulePath, - string baseNameRIDPair) - { - if (_disposed) - { - throw PSTraceSource.NewInvalidOperationException(MshSnapinInfo.ResourceReaderDisposed); - } - - if (String.IsNullOrEmpty(assemblyName)) - { - throw PSTraceSource.NewArgumentException("assemblyName"); - } - - if (String.IsNullOrEmpty(modulePath)) - { - throw PSTraceSource.NewArgumentException("modulePath"); - } - - if (String.IsNullOrEmpty(baseNameRIDPair)) - { - throw PSTraceSource.NewArgumentException("baseNameRIDPair"); - } - - string result = null; - - do // false loop - { - // Initialize the app-domain and resource reader if not already initialized - if (_resourceRetriever == null) - { - CreateAppDomain(); - } - - // If the app-domain failed to load or the ResourceRetriever instance wasn't - // created, then return null. - - if (_resourceRetriever == null) - { - break; - } - - // Parse the resource reference - string[] resourceSplit = baseNameRIDPair.Split(Utils.Separators.Comma); - if (resourceSplit.Length != 2) - { - break; - } - - string baseName = resourceSplit[0]; - string resourceID = resourceSplit[1]; - - // Get the resource in the app-domain - result = _resourceRetriever.GetStringResource(assemblyName, modulePath, baseName, resourceID); - } while (false); - - return result; - } - - /// - /// Retrieves a string value from the registry - /// - /// - /// - /// The key to retrieve the value from. - /// - /// - /// - /// The name of the value to retrieve. - /// - /// - /// - /// The string value of the registry key value. - /// - /// - private static string GetRegKeyValueAsString(RegistryKey key, string valueName) - { - string result = null; - try - { - // Check the type of the value - RegistryValueKind kind = key.GetValueKind(valueName); - if (kind == RegistryValueKind.String) - { - // Get the value since it is a string - result = key.GetValue(valueName) as string; - } - } - catch (ArgumentException) - { - } - catch (IOException) - { - } - catch (SecurityException) - { - } - - return result; - } - } - - /// - /// This class is the worker class used by RegistryStringResourceIndirect to load the resource - /// assemblies and retrieve the resources inside the alternate app-domain. - /// - /// - internal class ResourceRetriever : MarshalByRefObject - { - /// - /// Loads the specified assembly in the app-domain and retrieves the specified resource string. - /// - /// - /// - /// Full name of the assembly to retrieve the resource from. - /// - /// - /// - /// Full path of the assembly to retrieve the resource from. - /// - /// - /// - /// The resource base name to retrieve. - /// - /// - /// - /// The resource ID of the resource to retrieve. - /// - /// - /// - /// The value of the specified string resource or null if the resource could not be found or loaded. - /// - /// - internal string GetStringResource(string assemblyName, string modulePath, string baseName, string resourceID) - { - string result = null; - - do // false loop - { - // Load the resource assembly - Assembly assembly = LoadAssembly(assemblyName, modulePath); - - if (assembly == null) - { - break; - } - - CultureInfo currentCulture = System.Globalization.CultureInfo.CurrentUICulture; - Stream stream = null; - - // Get the resource stream from the manifest - // Loop until we have reached the default culture (identified by an empty Name string in the - // CultureInfo). - do - { - string resourceStream = baseName; - if (!String.IsNullOrEmpty(currentCulture.Name)) - resourceStream += "." + currentCulture.Name; - resourceStream += ".resources"; - - stream = assembly.GetManifestResourceStream(resourceStream); - - if (stream != null) - { - break; - } - - if (String.IsNullOrEmpty(currentCulture.Name)) - { - break; - } - - currentCulture = currentCulture.Parent; - } while (true); - - if (stream == null) - { - break; - } - - // Retrieve the string resource from the stream. - result = GetString(stream, resourceID); - } while (false); - - return result; - } - - /// - /// Loads the specified assembly using ReflectionOnlyLoad or ReflectionOnlyLoadFrom - /// - /// - /// - /// The FullName of the assembly to load. This takes precedence over the modulePath and - /// will be passed to as a parameter to the ReflectionOnlyLoad. - /// - /// - /// - /// The full path of the assembly to load. This is used if the ReflectionOnlyLoad using the - /// assemblyName doesn't load the assembly. It is passed as a parameter to the ReflectionOnlyLoadFrom API. - /// - /// - /// - /// An loaded instance of the specified resource assembly or null if the assembly couldn't be loaded. - /// - /// - /// - /// Since the intent of this method is to load resource assemblies, the standard culture fallback rules - /// apply. If the assembly couldn't be loaded for the current culture we fallback to the parent culture - /// until the neutral culture is reached or an assembly is loaded. - /// - /// - private static Assembly LoadAssembly(string assemblyName, string modulePath) - { - Assembly assembly = null; - AssemblyName assemblyNameObj = new AssemblyName(assemblyName); - - // Split the path up so we can add the culture directory. - string moduleBase = Path.GetDirectoryName(modulePath); - string moduleFile = Path.GetFileName(modulePath); - - CultureInfo currentCulture = System.Globalization.CultureInfo.CurrentUICulture; - - // Loop until we have reached the default culture (identified by an empty Name string in the - // CultureInfo). - do - { - assembly = LoadAssemblyForCulture(currentCulture, assemblyNameObj, moduleBase, moduleFile); - - if (assembly != null) - { - break; - } - - if (String.IsNullOrEmpty(currentCulture.Name)) - { - break; - } - currentCulture = currentCulture.Parent; - } while (true); - - - return assembly; - } - - /// - /// Attempts to load the assembly for the specified culture - /// - /// - /// - /// The culture for which the assembly should be loaded. - /// - /// - /// - /// The name of the assembly without culture information (or at least undefined culture information). - /// - /// - /// - /// The directory containing the neutral culture assembly. - /// - /// - /// - /// The name of the assembly file. - /// - /// - /// - /// An instance of the loaded resource assembly or null if the assembly could not be loaded. - /// - /// - private static Assembly LoadAssemblyForCulture( - CultureInfo culture, - AssemblyName assemblyName, - string moduleBase, - string moduleFile) - { - Assembly assembly = null; - - // Set the assembly FullName to contain the culture we are trying to load. - assemblyName.CultureInfo = culture; - - try - { - assembly = Assembly.ReflectionOnlyLoad(assemblyName.FullName); - } - catch (FileLoadException) - { - } - catch (BadImageFormatException) - { - } - catch (FileNotFoundException) - { - } - - if (assembly != null) - return assembly; - - // Try the resources DLL - string oldAssemblyName = assemblyName.Name; - try - { - assemblyName.Name = oldAssemblyName + ".resources"; - assembly = Assembly.ReflectionOnlyLoad(assemblyName.FullName); - } - catch (FileLoadException) - { - } - catch (BadImageFormatException) - { - } - catch (FileNotFoundException) - { - } - - if (assembly != null) - return assembly; - - assemblyName.Name = oldAssemblyName; - - // Add the culture directory into the file path - string modulePath = Path.Combine(moduleBase, culture.Name); - modulePath = Path.Combine(modulePath, moduleFile); - - if (File.Exists(modulePath)) - { - try - { - assembly = Assembly.ReflectionOnlyLoadFrom(modulePath); - } - catch (FileLoadException) - { - } - catch (BadImageFormatException) - { - } - catch (FileNotFoundException) - { - } - } - return assembly; - } - - /// - /// Retrieves the specified resource string from the resource stream. - /// - /// - /// - /// The resource stream containing the desired resource. - /// - /// - /// - /// The identifier of the string resource to retrieve from the stream. - /// - /// - /// - /// The resource string or null if the resourceID could not be found. - /// - /// - private static string GetString(Stream stream, string resourceID) - { - string result = null; - - ResourceReader rr = new ResourceReader(stream); - - foreach (DictionaryEntry e in rr) - { - if (String.Equals(resourceID, (string)e.Key, StringComparison.OrdinalIgnoreCase)) - { - result = (string)e.Value; - break; - } - } - /* NTRAID#Windows Out Of Band Releases-920971-2005/09/30-JeffJon - * Whidbey v2.0.50727 has a bug where GetResourceData throws an NullReferenceException if - * the assembly used to get the ResourceReader was loaded with ReflectionOnlyLoad. This code - * would be more efficient than the iteration in the foreach loop above and should be enabled - * when we move to the RTM version of Whidbey. - * - string resourceType = null; - byte[] resourceData = null; - rr.GetResourceData(resourceID, out resourceType, out resourceData); - */ - return result; - } - } -} - - diff --git a/src/System.Management.Automation/singleshell/config/RunspaceConfigForSingleShell.cs b/src/System.Management.Automation/singleshell/config/RunspaceConfigForSingleShell.cs deleted file mode 100644 index 55895079c41..00000000000 --- a/src/System.Management.Automation/singleshell/config/RunspaceConfigForSingleShell.cs +++ /dev/null @@ -1,754 +0,0 @@ -/********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. ---********************************************************************/ - -using System.IO; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Xml; -using System.Reflection; -using System.Management.Automation.Internal; - -namespace System.Management.Automation.Runspaces -{ - /// - /// Runspace config for single shell are a special kind of runspace - /// configuration that is generated for single shells. - /// - /// This class needs to handle the standard management of - /// - /// 1. consoleInfo: each instance of this class will have - /// a consoleInfo object. - /// 2. interface to consoleInfo. This includes "open", - /// "save", and "change" of consoleInfo and console files. - /// 3. interface to mshsnapin's. This includes add, remove - /// and list mshsnapins in console file. - /// - /// This class derives from RunspaceConfiguration and supports - /// basic information for cmdlets, providers, types, formats, - /// etc. - /// - /// Eventually when minishell model goes away, RunspaceConfiguration - /// and RunspaceConfigForSingleShell may merge into one class. - /// - /// - internal class RunspaceConfigForSingleShell : RunspaceConfiguration - { - #region RunspaceConfigForSingleShell Factory - - /// - /// One or more default mshsnapins cannot be loaded because the - /// registry is not populated correctly. - /// - /// - /// fileName is null. - /// - /// - /// fileName does not specify proper file extension. - /// - /// - /// Unable to load/parse the file specified by fileName. - /// - internal new static RunspaceConfigForSingleShell Create(string consoleFile, out PSConsoleLoadException warning) - { - PSConsoleLoadException warning1 = null; - - s_mshsnapinTracer.WriteLine("Creating MshConsoleInfo. consoleFile={0}", consoleFile); - - MshConsoleInfo consoleInfo = MshConsoleInfo.CreateFromConsoleFile(consoleFile, out warning1); - - if (warning1 != null) - { - s_mshsnapinTracer.TraceWarning("There was a warning while creating MshConsoleInfo: {0}", warning1.Message); - } - - // At this time, consoleInfo should not be null. - // Otherwise, an exception should have been thrown up. - if (consoleInfo != null) - { - RunspaceConfigForSingleShell rspcfg = new RunspaceConfigForSingleShell(consoleInfo); - PSConsoleLoadException warning2 = null; - - rspcfg.LoadConsole(out warning2); - - if (warning2 != null) - { - s_mshsnapinTracer.TraceWarning("There was a warning while loading console: {0}", warning2.Message); - } - - warning = CombinePSConsoleLoadException(warning1, warning2); - - return rspcfg; - } - - warning = null; - return null; - } - - private static PSConsoleLoadException CombinePSConsoleLoadException(PSConsoleLoadException e1, PSConsoleLoadException e2) - { - if ((e1 == null || e1.PSSnapInExceptions.Count == 0) && (e2 == null || e2.PSSnapInExceptions.Count == 0)) - return null; - - if (e1 == null || e1.PSSnapInExceptions.Count == 0) - return e2; - - if (e2 == null || e2.PSSnapInExceptions.Count == 0) - return e1; - - foreach (PSSnapInException sile in e2.PSSnapInExceptions) - { - e1.PSSnapInExceptions.Add(sile); - } - - return e1; - } - - - /// - /// One or more default mshsnapins cannot be loaded because the - /// registry is not populated correctly. - /// - internal static RunspaceConfigForSingleShell CreateDefaultConfiguration() - { - s_mshsnapinTracer.WriteLine("Creating default runspace configuration."); - - MshConsoleInfo consoleInfo = MshConsoleInfo.CreateDefaultConfiguration(); - - // This should not happen. If there is a failure in creating consoleInfo, - // an exception should have been thrown up. - if (consoleInfo != null) - { - RunspaceConfigForSingleShell rspcfg = new RunspaceConfigForSingleShell(consoleInfo); - PSConsoleLoadException warning = null; - - rspcfg.LoadConsole(out warning); - - if (warning != null) - { - s_mshsnapinTracer.TraceWarning("There was a warning while loading console: {0}", warning.Message); - } - - return rspcfg; - } - - s_mshsnapinTracer.WriteLine("Default runspace configuration created."); - - return null; - } - - private RunspaceConfigForSingleShell(MshConsoleInfo consoleInfo) - { - _consoleInfo = consoleInfo; - } - - #endregion - - #region Console/MshSnapin Manipulation - - private MshConsoleInfo _consoleInfo = null; - internal MshConsoleInfo ConsoleInfo - { - get - { - return _consoleInfo; - } - } - - internal void SaveConsoleFile() - { - if (_consoleInfo == null) - return; - - _consoleInfo.Save(); - } - - internal void SaveAsConsoleFile(string filename) - { - if (_consoleInfo == null) - return; - - _consoleInfo.SaveAsConsoleFile(filename); - } - - /// - /// mshSnapInID is empty or null. - /// - /// - /// PSSnapIn is already loaded. - /// No PSSnapIn with given id found. - /// PSSnapIn cannot be loaded. - /// - /// - /// Caller doesn't have permission to read keys. - /// - internal override PSSnapInInfo DoAddPSSnapIn(string name, out PSSnapInException warning) - { - warning = null; - - s_mshsnapinTracer.WriteLine("Adding mshsnapin {0}", name); - - if (_consoleInfo == null) - return null; - - PSSnapInInfo mshsnapinInfo = null; - - try - { - mshsnapinInfo = _consoleInfo.AddPSSnapIn(name); - } - catch (PSArgumentException mae) - { - s_mshsnapinTracer.TraceError(mae.Message); - s_mshsnapinTracer.WriteLine("Adding mshsnapin {0} failed.", name); - throw; - } - catch (PSArgumentNullException mane) - { - s_mshsnapinTracer.TraceError(mane.Message); - s_mshsnapinTracer.WriteLine("Adding mshsnapin {0} failed.", name); - throw; - } - - if (mshsnapinInfo == null) - return null; - - LoadPSSnapIn(mshsnapinInfo, out warning); - - if (warning != null) - { - s_mshsnapinTracer.TraceWarning("There was a warning when loading mshsnapin {0}: {1}", name, warning.Message); - } - - s_mshsnapinTracer.WriteLine("MshSnapin {0} added", name); - - return mshsnapinInfo; - } - - /// - /// mshSnapInID is null. - /// - /// - /// mshSnapInID is either a default mshsnapin or not loaded. - /// - internal override PSSnapInInfo DoRemovePSSnapIn(string name, out PSSnapInException warning) - { - warning = null; - - if (_consoleInfo == null) - return null; - - s_mshsnapinTracer.WriteLine("Removing mshsnapin {0}", name); - - PSSnapInInfo mshsnapinInfo = _consoleInfo.RemovePSSnapIn(name); - - UnloadPSSnapIn(mshsnapinInfo, out warning); - - s_mshsnapinTracer.WriteLine("MshSnapin {0} removed", name); - - return mshsnapinInfo; - } - - internal void UpdateAll() - { - string errors = ""; - - UpdateAll(out errors); - } - - - internal void UpdateAll(out string errors) - { - errors = ""; - - this.Cmdlets.Update(); - this.Providers.Update(); - - s_mshsnapinTracer.WriteLine("Updating types and formats"); - - try - { - this.Types.Update(); - } - catch (RuntimeException e) - { - s_mshsnapinTracer.TraceWarning("There was a warning updating types: {0}", e.Message); - - errors += e.Message + "\n"; - } - - try - { - this.Formats.Update(); - } - catch (RuntimeException e) - { - s_mshsnapinTracer.TraceWarning("There was a warning updating formats: {0}", e.Message); - - errors += e.Message + "\n"; - } - - try - { - this.Assemblies.Update(); - } - catch (RuntimeException e) - { - s_mshsnapinTracer.TraceWarning("There was a warning updating assemblies: {0}", e.Message); - - errors += e.Message + "\n"; - } - - s_mshsnapinTracer.WriteLine("Types and formats updated successfully"); - } - - #endregion - - #region Load Console/MshSnapin's - - private void LoadConsole(out PSConsoleLoadException warning) - { - if (_consoleInfo == null) - { - warning = null; - return; - } - - LoadPSSnapIns(_consoleInfo.PSSnapIns, out warning); - } - - private void LoadPSSnapIn(PSSnapInInfo mshsnapinInfo, out PSSnapInException warning) - { - warning = null; - - try - { - LoadPSSnapIn(mshsnapinInfo); - } - catch (PSSnapInException) - { - if (!mshsnapinInfo.IsDefault) - _consoleInfo.RemovePSSnapIn(mshsnapinInfo.Name); - - // exception during load mshsnapin are fatal. - throw; - } - - string errors; - - UpdateAll(out errors); - - if (!String.IsNullOrEmpty(errors)) - { - s_mshsnapinTracer.TraceWarning("There was a warning while loading mshsnapin {0}:{1}", mshsnapinInfo.Name, errors); - - warning = new PSSnapInException(mshsnapinInfo.Name, errors, true); - } - } - - private void LoadPSSnapIns(Collection mshsnapinInfos, out PSConsoleLoadException warning) - { - warning = null; - - Collection mshsnapinExceptions = new Collection(); - - bool partialSuccess = false; - - foreach (PSSnapInInfo mshsnapinInfo in mshsnapinInfos) - { - try - { - LoadPSSnapIn(mshsnapinInfo); - partialSuccess = true; - } - catch (PSSnapInException e) - { - if (!mshsnapinInfo.IsDefault) - { - _consoleInfo.RemovePSSnapIn(mshsnapinInfo.Name); - } - else - { - throw; - } - - mshsnapinExceptions.Add(e); - } - } - - if (partialSuccess) - { - string errors; - UpdateAll(out errors); - - if (!String.IsNullOrEmpty(errors)) - { - s_mshsnapinTracer.TraceWarning(errors); - mshsnapinExceptions.Add(new PSSnapInException(null, errors, true)); - } - } - - if (mshsnapinExceptions.Count > 0) - { - warning = new PSConsoleLoadException(_consoleInfo, mshsnapinExceptions); - s_mshsnapinTracer.TraceWarning(warning.Message); - } - } - - private void LoadPSSnapIn(PSSnapInInfo mshsnapinInfo) - { - if (mshsnapinInfo == null) - return; - -#if !CORECLR // CustomPSSnapIn Not Supported On CSS. - if (!String.IsNullOrEmpty(mshsnapinInfo.CustomPSSnapInType)) - { - LoadCustomPSSnapIn(mshsnapinInfo); - return; - } -#endif - Assembly assembly = null; - - s_mshsnapinTracer.WriteLine("Loading assembly for mshsnapin {0}", mshsnapinInfo.Name); - - assembly = LoadMshSnapinAssembly(mshsnapinInfo); - - if (assembly == null) - { - s_mshsnapinTracer.TraceError("Loading assembly for mshsnapin {0} failed", mshsnapinInfo.Name); - return; - } - - s_mshsnapinTracer.WriteLine("Loading assembly for mshsnapin {0} succeeded", mshsnapinInfo.Name); - - Dictionary cmdlets = null; - Dictionary> aliases = null; - Dictionary providers = null; - string throwAwayHelpFile = null; - PSSnapInHelpers.AnalyzePSSnapInAssembly(assembly, assembly.Location, mshsnapinInfo, null, false, out cmdlets, out aliases, out providers, out throwAwayHelpFile); - if (cmdlets != null) - { - foreach (var c in cmdlets) - { - CmdletConfigurationEntry cmdlet = new CmdletConfigurationEntry(c.Key, c.Value.ImplementingType, - c.Value.HelpFileName, mshsnapinInfo); - _cmdlets.AddBuiltInItem(cmdlet); - } - } - if (providers != null) - { - foreach (var p in providers) - { - ProviderConfigurationEntry provider = new ProviderConfigurationEntry(p.Key, p.Value.ImplementingType, - p.Value.HelpFileName, - mshsnapinInfo); - _providers.AddBuiltInItem(provider); - } - } - - foreach (string file in mshsnapinInfo.Types) - { - string path = Path.Combine(mshsnapinInfo.ApplicationBase, file); - - TypeConfigurationEntry typeEntry = new TypeConfigurationEntry(path, path, mshsnapinInfo); - this.Types.AddBuiltInItem(typeEntry); - } - - foreach (string file in mshsnapinInfo.Formats) - { - string path = Path.Combine(mshsnapinInfo.ApplicationBase, file); - - FormatConfigurationEntry formatEntry = new FormatConfigurationEntry(path, path, mshsnapinInfo); - this.Formats.AddBuiltInItem(formatEntry); - } - - AssemblyConfigurationEntry assemblyEntry = new AssemblyConfigurationEntry(mshsnapinInfo.AssemblyName, mshsnapinInfo.AbsoluteModulePath, mshsnapinInfo); - this.Assemblies.AddBuiltInItem(assemblyEntry); - - return; - } - -#if !CORECLR // CustomPSSnapIn Not Supported On CSS. - - private void LoadCustomPSSnapIn(PSSnapInInfo mshsnapinInfo) - { - if (mshsnapinInfo == null) - return; - - if (String.IsNullOrEmpty(mshsnapinInfo.CustomPSSnapInType)) - { - return; - } - - Assembly assembly = null; - - s_mshsnapinTracer.WriteLine("Loading assembly for mshsnapin {0}", mshsnapinInfo.Name); - - assembly = LoadMshSnapinAssembly(mshsnapinInfo); - - if (assembly == null) - { - s_mshsnapinTracer.TraceError("Loading assembly for mshsnapin {0} failed", mshsnapinInfo.Name); - return; - } - - CustomPSSnapIn customPSSnapIn = null; - try - { - Type type = assembly.GetType(mshsnapinInfo.CustomPSSnapInType, true, false); - - if (type != null) - { - customPSSnapIn = (CustomPSSnapIn)Activator.CreateInstance(type); - } - - s_mshsnapinTracer.WriteLine("Loading assembly for mshsnapin {0} succeeded", mshsnapinInfo.Name); - } - catch (TypeLoadException tle) - { - throw new PSSnapInException(mshsnapinInfo.Name, tle.Message); - } - catch (ArgumentException ae) - { - throw new PSSnapInException(mshsnapinInfo.Name, ae.Message); - } - catch (MissingMethodException mme) - { - throw new PSSnapInException(mshsnapinInfo.Name, mme.Message); - } - catch (InvalidCastException ice) - { - throw new PSSnapInException(mshsnapinInfo.Name, ice.Message); - } - catch (TargetInvocationException tie) - { - if (tie.InnerException != null) - { - throw new PSSnapInException(mshsnapinInfo.Name, tie.InnerException.Message); - } - - throw new PSSnapInException(mshsnapinInfo.Name, tie.Message); - } - - MergeCustomPSSnapIn(mshsnapinInfo, customPSSnapIn); - return; - } - - private void MergeCustomPSSnapIn(PSSnapInInfo mshsnapinInfo, CustomPSSnapIn customPSSnapIn) - { - if (mshsnapinInfo == null || customPSSnapIn == null) - return; - - s_mshsnapinTracer.WriteLine("Merging configuration from custom mshsnapin {0}", mshsnapinInfo.Name); - - if (customPSSnapIn.Cmdlets != null) - { - foreach (CmdletConfigurationEntry entry in customPSSnapIn.Cmdlets) - { - CmdletConfigurationEntry cmdlet = new CmdletConfigurationEntry(entry.Name, entry.ImplementingType, entry.HelpFileName, mshsnapinInfo); - _cmdlets.AddBuiltInItem(cmdlet); - } - } - - if (customPSSnapIn.Providers != null) - { - foreach (ProviderConfigurationEntry entry in customPSSnapIn.Providers) - { - ProviderConfigurationEntry provider = new ProviderConfigurationEntry(entry.Name, entry.ImplementingType, entry.HelpFileName, mshsnapinInfo); - _providers.AddBuiltInItem(provider); - } - } - - if (customPSSnapIn.Types != null) - { - foreach (TypeConfigurationEntry entry in customPSSnapIn.Types) - { - string path = Path.Combine(mshsnapinInfo.ApplicationBase, entry.FileName); - TypeConfigurationEntry type = new TypeConfigurationEntry(entry.Name, path, mshsnapinInfo); - _types.AddBuiltInItem(type); - } - } - - if (customPSSnapIn.Formats != null) - { - foreach (FormatConfigurationEntry entry in customPSSnapIn.Formats) - { - string path = Path.Combine(mshsnapinInfo.ApplicationBase, entry.FileName); - FormatConfigurationEntry format = new FormatConfigurationEntry(entry.Name, path, mshsnapinInfo); - _formats.AddBuiltInItem(format); - } - } - - AssemblyConfigurationEntry assemblyEntry = new AssemblyConfigurationEntry(mshsnapinInfo.AssemblyName, mshsnapinInfo.AbsoluteModulePath, mshsnapinInfo); - this.Assemblies.AddBuiltInItem(assemblyEntry); - - s_mshsnapinTracer.WriteLine("Configuration from custom mshsnapin {0} merged", mshsnapinInfo.Name); - } -#endif - - private void UnloadPSSnapIn(PSSnapInInfo mshsnapinInfo, out PSSnapInException warning) - { - warning = null; - - if (mshsnapinInfo != null) - { - this.Cmdlets.RemovePSSnapIn(mshsnapinInfo.Name); - this.Providers.RemovePSSnapIn(mshsnapinInfo.Name); - this.Assemblies.RemovePSSnapIn(mshsnapinInfo.Name); - this.Types.RemovePSSnapIn(mshsnapinInfo.Name); - this.Formats.RemovePSSnapIn(mshsnapinInfo.Name); - - string errors; - UpdateAll(out errors); - - if (!String.IsNullOrEmpty(errors)) - { - s_mshsnapinTracer.TraceWarning(errors); - warning = new PSSnapInException(mshsnapinInfo.Name, errors, true); - } - } - } - - private Assembly LoadMshSnapinAssembly(PSSnapInInfo mshsnapinInfo) - { - Assembly assembly = null; - - s_mshsnapinTracer.WriteLine("Loading assembly from GAC. Assembly Name: {0}", mshsnapinInfo.AssemblyName); - - try - { - // WARNING: DUPLICATE CODE see InitialSessionState - assembly = Assembly.Load(new AssemblyName(mshsnapinInfo.AssemblyName)); - } - catch (FileLoadException e) - { - s_mshsnapinTracer.TraceWarning("Not able to load assembly {0}: {1}", mshsnapinInfo.AssemblyName, e.Message); - } - catch (BadImageFormatException e) - { - s_mshsnapinTracer.TraceWarning("Not able to load assembly {0}: {1}", mshsnapinInfo.AssemblyName, e.Message); - } - catch (FileNotFoundException e) - { - s_mshsnapinTracer.TraceWarning("Not able to load assembly {0}: {1}", mshsnapinInfo.AssemblyName, e.Message); - } - - if (assembly != null) - return assembly; - - s_mshsnapinTracer.WriteLine("Loading assembly from path: {0}", mshsnapinInfo.AssemblyName); - - try - { - AssemblyName assemblyName = AssemblyName.GetAssemblyName(mshsnapinInfo.AbsoluteModulePath); - if (string.Compare(assemblyName.FullName, mshsnapinInfo.AssemblyName, StringComparison.OrdinalIgnoreCase) != 0) - { - string message = StringUtil.Format(ConsoleInfoErrorStrings.PSSnapInAssemblyNameMismatch, mshsnapinInfo.AbsoluteModulePath, mshsnapinInfo.AssemblyName); - s_mshsnapinTracer.TraceError(message); - throw new PSSnapInException(mshsnapinInfo.Name, message); - } - - assembly = Assembly.LoadFrom(mshsnapinInfo.AbsoluteModulePath); - } - catch (FileLoadException e) - { - s_mshsnapinTracer.TraceError("Not able to load assembly {0}: {1}", mshsnapinInfo.AssemblyName, e.Message); - throw new PSSnapInException(mshsnapinInfo.Name, e.Message); - } - catch (BadImageFormatException e) - { - s_mshsnapinTracer.TraceError("Not able to load assembly {0}: {1}", mshsnapinInfo.AssemblyName, e.Message); - throw new PSSnapInException(mshsnapinInfo.Name, e.Message); - } - catch (FileNotFoundException e) - { - s_mshsnapinTracer.TraceError("Not able to load assembly {0}: {1}", mshsnapinInfo.AssemblyName, e.Message); - throw new PSSnapInException(mshsnapinInfo.Name, e.Message); - } - - return assembly; - } - - #endregion - - #region RunspaceConfiguration Api implementation - - /// - /// Gets the shell id for current runspace configuration. - /// - /// - public override string ShellId - { - get - { - return Utils.DefaultPowerShellShellID; - } - } - - private RunspaceConfigurationEntryCollection _cmdlets = - new RunspaceConfigurationEntryCollection(); - - /// - /// Gets the cmdlets defined in runspace configuration. - /// - public override RunspaceConfigurationEntryCollection Cmdlets - { - get - { - return _cmdlets; - } - } - - private RunspaceConfigurationEntryCollection _providers = new RunspaceConfigurationEntryCollection(); - - /// - /// Gets the providers defined in runspace configuration. - /// - public override RunspaceConfigurationEntryCollection Providers - { - get - { - return _providers; - } - } - - private RunspaceConfigurationEntryCollection _types; - - /// - /// Gets the type data files defined in runspace configuration. - /// - public override RunspaceConfigurationEntryCollection Types - { - get { return _types ?? (_types = new RunspaceConfigurationEntryCollection()); } - } - - private RunspaceConfigurationEntryCollection _formats; - - /// - /// Gets the format data files defined in runspace configuration. - /// - public override RunspaceConfigurationEntryCollection Formats - { - get { - return _formats ?? (_formats = new RunspaceConfigurationEntryCollection()); - } - } - - private RunspaceConfigurationEntryCollection _initializationScripts; - - /// - /// Gets the initialization scripts defined in runspace configuration. - /// - public override RunspaceConfigurationEntryCollection InitializationScripts - { - get { - return _initializationScripts ?? - (_initializationScripts = new RunspaceConfigurationEntryCollection()); - } - } - - #endregion - - private static PSTraceSource s_mshsnapinTracer = PSTraceSource.GetTracer("MshSnapinLoadUnload", "Loading and unloading mshsnapins", false); - } -} diff --git a/src/System.Management.Automation/singleshell/installer/CustomMshSnapin.cs b/src/System.Management.Automation/singleshell/installer/CustomMshSnapin.cs deleted file mode 100644 index 57e1fd05e83..00000000000 --- a/src/System.Management.Automation/singleshell/installer/CustomMshSnapin.cs +++ /dev/null @@ -1,122 +0,0 @@ -/********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. ---********************************************************************/ - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.ComponentModel; -using System.Reflection; -using Microsoft.Win32; -using System.IO; -using System.Management.Automation.Runspaces; - -namespace System.Management.Automation -{ - /// - /// - /// Raw mshsnapin is a class for allowing mshsnapin developers to directly - /// specify the set of cmdlets, providers, types, formats, assemblies - /// available in the mshsnapin. - /// - /// To use this class, mshsnapin developers will drive from it and fill - /// in details about cmdlet, provider, type, format, assemblies. - /// - /// This class will also facilitate the registration of the mshsnapin - /// through installutil.exe. - /// - /// This class will be built with monad core engine dll. - /// - /// - /// - /// Developers should derive from this class to implement their own - /// custom mshsnapins. - /// - /// Derived mshsnapins should be denoted with [RunInstaller] attribute - /// so that installutil.exe can directly install the mshsnapin into registry. - /// - public abstract class CustomPSSnapIn : PSSnapInInstaller - { - internal string CustomPSSnapInType - { - get - { - return this.GetType().FullName; - } - } - - private Collection _cmdlets; - - /// - /// Gets the cmdlets defined in custom mshsnapin. - /// - /// - /// This member can be derived to provide the list of cmdlets to be included for this mshsnapin. - /// - public virtual Collection Cmdlets - { - get { return _cmdlets ?? (_cmdlets = new Collection()); } - } - - private Collection _providers; - - /// - /// Gets the providers defined in custom mshsnapin. - /// - /// - /// This member can be derived to provide the list of providers to be included for this mshsnapin. - /// - public virtual Collection Providers - { - get { return _providers ?? (_providers = new Collection()); } - } - - private Collection _types; - - /// - /// Gets the types defined in custom mshsnapin. - /// - /// - /// This member can be derived to provide the list of types to be included for this mshsnapin. - /// - public virtual Collection Types - { - get { return _types ?? (_types = new Collection()); } - } - - private Collection _formats; - - /// - /// Gets the formatsdefined in raw mshsnapin. - /// - /// - /// This member can be derived to provide the list of formats to be included for this mshsnapin. - /// - public virtual Collection Formats - { - get { return _formats ?? (_formats = new Collection()); } - } - - private Dictionary _regValues = null; - - /// - /// - /// - internal override Dictionary RegValues - { - get - { - if (_regValues == null) - { - _regValues = base.RegValues; - - if (!String.IsNullOrEmpty(this.CustomPSSnapInType)) - _regValues[RegistryStrings.MshSnapin_CustomPSSnapInType] = this.CustomPSSnapInType; - } - - return _regValues; - } - } - } -} diff --git a/src/System.Management.Automation/singleshell/installer/MshCoreMshSnapin.cs b/src/System.Management.Automation/singleshell/installer/MshCoreMshSnapin.cs deleted file mode 100644 index 04c7d88e5ff..00000000000 --- a/src/System.Management.Automation/singleshell/installer/MshCoreMshSnapin.cs +++ /dev/null @@ -1,113 +0,0 @@ -/********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. ---********************************************************************/ - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.ComponentModel; -using System.Configuration.Install; -using System.Reflection; -using Microsoft.Win32; -using System.IO; -using System.Management.Automation; - -namespace Microsoft.PowerShell -{ - /// - /// - /// MshCoreMshSnapin (or MshCoreMshSnapinInstaller) is a class for facilitating registry - /// of necessary information for monad core mshsnapin. - /// - /// This class will be built with monad core engine dll - /// (System.Management.Automation.dll). - /// - /// - /// - [RunInstaller(true)] - public sealed class PSCorePSSnapIn : PSSnapIn - { - /// - /// Create an instance of this class. - /// - public PSCorePSSnapIn() - : base() - { - } - - /// - /// Get name of this mshsnapin. - /// - public override string Name - { - get - { - return RegistryStrings.CoreMshSnapinName; - } - } - - /// - /// Get the default vendor string for this mshsnapin. - /// - public override string Vendor - { - get - { - return "Microsoft"; - } - } - - /// - /// Get resource information for vendor. This is a string of format: resourceBaseName,resourceName. - /// - public override string VendorResource - { - get - { - return "CoreMshSnapInResources,Vendor"; - } - } - - /// - /// Get the default description string for this mshsnapin. - /// - public override string Description - { - get - { - return "This PSSnapIn contains MSH management cmdlets used to manage components affecting the MSH engine."; - } - } - - /// - /// Get resource information for description. This is a string of format: resourceBaseName,resourceName. - /// - public override string DescriptionResource - { - get - { - return "CoreMshSnapInResources,Description"; - } - } - - /// - /// Get type files to be used for this mshsnapin. - /// - public override string[] Types { get; } = new string[] { "types.ps1xml" }; - - /// - /// Get format files to be used for this mshsnapin. - /// - public override string[] Formats { get; } = new string[] { - "Certificate.format.ps1xml", - "DotNetTypes.format.ps1xml", - "FileSystem.format.ps1xml", - "Help.format.ps1xml", - "HelpV3.format.ps1xml", - "PowerShellCore.format.ps1xml", - "PowerShellTrace.format.ps1xml", - "Registry.format.ps1xml" - }; - } -} diff --git a/src/System.Management.Automation/singleshell/installer/MshInstaller.cs b/src/System.Management.Automation/singleshell/installer/MshInstaller.cs deleted file mode 100644 index de0a3e9d7d7..00000000000 --- a/src/System.Management.Automation/singleshell/installer/MshInstaller.cs +++ /dev/null @@ -1,220 +0,0 @@ -/********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. ---********************************************************************/ - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.ComponentModel; -using System.Configuration.Install; -using System.Reflection; -using Microsoft.Win32; -using System.IO; -using System.Text; -using System.Threading; -using System.Globalization; -using Dbg = System.Management.Automation.Diagnostics; - -namespace System.Management.Automation -{ - /// - /// - /// PSInstaller is a class for facilitating installation - /// of monad engine and monad PSSnapin's. - /// - /// This class implements installer api from CLR. At install - /// time, installation utilities (like InstallUtil.exe) will - /// call api implementation functions in this class automatically. - /// This includes functions like Install, Uninstall, Rollback - /// and Commit. - /// - /// This class is an abstract class for handling installation needs - /// that are common for all monad components, which include, - /// - /// 1. accessing system registry - /// 2. support of additional command line parameters. - /// 3. writing registry files - /// 4. automatically extract information like vender, version, etc. - /// - /// Different monad component will derive from this class. Two common - /// components that need install include, - /// - /// 1. PSSnapin. Installation of PSSnapin will require information - /// about PSSnapin assembly, version, vendor, etc to be - /// written to registry. - /// - /// 2. Engine. Installation of monad engine will require information - /// about engine assembly, version, CLR information to be - /// written to registry. - /// - /// - /// - /// - /// This is an abstract class to be derived by monad engine and PSSnapin installers - /// only. Developer should not directly derive from this class. - /// - public abstract class PSInstaller : Installer - { - private static string[] MshRegistryRoots - { - get - { - // For 3.0 PowerShell, we use "3" as the registry version key only for Engine - // related data like ApplicationBase. - // For 3.0 PowerShell, we still use "1" as the registry version key for - // Snapin and Custom shell lookup/discovery. - return new string[] { - "HKEY_LOCAL_MACHINE\\Software\\Microsoft\\PowerShell\\" + PSVersionInfo.RegistryVersion1Key + "\\" - }; - } - } - - /// - /// - /// - internal abstract string RegKey - { - get; - } - - /// - /// - /// - internal abstract Dictionary RegValues - { - get; - } - - /// - /// - /// - /// - public sealed override void Install(IDictionary stateSaver) - { - base.Install(stateSaver); - - WriteRegistry(); - - return; - } - - private void WriteRegistry() - { - foreach (string root in MshRegistryRoots) - { - RegistryKey key = GetRegistryKey(root + RegKey); - - foreach (var pair in RegValues) - { - key.SetValue(pair.Key, pair.Value); - } - } - } - - private RegistryKey GetRegistryKey(string keyPath) - { - RegistryKey root = GetRootHive(keyPath); - - if (root == null) - return null; - - return root.CreateSubKey(GetSubkeyPath(keyPath)); - } - - private static string GetSubkeyPath(string keyPath) - { - int index = keyPath.IndexOf('\\'); - if (index > 0) - { - return keyPath.Substring(index + 1); - } - - return null; - } - - private static RegistryKey GetRootHive(string keyPath) - { - string root; - - int index = keyPath.IndexOf('\\'); - if (index > 0) - { - root = keyPath.Substring(0, index); - } - else - { - root = keyPath; - } - - switch (root.ToUpperInvariant()) - { - case "HKEY_CURRENT_USER": - return Registry.CurrentUser; - case "HKEY_LOCAL_MACHINE": - return Registry.LocalMachine; - case "HKEY_CLASSES_ROOT": - return Registry.ClassesRoot; - case "HKEY_CURRENT_CONFIG": - return Registry.CurrentConfig; - case "HKEY_PERFORMANCE_DATA": - return Registry.PerformanceData; - case "HKEY_USERS": - return Registry.Users; - } - - return null; - } - - /// - /// Uninstall this msh component - /// - /// - public sealed override void Uninstall(IDictionary savedState) - { - base.Uninstall(savedState); - - if (this.Context != null && this.Context.Parameters != null && this.Context.Parameters.ContainsKey("RegFile")) - { - string regFile = this.Context.Parameters["RegFile"]; - - // If regfile is specified. Don't uninstall. - if (!String.IsNullOrEmpty(regFile)) - return; - } - - string keyName; - string parentKey; - - int index = RegKey.LastIndexOf('\\'); - if (index >= 0) - { - parentKey = RegKey.Substring(0, index); - keyName = RegKey.Substring(index + 1); - } - else - { - parentKey = ""; - keyName = RegKey; - } - - foreach (string root in MshRegistryRoots) - { - RegistryKey key = GetRegistryKey(root + parentKey); - - key.DeleteSubKey(keyName); - } - - return; - } - - /// - /// Rollback this msh component - /// - /// - public sealed override void Rollback(IDictionary savedState) - { - Uninstall(savedState); - } - } -} diff --git a/src/System.Management.Automation/singleshell/installer/MshSnapin.cs b/src/System.Management.Automation/singleshell/installer/MshSnapin.cs deleted file mode 100644 index 72d178740aa..00000000000 --- a/src/System.Management.Automation/singleshell/installer/MshSnapin.cs +++ /dev/null @@ -1,88 +0,0 @@ -/********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. ---********************************************************************/ - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.ComponentModel; -using System.Reflection; -using Microsoft.Win32; -using System.IO; -using System.Management.Automation.Runspaces; - -namespace System.Management.Automation -{ - /// - /// - /// MshSnapin is a class for regular mshsnapin's which is constructed - /// based on mshsnapin assembly. - /// - /// This class derives from PSSnapInInstaller and will be used as the base - /// for all regular mshsnapins. - /// - /// - /// - /// - /// Developers should derive from this class when implementing their own - /// mshsnapins. - /// - /// Derived mshsnapins should be denoted with [RunInstaller] attribute - /// so that installutil.exe can directly install the mshsnapin into registry. - /// - public abstract class PSSnapIn : PSSnapInInstaller - { - /// - /// Gets list of format files to be loaded for this mshsnapin. - /// - /// - /// This member can be derived to provide the list of formats to be loaded for this mshsnapin. - /// - public virtual string[] Formats - { - get - { - return null; - } - } - - /// - /// Gets list of type files to be loaded for this mshsnapin. - /// - /// - /// This member can be derived to provide the list of types to be loaded for this mshsnapin. - /// - public virtual string[] Types - { - get - { - return null; - } - } - - private Dictionary _regValues = null; - - /// - /// - /// - internal override Dictionary RegValues - { - get - { - if (_regValues == null) - { - _regValues = base.RegValues; - - if (this.Types != null && this.Types.Length > 0) - _regValues[RegistryStrings.MshSnapin_BuiltInTypes] = this.Types; - - if (this.Formats != null && this.Formats.Length > 0) - _regValues[RegistryStrings.MshSnapin_BuiltInFormats] = this.Formats; - } - - return _regValues; - } - } - } -} diff --git a/src/System.Management.Automation/singleshell/installer/MshSnapinInstaller.cs b/src/System.Management.Automation/singleshell/installer/MshSnapinInstaller.cs deleted file mode 100644 index f56cae6e93d..00000000000 --- a/src/System.Management.Automation/singleshell/installer/MshSnapinInstaller.cs +++ /dev/null @@ -1,159 +0,0 @@ -/********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. ---********************************************************************/ - -using System.Collections.Generic; -using System.Configuration.Install; -using System.IO; - -namespace System.Management.Automation -{ - /// - /// - /// MshSnapinBase (or MshSnapinInstaller) is a class for facilitating registry of necessary - /// information for monad mshsnapin's. - /// - /// This class will be built with monad core engine dll - /// (System.Management.Automation.dll). - /// - /// This is the base class for two kinds of mshsnapins: MshSnapin and CustomMshSnapin. - /// - /// Each mshsnapin assembly should derive from this class (indirectly) and fill - /// in information about mshsnapin name, vendor, and version. - /// - /// At install time, installation utilities (like InstallUtil.exe) will - /// call install this engine assembly based on the implementation in - /// this class. - /// - /// This class derives from base class PSInstaller. PSInstaller will - /// handle the details about how information got written into registry. - /// Here, the information about registry content is provided. - /// - /// The reason of not calling this class MshSnapinInstaller is to "hide" the details - /// that MshSnapin class is actually doing installation. It is also more intuitive - /// since people deriving from this class will think there are really - /// implementing a class for mshsnapin. - /// - /// - /// - /// - /// This is an abstract class to be derived by monad mshsnapin and custom mshsnapin. - /// MshSnapin developer should not directly derive from this class. - /// - public abstract class PSSnapInInstaller : PSInstaller - { - /// - /// - /// - public abstract string Name - { - get; - } - - /// - /// - /// - public abstract string Vendor - { - get; - } - - /// - /// - /// - public virtual string VendorResource - { - get - { - return null; - } - } - - /// - /// - /// - public abstract string Description - { - get; - } - - /// - /// - /// - public virtual string DescriptionResource - { - get - { - return null; - } - } - - /// - /// - /// - private string MshSnapinVersion - { - get - { - return this.GetType().Assembly.GetName().Version.ToString(); - } - } - - private string _psVersion = null; - /// - /// - /// - private string PSVersion - { - get { return _psVersion ?? (_psVersion = PSVersionInfo.FeatureVersionString); } - } - - /// - /// - /// - internal sealed override string RegKey - { - get - { - PSSnapInInfo.VerifyPSSnapInFormatThrowIfError(this.Name); - - return RegistryStrings.MshSnapinKey + "\\" + Name; - } - } - - private Dictionary _regValues = null; - /// - /// - /// - internal override Dictionary RegValues - { - get - { - if (_regValues == null) - { - _regValues = new Dictionary(); - _regValues[RegistryStrings.MshSnapin_MonadVersion] = this.PSVersion; - - if (!String.IsNullOrEmpty(this.Vendor)) - _regValues[RegistryStrings.MshSnapin_Vendor] = this.Vendor; - - if (!String.IsNullOrEmpty(this.Description)) - _regValues[RegistryStrings.MshSnapin_Description] = this.Description; - - if (!String.IsNullOrEmpty(this.VendorResource)) - _regValues[RegistryStrings.MshSnapin_VendorResource] = this.VendorResource; - - if (!String.IsNullOrEmpty(this.DescriptionResource)) - _regValues[RegistryStrings.MshSnapin_DescriptionResource] = this.DescriptionResource; - - _regValues[RegistryStrings.MshSnapin_Version] = this.MshSnapinVersion; - _regValues[RegistryStrings.MshSnapin_ApplicationBase] = Path.GetDirectoryName(this.GetType().Assembly.Location); - _regValues[RegistryStrings.MshSnapin_AssemblyName] = this.GetType().Assembly.FullName; - _regValues[RegistryStrings.MshSnapin_ModuleName] = this.GetType().Assembly.Location; - } - - return _regValues; - } - } - } -} diff --git a/src/System.Management.Automation/minishell/api/FormatAndTypeDataHelper.cs b/src/System.Management.Automation/utils/FormatAndTypeDataHelper.cs similarity index 63% rename from src/System.Management.Automation/minishell/api/FormatAndTypeDataHelper.cs rename to src/System.Management.Automation/utils/FormatAndTypeDataHelper.cs index 4af4b553ea6..2817677295a 100644 --- a/src/System.Management.Automation/minishell/api/FormatAndTypeDataHelper.cs +++ b/src/System.Management.Automation/utils/FormatAndTypeDataHelper.cs @@ -69,89 +69,9 @@ internal static class FormatAndTypeDataHelper private const string DuplicateFile = "DuplicateFile"; internal const string ValidationException = "ValidationException"; - private static string GetBaseFolder( - RunspaceConfiguration runspaceConfiguration, - Collection independentErrors) + private static string GetBaseFolder(Collection independentErrors) { - string returnValue = CommandDiscovery.GetShellPathFromRegistry(runspaceConfiguration.ShellId); - if (returnValue == null) - { - returnValue = Path.GetDirectoryName(PsUtils.GetMainModule(System.Diagnostics.Process.GetCurrentProcess()).FileName); - } - else - { - returnValue = Path.GetDirectoryName(returnValue); - if (!Directory.Exists(returnValue)) - { - string newReturnValue = Path.GetDirectoryName(typeof(FormatAndTypeDataHelper).GetTypeInfo().Assembly.Location); - string error = StringUtil.Format(TypesXmlStrings.CannotFindRegistryKeyPath, returnValue, - Utils.GetRegistryConfigurationPath(runspaceConfiguration.ShellId), "\\Path", newReturnValue); - independentErrors.Add(error); - returnValue = newReturnValue; - } - } - return returnValue; - } - - internal static Collection GetFormatAndTypesErrors( - RunspaceConfiguration runspaceConfiguration, - PSHost host, - IEnumerable configurationEntryCollection, - Collection independentErrors, - Collection entryIndicesToRemove) - { - Collection returnValue = new Collection(); - - string baseFolder = GetBaseFolder(runspaceConfiguration, independentErrors); - var psHome = Utils.DefaultPowerShellAppBase; - - // this hashtable will be used to check whether this is duplicated file for types or formats. - HashSet fullFileNameSet = new HashSet(StringComparer.OrdinalIgnoreCase); - int index = -1; - - foreach (var configurationEntry in configurationEntryCollection) - { - string fileName; - string psSnapinName = configurationEntry.PSSnapIn == null ? runspaceConfiguration.ShellId : configurationEntry.PSSnapIn.Name; - index++; - var typeEntry = configurationEntry as TypeConfigurationEntry; - if (typeEntry != null) - { - fileName = typeEntry.FileName; - - if (fileName == null) - { - returnValue.Add(new PSSnapInTypeAndFormatErrors(psSnapinName, typeEntry.TypeData, typeEntry.IsRemove)); - continue; - } - } - else - { - FormatConfigurationEntry formatEntry = (FormatConfigurationEntry)configurationEntry; - fileName = formatEntry.FileName; - - if (fileName == null) - { - returnValue.Add(new PSSnapInTypeAndFormatErrors(psSnapinName, formatEntry.FormatData)); - continue; - } - } - - bool checkFileExists = configurationEntry.PSSnapIn == null || string.Equals(psHome, configurationEntry.PSSnapIn.AbsoluteModulePath, StringComparison.OrdinalIgnoreCase); - bool needToRemoveEntry = false; - string fullFileName = GetAndCheckFullFileName(psSnapinName, fullFileNameSet, baseFolder, fileName, independentErrors, ref needToRemoveEntry, checkFileExists); - if (fullFileName == null) - { - if (needToRemoveEntry) - { - entryIndicesToRemove.Add(index); - } - continue; - } - - returnValue.Add(new PSSnapInTypeAndFormatErrors(psSnapinName, fullFileName)); - } - return returnValue; + return Path.GetDirectoryName(PsUtils.GetMainModule(System.Diagnostics.Process.GetCurrentProcess()).FileName); } private static string GetAndCheckFullFileName( diff --git a/test/powershell/Modules/Microsoft.PowerShell.Utility/Update-FormatData.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Utility/Update-FormatData.Tests.ps1 index 24e07d43e7e..28b726f7b6e 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Utility/Update-FormatData.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Utility/Update-FormatData.Tests.ps1 @@ -56,6 +56,20 @@ Describe "Update-FormatData basic functionality" -Tags "CI" { { Update-FormatData -Append $testfile -WhatIf } | Should Not Throw { Update-FormatData -Prepend $testfile -WhatIf } | Should Not Throw } + + It "Update with invalid format xml should fail" -Pending { + $xmlContent = @" + + + + T2 + + + +"@ + $xmlContent | Out-File -FilePath "$testdrive\test.format.ps1xml" -Encoding ascii + { Update-FormatData -Path "$testdrive\test.format.ps1xml" -ErrorAction Stop } | ShouldBeErrorId "FormatXmlUpdateException,Microsoft.PowerShell.Commands.UpdateFormatDataCommand" + } } diff --git a/test/powershell/engine/Api/BasicEngine.Tests.ps1 b/test/powershell/engine/Api/BasicEngine.Tests.ps1 index 05ce39c8b50..16e5d7dd884 100644 --- a/test/powershell/engine/Api/BasicEngine.Tests.ps1 +++ b/test/powershell/engine/Api/BasicEngine.Tests.ps1 @@ -10,7 +10,7 @@ Describe 'Basic engine APIs' -Tags "CI" { $result = $ps.Invoke() $result.Count | Should Be 1 - $result[0].PSSnapIn.Name | Should Be "Microsoft.WSMan.Management" + $result[0].Source | Should Be "Microsoft.WSMan.Management" } } From dd5fba3313cbe6c5047399a1d781f39e8f975d56 Mon Sep 17 00:00:00 2001 From: Chunqing Chen Date: Wed, 18 Oct 2017 09:26:24 -0700 Subject: [PATCH 012/617] Exclude PSHostProcess cmdlets from Unix platforms (#5105) - Exclude 'Get-PSHostProcessInfo', 'Enter-PSHostProcess' and 'Exit-PSHostProcess' from Unix platforms. - Update tests and add additional cmdlets need to be excluded --- .../engine/InitialSessionState.cs | 6 +++--- test/powershell/engine/Basic/DefaultCommands.Tests.ps1 | 6 +++--- .../engine/Remoting/RemoteSession.Basic.Tests.ps1 | 1 + 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/System.Management.Automation/engine/InitialSessionState.cs b/src/System.Management.Automation/engine/InitialSessionState.cs index 1576ce2b744..a050c4d6806 100644 --- a/src/System.Management.Automation/engine/InitialSessionState.cs +++ b/src/System.Management.Automation/engine/InitialSessionState.cs @@ -5504,11 +5504,12 @@ private static void InitializeCoreCmdletsAndProviders( #if !UNIX {"Disable-PSRemoting", new SessionStateCmdletEntry("Disable-PSRemoting", typeof(DisablePSRemotingCommand), helpFile) }, {"Enable-PSRemoting", new SessionStateCmdletEntry("Enable-PSRemoting", typeof(EnablePSRemotingCommand), helpFile) }, + {"Get-PSHostProcessInfo", new SessionStateCmdletEntry("Get-PSHostProcessInfo", typeof(GetPSHostProcessInfoCommand), helpFile) }, + {"Enter-PSHostProcess", new SessionStateCmdletEntry("Enter-PSHostProcess", typeof(EnterPSHostProcessCommand), helpFile) }, + {"Exit-PSHostProcess", new SessionStateCmdletEntry("Exit-PSHostProcess", typeof(ExitPSHostProcessCommand), helpFile) }, #endif {"Enable-PSSessionConfiguration", new SessionStateCmdletEntry("Enable-PSSessionConfiguration", typeof(EnablePSSessionConfigurationCommand), helpFile) }, - {"Enter-PSHostProcess", new SessionStateCmdletEntry("Enter-PSHostProcess", typeof(EnterPSHostProcessCommand), helpFile) }, {"Enter-PSSession", new SessionStateCmdletEntry("Enter-PSSession", typeof(EnterPSSessionCommand), helpFile) }, - {"Exit-PSHostProcess", new SessionStateCmdletEntry("Exit-PSHostProcess", typeof(ExitPSHostProcessCommand), helpFile) }, {"Exit-PSSession", new SessionStateCmdletEntry("Exit-PSSession", typeof(ExitPSSessionCommand), helpFile) }, {"Export-ModuleMember", new SessionStateCmdletEntry("Export-ModuleMember", typeof(ExportModuleMemberCommand), helpFile) }, {"ForEach-Object", new SessionStateCmdletEntry("ForEach-Object", typeof(ForEachObjectCommand), helpFile) }, @@ -5517,7 +5518,6 @@ private static void InitializeCoreCmdletsAndProviders( {"Get-History", new SessionStateCmdletEntry("Get-History", typeof(GetHistoryCommand), helpFile) }, {"Get-Job", new SessionStateCmdletEntry("Get-Job", typeof(GetJobCommand), helpFile) }, {"Get-Module", new SessionStateCmdletEntry("Get-Module", typeof(GetModuleCommand), helpFile) }, - {"Get-PSHostProcessInfo", new SessionStateCmdletEntry("Get-PSHostProcessInfo", typeof(GetPSHostProcessInfoCommand), helpFile) }, {"Get-PSSession", new SessionStateCmdletEntry("Get-PSSession", typeof(GetPSSessionCommand), helpFile) }, {"Get-PSSessionCapability", new SessionStateCmdletEntry("Get-PSSessionCapability", typeof(GetPSSessionCapabilityCommand), helpFile) }, {"Get-PSSessionConfiguration", new SessionStateCmdletEntry("Get-PSSessionConfiguration", typeof(GetPSSessionConfigurationCommand), helpFile) }, diff --git a/test/powershell/engine/Basic/DefaultCommands.Tests.ps1 b/test/powershell/engine/Basic/DefaultCommands.Tests.ps1 index af5322a5e05..a6a54b3bceb 100644 --- a/test/powershell/engine/Basic/DefaultCommands.Tests.ps1 +++ b/test/powershell/engine/Basic/DefaultCommands.Tests.ps1 @@ -218,9 +218,9 @@ Describe "Verify approved aliases list" -Tags "CI" { "Cmdlet", "Enable-PSSessionConfiguration", , $($FullCLR -or $CoreWindows -or $CoreUnix) "Cmdlet", "Enable-RunspaceDebug", , $($FullCLR -or $CoreWindows -or $CoreUnix) "Cmdlet", "Enable-WSManCredSSP", , $($FullCLR -or $CoreWindows ) -"Cmdlet", "Enter-PSHostProcess", , $($FullCLR -or $CoreWindows -or $CoreUnix) +"Cmdlet", "Enter-PSHostProcess", , $($FullCLR -or $CoreWindows ) "Cmdlet", "Enter-PSSession", , $($FullCLR -or $CoreWindows -or $CoreUnix) -"Cmdlet", "Exit-PSHostProcess", , $($FullCLR -or $CoreWindows -or $CoreUnix) +"Cmdlet", "Exit-PSHostProcess", , $($FullCLR -or $CoreWindows ) "Cmdlet", "Exit-PSSession", , $($FullCLR -or $CoreWindows -or $CoreUnix) "Cmdlet", "Export-Alias", , $($FullCLR -or $CoreWindows -or $CoreUnix) "Cmdlet", "Export-Clixml", , $($FullCLR -or $CoreWindows -or $CoreUnix) @@ -274,7 +274,7 @@ Describe "Verify approved aliases list" -Tags "CI" { "Cmdlet", "Get-PSBreakpoint", , $($FullCLR -or $CoreWindows -or $CoreUnix) "Cmdlet", "Get-PSCallStack", , $($FullCLR -or $CoreWindows -or $CoreUnix) "Cmdlet", "Get-PSDrive", , $($FullCLR -or $CoreWindows -or $CoreUnix) -"Cmdlet", "Get-PSHostProcessInfo", , $($FullCLR -or $CoreWindows -or $CoreUnix) +"Cmdlet", "Get-PSHostProcessInfo", , $($FullCLR -or $CoreWindows ) "Cmdlet", "Get-PSProvider", , $($FullCLR -or $CoreWindows -or $CoreUnix) "Cmdlet", "Get-PSSession", , $($FullCLR -or $CoreWindows -or $CoreUnix) "Cmdlet", "Get-PSSessionCapability", , $($FullCLR -or $CoreWindows -or $CoreUnix) diff --git a/test/powershell/engine/Remoting/RemoteSession.Basic.Tests.ps1 b/test/powershell/engine/Remoting/RemoteSession.Basic.Tests.ps1 index 5c5918bc3c3..ff78ef011ae 100644 --- a/test/powershell/engine/Remoting/RemoteSession.Basic.Tests.ps1 +++ b/test/powershell/engine/Remoting/RemoteSession.Basic.Tests.ps1 @@ -280,3 +280,4 @@ Describe "Remoting loopback tests" -Tags @('CI', 'RequireAdminOnWindows') { $result | Should Be 100 } } + From db6aec0850199750ba8a711d139d2b1c9c886f6c Mon Sep 17 00:00:00 2001 From: Travis Plunk Date: Wed, 18 Oct 2017 10:08:11 -0700 Subject: [PATCH 013/617] Add compiler switches replace dangerous function with safer ones. (#5089) * Add compiler switches replace the dangerous function with safer ones. * Add -02 and make linker flags per platform * add -O2 for arm and add -z,now * remove windows linker flags --- src/libpsl-native/CMakeLists.txt | 9 ++++++++- src/libpsl-native/arm.toolchain.cmake | 3 ++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/libpsl-native/CMakeLists.txt b/src/libpsl-native/CMakeLists.txt index 60d42a35294..e4f33cce07b 100644 --- a/src/libpsl-native/CMakeLists.txt +++ b/src/libpsl-native/CMakeLists.txt @@ -3,7 +3,14 @@ project(PSL-NATIVE) # Can't use add_compile_options with 2.8.11 set(CMAKE_BUILD_TYPE "Release") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Werror -fstack-protector-strong -fpie") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Werror -fstack-protector-strong -fpie -DFORTIFY_SOURCE=2 -O2") + +if (${CMAKE_SYSTEM_NAME} MATCHES "Linux") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,relro,-z,now") +elseif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl") +endif() + set(LIBRARY_OUTPUT_PATH "${PROJECT_SOURCE_DIR}/../powershell-unix") if (CMAKE_SYSTEM_PROCESSOR MATCHES "arm*") diff --git a/src/libpsl-native/arm.toolchain.cmake b/src/libpsl-native/arm.toolchain.cmake index c8f20e0e7dd..c2c68104d81 100644 --- a/src/libpsl-native/arm.toolchain.cmake +++ b/src/libpsl-native/arm.toolchain.cmake @@ -1,7 +1,8 @@ set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_VERSION 1) set(CMAKE_SYSTEM_PROCESSOR armv7l) -set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++ -fstack-protector-strong -fpie) +set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++ -fstack-protector-strong -fpie -DFORTIFY_SOURCE=2 -O2) +set(CMAKE_SHARED_LINKER_FLAGS "-Wl,-z,relro,-z,now") set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc) # add_compile_options(-target armv7-linux-gnueabihf) From 2ceec725f6f14e05d8fe7ee03e52b2814bfaf48b Mon Sep 17 00:00:00 2001 From: Dongbo Wang Date: Wed, 18 Oct 2017 11:36:25 -0700 Subject: [PATCH 014/617] Fetch resource string correctly (#5114) --- .../commands/utility/AddMember.cs | 2 +- .../commands/utility/WebCmdlet/ConvertToJsonCommand.cs | 4 +--- .../Microsoft.PowerShell.Utility/Add-Member.Tests.ps1 | 8 ++++++++ 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/AddMember.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/AddMember.cs index ca2aa30235f..e645fe871f4 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/AddMember.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/AddMember.cs @@ -514,7 +514,7 @@ private void UpdateTypeNames() private ErrorRecord NewError(string errorId, string resourceId, object targetObject, params object[] args) { ErrorDetails details = new ErrorDetails(this.GetType().GetTypeInfo().Assembly, - "AddMember", resourceId, args); + "Microsoft.PowerShell.Commands.Utility.resources.AddMember", resourceId, args); ErrorRecord errorRecord = new ErrorRecord( new InvalidOperationException(details.Message), errorId, diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/ConvertToJsonCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/ConvertToJsonCommand.cs index 4def219c2c6..5c1e1f14211 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/ConvertToJsonCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/ConvertToJsonCommand.cs @@ -381,10 +381,8 @@ private void AddSpaces(int numberOfSpacesToReturn, StringBuilder result) private ErrorRecord NewError() { - ErrorDetails details = new ErrorDetails(this.GetType().GetTypeInfo().Assembly, - "WebCmdletStrings", "JsonStringInBadFormat"); ErrorRecord errorRecord = new ErrorRecord( - new InvalidOperationException(details.Message), + new InvalidOperationException(WebCmdletStrings.JsonStringInBadFormat), "JsonStringInBadFormat", ErrorCategory.InvalidOperation, InputObject); diff --git a/test/powershell/Modules/Microsoft.PowerShell.Utility/Add-Member.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Utility/Add-Member.Tests.ps1 index eb855cda046..54634705e0b 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Utility/Add-Member.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Utility/Add-Member.Tests.ps1 @@ -276,6 +276,14 @@ $results = add-member -InputObject a 16 sp {1+1} -passthru $results.sp | Should Be 2 } + + It "Verify Add-Member error message is not empty" { + $object = @(1,2) + Add-Member -InputObject $object "ABC" "Value1" + Add-Member -InputObject $object "ABC" "Value2" -ErrorVariable errorVar -ErrorAction SilentlyContinue + $errorVar.Exception | Should BeOfType "System.InvalidOperationException" + $errorVar.Exception.Message | Should Not BeNullOrEmpty + } } Describe "Add-Member" -Tags "CI" { From 01fe7c24eb58b18e0bf07c6f1f7fc14c42cf2208 Mon Sep 17 00:00:00 2001 From: Greg Zimmerman Date: Wed, 18 Oct 2017 15:22:07 -0400 Subject: [PATCH 015/617] Add macos launcher. (#5138) --- .../PowerShell.app/Contents/Info.plist | 28 +++++++++++++ .../Contents/MacOS/PowerShell.sh | 2 + tools/packaging/packaging.psm1 | 42 +++++++++++++++++++ 3 files changed, 72 insertions(+) create mode 100755 tools/packaging/macos/launcher/ROOT/Applications/PowerShell.app/Contents/Info.plist create mode 100755 tools/packaging/macos/launcher/ROOT/Applications/PowerShell.app/Contents/MacOS/PowerShell.sh diff --git a/tools/packaging/macos/launcher/ROOT/Applications/PowerShell.app/Contents/Info.plist b/tools/packaging/macos/launcher/ROOT/Applications/PowerShell.app/Contents/Info.plist new file mode 100755 index 00000000000..f85b0ed0495 --- /dev/null +++ b/tools/packaging/macos/launcher/ROOT/Applications/PowerShell.app/Contents/Info.plist @@ -0,0 +1,28 @@ + + + + + CFBundleExecutable + PowerShell.sh + CFBundleGetInfoString + 1.0 + CFBundleIconFile + Powershell + CFBundleIdentifier + powershell + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + PowerShell + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSupportedPlatforms + + MacOSX + + CFBundleVersion + 1.0 + + diff --git a/tools/packaging/macos/launcher/ROOT/Applications/PowerShell.app/Contents/MacOS/PowerShell.sh b/tools/packaging/macos/launcher/ROOT/Applications/PowerShell.app/Contents/MacOS/PowerShell.sh new file mode 100755 index 00000000000..dab22d55615 --- /dev/null +++ b/tools/packaging/macos/launcher/ROOT/Applications/PowerShell.app/Contents/MacOS/PowerShell.sh @@ -0,0 +1,2 @@ +#!/bin/bash +open /usr/local/bin/powershell diff --git a/tools/packaging/packaging.psm1 b/tools/packaging/packaging.psm1 index 9f9ad26ac61..7eb47980374 100644 --- a/tools/packaging/packaging.psm1 +++ b/tools/packaging/packaging.psm1 @@ -584,6 +584,48 @@ function New-UnixPackage { "$GzipFile=$ManFile", "/tmp/pwsh=$Link" ) + + # Add macOS powershell launcher + if($Type -eq "osxpkg") + { + if($pscmdlet.ShouldProcess("Add macOS launch application")) { + # Define folder for launch application. + $macosapp = "$PSScriptRoot/macos/launcher/ROOT/Applications/Powershell.app" + + # Update icns file. + $iconfile = "$PSScriptRoot/../../assets/Powershell.icns" + $iconfilebase = (Get-Item -Path $iconfile).BaseName + # Create Resources folder, ignore error if exists. + New-Item -Force -ItemType Directory -Path "$macosapp/Contents/Resources" | Out-Null + Copy-Item -Force -Path $iconfile -Destination "$macosapp/Contents/Resources" + + # Set values in plist. + $plist = "$macosapp/Contents/Info.plist" + Start-NativeExecution { + defaults write $plist CFBundleIdentifier $Name + defaults write $plist CFBundleVersion $Version + defaults write $plist CFBundleShortVersionString $Version + defaults write $plist CFBundleGetInfoString $Version + defaults write $plist CFBundleIconFile $iconfilebase + } + + # Convert to XML plist, needed because defaults native + # app auto converts it to binary format when it modify + # the plist file. + Start-NativeExecution { + plutil -convert xml1 $plist + } + # Set permissions. + Start-NativeExecution { + find $macosapp | xargs chmod 755 + } + + # Add app folder to fpm paths. + $appsfolder = (Resolve-Path -Path "$macosapp/..").Path + $Arguments += "$appsfolder=/" + } + } + # Build package try { if($pscmdlet.ShouldProcess("Create $type package")) { From b4e8e9d06b1245c4a87f780ad86986b3da10eacd Mon Sep 17 00:00:00 2001 From: Mark Kraus Date: Wed, 18 Oct 2017 14:24:02 -0500 Subject: [PATCH 016/617] Replace HttpBin.org/response-headers Tests with WebListener (#5058) --- .spelling | 5 ++ .../WebCmdlets.Tests.ps1 | 6 ++- .../Modules/WebListener/WebListener.psm1 | 14 +++++- .../Controllers/ResponseHeadersController.cs | 49 +++++++++++++++++++ test/tools/WebListener/README.md | 31 ++++++++++++ .../tools/WebListener/Views/Home/Index.cshtml | 1 + 6 files changed, 103 insertions(+), 3 deletions(-) create mode 100644 test/tools/WebListener/Controllers/ResponseHeadersController.cs diff --git a/.spelling b/.spelling index 96fda43c39d..53561fdcba9 100644 --- a/.spelling +++ b/.spelling @@ -1191,3 +1191,8 @@ tests.zip v5.0 v6.0. #endregion + +#region test/tools/WebListener/README.md Overrides + - test/tools/WebListener/README.md +ResponseHeaders +#endregion diff --git a/test/powershell/Modules/Microsoft.PowerShell.Utility/WebCmdlets.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Utility/WebCmdlets.Tests.ps1 index 927f2151c58..e4b9ebe22d4 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Utility/WebCmdlets.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Utility/WebCmdlets.Tests.ps1 @@ -737,7 +737,8 @@ Describe "Invoke-WebRequest tests" -Tags "Feature" { It "Validate Invoke-WebRequest handles missing Content-Type in response header" { #Validate that exception is not thrown when response headers are missing Content-Type. - $command = "Invoke-WebRequest -Uri 'http://httpbin.org/response-headers?Content-Type='" + $uri = Get-WebListenerUrl -Test 'ResponseHeaders' -Query @{'Content-Type' = ''} + $command = "Invoke-WebRequest -Uri '$uri'" $result = ExecuteWebCommand -command $command $result.Error | Should BeNullOrEmpty } @@ -1697,7 +1698,8 @@ Describe "Invoke-RestMethod tests" -Tags "Feature" { It "Validate Invoke-RestMethod handles missing Content-Type in response header" { #Validate that exception is not thrown when response headers are missing Content-Type. - $command = "Invoke-RestMethod -Uri 'http://httpbin.org/response-headers?Content-Type='" + $uri = Get-WebListenerUrl -Test 'ResponseHeaders' -Query @{'Content-Type' = ''} + $command = "Invoke-RestMethod -Uri '$uri'" $result = ExecuteWebCommand -command $command $result.Error | Should BeNullOrEmpty } diff --git a/test/tools/Modules/WebListener/WebListener.psm1 b/test/tools/Modules/WebListener/WebListener.psm1 index 7e8b4eea999..a3125d07c6b 100644 --- a/test/tools/Modules/WebListener/WebListener.psm1 +++ b/test/tools/Modules/WebListener/WebListener.psm1 @@ -121,11 +121,14 @@ function Get-WebListenerUrl { 'Home', 'Multipart', 'Redirect', + 'ResponseHeaders', '/' )] [String]$Test, - [String]$TestValue + [String]$TestValue, + + [System.Collections.IDictionary]$Query ) process { $runningListener = Get-WebListener @@ -151,6 +154,15 @@ function Get-WebListenerUrl { { $Uri.Path = $Test } + $StringBuilder = [System.Text.StringBuilder]::new() + foreach ($key in $Query.Keys) + { + $null = $StringBuilder.Append([System.Net.WebUtility]::UrlEncode($key)) + $null = $StringBuilder.Append('=') + $null = $StringBuilder.Append([System.Net.WebUtility]::UrlEncode($Query[$key].ToString())) + $null = $StringBuilder.Append('&') + } + $Uri.Query = $StringBuilder.ToString() return [Uri]$Uri.ToString() } diff --git a/test/tools/WebListener/Controllers/ResponseHeadersController.cs b/test/tools/WebListener/Controllers/ResponseHeadersController.cs new file mode 100644 index 00000000000..04de81a727b --- /dev/null +++ b/test/tools/WebListener/Controllers/ResponseHeadersController.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Extensions; +using Microsoft.Extensions.Primitives; +using Newtonsoft.Json; +using mvc.Models; + +namespace mvc.Controllers +{ + public class ResponseHeadersController : Controller + { + public string Index() + { + Hashtable headers = new Hashtable(); + foreach (var key in Request.Query.Keys) + { + headers.Add(key, String.Join(Constants.HeaderSeparator, Request.Query[key])); + + if (String.Equals("Content-Type", key, StringComparison.InvariantCultureIgnoreCase)) + { + // Content-Type must be applied right before it is sent to the client or MVC will overwrite. + string contentType = Request.Query[key]; + Response.OnStarting(state => + { + var httpContext = (HttpContext) state; + httpContext.Response.ContentType = contentType; + return Task.FromResult(0); + }, HttpContext); + } + else + { + Response.Headers.TryAdd(key, Request.Query[key]); + } + } + return JsonConvert.SerializeObject(headers); + } + + public IActionResult Error() + { + return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier }); + } + } +} diff --git a/test/tools/WebListener/README.md b/test/tools/WebListener/README.md index b0c5c98b157..04dbd20ccb5 100644 --- a/test/tools/WebListener/README.md +++ b/test/tools/WebListener/README.md @@ -269,3 +269,34 @@ Location: /Get/

Redirecting...

You should be redirected automatically to target URL: /Get/. If not click the link. ``` + +## /ResponseHeaders/ + +Will return the response headers passed in query string. The response body will be the supplied headers as a JSON object. + +```powershell +$uri = Get-WebListenerUrl -Test 'ResponseHeaders' -Query @{'Content-Type' = 'custom'; 'x-header-01' = 'value01'; 'x-header-02' = 'value02'} +Invoke-RestMethod -Uri $uri +``` + +Response Headers: + +```none +HTTP/1.1 200 OK +Date: Sun, 08 Oct 2017 18:20:38 GMT +Transfer-Encoding: chunked +Server: Kestrel +x-header-02: value02 +x-header-01: value01 +Content-Type: custom +``` + +Body: + +```json +{ + "Content-Type": "custom", + "x-header-02": "value02", + "x-header-01": "value01" +} +``` diff --git a/test/tools/WebListener/Views/Home/Index.cshtml b/test/tools/WebListener/Views/Home/Index.cshtml index 8b914686652..6c88ce5e0a3 100644 --- a/test/tools/WebListener/Views/Home/Index.cshtml +++ b/test/tools/WebListener/Views/Home/Index.cshtml @@ -9,4 +9,5 @@

  • /Get/ - Emulates functionality of https://httpbin.org/get by returning GET headers, Arguments, and Request URL
  • /Multipart/ - Multipart/form-data submission testing
  • /Redirect/{count} - 302 redirect count times.
  • +
  • /ResponseHeaders/?key=val - Returns given response headers.
  • From 847846d834d693028cb6cbc6e8ae1cc9786a47b4 Mon Sep 17 00:00:00 2001 From: Steve Lee Date: Wed, 18 Oct 2017 15:49:46 -0700 Subject: [PATCH 017/617] [feature] (#4960) remove -computer support since corefx Process.GetProcesses(computer) returns local processes --- .../commands/management/Process.cs | 65 +------------------ 1 file changed, 3 insertions(+), 62 deletions(-) diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/Process.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/Process.cs index a49c5f7a2f6..c5f3e46cf69 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/Process.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/Process.cs @@ -69,12 +69,6 @@ internal enum MatchMode ///
    internal MatchMode myMode = MatchMode.All; - /// - /// The computer from which to retrieve processes. - /// - [SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays")] - protected string[] SuppliedComputerName { get; set; } = Utils.EmptyArray(); - /// /// The Name parameter is declared in subclasses, /// since it is optional for GetProcess and mandatory for StopProcess. @@ -228,19 +222,8 @@ private void RetrieveMatchingProcessesById() Process process; try { - if (SuppliedComputerName.Length > 0) - { - foreach (string computerName in SuppliedComputerName) - { - process = Process.GetProcessById(processId, computerName); - AddIdempotent(process); - } - } - else - { - process = Process.GetProcessById(processId); - AddIdempotent(process); - } + process = Process.GetProcessById(processId); + AddIdempotent(process); } catch (ArgumentException) { @@ -292,19 +275,7 @@ internal Process[] AllProcesses if (null == _allProcesses) { List processes = new List(); - - if (SuppliedComputerName.Length > 0) - { - foreach (string computerName in SuppliedComputerName) - { - processes.AddRange(Process.GetProcesses(computerName)); - } - } - else - { - processes.AddRange(Process.GetProcesses()); - } - + processes.AddRange(Process.GetProcesses()); _allProcesses = processes.ToArray(); } return _allProcesses; @@ -555,29 +526,6 @@ public SwitchParameter IncludeUserName } private bool _includeUserName = false; - - /// - /// gets/sets the destination computer name - /// - [Parameter(Mandatory = false, ParameterSetName = NameParameterSet, ValueFromPipelineByPropertyName = true)] - [Parameter(Mandatory = false, ParameterSetName = IdParameterSet, ValueFromPipelineByPropertyName = true)] - [Parameter(Mandatory = false, ParameterSetName = InputObjectParameterSet, ValueFromPipelineByPropertyName = true)] - [Alias("Cn")] - [ValidateNotNullOrEmpty()] - [SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays")] - public string[] ComputerName - { - get - { - return SuppliedComputerName; - } - set - { - SuppliedComputerName = value; - } - } - - /// ///To display the modules of a process /// @@ -621,13 +569,6 @@ protected override void BeginProcessing() ///
    protected override void ProcessRecord() { - if (ComputerName.Length > 0 && (FileVersionInfo.IsPresent || Module.IsPresent)) - { - Exception ex = new InvalidOperationException(ProcessResources.NoComputerNameWithFileVersion); - ErrorRecord er = new ErrorRecord(ex, "InvalidOperationException", ErrorCategory.InvalidOperation, ComputerName); - ThrowTerminatingError(er); - } - foreach (Process process in MatchingProcesses()) { //if module and fileversion are to be displayed From ca2630a3dea6420a3cd3914c84a74c1c45311f54 Mon Sep 17 00:00:00 2001 From: Keith Hill Date: Thu, 19 Oct 2017 12:32:40 -0600 Subject: [PATCH 018/617] Add document about how to create cmdlet w/dotnet CLI (#5117) --- .spelling | 9 + .../command-line-simple-example.md | 227 ++++++++++++++++++ test/common/markdown/markdown.tests.ps1 | 13 +- 3 files changed, 243 insertions(+), 6 deletions(-) create mode 100644 docs/cmdlet-example/command-line-simple-example.md diff --git a/.spelling b/.spelling index 53561fdcba9..fbd9211e362 100644 --- a/.spelling +++ b/.spelling @@ -487,6 +487,15 @@ src preview3 #endregion +#region docs/cmdlet-example/command-line-simple-example.md Overrides +- docs/cmdlet-example/command-line-simple-example.md +aka +classlib +dotnet +netstandard.dll +wsl +#endregion + #region docs/community/governance.md Overrides - docs/community/governance.md Aiello diff --git a/docs/cmdlet-example/command-line-simple-example.md b/docs/cmdlet-example/command-line-simple-example.md new file mode 100644 index 00000000000..0a2682413bd --- /dev/null +++ b/docs/cmdlet-example/command-line-simple-example.md @@ -0,0 +1,227 @@ +# Creating a cross-platform binary module with the .NET Core command-line interface tools + +This example uses the [.NET Core command-line interface tools][dotnet-cli] (aka +`dotnet` CLI) to demonstrate how to create a binary module that is portable across operating +systems supported by **PowerShell Core** as well as **Windows PowerShell** version 3 and higher. + +Because the binary module's assembly will be created as a .NET Standard 2.0 class library, +the same assembly can be imported into both PowerShell Core and Windows PowerShell. +This means you do not have to build and distribute separate assemblies that target these two +different implementations of PowerShell. + +## Prerequisites + +* PowerShell Core and/or Windows PowerShell + + For this example, you can use any operating system that is supported by PowerShell Core. + To see if your operating system is supported and to get instructions on how to install + PowerShell Core on your operating system, see the [Get PowerShell][pscore-os] topic in + the PowerShell repo's [README.md][readme] file. + + Note: On Windows 10 Anniversary Update or higher, you can use the [Windows Subsystem for + Linux][wsl] (WSL) console to build the module. In order to import and use the module, you'll need + to install PowerShell Core for the distribution and version of Linux you're running. + You can get that version info by running the command `lsb_release -a` from the WSL console. + +* .NET Core 2.0 SDK + + Download and install the [.NET Core 2.0 SDK][net-core-sdk] for your operating system. + It is recommended that you use a package manager to install the SDK on Linux. + See these [instructions][linux-install] on how to install the SDK on Linux. + Be sure to pick your distribution of Linux e.g. RHEL, Debian, etc to get the + appropriate instructions for your platform. + +## Create the .NET Standard 2.0 Binary Module + +1. Verify you are running the 2.0.0 version of the `dotnet` CLI. + + ```powershell + dotnet --version + ``` + + This should output `2.0.0` or higher. If it returns a major version of 1, make sure you have + installed the .NET Core 2.0 SDK and have restarted your shell to get the newer version of + the SDK tools. + +1. Use the `dotnet` CLI to create a starter `classlib` project based on .NET Standard 2.0 + (the default for classlib projects). + + ```powershell + dotnet new classlib --name MyModule + ``` + +1. Add a `global.json` file that specifies that the project requires the `2.0.0` version of + the .NET Core SDK. This is necessary to prevent issues if you have more than one + version of the .NET Core SDK installed. + + ```powershell + cd MyModule + dotnet new globaljson --sdk-version 2.0.0 + ``` + +1. Add the [PowerShell Standard Library][ps-stdlib] package to the project file. + This package provides the `System.Management.Automation` assembly. + + Note: As newer versions of this library are released, update the version number + in this command to match the latest version. + + ```powershell + dotnet add package PowerShellStandard.Library --version 3.0.0-preview-01 + ``` + +1. Add source code for a simple PowerShell command to the `Class1.cs` file by opening + that file in an editor and replacing the existing code with the following code. + + ```csharp + using System; + using System.Management.Automation; + + namespace MyModule + { + [Cmdlet(VerbsCommunications.Write, "TimestampedMessage")] + public class WriteTimestampedMessageCommand : PSCmdlet + { + [Parameter(Position=1)] + public string Message { get; set; } = string.Empty; + + protected override void EndProcessing() + { + string timestamp = DateTime.Now.ToString("u"); + this.WriteObject($"[{timestamp}] - {this.Message}"); + base.EndProcessing(); + } + } + } + ``` + +1. Build the project. + + ```powershell + dotnet build + ``` + +1. Import the binary module and invoke the new command. + + Note: The previous steps could have been performed in a different shell such as + Bash if you're on Linux. For this step, make sure you are running PowerShell Core. + + ```powershell + cd 'bin/Debug/netstandard2.0' + Import-Module ./MyModule.dll + Write-TimestampedMessage "Test message." + ``` + +## Using a .NET Standard 2.0 based binary module in Windows PowerShell + +You may have heard that a .NET assembly compiled as a .NET Standard 2.0 class library +will load into both .NET Core 2.0 applications such as PowerShell Core and +.NET Framework 4.6.1 (or higher) applications such as Windows PowerShell. +This allows you to build a single, cross-platform binary module. + +Unfortunately, this works best when the .NET Framework application, in this case +Windows PowerShell, has either been compiled against a .NET Standard 2.0 library or with +support declared for .NET Standard libraries. In which case, the build system can provide the +appropriate binding redirects and facade and shim assemblies so that the .NET Standard 2.0 +library can find the .NET Framework types it needs within the context of the running +application. + +Fortunately, this has been fixed in .NET Framework 4.7.1 and in the Windows 10 Fall +Creators Update. This version of the .NET Framework allows existing applications to +"just work" without the need to modify and/or re-compile them. On these systems, a +.NET Standard 2.0 based binary module will work in Windows PowerShell. + +However, for Windows systems that have not been updated to .NET Framework 4.7.1 such a +binary module will not run correctly in Windows PowerShell. + +Let's see what happens when you attempt use this module in **Windows PowerShell** on +Windows 10 CU (1703 or lower) without .NET Framework 4.7.1 installed. + +1. Copy `MyModule.dll` to a folder on a Windows machine. + +1. Import the module. + + ```powershell + Import-Module .\MyModule.dll + ``` + + Note: The module should import without errors. + +1. Execute the `Write-TimestampedMessage` command. + + ```powershell + Write-TimestampedMessage "Test message." + ``` + + This will result in the following error: + + ```text + Write-TimestampedMessage : Could not load file or assembly 'netstandard, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=cc7b13ffcd2ddd51' or one of its dependencies. The system cannot find the file specified. + At line:1 char:1 + + Write-TimestampedMessage "Test message." + + ~~~~~~~~~~~~~~~~~~~~~~~~ + + CategoryInfo : NotSpecified: (:) [], FileNotFoundException + + FullyQualifiedErrorId : System.IO.FileNotFoundException + ``` + +If the command worked, congratulations! Your system was probably updated to +.NET Framework 4.7.1. Otherwise, this error indicates that the `MyModule.dll` assembly +can't find the `netstandard.dll` "implementation" assembly for the version of the +.NET Framework that Windows PowerShell is using. + +### The fix for missing netstandard.dll + +If you install (or already have) the .NET Core 2.0 SDK for Windows, you can +find the `netstandard.dll` implementation assembly for .NET 4.6.1 in the following directory: +`C:\Program Files\dotnet\sdk\2.0.0\Microsoft\Microsoft.NET.Build.Extensions\net461\lib`. + +If you copy `netstandard.dll` from this directory to the directory containing +`MyModule.dll`, the `Write-TimestampedMessage` command will work. Let's try that. + +1. Install the [.NET Core SDK 2.0 for Windows][net-core-sdk], if it isn't already installed. + +1. Start a new Windows PowerShell console. Remember that once a binary assembly is + loaded into PowerShell it can't be unloaded. Restarting PowerShell is necessary to + get it to reload `MyModule.dll`. + +1. Copy the `netstandard.dll` implementation assembly for .NET 4.6.1 to the module's directory. + ```powershell + cd 'path-to-where-you-copied-module.dll' + Copy-Item 'C:\Program Files\dotnet\sdk\2.0.0\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\netstandard.dll' . + ``` + +1. Import the module and execute the command: + ```powershell + Import-Module .\MyModule.dll + Write-TimestampedMessage "Test message." + ``` + Now the command should succeed. + + Note: If it fails, restart Windows PowerShell to make sure + you don't have a previously loaded version of the assembly in the session and repeat + step 4. + +If you use additional libraries there may be more work involved. This approach has +been successfully tested using types from `System.Xml` and `System.Web`. + +## Wrap-up + +In a few steps, we have built a PowerShell binary module using a .NET Standard 2.0 +class library that will run in PowerShell Core on multiple operating systems. +It will also run in Windows PowerShell on Windows systems that have been updated to +.NET Framework 4.7.1 as well as the Windows 10 Fall Creators Update which comes with that +version pre-installed. Furthermore, this binary module can be built on Linux +and macOS as well as Windows using the .NET Core 2.0 SDK command-line tools. + +For more information on .NET Standard, check out the [documentation][net-std-docs] +and the [.NET Standard YouTube channel][net-std-chan]. + +[dotnet-cli]: https://docs.microsoft.com/en-us/dotnet/core/tools/?tabs=netcore2x +[net-core-sdk]: https://www.microsoft.com/net/download/core +[net-std-docs]: https://docs.microsoft.com/en-us/dotnet/standard/net-standard +[net-std-chan]: https://www.youtube.com/playlist?list=PLRAdsfhKI4OWx321A_pr-7HhRNk7wOLLY +[pscore-os]: https://github.com/powershell/powershell#get-powershell +[readme]: ../../README.md +[linux-install]: https://www.microsoft.com/net/core#linuxubuntu +[ps-stdlib]: https://www.nuget.org/packages/PowerShellStandard.Library/ +[wsl]: https://msdn.microsoft.com/commandline/wsl/about diff --git a/test/common/markdown/markdown.tests.ps1 b/test/common/markdown/markdown.tests.ps1 index c8a2cbf056c..a79609340dd 100644 --- a/test/common/markdown/markdown.tests.ps1 +++ b/test/common/markdown/markdown.tests.ps1 @@ -8,10 +8,10 @@ Describe 'Common Tests - Validate Markdown Files' -Tag 'CI' { BeforeAll { # Skip if not windows, We don't need these tests to run on linux (the tests run fine in travis-ci) $skip = !$IsWindows - if ( !$skip ) + if ( !$skip ) { $NpmInstalled = "not installed" - if (Get-Command -Name 'npm' -ErrorAction SilentlyContinue) + if (Get-Command -Name 'npm' -ErrorAction SilentlyContinue) { $NpmInstalled = "Installed" Write-Verbose -Message "NPM is checking Gulp is installed. This may take a few moments." -Verbose @@ -27,10 +27,10 @@ Describe 'Common Tests - Validate Markdown Files' -Tag 'CI' { -Wait ` -WorkingDirectory $PSScriptRoot ` -NoNewWindow - } + } elseif( -not $env:AppVeyor) { - <# + <# On Windows, but not an AppVeyor and pre-requisites are missing For now we will skip, and write a warning. Work to resolve this is tracked in: https://github.com/PowerShell/PowerShell/issues/3429 @@ -42,9 +42,9 @@ Describe 'Common Tests - Validate Markdown Files' -Tag 'CI' { } AfterAll { - if ( !$skip ) + if ( !$skip ) { - <# + <# NPM install all the tools needed to run this test in the test folder. We will now clean these up. We're using this tool to delete the node_modules folder because it gets too long @@ -74,6 +74,7 @@ Describe 'Common Tests - Validate Markdown Files' -Tag 'CI' { $docsToTest = @( './*.md' './docs/*.md' + './docs/cmdlet-example/command-line-simple-example.md' './docs/installation/*.md' './docs/maintainers/README.md' './demos/SSHRemoting/*.md' From 59b5d16139bf727763c14591bb91953ff83fc107 Mon Sep 17 00:00:00 2001 From: Dongbo Wang Date: Thu, 19 Oct 2017 12:32:55 -0700 Subject: [PATCH 019/617] Update appimage.sh to reflect the new name 'pwsh' (#5172) --- .gitignore | 1 + tools/appimage.sh | 16 ++++++---------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index 089babc3522..53d53f91050 100644 --- a/.gitignore +++ b/.gitignore @@ -43,6 +43,7 @@ dotnet-uninstall-debian-packages.sh *.rpm *.pkg *.nupkg +*.AppImage # ignore the telemetry semaphore file DELETE_ME_TO_DISABLE_CONSOLEHOST_TELEMETRY diff --git a/tools/appimage.sh b/tools/appimage.sh index 4c3726235f8..318622a71a0 100755 --- a/tools/appimage.sh +++ b/tools/appimage.sh @@ -35,8 +35,8 @@ APP=powershell # Generate status file for use by apt-get; assuming that the recipe uses no newer -# ingredients than what would require more recent dependencies than what we assume -# to be part of the base system +# ingredients that would require more recent dependencies than what we assume to +# be part of the base system generate_status() { mkdir -p ./tmp/archives/ @@ -385,10 +385,6 @@ cd ./$APP/ # but not using the host system's information about what is # installed on the system but our own assumptions instead -mkdir -p ./tmp/archives/ -mkdir -p ./tmp/lists/partial -touch tmp/pkgcache.bin tmp/srcpkgcache.bin - generate_status echo "deb http://archive.ubuntu.com/ubuntu/ trusty main universe @@ -426,14 +422,14 @@ cd ./$APP.AppDir/ find ../*.deb -exec dpkg -x {} . \; || true -rm usr/bin/powershell +rm usr/bin/pwsh mv opt/microsoft/powershell/*/* usr/bin/ cat > $APP.desktop <<\EOF [Desktop Entry] Name=PowerShell Comment=Microsoft PowerShell -Exec=powershell +Exec=pwsh Keywords=shell;prompt;command;commandline;cmd; Icon=powershell Type=Application @@ -450,7 +446,7 @@ cat > ./AppRun <<\EOF HERE=$(dirname $(readlink -f "${0}")) export PATH="${HERE}/usr/bin/":$PATH export LD_LIBRARY_PATH="${HERE}/usr/lib/":$LD_LIBRARY_PATH -exec "${HERE}/usr/bin/powershell.wrapper" "$@" +exec "${HERE}/usr/bin/pwsh.wrapper" "$@" EOF chmod a+x ./AppRun @@ -468,7 +464,7 @@ VERSION=$(find ../*.deb -name $APP"_*" | head -n 1 | cut -d "~" -f 1 | cut -d "_ echo $VERSION get_desktopintegration $APP -sed -i -e 's|^echo|# echo|g' usr/bin/$APP.wrapper # Make less verbose +sed -i -e 's|^echo|# echo|g' usr/bin/pwsh.wrapper # Make less verbose # Go out of AppImage cd .. From e908b8a607a44e896febd795bfd991c3fe222424 Mon Sep 17 00:00:00 2001 From: Steve Lee Date: Thu, 19 Oct 2017 14:44:21 -0700 Subject: [PATCH 020/617] Enable import-module to be case insensitive (#5097) Fix #1621 Enable import-module to be case insensitive as macOS is case insensitive. --- .../engine/Modules/ModuleCmdletBase.cs | 44 +++++++++++-------- .../Import-Module.Tests.ps1 | 38 ++++++++++++++++ 2 files changed, 64 insertions(+), 18 deletions(-) diff --git a/src/System.Management.Automation/engine/Modules/ModuleCmdletBase.cs b/src/System.Management.Automation/engine/Modules/ModuleCmdletBase.cs index 896ef6bda08..cbce9e2c3f3 100644 --- a/src/System.Management.Automation/engine/Modules/ModuleCmdletBase.cs +++ b/src/System.Management.Automation/engine/Modules/ModuleCmdletBase.cs @@ -293,34 +293,42 @@ internal bool LoadUsingModulePath(PSModuleInfo parentModule, bool found, IEnumer // Now search using the module path... foreach (string path in modulePath) { - // a name takes the form of .../moduleDir/moduleName. - // if only one name has been specified, then the moduleDir - // and moduleName are identical and repeated... - // Also append th ename if the path currently points at a directory - string qualifiedPath = Path.Combine(path, fileBaseName); - - // Load the latest valid version if it is a multi-version module directory - module = LoadUsingMultiVersionModuleBase(qualifiedPath, manifestProcessingFlags, options, out found); - - if (!found) +#if UNIX + foreach (string folder in Directory.EnumerateDirectories(path)) { - if (name.IndexOfAny(Utils.Separators.Directory) == -1) + string moduleName = Path.GetFileName(folder); + if (String.Compare(moduleName, fileBaseName, StringComparison.OrdinalIgnoreCase) == 0) { - qualifiedPath = Path.Combine(qualifiedPath, fileBaseName); + fileBaseName = moduleName; +#endif + string qualifiedPath = Path.Combine(path, fileBaseName); + module = LoadUsingMultiVersionModuleBase(qualifiedPath, manifestProcessingFlags, options, out found); + if (!found) + { + if (name.IndexOfAny(Utils.Separators.Directory) == -1) + { + qualifiedPath = Path.Combine(qualifiedPath, fileBaseName); + } + else if (Utils.NativeDirectoryExists(qualifiedPath)) + { + // if it points to a directory, add the basename back onto the path... + qualifiedPath = Path.Combine(qualifiedPath, Path.GetFileName(fileBaseName)); + } + + module = LoadUsingExtensions(parentModule, name, qualifiedPath, extension, null, this.BasePrefix, ss, options, manifestProcessingFlags, out found); + } +#if UNIX } - else if (Directory.Exists(qualifiedPath)) + if (found) { - // if it points to a directory, add the basename back onto the path... - qualifiedPath = Path.Combine(qualifiedPath, Path.GetFileName(fileBaseName)); + break; } - - module = LoadUsingExtensions(parentModule, name, qualifiedPath, extension, null, this.BasePrefix, ss, options, manifestProcessingFlags, out found); } - if (found) { break; } +#endif } if (found) diff --git a/test/powershell/Modules/Microsoft.PowerShell.Core/Import-Module.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Core/Import-Module.Tests.ps1 index 0821e00d149..4dc287ab881 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Core/Import-Module.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Core/Import-Module.Tests.ps1 @@ -124,3 +124,41 @@ namespace ModuleCmdlets } } +Describe "Import-Module should be case insensitive" -Tags 'CI' { + BeforeAll { + $defaultPSModuleAutoloadingPreference = $PSModuleAutoloadingPreference + $originalPSModulePath = $env:PSModulePath.Clone() + $modulesPath = "$TestDrive\Modules" + $env:PSModulePath += [System.IO.Path]::PathSeparator + $modulesPath + $PSModuleAutoloadingPreference = "none" + } + + AfterAll { + $global:PSModuleAutoloadingPreference = $defaultPSModuleAutoloadingPreference + $env:PSModulePath = $originalPSModulePath + } + + AfterEach { + Remove-Item -Recurse -Path $modulesPath -Force -ErrorAction SilentlyContinue + } + + It "Import-Module can import a module using different casing using '' and manifest:" -TestCases @( + @{modulePath="TESTMODULE/1.1"; manifest=$true}, + @{modulePath="TESTMODULE" ; manifest=$true}, + @{modulePath="TESTMODULE" ; manifest=$false} + ) { + param ($modulePath, $manifest) + New-Item -ItemType Directory -Path "$modulesPath/$modulePath" -Force > $null + if ($manifest) { + New-ModuleManifest -Path "$modulesPath/$modulePath/TESTMODULE.psd1" -RootModule "TESTMODULE.psm1" -ModuleVersion 1.1 + } + Set-Content -Path "$modulesPath/$modulePath/TESTMODULE.psm1" -Value "function mytest { 'hello' }" + Import-Module testMODULE + $m = Get-Module TESTmodule + $m | Should BeOfType "System.Management.Automation.PSModuleInfo" + $m.Name | Should Be "TESTMODULE" + mytest | Should BeExactly "hello" + Remove-Module TestModule + Get-Module tESTmODULE | Should BeNullOrEmpty + } +} From 2fd484f491117f914dad0a9523bde436e2fac252 Mon Sep 17 00:00:00 2001 From: Dongbo Wang Date: Thu, 19 Oct 2017 15:09:16 -0700 Subject: [PATCH 021/617] Update the man help file used in packaging (#5173) * Update pacakging.psm1 and rename man file * Update pwsh.1.ronn --- .gitignore | 3 --- assets/{powershell.1.ronn => pwsh.1.ronn} | 6 +++--- tools/packaging/packaging.psm1 | 10 +++------- 3 files changed, 6 insertions(+), 13 deletions(-) rename assets/{powershell.1.ronn => pwsh.1.ronn} (96%) diff --git a/.gitignore b/.gitignore index 53d53f91050..db319f5835e 100644 --- a/.gitignore +++ b/.gitignore @@ -51,9 +51,6 @@ DELETE_ME_TO_DISABLE_CONSOLEHOST_TELEMETRY # default location for produced nuget packages /nuget-artifacts -# generated man files -/assets/powershell.1* - # resgen output gen diff --git a/assets/powershell.1.ronn b/assets/pwsh.1.ronn similarity index 96% rename from assets/powershell.1.ronn rename to assets/pwsh.1.ronn index eea00966b09..8560f44e3b9 100644 --- a/assets/powershell.1.ronn +++ b/assets/pwsh.1.ronn @@ -1,9 +1,9 @@ -powershell(1) -- command-line shell and .NET REPL +pwsh(1) -- PowerShell command-line shell and .NET REPL ================================================= ## SYNOPSIS -`powershell` [`-NoLogo`] [`-NoExit`] [`-NoProfile`] [`-NonInteractive`] +`pwsh` [`-NoLogo`] [`-NoExit`] [`-NoProfile`] [`-NonInteractive`] [`-InputFormat` {Text | XML}] [`-OutputFormat` {Text | XML}] [`-EncodedCommand` ] [`-File` ] [`-ExecutionPolicy` ] @@ -120,4 +120,4 @@ These are automatically defined PowerShell-language variables. ## COPYRIGHT Copyright (c) 2016 Microsoft Corporation. -All rights reserved. \ No newline at end of file +All rights reserved. diff --git a/tools/packaging/packaging.psm1 b/tools/packaging/packaging.psm1 index 7eb47980374..ca448711fbc 100644 --- a/tools/packaging/packaging.psm1 +++ b/tools/packaging/packaging.psm1 @@ -493,20 +493,16 @@ function New-UnixPackage { } # run ronn to convert man page to roff - $RonnFile = Join-Path $PSScriptRoot "/../../assets/powershell.1.ronn" + $RonnFile = Join-Path $PSScriptRoot "/../../assets/pwsh.1.ronn" $RoffFile = $RonnFile -replace "\.ronn$" # Run ronn on assets file # Run does not play well with files named powershell6.0.1, so we generate and then rename Start-NativeExecution { ronn --roff $RonnFile } - # Setup for side-by-side man pages (noop if primary package) - $FixedRoffFile = $RoffFile -replace "powershell.1$", "pwsh.1" - Move-Item $RoffFile $FixedRoffFile - # gzip in assets directory - $GzipFile = "$FixedRoffFile.gz" - Start-NativeExecution { gzip -f $FixedRoffFile } + $GzipFile = "$RoffFile.gz" + Start-NativeExecution { gzip -f $RoffFile } $ManFile = Join-Path "/usr/local/share/man/man1" (Split-Path -Leaf $GzipFile) From 5913069e5808790806b425d0b433988d9213482e Mon Sep 17 00:00:00 2001 From: Greg Zimmerman Date: Thu, 19 Oct 2017 18:09:57 -0400 Subject: [PATCH 022/617] Update powershell to pwsh. (#5174) --- .../Applications/PowerShell.app/Contents/MacOS/PowerShell.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/packaging/macos/launcher/ROOT/Applications/PowerShell.app/Contents/MacOS/PowerShell.sh b/tools/packaging/macos/launcher/ROOT/Applications/PowerShell.app/Contents/MacOS/PowerShell.sh index dab22d55615..d20a8780b4a 100755 --- a/tools/packaging/macos/launcher/ROOT/Applications/PowerShell.app/Contents/MacOS/PowerShell.sh +++ b/tools/packaging/macos/launcher/ROOT/Applications/PowerShell.app/Contents/MacOS/PowerShell.sh @@ -1,2 +1,2 @@ #!/bin/bash -open /usr/local/bin/powershell +open /usr/local/bin/pwsh From 1c469aaa22f29ba184f64f2f6a3f9ce73184bad1 Mon Sep 17 00:00:00 2001 From: Dave Wyatt Date: Thu, 19 Oct 2017 16:44:26 -0700 Subject: [PATCH 023/617] Unwrap 'ValueFromRemainingArguments' if the single element is a collection (#5109) Unwrapping of 'ValueFromRemainingArguments' was being performed only for 'object[]' arrays (which covers the most common PowerShell binding scenarios) but could be skipped if a collection of any other type were passed to the parameter. This change unwraps 'ValueFromRemainingArguments' if the single element is a collection. --- .../engine/CmdletParameterBinderController.cs | 4 +- .../engine/LanguagePrimitives.cs | 37 +++++++++---------- .../ParameterBinding.Tests.ps1 | 20 ++++++++++ 3 files changed, 39 insertions(+), 22 deletions(-) diff --git a/src/System.Management.Automation/engine/CmdletParameterBinderController.cs b/src/System.Management.Automation/engine/CmdletParameterBinderController.cs index 92977652e36..acf3766a3ee 100644 --- a/src/System.Management.Automation/engine/CmdletParameterBinderController.cs +++ b/src/System.Management.Automation/engine/CmdletParameterBinderController.cs @@ -1690,8 +1690,8 @@ private void HandleRemainingArguments() // Set-ClusterOwnerNode -Owners foo,bar // Set-ClusterOwnerNode foo bar // Set-ClusterOwnerNode foo,bar - // we unwrap our List, but only if there is a single argument of type object[]. - if (valueFromRemainingArguments.Count == 1 && valueFromRemainingArguments[0] is object[]) + // we unwrap our List, but only if there is a single argument which is a collection. + if (valueFromRemainingArguments.Count == 1 && LanguagePrimitives.IsObjectEnumerable(valueFromRemainingArguments[0])) { cpi.SetArgumentValue(UnboundArguments[0].ArgumentExtent, valueFromRemainingArguments[0]); } diff --git a/src/System.Management.Automation/engine/LanguagePrimitives.cs b/src/System.Management.Automation/engine/LanguagePrimitives.cs index cc4ab30645e..7db18d424d3 100644 --- a/src/System.Management.Automation/engine/LanguagePrimitives.cs +++ b/src/System.Management.Automation/engine/LanguagePrimitives.cs @@ -440,39 +440,36 @@ private static void InitializeGetEnumerableCache() internal static bool IsTypeEnumerable(Type type) { + if (type == null) { return false; } GetEnumerableDelegate getEnumerable = GetOrCalculateEnumerable(type); return (getEnumerable != LanguagePrimitives.ReturnNullEnumerable); } /// - /// Retrieves the IEnumerable of obj or null if the language does not consider obj to be IEnumerable + /// Returns True if the language considers obj to be IEnumerable /// /// /// IEnumerable or IEnumerable-like object /// [SuppressMessage("Microsoft.Naming", "CA1720:IdentifiersShouldNotContainTypeNames", MessageId = "obj", Justification = "Since V1 code is already shipped, excluding this message.")] - public static IEnumerable GetEnumerable(object obj) + public static bool IsObjectEnumerable(object obj) { - if (obj == null) - { - return null; - } - - Type objectType = obj.GetType(); + return IsTypeEnumerable(PSObject.Base(obj)?.GetType()); + } - // if the object passed is an PSObject, - // look at the base object. Notice that, if the - // object has been serialized, the base object - // will be there as an ArrayList if the original - // object was IEnumerable - if (objectType == typeof(PSObject)) - { - PSObject mshObj = (PSObject)obj; - obj = mshObj.BaseObject; - objectType = obj.GetType(); - } - GetEnumerableDelegate getEnumerable = GetOrCalculateEnumerable(objectType); + /// + /// Retrieves the IEnumerable of obj or null if the language does not consider obj to be IEnumerable + /// + /// + /// IEnumerable or IEnumerable-like object + /// + [SuppressMessage("Microsoft.Naming", "CA1720:IdentifiersShouldNotContainTypeNames", MessageId = "obj", Justification = "Since V1 code is already shipped, excluding this message.")] + public static IEnumerable GetEnumerable(object obj) + { + obj = PSObject.Base(obj); + if (obj == null) { return null; } + GetEnumerableDelegate getEnumerable = GetOrCalculateEnumerable(obj.GetType()); return getEnumerable(obj); } diff --git a/test/powershell/engine/ParameterBinding/ParameterBinding.Tests.ps1 b/test/powershell/engine/ParameterBinding/ParameterBinding.Tests.ps1 index 0bf88e86485..e3d84164093 100644 --- a/test/powershell/engine/ParameterBinding/ParameterBinding.Tests.ps1 +++ b/test/powershell/engine/ParameterBinding/ParameterBinding.Tests.ps1 @@ -422,5 +422,25 @@ $result.Value[1] | Should Be 2 $result.Value[2] | Should Be 3 } + + It "Binds properly when collections of type other than object[] are used on an advanced function" { + $list = [Collections.Generic.List[int]](1..3) + $result = Test-BindingFunction $list + + $result.ArgumentCount | Should Be 3 + $result.Value[0] | Should Be 1 + $result.Value[1] | Should Be 2 + $result.Value[2] | Should Be 3 + } + + It "Binds properly when collections of type other than object[] are used on a cmdlet" { + $list = [Collections.Generic.List[int]](1..3) + $result = Test-BindingCmdlet $list + + $result.ArgumentCount | Should Be 3 + $result.Value[0] | Should Be 1 + $result.Value[1] | Should Be 2 + $result.Value[2] | Should Be 3 + } } } From 053d1808171dd08927554243c2bf665e1121bf48 Mon Sep 17 00:00:00 2001 From: Dan Travison Date: Fri, 20 Oct 2017 09:03:59 -0700 Subject: [PATCH 024/617] Add exports for syslog APIs in 'libpsl-native'. (#5149) --- src/libpsl-native/src/CMakeLists.txt | 3 ++- src/libpsl-native/src/nativesyslog.cpp | 35 ++++++++++++++++++++++++++ src/libpsl-native/src/nativesyslog.h | 11 ++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 src/libpsl-native/src/nativesyslog.cpp create mode 100644 src/libpsl-native/src/nativesyslog.h diff --git a/src/libpsl-native/src/CMakeLists.txt b/src/libpsl-native/src/CMakeLists.txt index 28cb4a7611f..bb2e88e4626 100644 --- a/src/libpsl-native/src/CMakeLists.txt +++ b/src/libpsl-native/src/CMakeLists.txt @@ -21,6 +21,7 @@ add_library(psl-native SHARED createhardlink.cpp createsymlink.cpp followsymlink.cpp - createprocess.cpp) + createprocess.cpp + nativesyslog.cpp) target_include_directories(psl-native PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/src/libpsl-native/src/nativesyslog.cpp b/src/libpsl-native/src/nativesyslog.cpp new file mode 100644 index 00000000000..1445c59a14f --- /dev/null +++ b/src/libpsl-native/src/nativesyslog.cpp @@ -0,0 +1,35 @@ +//! @file nativesyslog.cpp +//! @brief Provides wrappers around the syslog apis to support exporting +//! for PInvoke calls by powershell. +//! These functions are intended only for PowerShell internal use. +#include +#include + +//! @brief Native_SysLog is a wrapper around the syslog api. +//! It explicitly passes the message as a parameter to a %s format +//! string since the message may have arbitray characters that can +//! be misinterpreted as format specifiers. +//! +//! @retval none. +extern "C" void Native_SysLog(int32_t priority, const char* message) +{ + syslog(priority, "%s", message); +} + +//! @brief Native_OpenLog is a wrapper around the openlog, syslog api. +//! it allows passing an ident and facility but uses an explicit +//! option value for consistent logging across powershell instances. +//! +//! @retval none. +extern "C" void Native_OpenLog(const char* ident, int facility) +{ + openlog(ident, LOG_NDELAY | LOG_PID, facility); +} + +//! @brief Native_OpenLog is a wrapper around the closelog, syslog api. +//! +//! @retval none. +extern "C" void Native_CloseLog() +{ + closelog(); +} diff --git a/src/libpsl-native/src/nativesyslog.h b/src/libpsl-native/src/nativesyslog.h new file mode 100644 index 00000000000..71b222fa4de --- /dev/null +++ b/src/libpsl-native/src/nativesyslog.h @@ -0,0 +1,11 @@ +#pragma once + +#include "pal.h" + +PAL_BEGIN_EXTERNC + +void Native_OpenLog(const char* ident, int facility); +void Native_SysLog(int32_t priority, const char* message); +void Native_CloseLog(); + +PAL_END_EXTERNC From 13eb283560adcb8191a48cc883b24c2e45289ad6 Mon Sep 17 00:00:00 2001 From: Travis Plunk Date: Fri, 20 Oct 2017 15:06:37 -0700 Subject: [PATCH 025/617] Add code to send WebHook for Travis-CI Daily Build (#5183) --- tools/travis.ps1 | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/tools/travis.ps1 b/tools/travis.ps1 index 2b3281e68c4..bc438521735 100644 --- a/tools/travis.ps1 +++ b/tools/travis.ps1 @@ -4,6 +4,43 @@ param( Import-Module $PSScriptRoot/../build.psm1 -Force Import-Module $PSScriptRoot/packaging -Force + +function Send-DailyWebHook +{ + param ( + [Parameter(Mandatory=$true,Position=0)][ValidateSet("Pass","Fail")]$result + ) + + # Only send web hook if the environment variable is present + # Varible should be set in Travis-CI.org settings + if ($env:WebHookUrl) + { + $webhook = $env:WebHookUrl + + $Body = @{ + 'text'= @" +Build Result: $result
    +OS Type: $($PSVersionTable.OS)
    +Build $env:TRAVIS_BUILD_NUMBER
    +Job $env:TRAVIS_JOB_NUMBER +"@ + } + + $params = @{ + Headers = @{'accept'='application/json'} + Body = $Body | convertto-json + Method = 'Post' + URI = $webhook + } + + Invoke-RestMethod @params + } + else + { + log "Skipping DailyWebHook. WebHookUrl environment variable not present." + } +} + # This function retrieves the appropriate svg to be used when presenting # the daily test run badge # the location in azure is public readonly @@ -236,6 +273,12 @@ else catch { Write-Warning "Could not update status badge: $_" } + try { + Send-DailyWebHook -result $result + } + catch { + Write-Warning "Could not send webhook: $_" + } } } From 9fd600448c41d8dbccc50bc30858938e35aeb96a Mon Sep 17 00:00:00 2001 From: Mark Kraus Date: Sat, 21 Oct 2017 04:41:46 -0500 Subject: [PATCH 026/617] Make -NoTypeInformation Default on Export-Csv and ConvertTo-Csv (#5164) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit •Sets -NoTypeInformation as the default behavior for Export-Csv and ConvertTo-Csv •Hides the -NoTypeInformation parameter switch •Adds -IncludeTypeInformation switch to Export-Csv and ConvertTo-Csv to enable legacy behavior •Provides a terminating error when both -NoTypeInformation and -IncludeTypeInformation are supplied •adds tests for the new behavior •fixes existing tests to align with new behavior The new behavior will need to be documented. --- .../commands/utility/CSVCommands.cs | 32 +++++++++------- .../resources/CsvCommandStrings.resx | 3 ++ .../ConvertTo-Csv.Tests.ps1 | 37 ++++++++++++++++--- .../Export-Csv.Tests.ps1 | 33 +++++++++++++++-- .../Import-Csv.Tests.ps1 | 2 +- 5 files changed, 83 insertions(+), 24 deletions(-) diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/CSVCommands.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/CSVCommands.cs index 6313a9a5ddc..ca7752da8bc 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/CSVCommands.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/CSVCommands.cs @@ -67,22 +67,18 @@ public abstract PSObject InputObject } /// - /// NoTypeInformation : should the #TYPE line be generated + /// IncludeTypeInformation : The #TYPE line should be generated. Default is false. Cannot specify with NoTypeInformation. /// [Parameter] + [Alias("ITI")] + public SwitchParameter IncludeTypeInformation { get; set; } + + /// + /// NoTypeInformation : The #TYPE line should not be generated. Default is true. Cannot specify with IncludeTypeInformation. + /// + [Parameter(DontShow = true)] [Alias("NTI")] - public SwitchParameter NoTypeInformation - { - get - { - return _noTypeInformation; - } - set - { - _noTypeInformation = value; - } - } - private bool _noTypeInformation; + public SwitchParameter NoTypeInformation { get; set; } = true; #endregion Command Line Parameters @@ -100,6 +96,16 @@ public virtual void WriteCsvLine(string line) ///
    protected override void BeginProcessing() { + if (this.MyInvocation.BoundParameters.ContainsKey(nameof(IncludeTypeInformation)) && this.MyInvocation.BoundParameters.ContainsKey(nameof(NoTypeInformation))) + { + InvalidOperationException exception = new InvalidOperationException(CsvCommandStrings.CannotSpecifyIncludeTypeInformationAndNoTypeInformation); + ErrorRecord errorRecord = new ErrorRecord(exception, "CannotSpecifyIncludeTypeInformationAndNoTypeInformation", ErrorCategory.InvalidData, null); + this.ThrowTerminatingError(errorRecord); + } + if (this.MyInvocation.BoundParameters.ContainsKey("IncludeTypeInformation")) + { + NoTypeInformation = !IncludeTypeInformation; + } _delimiter = ImportExportCSVHelper.SetDelimiter(this, ParameterSetName, _delimiter, UseCulture); } } diff --git a/src/Microsoft.PowerShell.Commands.Utility/resources/CsvCommandStrings.resx b/src/Microsoft.PowerShell.Commands.Utility/resources/CsvCommandStrings.resx index 6616139c9b8..8d0ae2da593 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/resources/CsvCommandStrings.resx +++ b/src/Microsoft.PowerShell.Commands.Utility/resources/CsvCommandStrings.resx @@ -127,6 +127,9 @@ Reviewed by TArcher on 2010-06-29. + + You must specify either the -IncludeTypeInformation or -NoTypeInformation parameters, but not both. + You must specify either the -Path or -LiteralPath parameters, but not both. diff --git a/test/powershell/Modules/Microsoft.PowerShell.Utility/ConvertTo-Csv.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Utility/ConvertTo-Csv.Tests.ps1 index 31a05bd73ca..11de104cbd3 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Utility/ConvertTo-Csv.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Utility/ConvertTo-Csv.Tests.ps1 @@ -2,7 +2,7 @@ Describe "ConvertTo-Csv DRT Unit Tests" -Tags "CI" { $inputObject = [pscustomobject]@{ First = 1; Second = 2 } It "Test convertto-csv with psobject pipelined" { - $returnObject = $inputObject | ConvertTo-Csv + $returnObject = $inputObject | ConvertTo-Csv -IncludeTypeInformation $returnObject.Count | Should Be 3 $returnObject[0] | Should Be "#TYPE System.Management.Automation.PSCustomObject" $returnObject[1] | Should Be "`"First`",`"Second`"" @@ -18,7 +18,7 @@ Describe "ConvertTo-Csv DRT Unit Tests" -Tags "CI" { It "Test convertto-csv with a useculture flag" { #The default value is ',' - $returnObject = $inputObject | ConvertTo-Csv -UseCulture + $returnObject = $inputObject | ConvertTo-Csv -UseCulture -IncludeTypeInformation $returnObject.Count | Should Be 3 $returnObject[0] | Should Be "#TYPE System.Management.Automation.PSCustomObject" $returnObject[1] | Should Be "`"First`",`"Second`"" @@ -27,7 +27,7 @@ Describe "ConvertTo-Csv DRT Unit Tests" -Tags "CI" { It "Test convertto-csv with Delimiter" { #The default value is ',' - $returnObject = $inputObject | ConvertTo-Csv -Delimiter ";" + $returnObject = $inputObject | ConvertTo-Csv -Delimiter ";" -IncludeTypeInformation $returnObject.Count | Should Be 3 $returnObject[0] | Should Be "#TYPE System.Management.Automation.PSCustomObject" $returnObject[1] | Should Be "`"First`";`"Second`"" @@ -50,22 +50,47 @@ Describe "ConvertTo-Csv" -Tags "CI" { } It "Should return the type of data in the first element of the output array" { - $result = $testObject | ConvertTo-Csv + $result = $testObject | ConvertTo-Csv -IncludeTypeInformation $result[0] | Should Be "#TYPE System.Management.Automation.PSCustomObject" } It "Should return the column info in the second element of the output array" { - $result = $testObject | ConvertTo-Csv + $result = $testObject | ConvertTo-Csv -IncludeTypeInformation $result[1] | Should Match "`"FirstColumn`"" $result[1] | Should Match "`"SecondColumn`"" } It "Should return the data as a comma-separated list in the third element of the output array" { - $result = $testObject | ConvertTo-Csv + $result = $testObject | ConvertTo-Csv -IncludeTypeInformation $result[2] | Should Match "`"Hello`"" $result[2] | Should Match "`"World`"" } + It "Includes type information when -IncludeTypeInformation is supplied" { + $result = $testObject | ConvertTo-Csv -IncludeTypeInformation + + ($result -split ([Environment]::NewLine))[0] | Should BeExactly "#TYPE System.Management.Automation.PSCustomObject" + } + + It "Does not include type information by default" { + $result = $testObject | ConvertTo-Csv + + $result | Should Not Match ([regex]::Escape('System.Management.Automation.PSCustomObject')) + $result | Should Not Match ([regex]::Escape('#TYPE')) + } + + It "Does not include type information with -NoTypeInformation" { + $result = $testObject | ConvertTo-Csv -NoTypeInformation + + $result | Should Not Match ([regex]::Escape('System.Management.Automation.PSCustomObject')) + $result | Should Not Match ([regex]::Escape('#TYPE')) + } + + It "Does not support -IncludeTypeInformation and -NoTypeInformation at the same time" { + { $testObject | ConvertTo-Csv -IncludeTypeInformation -NoTypeInformation } | + ShouldBeErrorId "CannotSpecifyIncludeTypeInformationAndNoTypeInformation,Microsoft.PowerShell.Commands.ConvertToCsvCommand" + } + } diff --git a/test/powershell/Modules/Microsoft.PowerShell.Utility/Export-Csv.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Utility/Export-Csv.Tests.ps1 index 3052b04d42a..3f9b3f4a55f 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Utility/Export-Csv.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Utility/Export-Csv.Tests.ps1 @@ -15,7 +15,7 @@ Describe "Export-Csv" -Tags "CI" { } It "Should be a string when exporting via pipe" { - $testObject | Export-Csv $testCsv + $testObject | Export-Csv $testCsv -IncludeTypeInformation $piped = Get-Content $testCsv @@ -23,15 +23,15 @@ Describe "Export-Csv" -Tags "CI" { } It "Should be an object when exporting via the inputObject switch" { - Export-Csv -InputObject $testObject -Path $testCsv + Export-Csv -InputObject $testObject -Path $testCsv -IncludeTypeInformation - $switch = Get-Content $testCsv + $switch = Get-Content $testCsv $switch[0] | Should Match ".Object" } It "Should output a csv file containing a string of all the lengths of each element when piped input is used" { - $testObject | Export-Csv -Path $testCsv + $testObject | Export-Csv -Path $testCsv -IncludeTypeInformation $first = "`"" + $testObject[0].Length.ToString() + "`"" $second = "`"" + $testObject[1].Length.ToString() + "`"" @@ -63,6 +63,31 @@ Describe "Export-Csv" -Tags "CI" { # Clean up after yourself Remove-Item $aliasObject -Force } + + It "Does not include type information by default" { + $testObject | Export-Csv -Path $testCsv + + $(Get-Content $testCsv)[0] | Should Not Match ([regex]::Escape("System.String")) + $(Get-Content $testCsv)[0] | Should Not Match ([regex]::Escape("#TYPE")) + } + + It "Does not include type information with -NoTypeInformation" { + $testObject | Export-Csv -Path $testCsv -NoTypeInformation + + $(Get-Content $testCsv)[0] | Should Not Match ([regex]::Escape("System.String")) + $(Get-Content $testCsv)[0] | Should Not Match ([regex]::Escape("#TYPE")) + } + + It "Includes type information when -IncludeTypeInformation is supplied" { + $testObject | Export-Csv -Path $testCsv -IncludeTypeInformation + + $(Get-Content $testCsv)[0] | Should BeExactly "#TYPE System.String" + } + + It "Does not support -IncludeTypeInformation and -NoTypeInformation at the same time" { + { $testObject | Export-Csv -Path $testCsv -IncludeTypeInformation -NoTypeInformation } | + ShouldBeErrorId "CannotSpecifyIncludeTypeInformationAndNoTypeInformation,Microsoft.PowerShell.Commands.ExportCsvCommand" + } } Describe "Export-Csv DRT Unit Tests" -Tags "CI" { diff --git a/test/powershell/Modules/Microsoft.PowerShell.Utility/Import-Csv.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Utility/Import-Csv.Tests.ps1 index 61ea6b53226..fc3144ad786 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Utility/Import-Csv.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Utility/Import-Csv.Tests.ps1 @@ -79,7 +79,7 @@ Describe "Import-Csv #Type Tests" -Tags "CI" { $testfile = Join-Path $TestDrive -ChildPath "testfile.csv" Remove-Item -Path $testfile -Force -ErrorAction SilentlyContinue $processlist = (Get-Process)[0..1] - $processlist | Export-Csv -Path $testfile -Force + $processlist | Export-Csv -Path $testfile -Force -IncludeTypeInformation # Import-Csv add "CSV:" before actual type $expectedProcessType = "CSV:System.Diagnostics.Process" } From 5b2bbcbf89251734e8557a55c5df40bfb1cba979 Mon Sep 17 00:00:00 2001 From: Dongbo Wang Date: Sat, 21 Oct 2017 02:50:00 -0700 Subject: [PATCH 027/617] Update the help text with the new name 'pwsh' (#5182) --- .../resources/ManagedEntranceStrings.resx | 42 +++++++++---------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/src/Microsoft.PowerShell.ConsoleHost/resources/ManagedEntranceStrings.resx b/src/Microsoft.PowerShell.ConsoleHost/resources/ManagedEntranceStrings.resx index 81021421024..b5d445ce434 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/resources/ManagedEntranceStrings.resx +++ b/src/Microsoft.PowerShell.ConsoleHost/resources/ManagedEntranceStrings.resx @@ -122,15 +122,15 @@ Copyright (C) Microsoft Corporation. All rights reserved. - Usage: powershell[.exe] [[-File] <filePath> [args]] - [-Command { - | <script-block> [-args <arg-array>] - | <string> [<CommandParameters>] } ] - [-ConfigurationName <string>] [-EncodedCommand <Base64EncodedCommand>] - [-ExecutionPolicy <ExecutionPolicy>] [-InputFormat {Text | XML}] - [-Interactive] [-NoExit] [-NoLogo] [-NonInteractive] [-NoProfile] - [-OutputFormat {Text | XML}] [-Version] [-WindowStyle <style>] + Usage: pwsh[.exe] [[-File] <filePath> [args]] + [-Command { - | <script-block> [-args <arg-array>] + | <string> [<CommandParameters>] } ] + [-ConfigurationName <string>] [-EncodedCommand <Base64EncodedCommand>] + [-ExecutionPolicy <ExecutionPolicy>] [-InputFormat {Text | XML}] + [-Interactive] [-NoExit] [-NoLogo] [-NonInteractive] [-NoProfile] + [-OutputFormat {Text | XML}] [-Version] [-WindowStyle <style>] - powershell[.exe] -h | -Help | -? | /? + pwsh[.exe] -h | -Help | -? | /? PowerShell Online Help https://aka.ms/pscore6-docs @@ -144,8 +144,8 @@ All parameters are case-insensitive. If the value of Command is "-", the command text is read from standard input. If the value of Command is a script block, the script block must be enclosed - in braces ({}). You can specify a script block only when running 'powershell' - in PowerShell. The results of the script block are returned to the + in braces ({}). You can specify a script block only when running 'pwsh' + in a PowerShell session. The results of the script block are returned to the parent shell as deserialized XML objects, not live objects. If the value of Command is a string, Command must be the last parameter in the command, @@ -157,15 +157,15 @@ All parameters are case-insensitive. causes the command to be executed. Example: - powershell -Command {Get-WinEvent -LogName security} - powershell -command "& {Get-WinEvent -LogName security}" + pwsh -Command {Get-WinEvent -LogName security} + pwsh -command "& {Get-WinEvent -LogName security}" -ConfigurationName | -config Specifies a configuration endpoint in which PowerShell is run. This can be any endpoint registered on the local machine including the default PowerShell remoting endpoints or a custom endpoint having specific user role capabilities. - Example: powershell -configurationmame AdminRoles + Example: pwsh -configurationmame AdminRoles -EncodedCommand | -e | -ec Accepts a base64 encoded string version of a command. Use this parameter to submit @@ -175,7 +175,7 @@ All parameters are case-insensitive. $command = 'dir "c:\program files" ' $bytes = [System.Text.Encoding]::Unicode.GetBytes($command) $encodedCommand = [Convert]::ToBase64String($bytes) - powershell -encodedcommand $encodedCommand + pwsh -encodedcommand $encodedCommand -ExecutionPolicy | -ex | -ep Sets the default execution policy for the current session and saves it @@ -183,7 +183,7 @@ All parameters are case-insensitive. This parameter does not change the PowerShell execution policy that is set in the registry. - Example: powershell -ExecutionPolicy RemoteSigned + Example: pwsh -ExecutionPolicy RemoteSigned -File | -f Default parameter if no parameters is present but any values is present in the command line. @@ -193,12 +193,10 @@ All parameters are case-insensitive. in the command, because all characters typed after the File parameter name are interpreted as the script file path followed by the script parameters. - Example: powershell HelloWorld.ps1 + Example: pwsh HelloWorld.ps1 -Help | -h | -? | /? - Shows this message. If you are typing a 'powershell' command in PowerShell on Windows - system, prepend the command parameters with a hyphen (-), not a forward slash (/). - You can use either a hyphen or forward slash in Cmd.exe. + Shows this help message. -InputFormat | -in | -if Describes the format of data sent to PowerShell. @@ -210,7 +208,7 @@ All parameters are case-insensitive. -NoExit | -noe Does not exit after running startup commands. - Example: powershell.exe -NoExit -Command Get-Date + Example: pwsh -NoExit -Command Get-Date -NoLogo | -nol Hides the copyright banner at startup. @@ -226,12 +224,12 @@ All parameters are case-insensitive. are "Text" (text strings) or "XML" (serialized CLIXML format). Default is "Text". - Example: powershell -o XML -c Get-Date + Example: pwsh -o XML -c Get-Date -Version | -v Shows the version of PowerShell and exits. Additional arguments are ignored. - Example: powershell -v + Example: pwsh -v -WindowStyle | -w Sets the window style to Normal, Minimized, Maximized or Hidden. From df06200be5177f43c9b5dede13ab27aec5de31f1 Mon Sep 17 00:00:00 2001 From: Aditya Patwardhan Date: Mon, 23 Oct 2017 09:28:17 -0700 Subject: [PATCH 028/617] Add new Fwlinks for v6 help content (#4978) Updated fwlinks to pull new help content for PSv6. Fwlink for Microsoft.PowerShell.Core module is not updated since about_*help.txt is not available yet. --- src/Microsoft.PowerShell.PSReadLine/PSReadLine.psd1 | 2 +- .../Microsoft.PowerShell.Host.psd1 | 2 +- src/Modules/Shared/PSReadLine/PSReadLine.psd1 | 2 +- .../Microsoft.PowerShell.Management.psd1 | 4 ++-- .../Microsoft.PowerShell.Security.psd1 | 2 +- .../Microsoft.PowerShell.Utility.psd1 | 2 +- .../Windows-Core+Full/CimCmdlets/CimCmdlets.psd1 | 2 +- .../Microsoft.PowerShell.Security.psd1 | 2 +- .../Microsoft.WSMan.Management.psd1 | 2 +- .../Microsoft.PowerShell.Diagnostics.psd1 | 2 +- .../Microsoft.PowerShell.Management.psd1 | 4 ++-- .../Microsoft.PowerShell.Utility.psd1 | 2 +- .../Microsoft.PowerShell.Diagnostics.psd1 | 4 ++-- .../Microsoft.PowerShell.Management.psd1 | 2 +- .../Microsoft.PowerShell.Utility.psd1 | 2 +- .../help/UpdatableHelpCommandBase.cs | 12 ++++++------ ...fb6cc51d-c096-4b38-b78d-0fed6277096a_HelpInfo.xml | 2 +- ...eb74e8da-9ae2-482a-a648-e96550fb8733_HelpInfo.xml | 2 +- ...ca046f10-ca64-4740-8ff9-2565dba61a4f_HelpInfo.xml | 2 +- ...56d66100-99a0-4ffc-a12d-eee9a6718aef_HelpInfo.xml | 2 +- ...eefcb906-b326-4e99-9f54-8b4bb6ef3c6d_HelpInfo.xml | 2 +- ...A94C8C7E-9810-47C0-B8AF-65089C13A35A_HelpInfo.xml | 2 +- ...1da87e53-152b-403e-98dc-74d7b4d63d59_HelpInfo.xml | 2 +- ...766204A6-330E-4263-A7AB-46C87AFC366C_HelpInfo.xml | 2 +- ...5714753b-2afd-4492-a5fd-01d9e2cff8b5_HelpInfo.xml | 2 +- ...4ae9fd46-338a-459c-8186-07f910774cb8_HelpInfo.xml | 2 +- ...1d73a601-4a6c-43c5-ba3f-619b18bbb404_HelpInfo.xml | 2 +- 27 files changed, 35 insertions(+), 35 deletions(-) diff --git a/src/Microsoft.PowerShell.PSReadLine/PSReadLine.psd1 b/src/Microsoft.PowerShell.PSReadLine/PSReadLine.psd1 index 6af2eea6f73..41e6b0cc5fe 100644 --- a/src/Microsoft.PowerShell.PSReadLine/PSReadLine.psd1 +++ b/src/Microsoft.PowerShell.PSReadLine/PSReadLine.psd1 @@ -13,5 +13,5 @@ CLRVersion = '4.0' FunctionsToExport = 'PSConsoleHostReadline' CmdletsToExport = 'Get-PSReadlineKeyHandler','Set-PSReadlineKeyHandler','Remove-PSReadlineKeyHandler', 'Get-PSReadlineOption','Set-PSReadlineOption' -HelpInfoURI = 'https://go.microsoft.com/fwlink/?LinkId=528806' +HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=855966' } diff --git a/src/Modules/Shared/Microsoft.PowerShell.Host/Microsoft.PowerShell.Host.psd1 b/src/Modules/Shared/Microsoft.PowerShell.Host/Microsoft.PowerShell.Host.psd1 index 4d07a73f9c0..f16263ffb5f 100644 --- a/src/Modules/Shared/Microsoft.PowerShell.Host/Microsoft.PowerShell.Host.psd1 +++ b/src/Modules/Shared/Microsoft.PowerShell.Host/Microsoft.PowerShell.Host.psd1 @@ -10,5 +10,5 @@ AliasesToExport = @() FunctionsToExport = @() CmdletsToExport="Start-Transcript", "Stop-Transcript" NestedModules="Microsoft.PowerShell.ConsoleHost.dll" -HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=390784' +HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=855956' } diff --git a/src/Modules/Shared/PSReadLine/PSReadLine.psd1 b/src/Modules/Shared/PSReadLine/PSReadLine.psd1 index 6af2eea6f73..41e6b0cc5fe 100644 --- a/src/Modules/Shared/PSReadLine/PSReadLine.psd1 +++ b/src/Modules/Shared/PSReadLine/PSReadLine.psd1 @@ -13,5 +13,5 @@ CLRVersion = '4.0' FunctionsToExport = 'PSConsoleHostReadline' CmdletsToExport = 'Get-PSReadlineKeyHandler','Set-PSReadlineKeyHandler','Remove-PSReadlineKeyHandler', 'Get-PSReadlineOption','Set-PSReadlineOption' -HelpInfoURI = 'https://go.microsoft.com/fwlink/?LinkId=528806' +HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=855966' } diff --git a/src/Modules/Unix/Microsoft.PowerShell.Management/Microsoft.PowerShell.Management.psd1 b/src/Modules/Unix/Microsoft.PowerShell.Management/Microsoft.PowerShell.Management.psd1 index 90759a98e4b..239ef66ecd2 100644 --- a/src/Modules/Unix/Microsoft.PowerShell.Management/Microsoft.PowerShell.Management.psd1 +++ b/src/Modules/Unix/Microsoft.PowerShell.Management/Microsoft.PowerShell.Management.psd1 @@ -6,8 +6,8 @@ Copyright="(c) Microsoft Corporation. All rights reserved." ModuleVersion="3.1.0.0" PowerShellVersion="3.0" NestedModules="Microsoft.PowerShell.Commands.Management.dll" -HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=390785' -AliasesToExport = @("gtz") +HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=855958' +AliasesToExport = @("gtz") FunctionsToExport = @() CmdletsToExport=@("Add-Content", "Clear-Content", diff --git a/src/Modules/Unix/Microsoft.PowerShell.Security/Microsoft.PowerShell.Security.psd1 b/src/Modules/Unix/Microsoft.PowerShell.Security/Microsoft.PowerShell.Security.psd1 index a8ef3b89ffc..8ff7cc1a76a 100644 --- a/src/Modules/Unix/Microsoft.PowerShell.Security/Microsoft.PowerShell.Security.psd1 +++ b/src/Modules/Unix/Microsoft.PowerShell.Security/Microsoft.PowerShell.Security.psd1 @@ -9,5 +9,5 @@ AliasesToExport = @() FunctionsToExport = @() CmdletsToExport="Get-Credential", "Get-ExecutionPolicy", "Set-ExecutionPolicy", "ConvertFrom-SecureString", "ConvertTo-SecureString", "Get-PfxCertificate" NestedModules="Microsoft.PowerShell.Security.dll" -HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=390786' +HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=855959' } diff --git a/src/Modules/Unix/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 b/src/Modules/Unix/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 index fdc7173d35b..aa30232544e 100644 --- a/src/Modules/Unix/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 +++ b/src/Modules/Unix/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 @@ -26,5 +26,5 @@ CmdletsToExport= "Format-List", "Format-Custom", "Format-Table", "Format-Wide", FunctionsToExport= "Import-PowerShellDataFile" AliasesToExport= "fhx" NestedModules="Microsoft.PowerShell.Commands.Utility.dll","Microsoft.PowerShell.Utility.psm1" -HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=390787' +HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=855960' } diff --git a/src/Modules/Windows-Core+Full/CimCmdlets/CimCmdlets.psd1 b/src/Modules/Windows-Core+Full/CimCmdlets/CimCmdlets.psd1 index 16c79204763..611244f824c 100644 --- a/src/Modules/Windows-Core+Full/CimCmdlets/CimCmdlets.psd1 +++ b/src/Modules/Windows-Core+Full/CimCmdlets/CimCmdlets.psd1 @@ -14,5 +14,5 @@ CmdletsToExport= "Get-CimAssociatedInstance", "Get-CimClass", "Get-CimInstance", "Export-BinaryMiLog","Import-BinaryMiLog" AliasesToExport = "gcim","scim","ncim", "rcim","icim","gcai","rcie","ncms","rcms","gcms","ncso","gcls" FunctionsToExport = @() -HelpInfoUri="https://go.microsoft.com/fwlink/?linkid=390758" +HelpInfoUri="https://go.microsoft.com/fwlink/?linkid=855946" } diff --git a/src/Modules/Windows-Core+Full/Microsoft.PowerShell.Security/Microsoft.PowerShell.Security.psd1 b/src/Modules/Windows-Core+Full/Microsoft.PowerShell.Security/Microsoft.PowerShell.Security.psd1 index fc76cbdf76f..f87b04f8c36 100644 --- a/src/Modules/Windows-Core+Full/Microsoft.PowerShell.Security/Microsoft.PowerShell.Security.psd1 +++ b/src/Modules/Windows-Core+Full/Microsoft.PowerShell.Security/Microsoft.PowerShell.Security.psd1 @@ -10,5 +10,5 @@ AliasesToExport = @() FunctionsToExport = @() CmdletsToExport="Get-Acl", "Set-Acl", "Get-PfxCertificate", "Get-Credential", "Get-ExecutionPolicy", "Set-ExecutionPolicy", "Get-AuthenticodeSignature", "Set-AuthenticodeSignature", "ConvertFrom-SecureString", "ConvertTo-SecureString", "Get-CmsMessage", "Unprotect-CmsMessage", "Protect-CmsMessage" , "New-FileCatalog" , "Test-FileCatalog" NestedModules="Microsoft.PowerShell.Security.dll" -HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=390786' +HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=855959' } diff --git a/src/Modules/Windows-Core+Full/Microsoft.WSMan.Management/Microsoft.WSMan.Management.psd1 b/src/Modules/Windows-Core+Full/Microsoft.WSMan.Management/Microsoft.WSMan.Management.psd1 index 722b3d0d3a8..8de5dcd0c60 100644 --- a/src/Modules/Windows-Core+Full/Microsoft.WSMan.Management/Microsoft.WSMan.Management.psd1 +++ b/src/Modules/Windows-Core+Full/Microsoft.WSMan.Management/Microsoft.WSMan.Management.psd1 @@ -11,5 +11,5 @@ FunctionsToExport = @() CmdletsToExport="Disable-WSManCredSSP", "Enable-WSManCredSSP", "Get-WSManCredSSP", "Set-WSManQuickConfig", "Test-WSMan", "Invoke-WSManAction", "Connect-WSMan", "Disconnect-WSMan", "Get-WSManInstance", "Set-WSManInstance", "Remove-WSManInstance", "New-WSManInstance", "New-WSManSessionOption" NestedModules="Microsoft.WSMan.Management.dll" FormatsToProcess="WSMan.format.ps1xml" -HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=390788' +HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=855961' } diff --git a/src/Modules/Windows-Core/Microsoft.PowerShell.Diagnostics/Microsoft.PowerShell.Diagnostics.psd1 b/src/Modules/Windows-Core/Microsoft.PowerShell.Diagnostics/Microsoft.PowerShell.Diagnostics.psd1 index 8dc0d9cada6..11096b37bd1 100644 --- a/src/Modules/Windows-Core/Microsoft.PowerShell.Diagnostics/Microsoft.PowerShell.Diagnostics.psd1 +++ b/src/Modules/Windows-Core/Microsoft.PowerShell.Diagnostics/Microsoft.PowerShell.Diagnostics.psd1 @@ -9,5 +9,5 @@ CmdletsToExport="Get-WinEvent", "New-WinEvent" # Counter CmdLets Disabled #4272: NestedModules="Microsoft.PowerShell.Commands.Diagnostics.dll" TypesToProcess="GetEvent.types.ps1xml" FormatsToProcess="Event.format.ps1xml", "Diagnostics.format.ps1xml" -HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=390783' +HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=855954' } diff --git a/src/Modules/Windows-Core/Microsoft.PowerShell.Management/Microsoft.PowerShell.Management.psd1 b/src/Modules/Windows-Core/Microsoft.PowerShell.Management/Microsoft.PowerShell.Management.psd1 index f2fadbe07ce..b4695877696 100644 --- a/src/Modules/Windows-Core/Microsoft.PowerShell.Management/Microsoft.PowerShell.Management.psd1 +++ b/src/Modules/Windows-Core/Microsoft.PowerShell.Management/Microsoft.PowerShell.Management.psd1 @@ -6,8 +6,8 @@ Copyright="(c) Microsoft Corporation. All rights reserved." ModuleVersion="3.1.0.0" PowerShellVersion="3.0" NestedModules="Microsoft.PowerShell.Commands.Management.dll" -HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=390785' -AliasesToExport = @("gin", "gtz", "stz") +HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=855958' +AliasesToExport = @("gin", "gtz", "stz") FunctionsToExport = @() CmdletsToExport=@("Add-Content", "Clear-Content", diff --git a/src/Modules/Windows-Core/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 b/src/Modules/Windows-Core/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 index 7c7b3d302c8..5309d98293b 100644 --- a/src/Modules/Windows-Core/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 +++ b/src/Modules/Windows-Core/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 @@ -26,5 +26,5 @@ CmdletsToExport= "Format-List", "Format-Custom", "Format-Table", "Format-Wide", FunctionsToExport= "ConvertFrom-SddlString" AliasesToExport= "fhx" NestedModules="Microsoft.PowerShell.Commands.Utility.dll","Microsoft.PowerShell.Utility.psm1" -HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=390787' +HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=855960' } diff --git a/src/Modules/Windows-Full/Microsoft.PowerShell.Diagnostics/Microsoft.PowerShell.Diagnostics.psd1 b/src/Modules/Windows-Full/Microsoft.PowerShell.Diagnostics/Microsoft.PowerShell.Diagnostics.psd1 index ca82ca6e9dc..2b5035e6e3d 100644 --- a/src/Modules/Windows-Full/Microsoft.PowerShell.Diagnostics/Microsoft.PowerShell.Diagnostics.psd1 +++ b/src/Modules/Windows-Full/Microsoft.PowerShell.Diagnostics/Microsoft.PowerShell.Diagnostics.psd1 @@ -11,6 +11,6 @@ FunctionsToExport = @() CmdletsToExport="Get-WinEvent", "Get-Counter", "Import-Counter", "Export-Counter", "New-WinEvent" NestedModules="Microsoft.PowerShell.Commands.Diagnostics.dll" TypesToProcess="GetEvent.types.ps1xml" -FormatsToProcess="Event.format.ps1xml","Diagnostics.format.ps1xml" -HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=390783' +FormatsToProcess="Event.format.ps1xml","Diagnostics.format.ps1xml" +HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=855954' } diff --git a/src/Modules/Windows-Full/Microsoft.PowerShell.Management/Microsoft.PowerShell.Management.psd1 b/src/Modules/Windows-Full/Microsoft.PowerShell.Management/Microsoft.PowerShell.Management.psd1 index 81e941c6d71..18c67d3033a 100644 --- a/src/Modules/Windows-Full/Microsoft.PowerShell.Management/Microsoft.PowerShell.Management.psd1 +++ b/src/Modules/Windows-Full/Microsoft.PowerShell.Management/Microsoft.PowerShell.Management.psd1 @@ -7,7 +7,7 @@ ModuleVersion="3.1.0.0" PowerShellVersion="3.0" CLRVersion="4.0" NestedModules="Microsoft.PowerShell.Commands.Management.dll" -HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=390785' +HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=855958' AliasesToExport = @("gcb", "scb", "gin", "gtz", "stz") FunctionsToExport = @() CmdletsToExport=@("Add-Content", diff --git a/src/Modules/Windows-Full/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 b/src/Modules/Windows-Full/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 index 86eccf288f3..afaafa5aed1 100644 --- a/src/Modules/Windows-Full/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 +++ b/src/Modules/Windows-Full/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 @@ -28,5 +28,5 @@ CmdletsToExport= "Format-List", "Format-Custom", "Format-Table", "Format-Wide", FunctionsToExport= "ConvertFrom-SddlString" AliasesToExport= "CFS", "fhx" NestedModules="Microsoft.PowerShell.Commands.Utility.dll","Microsoft.PowerShell.Utility.psm1" -HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=390787' +HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=855960' } diff --git a/src/System.Management.Automation/help/UpdatableHelpCommandBase.cs b/src/System.Management.Automation/help/UpdatableHelpCommandBase.cs index 7b006d35415..ff3bf2a6746 100644 --- a/src/System.Management.Automation/help/UpdatableHelpCommandBase.cs +++ b/src/System.Management.Automation/help/UpdatableHelpCommandBase.cs @@ -159,13 +159,13 @@ static UpdatableHelpCommandBase() // TODO: assign real TechNet addresses - s_metadataCache.Add("Microsoft.PowerShell.Diagnostics", "https://go.microsoft.com/fwlink/?linkid=390783"); + s_metadataCache.Add("Microsoft.PowerShell.Diagnostics", "https://go.microsoft.com/fwlink/?linkid=855954"); s_metadataCache.Add("Microsoft.PowerShell.Core", "https://go.microsoft.com/fwlink/?linkid=390782"); - s_metadataCache.Add("Microsoft.PowerShell.Utility", "https://go.microsoft.com/fwlink/?linkid=390787"); - s_metadataCache.Add("Microsoft.PowerShell.Host", "https://go.microsoft.com/fwlink/?linkid=390784"); - s_metadataCache.Add("Microsoft.PowerShell.Management", " https://go.microsoft.com/fwlink/?linkid=390785"); - s_metadataCache.Add("Microsoft.PowerShell.Security", " https://go.microsoft.com/fwlink/?linkid=390786"); - s_metadataCache.Add("Microsoft.WSMan.Management", "https://go.microsoft.com/fwlink/?linkid=390788"); + s_metadataCache.Add("Microsoft.PowerShell.Utility", "https://go.microsoft.com/fwlink/?linkid=855960"); + s_metadataCache.Add("Microsoft.PowerShell.Host", "https://go.microsoft.com/fwlink/?linkid=855956"); + s_metadataCache.Add("Microsoft.PowerShell.Management", "https://go.microsoft.com/fwlink/?linkid=855958"); + s_metadataCache.Add("Microsoft.PowerShell.Security", "https://go.microsoft.com/fwlink/?linkid=855959"); + s_metadataCache.Add("Microsoft.WSMan.Management", "https://go.microsoft.com/fwlink/?linkid=855961"); } /// diff --git a/test/powershell/engine/Help/assets/CimCmdlets_fb6cc51d-c096-4b38-b78d-0fed6277096a_HelpInfo.xml b/test/powershell/engine/Help/assets/CimCmdlets_fb6cc51d-c096-4b38-b78d-0fed6277096a_HelpInfo.xml index 6ca527fbc1e..06f6228f81b 100644 --- a/test/powershell/engine/Help/assets/CimCmdlets_fb6cc51d-c096-4b38-b78d-0fed6277096a_HelpInfo.xml +++ b/test/powershell/engine/Help/assets/CimCmdlets_fb6cc51d-c096-4b38-b78d-0fed6277096a_HelpInfo.xml @@ -1,6 +1,6 @@  - http://go.microsoft.com/fwlink/?linkid=390758 + https://go.microsoft.com/fwlink/?linkid=855946 en-US diff --git a/test/powershell/engine/Help/assets/Microsoft.PowerShell.Archive_eb74e8da-9ae2-482a-a648-e96550fb8733_HelpInfo.xml b/test/powershell/engine/Help/assets/Microsoft.PowerShell.Archive_eb74e8da-9ae2-482a-a648-e96550fb8733_HelpInfo.xml index 7b097cf3b05..36e9045ee94 100644 --- a/test/powershell/engine/Help/assets/Microsoft.PowerShell.Archive_eb74e8da-9ae2-482a-a648-e96550fb8733_HelpInfo.xml +++ b/test/powershell/engine/Help/assets/Microsoft.PowerShell.Archive_eb74e8da-9ae2-482a-a648-e96550fb8733_HelpInfo.xml @@ -1,6 +1,6 @@  - http://go.microsoft.com/fwlink/?linkid=393254 + https://go.microsoft.com/fwlink/?linkid=855952 en-US diff --git a/test/powershell/engine/Help/assets/Microsoft.PowerShell.Diagnostics_ca046f10-ca64-4740-8ff9-2565dba61a4f_HelpInfo.xml b/test/powershell/engine/Help/assets/Microsoft.PowerShell.Diagnostics_ca046f10-ca64-4740-8ff9-2565dba61a4f_HelpInfo.xml index a703a99bee8..3caa3197b7e 100644 --- a/test/powershell/engine/Help/assets/Microsoft.PowerShell.Diagnostics_ca046f10-ca64-4740-8ff9-2565dba61a4f_HelpInfo.xml +++ b/test/powershell/engine/Help/assets/Microsoft.PowerShell.Diagnostics_ca046f10-ca64-4740-8ff9-2565dba61a4f_HelpInfo.xml @@ -1,6 +1,6 @@  - http://go.microsoft.com/fwlink/?linkid=390783 + https://go.microsoft.com/fwlink/?linkid=855954 en-US diff --git a/test/powershell/engine/Help/assets/Microsoft.PowerShell.Host_56d66100-99a0-4ffc-a12d-eee9a6718aef_HelpInfo.xml b/test/powershell/engine/Help/assets/Microsoft.PowerShell.Host_56d66100-99a0-4ffc-a12d-eee9a6718aef_HelpInfo.xml index f4abd62853b..cc8e90fa637 100644 --- a/test/powershell/engine/Help/assets/Microsoft.PowerShell.Host_56d66100-99a0-4ffc-a12d-eee9a6718aef_HelpInfo.xml +++ b/test/powershell/engine/Help/assets/Microsoft.PowerShell.Host_56d66100-99a0-4ffc-a12d-eee9a6718aef_HelpInfo.xml @@ -1,6 +1,6 @@  - http://go.microsoft.com/fwlink/?linkid=390784 + https://go.microsoft.com/fwlink/?linkid=855956 en-US diff --git a/test/powershell/engine/Help/assets/Microsoft.PowerShell.Management_eefcb906-b326-4e99-9f54-8b4bb6ef3c6d_HelpInfo.xml b/test/powershell/engine/Help/assets/Microsoft.PowerShell.Management_eefcb906-b326-4e99-9f54-8b4bb6ef3c6d_HelpInfo.xml index 7aaa021a2b3..feb9ab2610b 100644 --- a/test/powershell/engine/Help/assets/Microsoft.PowerShell.Management_eefcb906-b326-4e99-9f54-8b4bb6ef3c6d_HelpInfo.xml +++ b/test/powershell/engine/Help/assets/Microsoft.PowerShell.Management_eefcb906-b326-4e99-9f54-8b4bb6ef3c6d_HelpInfo.xml @@ -1,6 +1,6 @@  - http://go.microsoft.com/fwlink/?linkid=390785 + https://go.microsoft.com/fwlink/?linkid=855958 en-US diff --git a/test/powershell/engine/Help/assets/Microsoft.PowerShell.Security_A94C8C7E-9810-47C0-B8AF-65089C13A35A_HelpInfo.xml b/test/powershell/engine/Help/assets/Microsoft.PowerShell.Security_A94C8C7E-9810-47C0-B8AF-65089C13A35A_HelpInfo.xml index bfe0ff8f29a..0ea9eeee58d 100644 --- a/test/powershell/engine/Help/assets/Microsoft.PowerShell.Security_A94C8C7E-9810-47C0-B8AF-65089C13A35A_HelpInfo.xml +++ b/test/powershell/engine/Help/assets/Microsoft.PowerShell.Security_A94C8C7E-9810-47C0-B8AF-65089C13A35A_HelpInfo.xml @@ -1,6 +1,6 @@  - http://go.microsoft.com/fwlink/?linkid=390786 + https://go.microsoft.com/fwlink/?linkid=855959 en-US diff --git a/test/powershell/engine/Help/assets/Microsoft.PowerShell.Utility_1da87e53-152b-403e-98dc-74d7b4d63d59_HelpInfo.xml b/test/powershell/engine/Help/assets/Microsoft.PowerShell.Utility_1da87e53-152b-403e-98dc-74d7b4d63d59_HelpInfo.xml index 1502a2c63dd..599d2c9c905 100644 --- a/test/powershell/engine/Help/assets/Microsoft.PowerShell.Utility_1da87e53-152b-403e-98dc-74d7b4d63d59_HelpInfo.xml +++ b/test/powershell/engine/Help/assets/Microsoft.PowerShell.Utility_1da87e53-152b-403e-98dc-74d7b4d63d59_HelpInfo.xml @@ -1,6 +1,6 @@  - http://go.microsoft.com/fwlink/?linkid=390787 + https://go.microsoft.com/fwlink/?linkid=855960 en-US diff --git a/test/powershell/engine/Help/assets/Microsoft.WSMan.Management_766204A6-330E-4263-A7AB-46C87AFC366C_HelpInfo.xml b/test/powershell/engine/Help/assets/Microsoft.WSMan.Management_766204A6-330E-4263-A7AB-46C87AFC366C_HelpInfo.xml index 3b747f0e491..9c214908044 100644 --- a/test/powershell/engine/Help/assets/Microsoft.WSMan.Management_766204A6-330E-4263-A7AB-46C87AFC366C_HelpInfo.xml +++ b/test/powershell/engine/Help/assets/Microsoft.WSMan.Management_766204A6-330E-4263-A7AB-46C87AFC366C_HelpInfo.xml @@ -1,6 +1,6 @@  - http://go.microsoft.com/fwlink/?linkid=390788 + https://go.microsoft.com/fwlink/?linkid=855961 en-US diff --git a/test/powershell/engine/Help/assets/PSReadline_5714753b-2afd-4492-a5fd-01d9e2cff8b5_HelpInfo.xml b/test/powershell/engine/Help/assets/PSReadline_5714753b-2afd-4492-a5fd-01d9e2cff8b5_HelpInfo.xml index 5a421e09586..eb1634001a4 100644 --- a/test/powershell/engine/Help/assets/PSReadline_5714753b-2afd-4492-a5fd-01d9e2cff8b5_HelpInfo.xml +++ b/test/powershell/engine/Help/assets/PSReadline_5714753b-2afd-4492-a5fd-01d9e2cff8b5_HelpInfo.xml @@ -1,6 +1,6 @@  - http://go.microsoft.com/fwlink/?LinkId=528806 + https://go.microsoft.com/fwlink/?linkid=855966 en-US diff --git a/test/powershell/engine/Help/assets/PackageManagement_4ae9fd46-338a-459c-8186-07f910774cb8_HelpInfo.xml b/test/powershell/engine/Help/assets/PackageManagement_4ae9fd46-338a-459c-8186-07f910774cb8_HelpInfo.xml index fda505c7536..432f4f923cc 100644 --- a/test/powershell/engine/Help/assets/PackageManagement_4ae9fd46-338a-459c-8186-07f910774cb8_HelpInfo.xml +++ b/test/powershell/engine/Help/assets/PackageManagement_4ae9fd46-338a-459c-8186-07f910774cb8_HelpInfo.xml @@ -1,6 +1,6 @@  - http://go.microsoft.com/fwlink/?linkid=392040 + https://go.microsoft.com/fwlink/?linkid=855962 en-US diff --git a/test/powershell/engine/Help/assets/PowershellGet_1d73a601-4a6c-43c5-ba3f-619b18bbb404_HelpInfo.xml b/test/powershell/engine/Help/assets/PowershellGet_1d73a601-4a6c-43c5-ba3f-619b18bbb404_HelpInfo.xml index 7fa73298783..fc2f96b5d72 100644 --- a/test/powershell/engine/Help/assets/PowershellGet_1d73a601-4a6c-43c5-ba3f-619b18bbb404_HelpInfo.xml +++ b/test/powershell/engine/Help/assets/PowershellGet_1d73a601-4a6c-43c5-ba3f-619b18bbb404_HelpInfo.xml @@ -1,6 +1,6 @@  - http://go.microsoft.com/fwlink/?LinkID=393271 + https://go.microsoft.com/fwlink/?linkid=855963 en-US From 17c16ce4c5f4f609e606ad1f455a1d32bea15059 Mon Sep 17 00:00:00 2001 From: Steve Lee Date: Mon, 23 Oct 2017 09:29:48 -0700 Subject: [PATCH 029/617] Fix vscode launch.json to point to pwsh (#5189) --- .vscode/launch.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 5a51dd2dc7d..21343b2861b 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -7,7 +7,7 @@ "request": "launch", "justMyCode": false, "stopAtEntry": true, - "program": "${workspaceRoot}/debug/powershell", + "program": "${workspaceRoot}/debug/pwsh", "preLaunchTask": "build", "externalConsole": true, "cwd": "${workspaceRoot}" From e0af4d96d8446b84d03b413af41aac0969745e92 Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 23 Oct 2017 09:35:28 -0700 Subject: [PATCH 030/617] Add example of how to create a .net core cmdlet with Visual Studio (#5096) --- .spelling | 6 + docs/cmdlet-example/Images/Std21.png | Bin 0 -> 28212 bytes docs/cmdlet-example/Images/Std22.png | Bin 0 -> 3558 bytes docs/cmdlet-example/Images/Std3.png | Bin 0 -> 41052 bytes docs/cmdlet-example/Images/Std4.png | Bin 0 -> 38680 bytes docs/cmdlet-example/Images/Std5.png | Bin 0 -> 11624 bytes docs/cmdlet-example/Images/Std61.png | Bin 0 -> 74929 bytes docs/cmdlet-example/Images/Std62.png | Bin 0 -> 169053 bytes docs/cmdlet-example/Images/Std63.png | Bin 0 -> 39636 bytes docs/cmdlet-example/Images/Step1.png | Bin 0 -> 18095 bytes docs/cmdlet-example/Images/Step2.png | Bin 0 -> 38176 bytes docs/cmdlet-example/Images/Step3.png | Bin 0 -> 37149 bytes docs/cmdlet-example/Images/Step4.png | Bin 0 -> 31317 bytes docs/cmdlet-example/Images/Step5.png | Bin 0 -> 50621 bytes docs/cmdlet-example/Images/Step6.png | Bin 0 -> 12413 bytes docs/cmdlet-example/Images/Step7.png | Bin 0 -> 11670 bytes docs/cmdlet-example/Images/Step8.png | Bin 0 -> 35634 bytes .../visual-studio-simple-example.md | 131 ++++++++++++++++++ test/common/markdown/markdown.tests.ps1 | 2 +- 19 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 docs/cmdlet-example/Images/Std21.png create mode 100644 docs/cmdlet-example/Images/Std22.png create mode 100644 docs/cmdlet-example/Images/Std3.png create mode 100644 docs/cmdlet-example/Images/Std4.png create mode 100644 docs/cmdlet-example/Images/Std5.png create mode 100644 docs/cmdlet-example/Images/Std61.png create mode 100644 docs/cmdlet-example/Images/Std62.png create mode 100644 docs/cmdlet-example/Images/Std63.png create mode 100644 docs/cmdlet-example/Images/Step1.png create mode 100644 docs/cmdlet-example/Images/Step2.png create mode 100644 docs/cmdlet-example/Images/Step3.png create mode 100644 docs/cmdlet-example/Images/Step4.png create mode 100644 docs/cmdlet-example/Images/Step5.png create mode 100644 docs/cmdlet-example/Images/Step6.png create mode 100644 docs/cmdlet-example/Images/Step7.png create mode 100644 docs/cmdlet-example/Images/Step8.png create mode 100644 docs/cmdlet-example/visual-studio-simple-example.md diff --git a/.spelling b/.spelling index fbd9211e362..9c3c046a124 100644 --- a/.spelling +++ b/.spelling @@ -496,6 +496,12 @@ netstandard.dll wsl #endregion +#region docs/cmdlet-example/visual-studio-simple-example.md Overrides +- docs/cmdlet-example/visual-studio-simple-example.md +dropdown +v3 +#endregion + #region docs/community/governance.md Overrides - docs/community/governance.md Aiello diff --git a/docs/cmdlet-example/Images/Std21.png b/docs/cmdlet-example/Images/Std21.png new file mode 100644 index 0000000000000000000000000000000000000000..30761d793cbe007d38b18fd887bece93f7961264 GIT binary patch literal 28212 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 XwkN&eu`YG9Hv^pPUF_;?{FD9yC$9a% literal 0 HcmV?d00001 diff --git a/docs/cmdlet-example/Images/Std3.png b/docs/cmdlet-example/Images/Std3.png new file mode 100644 index 0000000000000000000000000000000000000000..850680080d4767a6c1a6c3fcfb5509924b2307dc GIT binary patch literal 41052 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 OdF$!w=d#Wzp$P!(yQ;eY literal 0 HcmV?d00001 diff --git a/docs/cmdlet-example/Images/Std4.png b/docs/cmdlet-example/Images/Std4.png new file mode 100644 index 0000000000000000000000000000000000000000..3b755c78a03e7b3db419d2ec50321c7a4f5162dd GIT binary patch literal 38680 zcmZs?2UL?;)HTdFSP&JE2r2>s0){FUP*I|QN=Ji)K!A*)3jslTiy{gHq(}!bq7{ET_ZSVJwCbv(vTwF;-y4trN`dZUin9tH?K|gsk#yP5V-0PgJn2d5%Qi|7Q z>8~Q=eio(C#3t&`)H&-Y2U^dNXU)MO|2H-cDhIZrY${y1*?)}eD?a?k#lKoh&O1&D zDTON5eU&@^T;<{O*w9=109X6+t7_w66RKMs8`tlc<4y7T`SCKeTP zcBnz$+Nki-|MiI9?`iA&2p`|~{~k0{`}IksH_*UIV-kchRqjkF@2ZD<=HN@WI12@j z88+^d_;;Q4X~~n7^w+%za zi&Z08hj`K(nCfor_K=c9H2TD<6a+^LnuXVM%t|wgIM>sI*zgNu7gad%;$4f|t1fEF zkc9fYRfi_bH3rg+y}A^?#c6wanIh}t5oHwruf6sb6W$Rc1Z56T%t-Evj48y;YfER1 zB)%|;x^ngxp?8Q&`3jU^(m*FG)b-m%mZL~exTA|p+QPy|MXftJgEKhJj*GhRcm^cz zoGHCyjb^In4jxtJtk$+~>JY-69Wm5H5$^H)`rGjkV4pvTsepr9Ryd}sZi@;v{?qal z1Uq-^3PUUYNj548!~nngG(Y6T-5XT?;F3gGH*>UVM!bc znUk{6U1f}=@g`Ns4Z+^JGUutKTk@H%f<K zb{!G<$_<+vVlb>>>S8=fG;^Vt4j*n)T&Tk8aQsMZ&Hw$`MGJ3b9D$2C{6N-Tyq#3 zJL_v&^Vo@Z+8@oj?}Z@X2D;Y!_%d8a_{^4NA&dc2tLM8N1oZCW(0q*BfU59xfArBG ziE`hjMf4rbOA8v@Z}&lK86GP_i^9;2<1W-J` z@vM^VJBb)ezv;a^|Cf%%`IzWfP`c>^9@k-=N7oOPaXzl20-O#^w*{73YuzkWGTpMI z96X1A?Q0b|-7#%;PN@t+lw5+j@2_~1u2iubRR*q*Y43adxvbp9p&&Sv1;>n7-=`ZFkU3U)W!mX>)RzSVQLmNocBgC( zDLPx3VQE?=!&tNgne6Z;DDEgtz84BT<7Av)t2D0NAM@Qk@0VLD-7Wi==;Bu#Q-J%n zfl8ptvSh>Y?k*5%B7+i!t3u7}!v%M(qy$N}NtS2x`{NGMr9Ez+SI^FFCE05aWkn1g znCcOo{iL5)>kX;9`1{BrB?3;(ZE8qPNj=k^bfbXq<4WB zUmvgcnZ<66ZX=b4ht3RDM1g7!B@Rdjp7IvBt|XM%#a|&{^AFJa_)jg%H5^v~drRPC z*)v;3C)*a?&I{b!O-Ur*iP&iPj82Q|m|64E@Ns!e(rw#sdVX5 z_Kjp%O&Gp~Kvf8+ZD}Qo6kt-lvwOaxjbdIaDUYtG0DfqA!OhU}>9sy%oN7}Q{_({% zi)0i}9IP&_V9NoDMAac8>h&>ep6Zcs)xTr)CWr(kl(fm9jWWGoyA_IyK&?K7Y#^U*!155P*H zo#Sh1Ww)vxNgUad+W0#U4$+(hEt(au{ihYF_5qf@F3f7EUFBrcafwIqPby@o)DP>2 z0*&2ikIW!zlN2KY)RL544c9%kB)_Pq<6cf%voJSKRD1QWTMB_PmrE(QVSBe!?}`U) zvytB_j1hkn>SoC%&s=?4P^#Z6xiA|)&@sIjSVEJmL$-QA3U*r&xQ{GCQ@Pu~1iEMU zYRE}M?bLL`bty2pq4MkDtqB_CptR=KyBp%aPh-fZdkeP_$IPX@onVI|G1kh>?<=ed zTMrM2sU!8{O<^?<*83vc9f6iIMggXpckJrU_|OZYwb$C%fLNI{AIT$OqQhku_t~GnpE>?hK9bLgD_jfZ}W3Mh*7ODW(cGy#9ZMw4RI7#mgqmN zvl{-5(<=Ri)4qN?D)zGgD-5zD1?J~G5^L99Tlhn zKYBu%Gf@$KKc(zKdw3?^A6PjW0zZ=FX$Vyn#9cg-fcL!GZ;mIT0jno$wmH)x>+tox#&)!Q=*cq@NGHxph=H z#@2_lc9ilbvY@qQt^8n#TJ2h*X^@-mS%!u93a^QA-7@RIWJ0vOS$)#YU$59yh3<{f zSZekdQ-A9~Hk__sjR`!zc0oe-%0%0LjO}f4Zhgo zq4T#`RlpUGQ)wyqizjnE2USTWGIj-Lq(lu@j>e7Zb5_4|AHPPfKW(km)T(#_5d zU-yrjXdXOEUVNPsfib|EWReFBvKSUGH)PsePZ02lh4r>w`zJv$_0%)ioUKRBMgPjaid2551|xA9S^ia&N_yk^uS6EIQ9y~`s*_<1e>6^(fY!G5O%#VrH^4);3CclIz6N9C z#S%VZQ@I#)(ZylEV|PBGuTNd&FslxUQdQ~lWaXfF{WguuJlCN&I^Y&qJKQk}J{$hE zXaf7aD$x=t*Fk5giCk02{@(I_r@ctI-Sm`ky*YOUzd_txx4ym{-Hb)a1+&S-eR{d{bly-9BP>~M;jINNjBy_~ezU1PhA1UN(DGHS)tSsjmUvlU0AQu6gmCg4KT<*^bKBm}iylHCGG!H2V3;TX9B^ z+uT9)HSqG(@CWKo=Rti6N836^Dk$U;plgfoq|j|pV!UvcV_aKZ&G;iINr$t-?p zwliBRthH2r8_r^{keWgTd3R1-*EnH>;dPlOKa!oYmVKt3=Al)T^Dib4nkJsr- zO9>>E-uk+aWKaWjicoFyK5r>+~d>>@=2W;4gW zeLvgJ=ES^>*K397m=SS^PkrTqE$PnN)k|=MB#m$L3IOtfO%Kh2riQidje2+l2(ubU zA7_YL^208Scu7ot(PPldXG$z7u)nfvZ$wn;wCrS@?3>(5+-3 z^B4@9d#Wf4{xyQopp|Q!%<#$rUhI)}^JI90-Tq7Guz4GfzwOq4+p!I>nbW)}(F z@gfnbf*klZRG}Ld)sb)fc&$*j*&p@pt-^q8C%{YKdkN%i>TG zta>#z9m1Mj`qOQ+59fi1aNKZpmlp?k%H=1eFNd^iQ^P36u&2?nzY;}E>NCMQvGqs`&D zmY_Fe>f|-pY)s+^(Nb7K!h0NlGHk8!Yf#SMnC#cZCh}8El{<8)DPW8-x`bnuVv<-5 z#>~(?f1=q`EcYsQ0XL&#Q{Co9tvJ zr#L*bF*vtY8RY-TQGJ!~WsRLhn9!tr%#Hho-gO9hnzpKUdbZka>lA)758H+ZhC?<5 z=y4C5P37L=hZdC`<&!66O{@z$JOYY^uExpw?Ur>ea<_|C7%a`!jW=EDx)EPDcSrdm z#4GI|yLuc;cQx;4uwvc&=UtJNM>p5Y;SSY`Wk|6T-oBs%u#zFPC^l z3$~VFUJUn#k6YK?Odos;CpU~GPXIZR_{L|{{i2@Z9GZ$OQ!FSBp=!)dE-j^cEeu_=ocpF0dwWpKEBkzmxAhBBW zN}6`N5>02x>4Lgo8JM{J{y|3I1%e+TKZ4YJL33Ei_Cz^;Md}^2FyJk0bF^}^A5m%? zycR#>a6SXB)Q;U8i5XlBHJ$hZpt>M-BGV1W-p)$+T%A5<5P`@YcRfaBz{O&c~6x;w`i{M6X zL53gP)xlCD(Jd7Ld2j5P}|1{h(T9RXPKk{~9A#jU`O2nuS|62Pca?Hc_xtA9nV!X8r0a z=Uf-E>P!_vQI3fUM-t`9=zZYPw}T!ez!!&n{?dRu`}Iq}i?c!i!D1w$A_zg!@y(&l zSYG5sO{dI@ni5UKxQU9uxws_^qtwS1<3Gb})LB(#PbdTQzF)%0!{Gc%@HeY_u1pic zV{p=;@;pPGQ<;P}v6rtk0)`;Yx{x###`Rb8_W|zFr3yI&6afeSnlR=c|5 zsScq~2(q@LEWIDrqrn(N+QndY7I)4m-FP%0(WLjzG+ACVbAKaWhLD^T$ipQb6v-9I zA9a5ENO@-$m<4eS0Wwb1r`?i7+lLs)t-s){mKouS}Z1WnYQd5E=5(i4U3a7mJ&4k}L z^i5+QUiIsS3hM3cf|b$vsmdB}@h-L+XHp?xprr|c$*Dvu$divRGWBxcS5H~q4X57y zWQf)rnnub8S3Vt)8G3ukhgC^9B-$$judSE$ACf$5453s)^;B8_>Bx4CPe;|!~T%b9Keca z-pHIQf!2ykB;5i+I)d|4ob4hbK`JBd6uGUa=d>@6E!*RnL-NiN3_zdx>uvZC>s_h~ z5&+RL!>pI{0;$<@ zwL{=52*(53C2&<;n`?9A7@qBp3}FEkz~YimS;=ubpfRPE%*PfMtp>T+1Ck; zz*M_tlS^%yjBVA1{gB>Mff&K}fVVP|BU&ykk-FA*tW~LEcOTBwsQcAalv3UmIlH_m zL((txdoK}7XcTKgZmL9A(f5aAgPmKWT2u;MYkbuxdk0P_YSX%5bU zUzlYVKN*8MacKbR!moH_`{-JL_yuTSmpCMa)g7iGcEbqJYWn{txpT^w*hjthTcx?H zOkUq1FEw|YPzd_4C_XHR@8t=s-gz@}>_nMb+Z~j8jOG&EUY*iuRDRP7m|D%w)ei4< z=f47yXyu?}V0srkgMv`fD&p&I%5>?(obD2*>@urS)A)Q5@GHZ!UW|=NlUiWJY|$26vZL|Qw@}46gl^0mBV-Xs0c)A1dVc~6gfDO zM`uX>Y<)Z3^lGicr+}5Y!4C!tQHIxSTUsLG4eP#I>N>saqPl&|*P4AAblF2aeLARp zYj(5KdtqM1rGA9z>*PGz$Sfampq3&MJ}zDoq!(o{xAW`jb(+?ATwnIZ3|5xWkP68B z3`3iYuL;hb__t;&Owgw3Kz>=9t6E=$%b1PL$U_{iYua7m(z|0m!Ct8hJGQp9D*>CY zo9$#E9tehod@^&j!x%^!*7;Dj{LbUFT+K)Qn)Q_z+@#6Sdk=C*$KT}}!?Qs(#CEaP zu7LN7Y(+{iVrd~Ln5L(`?w)p{scPe)xMx~{8-;lF@jTn>`-OK0Pav^(f?2VBD1fQv z^#T>Mcu7yiqo*=e1w6 zVn5hZ%*5Vc3DG~hJ3HBFn7^XwQfO$Q#nGJ4BVOLbD>F}+8_Fq$&cCRToC}3Nd9ye< zRhUp!TTiq6>dc4=^s~$NunC#9Sx5@JgLF}^Bhb0=c^Y5dQcvJPVM8e5^qC(+sNP}U zAto^h-Bfsn&r1Wa#O`tD$gu;4>8m$BWx3*9MbQ5gYj5*+Z!d3=fa>i(Xo+4+a*%Ga z%7*`Pt4TUxD~qtV^Ua)<$q7}9r=nj;2nHonhderudaevc>vI~_=TMGCFSKCxhc=uS}gtIFt zorn(YZQA$}FDEYRu2CE)h4331)l#P{MbwV%ELvD-wo{4S#G>;i<)t#@qnkW4!^h5& zRTW7Gc%N_dzJU&Z;L`+Gk^RgaBL|WnB0STKsl+qduPlJb5dze-Edx2H37xmF>fgga zh?dVGi>_Y%p`ld;p!5MzvsYU1+n>1aT;Q`wn-)}(KBXZ+;OFVqbe8d|diIiAR@&&8 z?9X6!7N~#?Pu-MB5xAx|6JM6~xAzKC4)6uh-{I<-HbQS2{ShvVw@-HED>Q!%=c}w& z#0MEil}k}b&p-gq?Qe{vkQbJ)0_owOvwBb|8otnJ8)>-}XT$s@Vv(~fwaRRvt%)|u z^m3;X6)%Z5h1(L7P$Z2$qjdX<^aa5K@hE&p$VPdeo_nOmRUyW5`JGVW9fT!r6LK>Y zHfi4MM^#BbTo1wp&aIbUWq*k|^+yu!`q4cZHao5(;!5LO_Mk@4P_Ssccu@1ITsHi? zTU@7>nD2Bb@r`XoKH}zm`GlDs6R5%uGpuxe*-6*6l`x^w*oUSi3C#|+-?C@pYt!EQ z`tg1-h=~7oCVn=rv5hD-IHS2+XiNFb7qBLi!*dNg-Rq?4dCl6QjZI#=Qf~5Twy4o! z?y~)zDy5jvF2I06lby|QBucGNG1w>+e3h1 z)x|v5%<`T5-KbwX9`>Py&9dVy{svfQuM^|Zy|fMT=OOx<&}QP=Y$8}fFF;kd-^7vah=(LeNLqWENo3$Er`)CWSH zE?AYl*CI7!ZBIIMrLV{ef!V)sm`3fnt2|kNkiu##HLL&U3>oNRNAgRok1k$c^ z-^*nh3OLDQUG>`|WEN!=!=W4e+Uyx?j20_Vu|}6P8h@z-%@d(lyFVv&lZxMsI0)XLZ%pv>Ucj_z4Cy z49JQ!lz35Yw$0?Xid$eiQUZFMyS@}SYp!%^*-(=bCY-x8;#m}g>&n|0xK$to!fDvu z2VVX=CHo{m425)c-KlUrtazO)qg;(z zTZ`7<4|;oGXsU;mwG-zn!EhQ^=(-qPQ76~6Tx#<`&jHLL6P~Zm4HXX!9_+N5yV~N` z7E7P6UTAvQq<3vxrIxX*-mbVE17U23fZF7Ku_{Pz?+GzEhj9W6UwtA4N z)S02t$(Ih>Bq!kDdB{&66>7F;_5RAPECT6|Lbj7J-xnRI5!&2)T|EDpQSw}sm5n)& z_Q`v476yX*!jlt=^_HTB{Vu|J#y|!=kLf70+#6u;zP;QMJR@F3y5KOD=~Qnn2H7#V83aC=m5|=vjkSX2AjH zhELA@d`fP(eeAy^;E=BC0FavMH_z%#ufJ6RuWeBihc$;nP(sb(ae1+ycE;af&&c`c zL6=}n!n?iMR*Fr*Dn+f66{_{Azx4e#3ufIQ2>!DP5-qgTZ91!4V(RAD$ePy{uFuQg2v)MLC0FMlf;!w=sJX&+ zdXYnk_lys;dC=stdjxNh6coL3M!Jc+J41>1^%i2}MliUIRk-kU60{O?vpA?Gt*QQ< z%%rJt?>;yB^yaH~8Z@Gr1UWFrcSK?~3T_rW|mi<%Bg!YExj|t z@Flmfe{gZ-+|luog#{896Z!e*&RH~@Cv$I|HVbQQR zwR*8AF0N-z0&j+k30P`w#G{Y855tZ~{T&hJym=yqIgU@{9QwK5&~Q7ZMVDX>9<77B z6bWSk$Nn#i&~pPZYNPDspTUsWiB+NErm{HKVNCX!#aEK zVyTVu#zD`|UjP5o7}-t@BOs00dS9e*`}YRD6dJbspo=9vVLKO1t|NnA{qIlD*84{6 zso|pkJ-!Cez5f-m1-ljBZ5QAL|5xg}hkD01D6VHR#kK?CfJi?4$G>K)a0V9n8Cfjg zyqDnqlPUA(^;((+?a9qoq$21;(te2GYiH+5A;w$z(<$TpZ)Gp_;#CQ z88}DAE5FZ>hG1CqyVhu{g?ln-S=(dGbWHEb?@{qz6@}FcSWPdICUydq)6oH&)7`nT z)w?LKySAYW)JGxD(pOT_x_nAAq}ej~UAHQyCb|OkDW`pTFoqbqyU2cE)jwNq zlUV4|zD&wiRh7jHF-$CPrj7uvd@G*5*`d~1l3V358PacW(WaZ4 z-QV~)t9K#K%=XL%_*G}+1%?QVy2 ztOSfLg1}%RCV2t#&HgARnX2bbolGJpAe-la9>vJzu%d!d{7A<3+f3fNC`!DKEyRC> z^hx{b7<+(kMx=h@m7_e_&kq94>cHR3sGDvqTB^=Kv@>l_*z_Fao&BL;Q0P1S==h$8 zT#uy0eWVL5)WafPYGnD!3+t8E$*;kAvSZ@)bp^r1CJIv$Zf5#wEWj9^T z4R(yM0ZftEt&b};)&8e0nU^2sp<%P&un5eCp|LPx|IVt-8`Kv|tv^R44o&{$Ax~ak zcPQ1m*JYm@;QN%AIFasJ?IaNz3re2IvhCF?K?Eg!cDjpw%Cjk5nt&?5xVTn@2DQ|j;>uZZIb^on8QpG*t=_kpZX-;m zYE;taR1oLna{^=wLzTK!IulT#-_{u`vk7ueOd;H6z! zIm=Ou^vlbUXftWqj>~7h!4D}33!Q_kpSy2hjP1yGhwxDsY_cnNUz+O@k_;h=K&=5^ z)vj9CqTix8<(sLvLyVvJpRDZiBaFZhG73y7ZJLMNA}douLCRU>iNM>ZvpoBt3fmP{ zjD5!dU#e<~6%YJ%Tk3Bk-|5X2&hEj|0rs{i1&5i7vq+0f0P)set|Y0j$IMI7?D|2H zRDIMozQaAE2Ra>4B8h?2k_EQ zv5^Cr1Pl+)L9S<4)8)vLe;;@Cf?IRCIJpB!5}t{uFqR04)47c?KC|qGV^Ia;;)qU) zZNeMgf|0Dx7vZlgo?r3vq}GyfhP2}B#eX%q!VU|^$i%;->MgK!T?a%w{ll}fD;L7} zZ*DzbJ!T!&;%@D7@6%E5ccxMsnEfbP&qLVT=k>14_U%x7AZH?Vq*T?VLeZpLW zamEwZeh_5vW;t7Jy)4aR0?zs-Y4?qlgS(TzTE{H#Y1U$TI{oYAj&gBLxa0%w2S{?;X}8>21o$Gaf6dXn;6ty`k-F~h75|lVg`A(>a%_{m;}#BL za5j)Syiq2W*ko~sFU!0Yr;aJbBf!h?s?cFjdbp71NntkH^w^HpaYV!cu4h=oBos1a zx;%WP1bSmEL$Nucj`ooIOKX_!`qT#*sRbn&MnzM0ANk`uyw#43Av(-)A&gB;&i^*; zj+S@3qZD0E?Hd~)*ZwQy3pqYjDl-$Wtpg!^M9Oyp2}#ycB_pmlYxX6w=~#MKQ2OF$ z>zr>Sp+L`@Az*|ej0=ePj&CLiA)pu$Me;5mFBezCwF^*7Ci?u!`JucSW!NptG@%o2 zR8qRLLv9jmlmM!}QikukFW&?&P(cZ&N<^vUPXAtx(~s`xh014ly} zd``Jsd$hWY&A3D(8D6*vFbf0IJGQINN_=ipPTBf4%F{VI|97w?+XAB!uVCZkuBT@;X|@Im0|-=6L94%;l>V780*+%{#Yc~x-o&BT^yCy}j8 zddJ$MP+S+T?v49j7|boPNmg=b+T);Hjx9g3x0|9zD<5)kojE5XLC*CtwhimD?40(^ zf?5V9o!mw)1k| z$ys|j^g%6yeU^-_a3~}5W?22yjfKl&12w%dpqgDz79(yV$Gz9=(!`nTyHb+IhOGp!J_;_&M8w#4>|I;-q} z4~tn{d{SgZn3M2=f~$UXxpYdd&QlMI#!lCwqYPSD=(7GNBMF!gSE1N{)OYY9nEuii z(9*s#nrAf}tQq6lgRBG{UBY|24qfZ2e1uL0rtOJzJnSqhvFl<{^DI7Xw~1%7dQW*# zCV3-th|+N~bEeeKpeDw6qgJw@h?)e2iy(A?nm|q-u|H= zA1^U}!sT5hPuf#I=ZW)E=@Ie`~WH*Sqr|lS^wCvUcJr%>@&$rjMV!FI64)JS zZ%yg9n;QuRhh6P{@FBU{n8BdqXWpPB`jZ+jbJXM3>BL0Tmz5^Ew{-RE$(#jHS|c|X z?BH*Y030!{Lh&qL6)5xw&0R98d7q2MUIy|zr*!Af@=blldQi;F?{nrFGyuH9hBVL( z$@X2{yCwF@b^&_i+k=|@rzH-YJOO+wDQ-fwPzyUd_RfxqFA%#h9mZE{v~}PGXWz&92NqcDr*U6RxZknbW^ggTd;4 z<%6$ULiU`+T(++U>8+@Guw>16C!_UhSpY%DO3@IiQ1I1I03`~o-TLlLWZmB`I0SXl zSeNx~)h&!TVbnZw&TmBXxO3C>Ecjr8d+KS4OiTO10l(n8K2QLZT5oP4z z@$M0#I6Y_mRhNBOD(=e9$lTSm8S!+bzQxHfiIv`s_)<@C zR6}RCW>Ag+m6TK8)cHc{it3Ezd~Ma=qyE&_6hytLi*k*};_M|T^R3I`3%5WQm%)JMtX*;ipr860$e|zlP;tguDcqG10RbhlmY}V zFxmcMhVdI``CII%>xvN%P97zK8sbY=5)4c|~dZv8BNoDJO7J zk@B7V_LF%kPd`kHOEKCv^NOuF%xk}wU^0;`*}paA)&F5{YaBB*@Q}RvmD!;a!&N=a zSUjR7F>$h=@8=r=7#83xUrz?^uvOP@&-gJDowBxnJ_F&EP@&P%05r2w-h#T6Gun=A zm01iA=&i;=&j{X=NEAXnf-W1sH%;p*5p>Kj*1z=-D~NWIRE=Aalt<4yTb{|W`a|G2 z)G5vMN3IhhN9KxsosRprs@GP^U}#W<)80if#oh0r8uxfN{aCu2H@(Epi|LZ(U!y=;Tv?Tf&|kgQK>cAr^VfRK_VCA*4(rtykQ6HnYtxQ7<)#6; z;obb1=Kp{$vbD0mH~Dqf2uGb_Our9YkSK^~(OsP%5u{{J&X(|s%Dh6KssW|zK6Qbn z>qKVCwn%1go+$psJ!lwhQUU@Uzci1R84V6{RkuXeDxzaO?qmhNDJiiH3VIzGGiGEc z*WqBgx#J1$mAzuG3#Ko~x82{|-&9SmI{JHI#?}tNs$N;7R%`gh4D@^rGR`=7&+&%n z18}F`uNb%X=-{RPg``;-kJOQRbWH-v9PL^TU7CK1L(W_xAAIrR92w)!VP~6s?^&G8 zt=hPM%|avN9OtL}Xw8$Q*zRNiO$3TcT^DHUT!SVOdIOZ#;y(~kd%yT%)qN;hmO8%S zah%rE8c{KX3{BS&d32sm2|I5p=&KvqqL;5|_+u^U`0?b#$29>#1!BqfHIii$`x`E9 zUWvP20Y=#*0cmrVu%Gw4Pn{0EaJ3BT_st&dz#F{-=7oIVo`KMW@$5W$?yi_RpW!4p zD{FA%uvKt>#eVh+qAPO{AunL0>mEJ)fwnfXwvDSmX1sdv^nTWM5NAe<0@*&;#h2s7 zb6ekSuAHR&&`3vv_IN>&qAqTQih(U|=g9qU60g1w(x%sg$}y zU0~jIvYLNx{QV<)P#6{QUB&8yBEU}fM+6Qi-n~I%i?;^@SCnKKCIY%r$@I#`8{{HN z2}!9kF`P5+R)5}@YV1ekt3Q`+Q(N+3TJM^3ebC#p#~%N~ys3r9_;%haay>f!oE*cx& zmo}Cd{8DDuD$h+R$9q+ggB5>p-`)`aFL0`uf{*bKwC4tM_@O`g^jxn|tsc?`uSpT{SHl*J}BVFlBc?u^T~fy+k!249ss|B(p&&}g^A|L$3|_#?uG zhOwnfn44BHoe`4SDHt~>Y0RY07f+Yh1^KU@gk*{4d4`;Yi2!5m0tHMiE;ye_!h~tq z`|N=xYq-f z$;FtH`odU+NJS+Tg~iw}9t#AfXaa%HVpyc=R1$~g+HC4~!I_dfCacGNwf zio93Z2D)}|5n4@McEbKC+H`61;v3f_>n-*hfMCM7rN}BSrL@znr>v9*3vT7D%T4mW*dTv^c~`(&Z3! z)lzX0aFCPh=Cwo_om6!`N+KeD*|2s5TiiB~qak5xzd-DQbD}QzF${e<2I1wGUV=@E z4D?vjmC~(IoA?B|Yxq0$M4vwzc1JJwS7)%{O>-7GuKKLqPg^%(_EEp8`n(=Gp*yv( zKgxf2vY}|F58lC%-g*e)I(rezkSQbEgo+tIT>Q;h^u2Yqm6?85ePYErQ5@cUu=fCq_Rl^JMUdG2>J5I$r z1`W%#dX||NmDs_K^Pk|7y*TY&VpT5vN~2RbH?MszC3SLQvPX!t!fS{9oOfAG#=jkP zuI(Y3UV+wdv$Pc6*@wWeRMbkq=?Tt>`y}jH?+ZDgNn}>Yhvx7G{d1FsFRApyCFGam#@}_ zfhJCx2In;2K$A(!cGppY>u`>Ng+ff+e&v{!0c+T>-utn!oQpOr=hMlcqOKy@d%LF( zN0@{^OwH)58B5Z(5YgPs8Tx?qk?>c{-gU4Jm~DFdab~eS>6Aw2W*6ix{S?^M-BpX_ z_}C%YxkQ_{P`3VnlQUsRemvBidoa9Awl*77V2X;E9qvcq60tsZVyP(LZf9x*?^asqM~wb0K-(rV>l) zszvq?=wyk?+O5BzgL?&1i$;gfmH&8DNJX_3b{54f;xJK5)MSuaSt;#`xs){7|D{qq%9+B4l}Aig&Bu^prJa>KP=_ss=U!7dF(;f^0|=!)Re9jn>>T(^)0 zKQEE@n(*X#i1JO77GSZ3OJw`wBB^h4dQgM9?pLaWB*KejS{o|wr177)VTvQwx%|(B z!TLS4R{yM+zAgTbkA{VfBO>x70Ce=J`j2NfRYwMm}%(NMacRd#Ew z3b@Acr~iT={TJ=c>gC(5QHJkd|0w$0?%}br2DDVX-t2mGC-Z8fTMP;L;TzX>WjHrg!!L2$sNjF};J0=)0B1bdgdFfp_%93#+7zzzf1>P{G8uc&fG;Q$|b zAMk~nwnMUsL86=hr+~^Pe6b? zl~OdrWtBB}*qt>vlCkmjgZ>WJ=be8_M7cV8PzL|te*;a9hlzK(R*t_yIb*_qjruPZ zQPfB~hJtGryoAV;*>9I;P>cT`W8WRsRMvitj*cQKNLLZ08>(0krHvrcK|`-Ws+52r zRR}l;0s)a;g$x=%I-w-gpg=%+?``PP1q>~e?*yE8^nKU2*6*KL4uqR~&pG#bp0l65 z_sLntMr%J$52l?LEfQp-s5?gPyOl^n6qjU8NZ05+Xd zkm;6FS$SbJylt^wa(8ck!T(mF(z|5oZik#0GvJPpRb1wBnWB!o_q9mvrv|C9pCxR< zbxWoq13ElIlwrMK?BMU=fHnGJ&$Y4~dcmO*+`&2UX}mTv;6*zl_=E2I$ixnr3MGi~ zz*1LoQDY-q)r%b8Y zE?AhbIE}%n=uDJfYw59yzM>#Prs;~e#{vQ=>BHal2Xi}U0?*>69I8c)$wyOdWrH-* zvG&IstXn?NXQOrM5+w=GNo+vWm^`w+>3!RCXRy9NeRt)+cq4sfODQ~Jed@}< z+hMUR#M@^Ld$_2oS*&S21wD{t%2GM1c$<;@NjeK%Fpsqa%kcbWds3yB;v91v6A<9W>Blq78ZsKt8zrDvu8!c8eIMo>X_^ zMbELZ1Cm9yl7egr=!0hKBMaZ|BBLj^y9UgpiB(z3j;#%ec}-Y*DLuQB3PCsjI0mhd zDx#^Mx`Sn-Fws)6PwhvlNFTqU1#zW){&dq6V|Dj+#6*}KAPm?5+EpsRA%(DIh1v9Z zHWKxXH)g$_F5ad;IMut?W@Zx(N%L2gsqWF!ImJLEOv;Rs?L^pSDBY~Kb&M}<&rIk4yGwnBb@vV`dcgv^fL zoOQa}%)PQzx~PlUne(g9+0o*Ezl7GEeLe?84b95r73_@3er-pzAFu@V@CHh-HITk` z8nG!sHkKcL<2Hz$>vT4_m4UCXyBD1{J(4$;dS$(?XGOM4aGBV%oO#}-3Wb~7O`Q*Z zqpZPZI?E0a)uHb;45hm)38ktIyou4UfsSXvBWKWJ4~ujl|9K@Ya=eU3OkszS+nGpqT{C_v6seFrxP4* z`jkBIte%UQlaTX-dg=XDj#CtWNCPfH@#&m|3?)pU%A%-Qq@}q+U2krM{{3>p5I61$ z_KRl~SAAs4wV#Hhxs`e|djAV=$Y*+q$4kG+{vH}|4^>0rEt`?twG z)ZrY`%+048y0O}4z9Y4fW^rwon6hf|`S;iv6pQ(rd$8!cih?Hx>A&}}3BDDjis-hUp$jElE8+=XivVYo+DYW=%Vx|!k1yMG74zKH~?^)@TF-uZ1 zc$)6U3bhXX`|jF2CHpL1DtXnh)2~xwva|bC!{vL_@D8Vn5>RI-V|bgBw=Uh^IN_-P zVJr%}N7?%|+Jq7}k*IXjBR0mgQmIk~qBbJ)hF+G6j0pmCY$(Xdi?-^_PQ*k?;HcCU zT}fvy3p+iC_Vz7EhLWPAmXFcbgn0vPL`pNMy<;ttrbP1r2a-ZQR?)L zg!5hd#?oD&y9Zf0~t}m(a``l!w($xM}Ci8k=;Zpc9d+-Pwh|-hYLv?opPs|VykdG@bDYro)z$CyDqwc+d9YR> zb|eJ8vtNxGf8LF!o~cZ43`vq^*M*rH4u1c9VG*`^`*KF!O2Kj4JbqZ%ZAD0KH2cbJ zy(hWKj)~YJ!br@b6lzEx8SG`$#R9cov`x7OB!~-semLKu^e3pprUxaYmu?;(mq|~h zEs<#uGO|Q~T%?;SZhAiD#VxGnWvK6>A|fI>+nlAIGqp1Z2Lz&LOC1r3nZkmEU^CM$ zMv_i!*g2BZLkVGQG{C5O5Y7Axh8Ylhk&*rFO17XYj!1Nd6Yhrd zY|Tx>`~1(AO9-L&LAQ5b3FGHAx@Ei0&y#ab;wjYz6;wiPbi36pA>dhqdVNopj;aJ{ zv2bR#*tSold424TH|V_Z5aTECbIQoRz4!@Cirfhk0kn1sHOGuATs`b$_*AbtYKA}F zRzrnXU*X5=tZdx+xoryP#@Whb$~rw}2BvEDIxmhq{U zK7vlrNi?%QC@pK&Q3t!x$km~-eOJy}2hX7)q$H_kudAR!_S)Lx9DK%DgEQyZ=p-JRqrxRz4?T^{K=hi#PtfPV(s|m7%h{jBENSVXg9Z0Kqb!h!F&)K zzDyM+)BJVSO!#m9gN=>?Qk$i140jnjj$8QgthE#H?QYc#8v>|V0ZupXNpBY_@1OSS3ai%x z=~tGQH#q7zDsZDOY&TjQyu17=dI4SPbxeqhLV(^$s=%!q@C+*d%@_VIw=l>XW)?+| z^0!jOa{C#y`k#y7XB05+m{!hzd9*KDACihERal$CZ5Sy%M|%C6nCv=e6yi`42C}+V(@WvW@FkH zYgDBy@?HIP_q>J5-;7hj&kPgISd2(`_j3c$1J7W=1;P9NxmDN|Dpd_OxE}U=07UrP z+vMDz;0B4aYDjfrn7a8GSEe~dGW0~N@!o7G2o{|;d+(xIzafbbKY4Mio&+gh0+O8vG818=<)R2t{s3zPtyfRSXitV0yt+PsEskqdW`v z0wLd5O;~h>JnH5hNxkZxrCBas%JQZ0-9WB372LaOQDQ9!&v=F{R$e(!aUDApbtQ{e zE5O7LEpW%MSH=K|X}7j4SM@k&AvU;3eT9xzT%NQ)X#2ThV{rc4+m8Nw^Tact2f1_m z@8TSbv97*$Q`p{aN5!az-6lStD8Nh5iYFZd?*XvCc&!QuV!Qg@t436KjQ>cI?Y93r zn1aWb%c?iW%41;PJTCrOq}A0O0~zc%gl;rPwZKwQIrRC3$s2zxZq+Z*8_3Ah9 zvTzU(r!h1UWB=B=X9dqlxvm+b0(E@Hd8X7ZnTt#JM*2STX4gu;>ieic(Pj936uL>R zhc2gvzb`hl4oiVJe*9WJagWL(@r8zI|FG2OphQNofR;jcHJ0VU)s8hLzVa54 zPzzEnC9$WCt;yic6K}gI#D(`6Z&NVvODkA%-*~nyCQ>X&wwx(As;85SP{21#&t4}$ z@MXCW<;Uy-a`;{13;G4!c#<0 zdRWyt6C4s5j^DpXZ>n%iU;aS*{us0()A2rX{I6H!D4e`mVeF^dF2fQz*6+=J>)0kH z(#0(+J>g^GE%h7S*hg(BdFPWQ-YUf~w)BOp+4Z-2UPjWr?EGvjk!s;5$Vv+eFRC4Uetkv^WXsT9~<0@Ozt zNg|(B-xLqcnx4(trZ^5>7X&5dFMlzfD$E{*5#`A7C9@OHPG-e6(bA4V-s?jb1n~kM}K=^)XF# zLbuFBVfHh@Bg!4Eb#-Q{ZkX%u7RrMYS7s-t+N`Reiz{?CW|dQS=U<6V(k{Y+U4L&I zlggufsd|!(LIx>dl0Rt=WtoH8pDRxY&+$f$&qeN~&#%a?L#!tHrE zR#Jz?U8l+@qTj!5&CM-vUU57#`pLBH7}g-yiSKTZlB1bHr!VJp*}dCFsr?n9lwg5J zz&^7vRVLBapl@Z~NJZsnBP+djSc+5Dt&nt+omd}?YhBye+R;#eMmv|3hCrm`K@7ed z4VNY(zgG*cIoWE9t7=AEi^5UPvQtMoalC8PQL>4*l;t626g?YtEx6d!r-@>CQm($K zJ{yd~?7z%qE_go!d%KfR1f9r1GTw-z75ZG&`u3epJ!3UACIcsIaHH7wNj=;q_RV*v97Ip}NWIvY-?s(z+X$n~~&xp)?;(?5shne=97txn9 zwBwg|C@266t7d&<#rqEF?^8giyUKRpxWTqx<8z&a->h7*K<$4|Z#iBaM8{h|#UvEB zM?t=pn+d>c3-48gf}OY>ZOV|V9{2Ar+5bRxN$h^BA!PM@bMx7B8vxaE!Dhv*J*fs@iQz-P-S9+j|_IU;*3dj4eRz zWT5!E_P3=EW(O)aM-9+IH^>}x|I_751G$l=uoqN{LTH`zmF4c#ixlU{H1&UaOA3yc z!Y4*XMxui-!+eM?)jQFh{Hul1q{4wNb!qtg_BQIkqj0a|t@kZbjr6W;eXkr4<*%hU#qv{?+7(DomBnbLCla&e58FD)i9eVECUww= zHk7nOXk;6k&)>hXDR}4h=TIzYjs8W?gi~nJ8H=7P%-8(w(`T~4NfWJWf8hoyZ@lU~ znDkFzgvB6?%O#WNIqSy2RtIb=X5+1r8;sW?Vxwes%Yh}=%zB;CHEHU1ZSY~YN?hc` z3swrT5>QS|FBlHf*%IB7awG6)_b+Yq3vHtS4rDP0!>fk0@YnUz)ehNw6*(4*|DFmQ z=XR&pAl*V!y>sL#oQbja@wvRnBA;_YSOGJlleVIiyyHmm>>D7O9rpA|V-9>{ZZF7s zlT&kve)RHEo?z)dqX9P@NS~(^c=Cebwwfs=EbySGYDZ@}r<+(uuT z=!l{|ujDv&ldv(@Bft#q3iNU~K7-OH$IH`OMBItY+MtE994D8eAHkA6x@h?5iuY#u zfIk&eLHTl7lb?jqAZ7m0=Kdyd4+j51NrL^KA|!dGRcX})ClBl&i|L1!ww8Jxrp2=z zW6@1xCyXkQn`>)Jj(|YH44Emc1w-;XTC9a!Iz&@qt^&8V+7-l#=bID3yLj*qe&B6K zvaWy2b_do$U(=9F5}Mf25%M4rGclm+E%E%M$nRodDib#e9Mu4I4`_RLc|>WICd!9} zhRjH!1y|mbx6Ad1*-u2I2>Tgh#UKD^h_L!fZ*bUmmZKM|2plE zh8S6nC{sV8Ly^@IUtxFUEBGI=uVes#92w3)1>yqWt6VnV`N^!Zun8d*Ir3FL zk?Bi6{t7G_@b5nenyFg=2p2LwM)3#Tzx`eC##<{*IwgGj1~4)9FvS7KKB(AZqJMvSY_zEckB{;(lkg6ORWI+m;;y?7 zeh@|beBxWk#1^(<>mMSP*;qj7lJKO4%M;k6XKwnKroYoo)J>rgYtY;Dlk5$BB}7Pc z@@ARQudt0z|;fpKl|=IIy?kv%+R^FkQ7f zYpU)~H_pS(n1JViDz7f9?YoVQm>PL`zTU2!77gmxHNybyOyO%54Qr#8ASZ8v5t!JBdG4daFIIjx}88+02|fyHK#C!d}c zo!%8|E_QR+sjT9wb634exXzO%M5w;vHVphm$c;0MmB#~j7_t5UWtt_kv7qn-U9z?N z>@b4FehG4!%&~4_g8EA%EQXT`r-j46lO7ZI0K;gUu8m-cA>~ooHUWx4yUS z@s8}2pvwlG78o31>8Eq zSYj5tv?w@sqk)3oY@QqrIBE+_E6zM{?ZZIr*dn42gswkUa9oWyhndTgSQH_lMZ8+9 z6eu%M8Fw(81{Brni^GVw~<4OE)jR-Fr*Ao=M#MJHAXAGBKUNa?<4fU zQl{O_2K6s)cGb&fyenE)(p2&!AHG;S;+~!QhkMr4i+hwd2b(f1UM#O`vpUgMfh9J2 z6u$5A+V7mCZHu+B%5H&QM?CI}WRL$-^;A0TZcvYQMVh%6^{cmWEG<`P;oPN$Rhk6UmytG4eCHA#fhHJvc zm(^p(?5c?b-lDcV>7E$+8W`R9WW=m`<()mOn9N>aF&*SJdwc~gjQs@PWhNTS}Sj69)VR^*-V24?1r8hmRh3A{EZ^*GZ!%X z97;_(5fG}!0HBU`;E4gb@Rg5}iq63yBB#p>N{5htR-L;x7v!D22ksmbMIop+CKJE! zE;O|H051eh4GLA3#f$dEL1fLdU$F$75CgYcwLn~E-cLAPrBn7!8c})r^QLZ>hdlBL zMH(NW&2w~JTc}pV{G^B8@KVDD_N&D4F%3I!pOOG0_=>qW;Lq*F%uj5>Oi(p3b9(AHpS`}DRnouSZzC6Pf3+T?|qd= z31R7-TK2J1!q{UmCYex)C>o%(`tz{@##5kmkM%M)`4*0rH{Y%giM}Php3wyC3Hj7~0gu zM`=>3B2K?)s`ic+?rm-NP!Edd;UdT^T{;(H6?@N12C*`kKx4WRowjb(87v{Lt_in& z@z#HEyZd%t(pX~`po9MX3Oig=0xD^0jcAaMpSFF}M)s+KUKHUJe2%gV(8XTMDl<@g zx_^RPXB^gXDwO1Oc=W$?8sVl~EGK^Y0eQ`kQz*ruBK4=9>CvBq&x7CP|46bRxLHnv z7OaWnj~`G#mS1mscP{1F**4X+3Q;?EE-s%H7XtP|*h)f8@lJKfit85XCD1EQdp_ZJ zI!kf(kV5ex9AI5eu8Uhii?793nnK^@sq<)9XPNUsB{UJ*NHQy33I+nd{L;2l$E?Q? z_445S2ZU$glAUdOnRoUrtx1cMuEm|ha>x48N?vyUi6jnqHEVO0DcBKv@Mnjs{@P9>?hZiXA5d(SnQLzz$T0RE`#D|YrQR5 z^$6Cmc+UpkA4pQYS5Ne2+qrYlv-x`DC%&FJl&<01Ig3mNdxnR$5bfFJ@Ah5{dYz%~ zE(BrgS=JhZrpw9l3$ZrNtge7iR8uGj+0OjaTE^0#2{;kPyMpnO$xQOi=CK*L4V4&b zu@vV}+3ugtTaxm8r}w8bZtMmB7wu}-wMkslttvbIYVT1cq?tv6mYqY@8-kWy?2K}H zDYw^5`p}L_eDc|QbH=IPNsBGH(=M}BQ#RqsP8|UwNro}&X4rLvkm?|Wqf(=SamI6l zxpJxTEG2Hv*1Q-cvQF=}?oKe%En* z-P&2-F14RE{bcE&==&u_RQOcI*^w1Z1FuC#wfwC1r8D9B5Jt#oV^^l@;3O1U5vFY? zY&aQ&kH3XxHZeP-wjHwVC6-RX3Fs32Cp|I(5sRJQ`D|5u{dJ`{381ci0XG8VoF3!E zJb(H-Q_9#v-GQEJ&BhPBnt1v?)^77^)(=hV>xmNk^Vt!_y74@M9E23DM}4k)`kdCe z(jwz9ZdEADAPOiQmFzgL66V<`q(CFz@<)vc7!Q}>I!MHKr0vsGF|Yl}?Fc}1?;b_w z^6(MPZEtWAq#o)&Kc<>fAjD6|xY6QD4K<{E;(k`9-*tP!o>M!ZtufUdhc9CRnqp?^ zADW#wB)!9+6%vu%+^b_alue%wB3J*SGVBgChGn5EDo+o|RL>0|JUp8v;bfN;Z7Ph4 z9KHd2uM)7>l~sBV_VHa*{_^rveXCv7>puYX!!@Tr6X>JGEwwX=vu`x^=ysp~C1MR8 zqV7=Ma}C{38R(Oh>8Bvi2k#*x355+%fxt&)>rdIjdIShE0x%$ZL+}?FAKU2CpdPeY z*Ru+UY3a|*jx_zOl=Wt5Ae(+1w5cpDaE3-XY?t}Fo-{etyK@+pFO_+RCZhYN;j~R! zkE^Cj%X;qe5PT29gf7gtH)52jb65hjyU4VN!_oXij!}TZ@g|O5mi?j9AJk`dVwN+) z%UtxqM2k|9gAs^3pjZz8OpQo=)pvZ_%mD`6#-}Wal8(mVrY~C#H%&)aei0i`|6`J{ zrv;U}a_TgyM>0n?>C*dxe9FtyT$}EKH&x_6u?d7Qpyoc3OM#*19RDfIk%!|@)}s64 zT{uK4RDQafJMr5U`$_qiw(SRUCP+_YsXsc6v6s(L=Uq}3C%xbGp89R$`;wN1_o>^H zr}J--za|7wClBcnyakt+D}=?J@IthQQAQp`9BHA{Vqe6QGkIFW*6~{a2;AvY2+=u{7?a7-E|$N=uCsw6;psMoy-SnC=eKX zmb&bVb@S*+&26Zb^H*}XJfg`n@Ug97$xeG@xgx1*qwC#PnU=9j_J9wu8Wn`Xb#J3PRqOzjUhtD!U@LBce= zS*~Qy$zXZIE(XUthMGl@BVzerd0gJPCI!dLl^qr>gl_XBit}?0+ResiDuL#;eK2@w zbPu&bJiG+URCmDfDAp(UyDvfk2zv~GumXW6ioz!zNy)1q{dE&Abi8jCVlI92`-Be0kHohMuHiz-X*E zJD@YNKTO;(>PkD0`csuSlBxxNTt72}dCn!k`5t3ydIjznNMCL+b?mRphnlz_b_^36 zekVRtewG0X8Q{Swh|vC3{5$6q!*TuxJ-j`kQ7Tj!u4#4LT(2QYkk+?DBNrTVlreM| zJ_(2@tr4XIgkTfh|FDpLs9?=ZT#BBr$L-ET4~(&UJx^;#L2Yi3OA(=dpYv54<8RJ~ zI3*}m_1Kpm2l{6ytkMXaPUby9WqnzIaK7BefGI^&oUDq{L!AGjeFlbXSxC||26$;@ zb$LFN1vo7=TRgLHWAEKe^Er=h?eOmCtGzc=tt9dZ7?Fa!MhRh+3G@fsY9#fbK8*w? zjms(n#_|1MT{7D&kkZqs(Jt;Xxfd}&XWI6JwDzYV~Ypp#;2KnZM z4%AK>HY|e-W*E~vfI3IdYmSY?r4E9gn6I_+Xsm^Qfoo`QKcke!*?ft^w?ziI)Rn%Z zBec!#wCHmsQqADDf}`iVtNqcHJM+nZOS>y@eQq$}L!tHlbhQ=@`J215+GD}#GKXdw zBQ>vFZnM($8mI2=Q+LkK=&F~TfD|U@$+1PfytnEEFXXVRkqp$WfZrjkZ2D(Mwn88K?Y0TwQu6SLJ>PO#XeRcGBo8{Fa<*jRg|l+>KBQn%{qvYX4JfB~QG!Ky`9Bj9!21-8vr^hhEDt0` zYdr0=ND+OWZ1pDVU@MkwkRLmb?!2Y;2xsiT$(@;HssKrD+bkF`3U(o~6R^!T0s)uW zv~@9>cAHBBQvFIET}U>Ukp$(hIYEr8^3eUEzRgmeV=n8j zBXJ!Pxa6v}*Azr3b%`BwinJGhGIo~oQXajIg?*erN%6&V-(K@q@4Ts%!*3a~r z_Rxabyd$Ie!*kV{PaOvMBUhL6s8SYH7=uRm1Uu%vmTD-Vrn5hI_}#oqrSAD-<1kM3 zEyn3Q@9Ybl>L1^H--@8oJyvL;Nm@jg7$G30S@2w`P4#2zZGMPeTv%JwfP@e>Z&Wu6 z9tk)Vp=qx3j+;TL{*Bk_KguCKyJF{HPYqSJwZ!*qIs8jsw>XMc8BS_PZC)bfcM~JN zjujwi-oq8UV`~*wpBLm%OPS!_MA=(8Y{!hyV-T%Fp_b}Kh0|ZK;kqt{*I;^S>g?mG z;LIr8sH>SED#liRamVjy?tp3DuxO=c2Y!_1U*%mCTag9Nq|M2`a3v~sy0$oaD(|wY zF}3RTpl2AQS#@I69o46=pxJ}VO|lvYNN2=kL&uqUegY(dS5#=f|K2c0f6yyo(7G`i zaqRJ%RKf30#^1SH)5;-0_S;E^kz8#QK=mLJZk{nj7!{+^(pip`D>K0`A}0GmBFss{@#CqWke1diuz9 zJc+;Uv3baYP%YF61fp8(kS$1yQx_KnqNTbtz~3guQ@W@q(OQcvo*0QVs$4SP3VJc1 zO*0YsEsgTUBV=Wn(ThFT8RvKiT2gJ11=660l`=}>;qwVve-tXGziM}jOT%JrIrxlT=2%Udj?qQP!j`MBKKpcz>RsI{W~wjpHFO9^Y*R| zrSs3JaacU8BW&dD#eLp6Y|POEfDc_Q3OiT8d{DHY~oH^!eop!hf~c#>P_ZjUQ&$2mTszvOhrdj55L z!NH4{Y<1l3sqXwusly(=JgD?WxgaTMKedkAMYR@)&fA^sZRg;5u@4Sn=3a4jGZt2j zBQB%Ey4!P_Wi*i|GlV1Z=qEWOiGK;=oU+#yib|!PupDi#qbFQ|(Nv--9kUFQ$TiFx z{X2z8J3oO!@}H!~Lk^`tsZ{gFk1GGDBPcO_3Vw`20Q3uf`%lgV%fv+gpHJ~YL;OH! z|EJg|Q?`M91xws7+A ztB29>Df(w&bOGmV7G-kP7y$sMa`QHTs7GDhxOC)T>`Bm0(oC?F8f&t26I5GE=OD;r zzXc?ObG?Fu3|qUWq8WnEuK$>~pJMk(F)qSB9uFdI&6x#PQPRf5U8Piiv9HhySlC31 z$;d27PoSd&`mi892b^GrEVs53TTuNC*yVF?HTYCH`5TveCvKcc5lYo<*th&pmjPty_rZLFQ6sGuBKH(GTMHN_$Ly z-1a1pDHpn3ZCS&%o*eL1`sLK6Hd0~itm+%9#TSZ|Z~ZLl zxnqP~1POy{F%I#vkrLlN@Ae<*osa#+c^GORBAX1-TaZrWiiSErYW$^IDXbEUdhi8? zlQ&medF%a6E<0Z18KsJJDjdl*=DczYqM-VnY0$LO%Y!=ot|@|E#yVrabVup_>R`NS zib`}IvBVvIA><>2%q&)RdaFdruQjL6A^n2T`rr)H{o?l(ef_Q2En@26TxVJGsf%nQ z#$9>uL(^76s$kHS56hFLB#kSx4#H6xJIQ6E2J1hG;eY>nxKcjEnzjJI|4_y(#ABFs z0F^RW2BUryXvVKnju_>-8AgYT4{qq*4Kz25u02q_M$ zeM%euwd7Wa%Vo-5VD|YPqm5F1zV>u|NHhvM+}=u$*?}$@Zb(EewX8dg6~pUVm*_ya z-1iPz1QRx_ODe(MPOhpYCO@d_1{&(+V%$|iKH1%jLPhP!+0Rp7Fd0}{E82A8-(4l} zY%lqnUsSrl$FtwCrcoB}!`^RKYYQ+IBBR!hCj9tp=mXB5r^DK3c3ozK@zi{`wO@ivzk z`LsxZJU&q|^CmNvY3gL55RP&vZ`mReuvdYIl|Bv=a41kDS#5TOl6KatcwAxivZ3b zwy|6fLYbsAh9haH6ddnB=|);3O{m4kTX}m&bCMwJ8Q5S6T0y^xcc027Jhlo<&{_Qs zY+p4`KVoOJkb*HrSO*go6_PS;Mc(O#Lka=%0y)~f=#`!%%Tj;*;P7Kd{Z_Ei042YI*e`|fYCEu% zNZ(;lT_$Ojdv7kM-6Wp!h3g;eu1NLvLHShs{cN9c=EXWpPdW`zPfbGYHXjV()roEd z`oq9 zb%X)+<^0_axJ}cI+QtXS0A3gGNbAeb&TWV!Q+qv{hlsMMFPa;$dHvP@^eP8o-B#Vo ztzzkJu*IFnQ8?m|0nacqxM|Xs(X+7s4XOlP<$pz~tL^=YlZTOYTQL=WJn`1{A~@hy zsg(y4w5OajrdoPFpu+e8(&zgJbzrMzgchrYLcNIQu1&U;5*%L$D>*KP%85>rDu6r< zY7-Z-tNTW33GK{2?stJx`Wu2t6cb{*P-P79|r zxwaMApqr3wQjV~2Kh9R3)1w+;W$f+4EzuLe47?kN!Vfc>o!+k$7xxBm&v&hvGzFqQ zV2P=%o*+y&mka{|u3`C^W7hZN&mWY18-fm@0$2-yDp(`;vs7*@xfh70556_FhWRi( zzvPlv$t~{D!xdj-BiFY~hgQLj5uV!*wT`akOuY2(F)1IK(zqdHCX7%ajwIc|!8R+c z4Q2YET`R}Gw)XaZpz;~AfW?yMwXS6=b*r;<@f+xY&fQFJ97+crLPK;epgD`XLYb5E zQ#)n)8?0O^;`=?c$F=sK(1r3qWCNYA$bVv#zP*u0_m>Y`MFw15^Txu=l=c6cDdlQ;oMYxx5#cARU=*ST=Rw4C=N0KJXK~B?%iKWIgq}TVw;D zy0x+*Gsd|hE$ON{8BrDk?fcDH{wJ@DeS7BcGx8>&g3o1!dKea+SK1lGfeZ zAD|XI8QUjr=7asyO^?ewC`a~Hp7Lah+eCJ`Y(aac<*tWk{dMCTq;7@ig=oghlpasp z>C}V`;dcazJu|84_;CWji!1q#81` z`i$<><7QlXb>0@Au)U{@(dXXK2~SMzU+{DenI{2BiMt?o?y0Zmaq3{dZLW>nYokMr z8to3R@{#wumI@Fx%BCAPI6X}17IZx_6n!FTZmCMi&Oz?eKoJTTY@7au4&Q(8l~6}` z+-TO3p0*QH8VWK(QA@X;w2+*VxwHPql?>Y)Tm3HGyq!xbJ-9{U1Wzw&W4eIMfOW;DPv=5D;F6S&zEz-Y!;JyW>kG?}KOe8p%! zIBAofYLD*zWB5Sj9ft+kZEqrV0J8<^c>Th24!H4<5~jkKcsnjLZ+uryq_YI%2+x2E zJ<N^9MFJKCd(m3?x9fszg~)6vPebFTmcEF;+B9qop?wjY&a5VPe{_z9 z4BjvGiEKY+8t1Egt7ZBGbf@Su6o(4v?s3xD`!{7fX+^3l2CG&qag8+1D&FT){g`T- z@!SI$wxi*D6}{8`;G>{rl}c^XTIL@7^rrAgfIe$bOoY}bM^gQUY+*rYyZg@U4K3Jw zMg21wXbcnc%{ysEjmBT)rz-9cjjD~6o6^pCp4)J$q{rP9_qd%^JX(`y3SBhsuR1r_ zX7$ZJT21n47S>6i@6`}$7Bc23n9Kb+N%-IesK&v_%gi2&A={ZAC6FUzuQSpVrKykn zW;0p>RLkuFuYB+72!fLvo}J4L2&1pDB$u;*D02+$Uir15!XV{h7uWMM2(i;D+ZE)G zv`cfE-26A6xM$O{mKizQWf^FEt?72eF{%^6$Ib`fB@=uk?0EE_$tgFs9`K#ywm++ks17Az&fpOZXh-M!R~10lU67zH0os;0rZz=Bcre+^3R=Me ze3A-sJZmPSl)CyEruBp{1_QlDg?8FrsBAhT{ zUCB|X$Up9~qHrUob0K;hUhd_>E>E7I*S|a@1hV`*S{KBQ^xeM%Ipf`03MyX;q;<+L zLt3YMm`0&UVrGtBDV(2>tm5gkFuy)f*%y;C6iU7+x?gVU22`TTSx9_%k`DtYTJ?(N zftvb(X!<*+Mag?F_Mc}ku|a`sO;edmO9f^kW&Y-SW&>_DG(kZLGY}hNcR~MdFE2M? zqZl{12=6mys?L$tu&doBj?}UN8?0Xz$whzqp|&$ad1hx2OPw@Xhwd=sov(t-m5d^0 z2!t{F;|rWR|6Fcrtjy(D(?X-b98~?2K@Ieh#A9LkXLID0HuL`H)fi%v>OOLnu+-r+ z7pVkZ5oX$-pYr!ZlH*}@_48^w)GVXj8>t761C6u!&(BI;t>8RBHgFajGC~x+&62sX@)~? zu9NUFzx_9^s}Tq638!1`Jwxl9&rC! zWKD}k(qs=~fv`EI1>0rX9jz4=M8Da_H*^=ZVkvH5Fc8C(Rgw1E1VcSEVCQgihX$M_ zG~kLYF5G(i;KFpf_e=I)Zu=qoFNgAgMwd0&4ty%>o+~l31_&s?DO%FN`HNZkpiI$` z8?HSeD$h4$LV8p@aC-K2cFAkBSn-Q&((&tDKTk%>5oGBC!IA)`XNNoNd6Dt$C#GWH zm3c39p(V*s4LBPQ^lE#jOdmNLPt9#(Plu@HJ*W$M(===D(#D?!3^GhPt~AYt-P`km zj(InBTYIxXxk#~1rNXy6E$`T8V9|Aj5JAo4uz6UfpvcBhm99~SYn?8D*TH#5x!S=k zg7}-^Vz@I|CkK~chEGJZlCP}K6@l}P!fDmJI5JWT-@3Y9WRg}5tMIP6h0!v9iT`C0 zJQOB`c9n1R&g1Qq82{4{ix(O4FDap{2xn0b3n`h7bU+MOyP9kD_2{UzCqH6MqJ+$0KVv}g|_yJ)fupXzC%bWc?p79B|T(D2J$QW@vU)$hrsGEjLS zn-%XOayA&nAXSBbk(6dQz(mudJ1D~@p{Lpdh-H~RJH>Ce)2n6n^pRcFi8f4spnge4 zfSN=mg-`(_vOJ!Z*bH!n#-DT@Hc&&Rgt(7_f&`^dFGB;<$feZAMMb3QUGPHjfQ>YH zAkSpnV(&iCJV+Rf;OMO)DmWT;Y6}sRE}8W+EEt;n=9JyFyYucuEKZwuUYX4MdKLIf z#JvE?Wz9~-=_npCdG1~iJ@rbWJ_q1%-|QGKsZcin6xjFv40yFPZ#-|o8)kYTOoNAgBwxdl}f|A z@XgYxzuFUasx54a9_?&d>vJq23s8)6vY7zGqlDL`3XCntULIE^Uj9q{=QxuHw$287 z#41IU-G$(N)9VjL^4+IB@nVA8<$vGkA;V9QFw;=5wwEfQ0{Up8XMfH`mjAQSCh}ftYeU^8ai6~;nV7UZ7gVp{ z=ms5A1@@8o_CH@9OfMh>{~)SIFqpxPP$bCX&ou`LR%fc&7X z=coMg8Gy0ff6$Le+xiy&Je&T`^#_RcZF_7@O))@iYknDd;6E$1bF(fBEev5zVCVL7 zz`kJyw^#Se?Ex0L(a!kI*kH*lAj~*VZX~``efUd_1`3A&s{wHOf$UU&P<~aOFu*}% zeaTPC^Wo>#RT5zHwryFh5?|#}A6x+ZBD4nlw_gqLCX^?7JO06{B7es`%9lAKQX0 zZ_40rlW-a0ce?@|PNSZo9Jk4yp~h#1y-P2sH`Y`P9XNOo4$0K`{=^uKV;JaOHEOcq z=nas%-e=(5ina1|^=z=U8oBjGPX(E{*5Db%+g`)-%jyUrlWYDtdxUEjtW2^=;#xzW zgnD`0l?MNF1%uRuB7+~stZ~nHoDwHfW9#UN8 zvz~tiA2Utl+s+A||B4oC4-j>h)R}oPG%BR?;Ld$yZ0Tr1ot?e5ubg+!ew|k*BT0&) zpX=u}kob61N>bWKR9rJK&%@|+!PRO3{yMb?9ZG0L=@%s{V4tM4)(or6dGI;ggn@+k z6H)~$W$ZyqVK1@hySQ{3D=A?zuchcPj(At8uxq1gRst4a8f<>;()7?E;*O7`TB3| zf%5O?OtgMkdmo}q3!xRBj^qEu5|02&oE~F3u4pCoBsK^eDapw-YIVtC2=%gFn>ayQ zD0qU)v3t$c)$meM$U&L?_kF&Cx4Cz;P$oM}VdvO;Pu-90`aRr~H{Cn%qs^0oA)*1i zTnU3Wy5mY(&g?K7^^2U4yqi8_$Xhq^&dmV3SMOhe?R#w~p0Y47wcw5~+ekS_3OB79 z1Dw9>UpFPr(8WAjDmCOA8c!z)9!T;;V@?~*-pxpx3*o!7t!k{>Q-eYNe{t(}=^=aO zlipyVi^^){FEog^gP_pXn6R{NC5&-LwEK!wYQMy%IW1~N14fT)I@b>P@*^_q%RFvZ zMooAby1GqyeSEGP2xD*^Ug&!*`8JiFx78DAL27@EP;{&*K9hg`*ZEe&TreSeJP9{1 zH5ydR-`jO00y&K@y>NXPwBpWC1Ml#5?NG(?W2EGv$0cIdJVsS z{Uum}4fRHqQ^VUGy7YQdw94U|B|ebL)AR6_M0}v4BP41YPAe#*SgKmDg|^GMI1G&N*}ogbH{&;lc4ONfEb@AW6J*%yUBRIA^`CJ2TUPv3dooX zg}~3x15(caKX1s6C-XJ^<_fZh#xLpPAt&L8z4+q{*RNkQ7W-4@A*Jiv(~JF%iR43F z)!UW;OibIAwQ?;?wJ2E&vM2Kak~5P-2zQ@FjHpY4D&%|9y#=Xj5r&8Sv`}ke6LCRDwwE zkyF_5{ofYGAvR(C->4iJQ1(3q1J~*PzpNF0Zz!PkFG2;rF(`ujV)*&1Tdw`nI2RR{ z#BsR&yF$dHu{OX|v3j``6ehu-{-XHhIX_e&UL2lV@RYk+Dx+wx6EySp;!Vl#$*-k% z2oUnvd|M`%W~uSPtH9ZXI4e&AkS~1t{OkNB(dXGl>w>qKY9qzK3k$AuUi6nc{fO?* zJ}!^G6OH8~Ptp_enSKBDRS%JUg0=YinNX_^r?O>!7QTy z*^&v6%>Li}=L3gDBlwZ61ho-0ferF~v)_Jb0QMXhn$en=32%aOph@92Fl!V9prmGW-Rl^#;%$>Q#^n6@EWhUH?lD6dMT+phQ#vS{99Y)!fx^uDSQN z{&vn>y`+CC@pr zFFbF5_f*_BJFtZs5DPzjd-?O{=9>!_PgVI1EM*WEu1SF+=7Gdgk?fCiLF2f0)?T$; zE5u#v^^t%7JMeOZ15kVCiYy1-`LyiIU*J*^?;GuTH_rnLB9M1M{egz$5a1kBhjh#J zbyD9yZ_owbA+d}R6drvSfolX6#m;yE_cj3s{u)?7p0NOqYW)LFB@{mSv*%kS@Ur*1 zWsn;(z=gZa;+hNBc0qcAU^77X{?&SXJeq!Q>fSXK2f%#{10JwJz=&NF)TLkZw)4%G z?0f^JJzqE7H@>ZxGT*un7*`4%|4>Gqf#c;H)`bea(3->llYIq%G3`>1mZ^ch zDnRQv0Hck;0SFVdQ&MBb@0CT`hPyhe` literal 0 HcmV?d00001 diff --git a/docs/cmdlet-example/Images/Std5.png b/docs/cmdlet-example/Images/Std5.png new file mode 100644 index 0000000000000000000000000000000000000000..74fe290b84ae40361ddd8a72257e46bee6bb8bf5 GIT binary patch literal 11624 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

    AcY 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 HLHK_G7YJNAB$ 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�C+l;1fAXd!7o#mCPhwpn_2DLX6TN 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 bFn>wwbc^c~NhH#UfSRf_0VAQYt&2vu4r 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 literal 0 HcmV?d00001 diff --git a/docs/cmdlet-example/Images/Step2.png b/docs/cmdlet-example/Images/Step2.png new file mode 100644 index 0000000000000000000000000000000000000000..fc8f2fb4f9f228ff87a114eeb213f0ca8efedc38 GIT binary patch literal 38176 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 z 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%0AqOPybFK%(%kvh)c`8*IM-EAXP2MQ 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 literal 0 HcmV?d00001 diff --git a/docs/cmdlet-example/Images/Step4.png b/docs/cmdlet-example/Images/Step4.png new file mode 100644 index 0000000000000000000000000000000000000000..63926f317ea3ad72221f01e453f69ee79a528255 GIT binary patch literal 31317 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 literal 0 HcmV?d00001 diff --git a/docs/cmdlet-example/Images/Step5.png b/docs/cmdlet-example/Images/Step5.png new file mode 100644 index 0000000000000000000000000000000000000000..f5e4f75aeb5bc0d449246491e1ee61d41e74d969 GIT binary patch literal 50621 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 HxP<+G;_*yywCfb_x=4o4=-6;h;NtME+!@> ze*T=9otW6hCebr|>t@maoXE}q(a$=loy8fk60*XusI$@UwAE=bF>K0?#cP{H{cShT zIYY(7c70m;TSp8oxGpAkY|nYK)0ZPX#xg1I!sxGPtQz5Mv%asp?gf1~UvTF@0lCrj z?!geR4#~J}mv8*Aj=m~?Xye0k>nF53UhmNymU+v(Lv@w(PE-$g3NSP6l4o2{acG&{ z!hpQ3-J}uXqD8=xY0QHEJ+(<61BB^F=c(Yn~Lmer@E`)}q-fH_fpmp+IA8OiWfhXWv@K z?LdOp+Vjn@gNf^Yciwm1(OfyQ)#kY6-w8ePvD_w(M&uIJSKoHj&oc_a`}ysS2?aix z6a-qEa63-s13SUXQ;^y4gpc6NG#L6ngSM-~16{A}wbk0;1*%$TpNl=JBpgga>B0+a z_6g`V2nf$#Km0J5zJ|i>4(w%VsZ-aAEOtxnl4(j5n;phHYAQg(g^mD322YP6J z#O(O*MQ^vh*=nb#efomx(u^Ox=dMh1^rquKZrT>9AbhY|NtYc;<&uZEzmBG*02jcf zOvlFYdB@|N?!$;Rq~C}9x`#E4dwI}%S~Ndt_D#fcm>E`LsfFE8o8yGITcqRL#ZZJO zjs^OD(;negt>O88(plx4f5ldZ(Vw%5E%IJ*%U42SGvR%=jvMUjZTA?!de8qypvne9qz6UpeBobK!*^~B;$!LYSWxhW-h{f9HI?_QCj z)%Jblq_OQk4EVkK|HU)JK-*CPC|dTPc{!)0H~jA0ez)OY5GA|Jutx`7SxdTNVzPH4 zB>w)$X@h9g43G|58n#&{MovE`E%*qU&m^TRGle0{6?krX30{s{MI7q3 z9-Qa}n*S#3Tl_vI)Gsxe^3g*4REb~Yp z{*G9qZQiWvCGhZKLkxe4J=8GI0W{3bEzhzCl!Wu=b{jv?q?T=4Ih$j$qEp-`I%}Of zpUjU-CM_R>?_D=M7dy}D;P?eEoi?%_BUdNr9M4yA^X~}}FGA{zM4-P@3C821SbR$* z#tv_lrzQeHENzULdk$DdROVfxS1^2_6_ql2uQYVA#*yqP?b_P# z**Yi&!7GFS1DS=B=GfB}Enc)F6pb|@ixqMDRS0!=li9I7*NV1UOobI{s=1YG=CP!o zd7_?UDm^m;AKIJnWaKL`L*=;@s{&KuxL6FF;*hPOxL_&}P7djgv34Jg4fI5W*^%KB=%rcP z<-C`bJ}KI^@~fL5*5-7NLkd!0KVrxWHi5voMEv<#7=Q1XUX6xpsgxZEOZIuRfPi#PN!}?BsF#~uO`hyu5z8&Vy5o$r=_KL2RXOUrsl_w zTEFnjt;l&24-U4Z;m?@wdqz?GmLa#0@+zx0mKQ@&2i#BX&59g!R5#z*5$AMzS*!tX zqV74fAk!O_vF>kM(&lr;_F^P=YytwD`*yne3#Ux;a%1|To=3}lFZVP&J@(u@zcW}v z=L;tVHZ2u1X|YjRyC@gplF@?^hwijS5)3 zEtKX2cP(fLWb7x>qOmks$j8(|ES*#mm%eAtwY!3+7WB{y7x%m$1p8a8YO&ijMLLOl zTU>2arsm_mTK_t~^q|31{kcJ-9n<=I)IvDZv+wx@q6%Joc6)a5=lIuSyN%PS3YPG> zWY-fc=^e|r5nA`gfUWZ!4+h>|k}4*)UFAVk+{@BLOyqDy4>y&7J04$9(0zK>NM zw7+m^tW+)wd4_`5cg;Ge9tmG%JC$Vh#BEam+E1F~0Z9#+yNUCaV-2#OaPSvS4$X(^ zEcP_DFoPXc6YGU!b}nZM<y{-s4M$?zF z_q5i>aKc~vz z>|FUTOvmod*enGMoH3S*O&-o5Oqh7{LZB_wT{6}ryFoc{Uq10y{Or1`+wh0k<$1kO*``z3@3wlQg^L^u&g!<=Wuk3g`nB<0 z{Jp&*qep(CZ;myL1ZSE>%?@{O(_2DjFoQwk5T@Ax@#+@w;r@CwE|_O-HsWs zSsoNB?))3@%8;9M)@OZLv*VxYg8LvrilDw8;F5RMft6P)ZCuu7FunDgIW~e7gNq8~ zMe;sKAdXGWPwqfz1S{&CtQYiwQA}bL%8}*jh&Otn>B~7BHS#LL-#X<*dChept#HlM zR|8Ky0qbb&Y1+JQ5LqV+NC_SX1S@E^WhA{Xe|{(t!V4{LHOFW=@J$GC5+vo%H6P)2 z{B4a;($JvD^D+(C?OS$94?pvldG-|Giho^AOe(n{+BoCrjVGUzI{=>bz5Jx!))~YuA5(Oeu4A5}H>)iB+qNY-^5=W=tFjB6TK$gt>APTE z>x^i)`ZhnX%C_7QNY!WG=UkW3zG^D}?}HF~ztI2C4O)XXXgb?}&V2FsfL86q^x`p{ zBxUap=1CVqPwlZ$s51|w3+kmR%3k`irM|tj2s{E9W*$!iZT|gmoZWMqiR$=M zXPdH;m%_f(D30d48P|LTGozuGm=#d2o06U7@8xbfN2;W;lWdl;F&ywMi&!%@AKoK+a}4z?H(~d{t8aq`@>7f z4Z5(eY~X~zAgAKBgJh(&cH$Rox5B-bg*J*tv!gusG|g20+YGBI`N58);-*enea`@U zl^3&mFTueBLGnq%QuOBoE+rC$YQOhWt##^&<<~eT%YDX$n(9QA3(~e4I~1|!u9W7) z@3lF*R8ioS>= z=kKB7r>fo+iAADMO}qX6?oTC$?=I_ey6<#XJ-!z|J@=M;K|1Dp&F>iN_NtWpN49Mv zRcLPiak_JUnU&Q1$JI6$Q4abahdSw_R1I6CMQ%#q1?*lndvbs@)*%pX*?bIb=?oef zUA%^bRX0jl%{)2#I!u{&XlAK70}w8@)g zgAE3ZkCAirekctC_vd?+rA#r~X*2MOH~FpVn&!n;xG850c8U;U0lI>%(0qGXs{` zrDuT>g=zNf1DvvM3Ma;`cr&efR*TNQnb}t35RhRHglG>AaOuycLmx3*THyT94De_v zSNSb{8g`A56LX!i1hrD9v4WPfVjj)v3z%u2a>0?KwZ?>{0nAwX@wO!(1iL;>BhGpB z<+J+3;iF9;$JEBm?cOn;@HI6|JoW%BrbBZnHNh^vC}k^J;{4VQH*oLSL8Cf+{AWwI zR&Rcfw?LU1tDWcFm_ClI6GR$~A{~Zb$XWhtUEKw^xrV9}$6KG6nS-XjRUwURJ&?v8H)fonip(I<9Ue zOwe;Jc3&Eki_JJfOsi-x3AeUR<*AaPZ}&x){@y{1Y|~VeiDrWd>t$lGMuhGtaajKS zyDBECspG?Vq`iuFKF7$|;p!ak=?S9a&c}Ya6O`gqHeN`YZ?8kxj!|KU!LP`LVHaoPTrQ0H z0-59A%KW`6qNrnPvkISniPM*_A1T}4RC*oh(jB74QPb@UJ48$?McD3qg5G3|h$TGL z>-E#2`Z_ax$##Op5d9o5qulWAheTb;sJ5Gs=Z4YL0tX)BK}1h&9z-ZZPf^}%Wdj5w zs3Uwp?eA*OnQ!bXKIPgnH$66AoYHS|ltASl zP<`<874B>+#RVP>;io%41z+=w-a&`CF*H)u$xeyof#TG*cs2`%C!yu2qtMaG~(s7|SZz4YCP9@AH*-b%L?!yeaMEJ;F# z4p<`2p%>p-^of7)Mut^&PVH$rNYwXi9w3JE3>#9_dFQjjmsHdN$V^+7^r!Fki635> za6=G8icx@r>&)Z0$J z02?NM4bS6%xsG$@%wLZghv#&Idre$zNzCOZx_mwpjrtLDO}NzfC4}TL=(nsub6(2u zw9HM3uSeW3lcDE%-u*Org7DD|q`|WqDLRmnOZ1z_$gT2F=UMgJLo(-TWhy5u?rRcU zTuFHz@zlAKR>r!^wP1NgeW5DKa>5yhc9aqj@*qf90E#Z#kSas0DxYl53_KLv0Y42Z zn~U#^=(l9?i}#wg_kNG~a_4V}=`JSyF|1f~a zNgxJH~*SNTZ_z4o#KklY5}2wTGcH1{21v_8^i;`=qHJ zjWP@y7^s{G`&M%cVH_S*Uon7+#UzyiOadmm7%HgZi4gr=&T|Patk3NB7zf<(N9EoD zGf#=yt$rA*Ojgq*1oFA^1(6dqn9lT^$kttej`*dd>^7y;llCkWa&$(y9Tmvt1M^G4 zr>r@-6dPvM*&F3_Hc={h$J8FCTX^il&w%)azw%ruyNYq89*1TjC|G?j`6y=!p`WaV zWP&8l3x5b8&%yF3$yHa-wmp)SA+{dVhL({??Y6MzO~4LHTm*0LTkh_n7|MNn@8Me6mZmP~hpIJt(Y>+$!Iyjjk%d-QqzXyG=4(X% zS-?2X@EBYL73!As}KydveP_!dkEhz*XQ?gn5+BO3< zLI=kd$G8i67Nh-(KRu0czsI?&Hqs$a`|2Q6l*KmJ#;kBcT3@+JLnz8qcd}X#<6HV! zu4yigFrNqE5?^BqJZbuO`EF> zL-L@u^`l;~Ve)qu6DP)c!EYu|`nSksOT1ndwb?xC8%N95U6=GX0c1&Oe8&>z!3Uw_ zH;+1&#-Prv4$~J8K^(qMnH@_y0By)|s!h1kPYMwSA60WbKugq1N!k%1G+umWo)UP( zvu7auV){2L?}#6)M?rFTO&(S@dMs+018V(8839<`$?~f^>Mps*U+s<2$&iaLiaE^z z9&r4vDYqLD7>4k`r4b)5d-tONfV<^TcdMYFq^(j`q#r*Iq!!yE@#<<0lXQ=xA){#o zL|-J5CNmVs^5foxd5<_BRc0zIb`rt9)Yx2g8`b@ne?(_P!R5< zJ1u1<_7-vzB*ygs&-@~_qpfB_c7bm1myEX6egRZmuKq(9nME}r{XwIAfsyCW$VGgw z4`LB{9gS31-D|J|KuUf5)_&J%h23myyF>YYcuLY%o);`(u~M{P?_?CqclnesYwv>3 zQt3?DA@mbcL27C<$HXQTnyss@%b#~To{(uu3m){lj2?zQ^n*$GFF32VS$5d4WFf4w zTZDERruRK%+R&pxe?nIhS5nNXgxb0~>DDb*Mc6T!kvNJ$)rikixi8Jj&gz^WZgW*D zQgjPsIqulMpB8pqPw<0NTk!(V92lu#!%Ues4#e$Cgrr>NY)SMwlim;ts$BDE_BORI z^nS9n6LzYYU3Z;9o3*TW&`qv*9Z+;WXp)$WL6(O^g|vK}AR3}nlH6}`pWz}@g@%5A zG?0J*Yy%tge#jiK0AC8T}$He_E0f0rc9d#5~IS<5;#UJ}0C zg;?!`kA>`*NDrb1_JUML^`DYobyr$3eZjd`>O5Recw)KPG#zBf2(>leBzUQ)%ej^E zlOT_+*nB^_zHLq~MV|eYXz$4%a80M=&g>~R<$6^8RP=&&V0V%By#)+Rgh*Oa-BU2O zm=CoiwYj2H&&ud0xKrT>peo8%Tl=BS)D5mRItjBy{@nz}<@o37tn`kG#YZJfhRGqM zt4I^Bcr7Z^)rPzw@4c+;G^bwnlpx7MQe$-94n$2EY$a0)wCN>%l&K6g^;hrm)$Irh zf~GkJKbHVN>y2+>1Wne&Gpc_YB_@nSpD)pvDM(H$fxLQCK@UstDo}<#6f!_q)w$l! zHcSAywR%ktT8rui53S$QcK!N#&OjRaEDhxVwhytUwY2Y3TrY8Wb_#i8ctgg67{eZe z&hNF;JzOe2{{5#RWf%+3<|vBYw!bC{pEioZCsFVt`zPH@+WgdE_5sk?$$YSn|4xZJ z@q1zxwtaJvnC@x)LCD@r%MHW03Ph08;(x(;*|3Q%VkiBI-VZ&zDr3x6F<&bNiB)_2 z9^CwIp+RT+(VI~!FPoD8N8I#VpZ_=3`t4}%GsEiTEhafHn|2I+l*=-p;ely;jA^@9 zL)%EFJFQY5w8GoYoBd9bJQE69^dW(Gp^=^jB3Q2gx==l-R8Hk%T)^~iMc1Gv@~yOj zrgVA!o1#zThCKp?aPJp>5!Zk;H-De>%z&0eY;U0(Zqu0xW>|XM3kzr-bS<8!X+&%T z9}+rvVyw7*t|y!InRgfC8@xSTFZNtR1E(7M;qws7U6q z+kn$8cYm2K(R!p#AB2ok=?7;5aa6|R1K!?M4@lnKpTW0kNrMVhkNCieTRE2{Z&)u( ze5R4<*vEqJ$EW%qN^qLhik^_XWilB+mPO!#5tCdqvmniK1y_Q-X>$&L*Wa8r{61R4 zFDS1w^xe$(K0&u8I`K>1pMdoS5hw#3@fje@EmQ^MjDg?-P{mUY<_lk7bMoT8ZuE;^ z&gNzu{aINy77Z8Wa)NGW?FzRX)kYcOvQu#M#Nd(wefRi~Osdy8I8xW=(F}`#m2A@Z zx%eDk5vtynT>q_s?e~TLtWI_o63ugWRdpBUV$|Eh9+$hgJ}>_%hmuD_(3UvI2J10c zJ@;Tjq&KBH8L43+lk zV$3jiQ10#gQ+7My(ZIWFL?lCfQXC+;S`xb|zQ%oh=GZe6HhsDe@rU;T^o$`zP{Rzom}{im3@S zwC24cd3{KV=mhG8pDwApj5=~QyMEVQw0~dk{CSVg>RZT(=26ZSIJYJl_K@eFqU{j_ zr0qwS*PtyA$yl@P!3qn`Q|~65oOQ!NKqgC(Mim8Ap*zEjQ*}VbyfP&WKMg9WFR77q zU$oz$s&P&VkCuJEXz6CJraV>lMOu$zFFLo_n-D(scHWL0F?nTbxNFA>*Z(QLMrL{2 zi{~U-0#sicggYEF&d169$a{}_wGt+ff==X2rtU${sh{~t3@1O8MWJpyvoC)IJ%KRJ z>1h;agKaXEjG+w|ne!fKfP_OZ|2fWN& z|KaJpmbQH5zG#E6@Mm((v|m2RNY%0>cR2Z%y^;m^Ipet%3KdYI>KTXY?ECzRrr4xG z?B}G*|ByCqvcBx64cb(b#Sv9)wFz1HYHk|8YeGsNwB19H9rdcUq9lI8k5}?yd19UA zh!*Xs6xu*CFcaMsb9ecCnfHD$uor<3}rg) zE|o{$wEt0o9OJ-r=@m??teG$tM$(l2*U0hv-FcuA4MLA!K-GgZ3oGr-#x@X-`fX(5 z%>2ezx-!Q{uq0$}4l$m4H8d}!Ts#(;Ncur~5fb#aCWvoG@e7g&&4XbwJBWt~53U}R zM@Xs$0G(%}LdWlfTjhfX1W1Rdpo__3 zi)kdJBYb$!>dvyiFjC5)uVqir_;?#zjql&U@`dyPi-Rwm5S=lE7PPB1>VT<#62MU( z6?ONo#aEK7QBqK8h*ZwL#Q7(%qBj5g=vz7o!DTYO<<70Ijv0p!#g_RsQx_`?%ZcCQ z%qwNsMlH@?)gukd5kEtU=WmhnLtfxXHJGTmFHe(PGAkFQ4~26rr0XgyCWqa~HGP#< z#?~+ER<(-)toWr|5@v50FoD_X=iln>9cw90*Vp8>qthm9WGWdmqbbc{J)l)Ws;q7E zdT`=8H`QXKvYSlVld8Ccgk2p~(2@1u3_GNh6wm^fEjDJGR+#prFb=XY_zK)9G4e$t}ArZmIe>JnOPZVPSY#zDsVH4XAmb9Ow2087V@k~uLoLnrMH0#XahU|{F&<+pizojoZR67)ZjFxs22%Q)%&Q}C++TVW2 zRro}Mp7BJjmLYC68_MOE=#Fp7uaj*%Ey#s>Vdw?oA}n>btYKNJ2{?6SYT?DIjePeSorj0^e8ub!v(vp(#ai{rhMrC>hO zpvV;>@z;`m&+v!UpT`4^CUz;Zr#|^DW&Z*Cyc4vy7gRB>crz=|Ks(n8RAG&Xu8Y}s z0hRSVpNQ!Tf=3xW>Vks_W{{~%9^}0jc3rS;uW9+@9t^|5w^=GykFh_z!8NNjGrC=3 zv}yhWp>;k?b?)r-v>5+jb~!+H<`v~tPa6_bVIlHY(SGIZj_cyGjlf6HQCq16H#MQ< zxU)}DLpXtS7gk8ps8Q_tGs_$Qpd+IRk<3X~z+|Ll!$k4Lj@!^>+5YgUmF0W~``XsMS6B-jk z>pFp>KCY&oOPA~w`)4I?OqEv1qnQu3Trsf*9hwkX#3AKN0%hVJ%TddEk})oFY{AVB z=BpZ^*(cX^!{o0W3#X~9lb_uxJkn?O0^Pc;b73rZ0{qV5;Jk`MdA?-nbTt%${s z(`-x9Fp#%udJV@W?b-H3%YaMC`gGqQRAW9ng;8OWJ%5ejI<4>EC28xCGDFSI;CLJh zqHv4`paFf}f0P(uCcvF5 z+Im;fk;-IDjhvV=e+`VEJw}*zraMlao!L|3`MCU7j~v!sN(%q?u)*ZG0Oe)_aVTN# zCp_YJFDNt|YAD?7S3LIJZ_siXf7atU={^_?-(PuU%8q*Nym;Phac>BUoRqBF!l_W- zSQ8Z8U@!z8t-PM^1_tDv(4C9hwrayqm8^4hRkZcUftvhJGCMaM&if{Darj#C)b0SK zo6{lFzeJXk$n`6mbB!=52~^2j zP{71wvn`dG*+9|9)edOe`g>g2L9J5}S4Y?De_OS^mFZu*o$>(rw6Q&&+n+6{a}V-{ zfIMpWukxW*qp1BWkLWE<7LIEwhhTZ zG9VlsvHW}s#;bg>qEe7uHk`x)RHP^|^2Y|^^<%7+suaB>vi*=J1dE%!r_&vnnUNz= zg+-snvz=2!S6bR>-PRoWnl9`;Lia*v2o5WN`ONI^vaCj&CeIGML+GTqzg7RYMd&x7o)8{#3FyDd9@%Xygz&B9H3v>+x?;*fdPUR%4g5n9wjKttv@(F*0 zezT%3=EDV#%clw_4xte!g{qCmhcTNqpB+_1hKJ^I_H z$|eTp+dKXT2P?QsAC)*flpi~*al0#itoIY;nD64R7fSa!ZT3b;*ncxkQ)s;#vL7nw zTaalC%2v0IpvVnH?};$cD6H?0wW`Lc zYfLiui0wvc1`!deo~fK%MOJ${x-px1IjAUwVPH9!lH`#t|!d(qt0_WvK={u?c8{sV4wo!v4rdd#zQ zL(#gh&77SxtM|x$mHsZDt;EEQ0^N&HKzN_;uim*VNLJ5vREoSX8(b{x&*i{=%6H@% zx@yzv^eJ4yN+EG+cG@U+GE+Fo{c4nSG9F(LwRYx|fPIofOGPA7&a=1-~u0}!IYJr3EqMHor(6i@+ zPrZ@kG+e}`O!q%MiYEBgFhp6oT4YUmx7+qNawo8JCGOA58GL>CHtLOS@tyg|;A+`N z=Et$leSap6=(#jd8E2!M>%v#@e7(j}>IN2|s;4v_3&;XQ0 zqAmL_l4Iw|^sNkToP+JqDJybJzu`#|cgEKkc zwxgeW@&Ok8WWs})JJ>`nPRWN1@O3JUH9P^~rv=XC^cLp|#1+pt{q`mH&2#Y7?)H3*$<1;B+LaR>b@iDQC&lG*o3mW;nB-B)K5yxw)v?+>aa_BOu=lmmgC>I6JCql~D} z(Emw%+)Ra?=L~RXI%k~EO^#1&+7pa(cD;LQVjgdjPsA}(X*#Pqq-f3eIGC8J?6UzU z+*V7+r&g)oL)FzSoh2t*dRxTVEotx=?6HnX_OXS|8e84xq#rj3$;kfp?q2M(DuW}C z!+@^5sXdkED~y;@ybY!pO{kF%og|_x?>+D5xP*ltjwmeo$o9dKVZt4Oy;GtyQ>#lP!+VYx12zYnxepiZv5xhv`m z(5>ow$d{S@#Y*76)rs>z>SW*h{kDB4U-4wf`Zsl=YQldEwsWQa&JBM5v2umucMfv( v7(~9O?Y}dB4~gzfiLP**ahDbhk%U{$9Nlo|fq29Dm6zwut<6f#T#frbZl|a6 literal 0 HcmV?d00001 diff --git a/docs/cmdlet-example/Images/Step7.png b/docs/cmdlet-example/Images/Step7.png new file mode 100644 index 0000000000000000000000000000000000000000..a18ac91f474568224dbe9d272f80497ec73cf53b GIT binary patch literal 11670 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 aI~6{<#U!9<5mPWf-a)rRu4Q}AB>pdHN#!p9 literal 0 HcmV?d00001 diff --git a/docs/cmdlet-example/Images/Step8.png b/docs/cmdlet-example/Images/Step8.png new file mode 100644 index 0000000000000000000000000000000000000000..bcaafca26e197bd41f06f3fc341c483ada020145 GIT binary patch literal 35634 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 + ![StdImage22](./Images/Std22.png) + +1. Now we need to setup reference assemblies. + In `Solution Explorer` right click on project `Dependencies` and select `Manage NuGet Packages...` +In the top-right corner of the package manager select `nuget.org` package source, select `Browse` tab, type in `PowerShellStandard.Library` in the search and select `Include prerelease`. +It should find `PowerShellStandard.Library` package, select it and it will show package details; install it using `Install` button. +![StdImage3](./Images/Std3.png) + +1. Add the code of cmdlet: + ```CSharp + using System.Management.Automation; // PowerShell namespace. + + namespace SendGreeting + { + // Declare the class as a cmdlet and specify and + // appropriate verb and noun for the cmdlet name. + [Cmdlet(VerbsCommunications.Send, "Greeting")] + public class SendGreetingCommand : Cmdlet + { + // Declare the parameters for the cmdlet. + [Parameter(Mandatory = true)] + public string Name { get; set; } + + // Overide the ProcessRecord method to process + // the supplied user name and write out a + // greeting to the user by calling the WriteObject + // method. + protected override void ProcessRecord() + { + WriteObject("Hello " + Name + "!"); + } + } + } + ``` + At this point everything should look like this: + ![StdImage4](./Images/Std4.png) + +1. Build solution (F6); The `Output` window will print the location of generated cmdlet DLL: + ![StdImage5](./Images/Std5.png) + +1. Now cmdlet can be run on systems supported by PowerShell Standard;
    + For example:
    + On PowerShell Core on Windows: +![StdImage61](./Images/Std61.png) +On PowerShell Core on Linux: +![StdImage62](./Images/Std62.png) +On Windows PowerShell on Windows (this requires [.NET Framework 4.7.1](https://github.com/Microsoft/dotnet-framework-early-access/blob/master/instructions.md)): +![StdImage63](./Images/Std63.png) \ No newline at end of file diff --git a/test/common/markdown/markdown.tests.ps1 b/test/common/markdown/markdown.tests.ps1 index a79609340dd..2b9cedcd995 100644 --- a/test/common/markdown/markdown.tests.ps1 +++ b/test/common/markdown/markdown.tests.ps1 @@ -74,7 +74,7 @@ Describe 'Common Tests - Validate Markdown Files' -Tag 'CI' { $docsToTest = @( './*.md' './docs/*.md' - './docs/cmdlet-example/command-line-simple-example.md' + './docs/cmdlet-example/*.md' './docs/installation/*.md' './docs/maintainers/README.md' './demos/SSHRemoting/*.md' From 6acbf5c5e451425b99b5541c1a7a3c8dac8791ec Mon Sep 17 00:00:00 2001 From: Keith Hill Date: Mon, 23 Oct 2017 12:22:12 -0600 Subject: [PATCH 031/617] Add global.json to pick correct SDK version (#5118) --- global.json | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 global.json diff --git a/global.json b/global.json new file mode 100644 index 00000000000..110af6027d7 --- /dev/null +++ b/global.json @@ -0,0 +1,5 @@ +{ + "sdk": { + "version": "2.0.0" + } +} From c98fe394ec32b7025e0b3c26811b0e45b349e3c1 Mon Sep 17 00:00:00 2001 From: Joshua King Date: Tue, 24 Oct 2017 08:22:05 +1300 Subject: [PATCH 032/617] Make Get-ChildItem honor Depth parameter with Include/Exclude (#4985) * Add depth to ProcessPathItems * Honors capped recursion when using Include or Exclude filters with Get-ChildItem * Including test cases to test include/exclude recursion * Swap optional parameter for overload --- .../engine/SessionStateContainer.cs | 73 ++++++++++++++++++- .../Get-ChildItem.Tests.ps1 | 16 +++- 2 files changed, 84 insertions(+), 5 deletions(-) diff --git a/src/System.Management.Automation/engine/SessionStateContainer.cs b/src/System.Management.Automation/engine/SessionStateContainer.cs index 97c412f3f0e..efcc2feedc3 100644 --- a/src/System.Management.Automation/engine/SessionStateContainer.cs +++ b/src/System.Management.Automation/engine/SessionStateContainer.cs @@ -1593,7 +1593,7 @@ internal void GetChildItems( } int unUsedChildrenNotMatchingFilterCriteria = 0; - ProcessPathItems(providerInstance, providerPath, recurse, context, out unUsedChildrenNotMatchingFilterCriteria, ProcessMode.Enumerate); + ProcessPathItems(providerInstance, providerPath, recurse, depth, context, out unUsedChildrenNotMatchingFilterCriteria, ProcessMode.Enumerate); } } else @@ -1861,6 +1861,72 @@ private void ProcessPathItems( out int childrenNotMatchingFilterCriteria, ProcessMode processMode = ProcessMode.Enumerate, bool skipIsItemContainerCheck = false) + { + // Call ProcessPathItems with 'depth' set to maximum value for infinite recursion when needed. + ProcessPathItems(providerInstance, path, recurse, uint.MaxValue, context, out childrenNotMatchingFilterCriteria, processMode, skipIsItemContainerCheck); + } // ProcessPathItems + + ///

    + /// Since we can't do include and exclude filtering on items we have to + /// do the recursion ourselves. We get each child name and see if it matches + /// the include and exclude filters. If the child is a container we recurse + /// into that container. + /// + /// + /// + /// The instance of the provider to use. + /// + /// + /// + /// The path to the item to get the children from. + /// + /// + /// + /// Recurse into sub-containers when getting children. + /// + /// + /// + /// Limits the depth of recursion; uint.MaxValue performs full recursion. + /// + /// + /// + /// The context under which the command is running. + /// + /// + /// + /// The count of items that do not match any include/exclude criteria. + /// + /// + /// Indicates if this is a Enumerate/Remove operation + /// + /// a hint used to skip IsItemContainer checks + /// + /// + /// If the refers to a provider that could not be found. + /// + /// + /// + /// If the refers to a drive that could not be found. + /// + /// + /// + /// If the provider that the refers to does + /// not support this operation. + /// + /// + /// + /// If the provider threw an exception. + /// + /// + private void ProcessPathItems( + CmdletProvider providerInstance, + string path, + bool recurse, + uint depth, + CmdletProviderContext context, + out int childrenNotMatchingFilterCriteria, + ProcessMode processMode = ProcessMode.Enumerate, + bool skipIsItemContainerCheck = false) { ContainerCmdletProvider containerCmdletProvider = GetContainerProviderInstance(providerInstance); childrenNotMatchingFilterCriteria = 0; @@ -2016,7 +2082,7 @@ private void ProcessPathItems( } // Now recurse if it is a container - if (recurse && IsPathContainer(providerInstance, qualifiedPath, context)) + if (recurse && IsPathContainer(providerInstance, qualifiedPath, context) && depth > 0) { // Making sure to obey the StopProcessing. if (context.Stopping) @@ -2024,7 +2090,7 @@ private void ProcessPathItems( return; } // The item is a container so recurse into it. - ProcessPathItems(providerInstance, qualifiedPath, recurse, context, out childrenNotMatchingFilterCriteria, processMode, skipIsItemContainerCheck: true); + ProcessPathItems(providerInstance, qualifiedPath, recurse, depth - 1, context, out childrenNotMatchingFilterCriteria, processMode, skipIsItemContainerCheck: true); } } // for each childName } @@ -2066,7 +2132,6 @@ private void ProcessPathItems( } } // ProcessPathItems - /// /// Gets the dynamic parameters for the get-childitem cmdlet. /// diff --git a/test/powershell/Modules/Microsoft.PowerShell.Management/Get-ChildItem.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Management/Get-ChildItem.Tests.ps1 index 043b9c4c6f9..1956a558f9f 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Management/Get-ChildItem.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Management/Get-ChildItem.Tests.ps1 @@ -9,13 +9,15 @@ Describe "Get-ChildItem" -Tags "CI" { $item_c = "c283d143-2116-4809-bf11-4f7d61613f92" $item_D = "D39B4FD9-3E1D-4DD5-8718-22FE2C934CE3" $item_E = "EE150FEB-0F21-4AFF-8066-AF59E925810C" - $item_F = ".F81D8514-8862-4227-B041-0529B1656A43" + $item_F = ".F81D8514-8862-4227-B041-0529B1656A43" + $item_G = "5560A62F-74F1-4FAE-9A23-F4EBD90D2676" $null = New-Item -Path $TestDrive -Name $item_a -ItemType "File" -Force $null = New-Item -Path $TestDrive -Name $item_B -ItemType "File" -Force $null = New-Item -Path $TestDrive -Name $item_c -ItemType "File" -Force $null = New-Item -Path $TestDrive -Name $item_D -ItemType "File" -Force $null = New-Item -Path $TestDrive -Name $item_E -ItemType "Directory" -Force $null = New-Item -Path $TestDrive -Name $item_F -ItemType "File" -Force | ForEach-Object {$_.Attributes = "hidden"} + $null = New-Item -Path (Join-Path -Path $TestDrive -ChildPath $item_E) -Name $item_G -ItemType "File" -Force } It "Should list the contents of the current folder" { @@ -66,6 +68,18 @@ Describe "Get-ChildItem" -Tags "CI" { $file.Count | Should be 1 $file.Name | Should be $item_F } + + It "Should list items in current directory only with depth set to 0" { + (Get-ChildItem -Path $TestDrive -Depth 0).Count | Should Be 5 + (Get-ChildItem -Path $TestDrive -Depth 0 -Include *).Count | Should Be 5 + (Get-ChildItem -Path $TestDrive -Depth 0 -Exclude IntentionallyNonexistent).Count | Should Be 5 + } + + It "Should return items recursively when using 'Include' or 'Exclude' parameters" { + (Get-ChildItem -Path $TestDrive -Depth 1).Count | Should Be 6 + (Get-ChildItem -Path $TestDrive -Depth 1 -Include $item_G).Count | Should Be 1 + (Get-ChildItem -Path $TestDrive -Depth 1 -Exclude $item_a).Count | Should Be 5 + } } Context 'Env: Provider' { From 14af252878f8019ec0f55db1ec2328984cc4e587 Mon Sep 17 00:00:00 2001 From: Travis Plunk Date: Mon, 23 Oct 2017 12:30:25 -0700 Subject: [PATCH 033/617] Update packaging to only package PowerShell binaries when packaging symbols (#5145) * Update packaging script to only package PowerShell binaries when creating symbols zip. disallow all other package types for symbols * remove instrumentation used for debugging during development * Add error action silently continue to cleanup for reliability. * Add comment about why folder is being deleted. --- tools/packaging/packaging.psm1 | 403 ++++++++++++++++++--------------- 1 file changed, 226 insertions(+), 177 deletions(-) diff --git a/tools/packaging/packaging.psm1 b/tools/packaging/packaging.psm1 index ca448711fbc..3f640cf96fc 100644 --- a/tools/packaging/packaging.psm1 +++ b/tools/packaging/packaging.psm1 @@ -30,8 +30,6 @@ function Start-PSPackage { [Switch] $Force, - [Switch] $IncludeSymbols, - [Switch] $SkipReleaseChecks ) @@ -39,217 +37,255 @@ function Start-PSPackage { # creating package for 'deb-arm'. It should be added back to the ValidateSet of '-Type' once the implementation # of creating 'deb-arm' package is done. - # Runtime and Configuration settings required by the package - ($Runtime, $Configuration) = if ($WindowsRuntime) { - $WindowsRuntime, "Release" - } elseif ($Type -eq "deb-arm") { - New-PSOptions -Configuration "Release" -Runtime "Linux-ARM" -WarningAction SilentlyContinue | ForEach-Object { $_.Runtime, $_.Configuration } - } else { - New-PSOptions -Configuration "Release" -WarningAction SilentlyContinue | ForEach-Object { $_.Runtime, $_.Configuration } - } + DynamicParam { + if ($Type -eq "zip") { + # Add a dynamic parameter '-IncludeSymbols' when the specified package type is 'zip'. + # The '-IncludeSymbols' parameter can be used to indicate that the package should only contain powershell binaries and symbols. + $ParameterAttr = New-Object "System.Management.Automation.ParameterAttribute" + $Attributes = New-Object "System.Collections.ObjectModel.Collection``1[System.Attribute]" + $Attributes.Add($ParameterAttr) > $null - if($Environment.IsWindows) { - # Runtime will always be win7-x64 or win7-x86 on Windows. - # Build the name suffix for universal win-plat packages. - $NameSuffix = $Runtime -replace 'win\d+', 'win' + $Parameter = New-Object "System.Management.Automation.RuntimeDefinedParameter" -ArgumentList ("IncludeSymbols", [switch], $Attributes) + $Dict = New-Object "System.Management.Automation.RuntimeDefinedParameterDictionary" + $Dict.Add("IncludeSymbols", $Parameter) > $null + return $Dict + } } - log "Packaging RID: '$Runtime'; Packaging Configuration: '$Configuration'" - - $Script:Options = Get-PSOptions + End { + $IncludeSymbols = $null + if ($PSBoundParameters.ContainsKey('IncludeSymbols')) { + log 'setting IncludeSymbols' + $IncludeSymbols = $PSBoundParameters['IncludeSymbols'] + } - $crossGenCorrect = $false - if ($Type -eq "deb-arm") { - # crossgen doesn't support arm32 yet - $crossGenCorrect = $true - } - elseif(-not $IncludeSymbols.IsPresent -and $Script:Options.CrossGen) { - $crossGenCorrect = $true - } - elseif ($IncludeSymbols.IsPresent -and -not $Script:Options.CrossGen) { - $crossGenCorrect = $true - } + # Runtime and Configuration settings required by the package + ($Runtime, $Configuration) = if ($WindowsRuntime) { + $WindowsRuntime, "Release" + } elseif ($Type -eq "deb-arm") { + New-PSOptions -Configuration "Release" -Runtime "Linux-ARM" -WarningAction SilentlyContinue | ForEach-Object { $_.Runtime, $_.Configuration } + } else { + New-PSOptions -Configuration "Release" -WarningAction SilentlyContinue | ForEach-Object { $_.Runtime, $_.Configuration } + } - # Make sure the most recent build satisfies the package requirement - if (-not $Script:Options -or ## Start-PSBuild hasn't been executed yet - -not $crossGenCorrect -or ## Last build didn't specify '-CrossGen' correctly - $Script:Options.Runtime -ne $Runtime -or ## Last build wasn't for the required RID - $Script:Options.Configuration -ne $Configuration -or ## Last build was with configuration other than 'Release' - $Script:Options.Framework -ne "netcoreapp2.0") ## Last build wasn't for CoreCLR - { - # It's possible that the most recent build doesn't satisfy the package requirement but - # an earlier build does. - # It's also possible that the last build actually satisfies the package requirement but - # then `Start-PSPackage` runs from a new PS session or `build.psm1` was reloaded. - # - # In these cases, the user will be asked to build again even though it's technically not - # necessary. However, we want it that way -- being very explict when generating packages. - # This check serves as a simple gate to ensure that the user knows what he is doing, and - # also ensure `Start-PSPackage` does what the user asks/expects, because once packages - # are generated, it'll be hard to verify if they were built from the correct content. - $params = @('-Clean') - if(-not $IncludeSymbols.IsPresent) - { - $params += '-CrossGen' + if($Environment.IsWindows) { + # Runtime will always be win7-x64 or win7-x86 on Windows. + # Build the name suffix for universal win-plat packages. + $NameSuffix = $Runtime -replace 'win\d+', 'win' } - $params += '-Runtime', $Runtime - $params += '-Configuration', $Configuration - throw "Please ensure you have run 'Start-PSBuild $params'!" - } + log "Packaging RID: '$Runtime'; Packaging Configuration: '$Configuration'" - if($SkipReleaseChecks.IsPresent) { - Write-Warning "Skipping release checks." - } - elseif(!$Script:Options.RootInfo.IsValid){ - throw $Script:Options.RootInfo.Warning - } + $Script:Options = Get-PSOptions - # If ReleaseTag is specified, use the given tag to calculate Vesrion - if ($PSCmdlet.ParameterSetName -eq "ReleaseTag") { - $Version = $ReleaseTag -Replace '^v' - } + $crossGenCorrect = $false + if ($Type -eq "deb-arm") { + # crossgen doesn't support arm32 yet + $crossGenCorrect = $true + } + elseif(-not $IncludeSymbols.IsPresent -and $Script:Options.CrossGen) { + $crossGenCorrect = $true + } + elseif ($IncludeSymbols.IsPresent) { + $crossGenCorrect = $true + } - # Use Git tag if not given a version - if (-not $Version) { - $Version = (git --git-dir="$PSScriptRoot/../../.git" describe) -Replace '^v' - } + # Make sure the most recent build satisfies the package requirement + if (-not $Script:Options -or ## Start-PSBuild hasn't been executed yet + -not $crossGenCorrect -or ## Last build didn't specify '-CrossGen' correctly + $Script:Options.Runtime -ne $Runtime -or ## Last build wasn't for the required RID + $Script:Options.Configuration -ne $Configuration -or ## Last build was with configuration other than 'Release' + $Script:Options.Framework -ne "netcoreapp2.0") ## Last build wasn't for CoreCLR + { + # It's possible that the most recent build doesn't satisfy the package requirement but + # an earlier build does. + # It's also possible that the last build actually satisfies the package requirement but + # then `Start-PSPackage` runs from a new PS session or `build.psm1` was reloaded. + # + # In these cases, the user will be asked to build again even though it's technically not + # necessary. However, we want it that way -- being very explict when generating packages. + # This check serves as a simple gate to ensure that the user knows what he is doing, and + # also ensure `Start-PSPackage` does what the user asks/expects, because once packages + # are generated, it'll be hard to verify if they were built from the correct content. + $params = @('-Clean') + if(-not $IncludeSymbols.IsPresent) + { + $params += '-CrossGen' + } + $params += '-Runtime', $Runtime + $params += '-Configuration', $Configuration - $Source = Split-Path -Path $Script:Options.Output -Parent - log "Packaging Source: '$Source'" + throw "Please ensure you have run 'Start-PSBuild $params'!" + } - # Decide package output type - if (-not $Type) { - $Type = if ($Environment.IsLinux) { - if ($Environment.LinuxInfo.ID -match "ubuntu") { - "deb", "nupkg" - } elseif ($Environment.IsRedHatFamily) { - "rpm", "nupkg" - } else { - throw "Building packages for $($Environment.LinuxInfo.PRETTY_NAME) is unsupported!" - } - } elseif ($Environment.IsMacOS) { - "osxpkg", "nupkg" - } elseif ($Environment.IsWindows) { - "msi", "nupkg" + if($SkipReleaseChecks.IsPresent) { + Write-Warning "Skipping release checks." + } + elseif(!$Script:Options.RootInfo.IsValid){ + throw $Script:Options.RootInfo.Warning } - Write-Warning "-Type was not specified, continuing with $Type!" - } - log "Packaging Type: $Type" - # Add the symbols to the suffix - # if symbols are specified to be included - if($IncludeSymbols.IsPresent -and $NameSuffix) { - $NameSuffix = "symbols-$NameSuffix" - } - elseif ($IncludeSymbols.IsPresent) { - $NameSuffix = "symbols" - } + # If ReleaseTag is specified, use the given tag to calculate Vesrion + if ($PSCmdlet.ParameterSetName -eq "ReleaseTag") { + $Version = $ReleaseTag -Replace '^v' + } - switch ($Type) { - "zip" { - $Arguments = @{ - PackageNameSuffix = $NameSuffix - PackageSourcePath = $Source - PackageVersion = $Version - Force = $Force - } + # Use Git tag if not given a version + if (-not $Version) { + $Version = (git --git-dir="$PSScriptRoot/../../.git" describe) -Replace '^v' + } - if ($PSCmdlet.ShouldProcess("Create Zip Package")) { - New-ZipPackage @Arguments - } + $Source = Split-Path -Path $Script:Options.Output -Parent + + # If building a symbols package, don't include the publish build. + if ($IncludeSymbols.IsPresent) + { + $buildSource = Split-Path -Path $Source -Parent + $Source = New-TempFolder + Get-ChildItem -Path $buildSource | Where-Object {$_.Name -ine 'Publish'} | Copy-Item -Destination $Source -Recurse } - "msi" { - $TargetArchitecture = "x64" - if ($Runtime -match "-x86") { - $TargetArchitecture = "x86" - } - $Arguments = @{ - ProductNameSuffix = $NameSuffix - ProductSourcePath = $Source - ProductVersion = $Version - AssetsPath = "$PSScriptRoot\..\..\assets" - LicenseFilePath = "$PSScriptRoot\..\..\assets\license.rtf" - # Product Guid needs to be unique for every PowerShell version to allow SxS install - ProductGuid = New-Guid - ProductTargetArchitecture = $TargetArchitecture - Force = $Force - } + log "Packaging Source: '$Source'" - if ($PSCmdlet.ShouldProcess("Create MSI Package")) { - New-MSIPackage @Arguments + # Decide package output type + if (-not $Type) { + $Type = if ($Environment.IsLinux) { + if ($Environment.LinuxInfo.ID -match "ubuntu") { + "deb", "nupkg" + } elseif ($Environment.IsRedHatFamily) { + "rpm", "nupkg" + } else { + throw "Building packages for $($Environment.LinuxInfo.PRETTY_NAME) is unsupported!" + } + } elseif ($Environment.IsMacOS) { + "osxpkg", "nupkg" + } elseif ($Environment.IsWindows) { + "msi", "nupkg" } + Write-Warning "-Type was not specified, continuing with $Type!" } - "AppImage" { - if ($IncludeSymbols.IsPresent) { - throw "AppImage does not support packaging '-IncludeSymbols'" - } + log "Packaging Type: $Type" - if ($Environment.IsUbuntu14) { - $null = Start-NativeExecution { bash -iex "$PSScriptRoot/../appimage.sh" } - $appImage = Get-Item PowerShell-*.AppImage - if ($appImage.Count -gt 1) { - throw "Found more than one AppImage package, remove all *.AppImage files and try to create the package again" + # Add the symbols to the suffix + # if symbols are specified to be included + if($IncludeSymbols.IsPresent -and $NameSuffix) { + $NameSuffix = "symbols-$NameSuffix" + } + elseif ($IncludeSymbols.IsPresent) { + $NameSuffix = "symbols" + } + + switch ($Type) { + "zip" { + $Arguments = @{ + PackageNameSuffix = $NameSuffix + PackageSourcePath = $Source + PackageVersion = $Version + Force = $Force + } + + if ($PSCmdlet.ShouldProcess("Create Zip Package")) { + New-ZipPackage @Arguments } - Rename-Item $appImage.Name $appImage.Name.Replace("-","-$Version-") - } else { - Write-Warning "Ignoring AppImage type for non Ubuntu Trusty platform" } - } - 'nupkg' { - $Arguments = @{ - PackageNameSuffix = $NameSuffix - PackageSourcePath = $Source - PackageVersion = $Version - PackageRuntime = $Runtime - PackageConfiguration = $Configuration - Force = $Force + "msi" { + $TargetArchitecture = "x64" + if ($Runtime -match "-x86") { + $TargetArchitecture = "x86" + } + + $Arguments = @{ + ProductNameSuffix = $NameSuffix + ProductSourcePath = $Source + ProductVersion = $Version + AssetsPath = "$PSScriptRoot\..\..\assets" + LicenseFilePath = "$PSScriptRoot\..\..\assets\license.rtf" + # Product Guid needs to be unique for every PowerShell version to allow SxS install + ProductGuid = New-Guid + ProductTargetArchitecture = $TargetArchitecture + Force = $Force + } + + if ($PSCmdlet.ShouldProcess("Create MSI Package")) { + New-MSIPackage @Arguments + } } + "AppImage" { + if ($IncludeSymbols.IsPresent) { + throw "AppImage does not support packaging '-IncludeSymbols'" + } - if ($PSCmdlet.ShouldProcess("Create NuPkg Package")) { - New-NugetPackage @Arguments + if ($Environment.IsUbuntu14) { + $null = Start-NativeExecution { bash -iex "$PSScriptRoot/../appimage.sh" } + $appImage = Get-Item PowerShell-*.AppImage + if ($appImage.Count -gt 1) { + throw "Found more than one AppImage package, remove all *.AppImage files and try to create the package again" + } + Rename-Item $appImage.Name $appImage.Name.Replace("-","-$Version-") + } else { + Write-Warning "Ignoring AppImage type for non Ubuntu Trusty platform" + } } - } - 'tar' { - $Arguments = @{ - PackageSourcePath = $Source - Name = $Name - Version = $Version - Force = $Force + 'nupkg' { + $Arguments = @{ + PackageNameSuffix = $NameSuffix + PackageSourcePath = $Source + PackageVersion = $Version + PackageRuntime = $Runtime + PackageConfiguration = $Configuration + Force = $Force + } + + if ($PSCmdlet.ShouldProcess("Create NuPkg Package")) { + New-NugetPackage @Arguments + } } + 'tar' { + $Arguments = @{ + PackageSourcePath = $Source + Name = $Name + Version = $Version + Force = $Force + } - if ($PSCmdlet.ShouldProcess("Create tar.gz Package")) { - New-TarballPackage @Arguments + if ($PSCmdlet.ShouldProcess("Create tar.gz Package")) { + New-TarballPackage @Arguments + } } - } - 'deb' { - $Arguments = @{ - Type = 'deb' - PackageSourcePath = $Source - Name = $Name - Version = $Version - Force = $Force + 'deb' { + $Arguments = @{ + Type = 'deb' + PackageSourcePath = $Source + Name = $Name + Version = $Version + Force = $Force + } + foreach ($Distro in $Script:DebianDistributions) { + $Arguments["Distribution"] = $Distro + if ($PSCmdlet.ShouldProcess("Create DEB Package for $Distro")) { + New-UnixPackage @Arguments + } + } } - foreach ($Distro in $Script:DebianDistributions) { - $Arguments["Distribution"] = $Distro - if ($PSCmdlet.ShouldProcess("Create DEB Package for $Distro")) { + default { + $Arguments = @{ + Type = $_ + PackageSourcePath = $Source + Name = $Name + Version = $Version + Force = $Force + } + + if ($PSCmdlet.ShouldProcess("Create $_ Package")) { New-UnixPackage @Arguments } } } - default { - $Arguments = @{ - Type = $_ - PackageSourcePath = $Source - Name = $Name - Version = $Version - Force = $Force - } - if ($PSCmdlet.ShouldProcess("Create $_ Package")) { - New-UnixPackage @Arguments - } + if($IncludeSymbols.IsPresent) + { + # Source is a temporary folder when -IncludeSymbols is present. So, we should remove it. + Remove-Item -Path $Source -Recurse -Force -ErrorAction SilentlyContinue } } } @@ -318,6 +354,19 @@ function New-TarballPackage { } } +function New-TempFolder +{ + $tempPath = [System.IO.Path]::GetTempPath() + + $tempFolder = Join-Path -Path $tempPath -ChildPath ([System.IO.Path]::GetRandomFileName()) + if(!(Test-Path -Path $tempFolder)) + { + $null = New-Item -Path $tempFolder -ItemType Directory + } + + return $tempFolder +} + function New-UnixPackage { [CmdletBinding(SupportsShouldProcess=$true)] param( From 1f75e81e4cbed052bb23ce60dc1ef8cd72d4ad8a Mon Sep 17 00:00:00 2001 From: Dongbo Wang Date: Mon, 23 Oct 2017 12:33:07 -0700 Subject: [PATCH 034/617] Update docker files and related due to the name change (#5156) --- docker/.gitignore | 2 -- docker/InstallTarballPackage.sh | 4 ++-- docker/community/amazonlinux/Dockerfile | 8 ++++---- docker/community/archlinux/Dockerfile | 8 ++++---- docker/release/centos7/Dockerfile | 8 ++++---- docker/release/fedora25/Dockerfile | 8 ++++---- docker/release/fedora26/Dockerfile | 8 ++++---- docker/release/nanoserver-insider/Dockerfile | 12 ++++++------ docker/release/nanoserver/Dockerfile | 16 ++++++++-------- docker/release/opensuse42.2/Dockerfile | 8 ++++---- docker/release/ubuntu14.04/Dockerfile | 8 ++++---- docker/release/ubuntu16.04/Dockerfile | 8 ++++---- docker/release/windowsservercore/Dockerfile | 16 ++++++++-------- docker/tests/containerTestCommon.psm1 | 2 +- 14 files changed, 57 insertions(+), 59 deletions(-) delete mode 100644 docker/.gitignore diff --git a/docker/.gitignore b/docker/.gitignore deleted file mode 100644 index 9cc0e40f1bb..00000000000 --- a/docker/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -logs/**/*.log -packages/ diff --git a/docker/InstallTarballPackage.sh b/docker/InstallTarballPackage.sh index 90fcc6bbf5b..6b09b787f81 100644 --- a/docker/InstallTarballPackage.sh +++ b/docker/InstallTarballPackage.sh @@ -24,7 +24,7 @@ then usage fi -POWERSHELL_LINKFILE=/usr/bin/powershell +POWERSHELL_LINKFILE=/usr/bin/pwsh # Download the powershell .tar.gz package curl -L -o /tmp/powershell.tar.gz https://github.com/PowerShell/PowerShell/releases/download/v$POWERSHELL_VERSION/$POWERSHELL_PACKAGE @@ -35,7 +35,7 @@ mkdir -p /opt/microsoft/powershell/$POWERSHELL_VERSION tar zxf /tmp/powershell.tar.gz -C /opt/microsoft/powershell/$POWERSHELL_VERSION # Create the symbolic link that points to powershell -ln -s /opt/microsoft/powershell/$POWERSHELL_VERSION/powershell $POWERSHELL_LINKFILE +ln -s /opt/microsoft/powershell/$POWERSHELL_VERSION/pwsh $POWERSHELL_LINKFILE # Add the symbolic link path to /etc/shells if [ ! -f /etc/shells ] ; then echo $POWERSHELL_LINKFILE > /etc/shells ; diff --git a/docker/community/amazonlinux/Dockerfile b/docker/community/amazonlinux/Dockerfile index a18792047a7..02b98e59c76 100644 --- a/docker/community/amazonlinux/Dockerfile +++ b/docker/community/amazonlinux/Dockerfile @@ -16,10 +16,10 @@ LABEL maintainer="PowerShell Team " \ org.label-schema.vendor="PowerShell" \ org.label-schema.version=${POWERSHELL_VERSION} \ org.label-schema.schema-version="1.0" \ - org.label-schema.docker.cmd="docker run ${IMAGE_NAME} powershell -c '$psversiontable'" \ + org.label-schema.docker.cmd="docker run ${IMAGE_NAME} pwsh -c '$psversiontable'" \ org.label-schema.docker.cmd.devel="docker run ${IMAGE_NAME}" \ - org.label-schema.docker.cmd.test="docker run ${IMAGE_NAME} powershell -c Invoke-Pester" \ - org.label-schema.docker.cmd.help="docker run ${IMAGE_NAME} powershell -c Get-Help" + org.label-schema.docker.cmd.test="docker run ${IMAGE_NAME} pwsh -c Invoke-Pester" \ + org.label-schema.docker.cmd.help="docker run ${IMAGE_NAME} pwsh -c Get-Help" # TODO: addd LABEL org.label-schema.vcs-ref=${VCS_REF} @@ -52,4 +52,4 @@ RUN rm -f /InstallTarballPackage.sh # Use PowerShell as the default shell # Use array to avoid Docker prepending /bin/sh -c -CMD [ "powershell" ] +CMD [ "pwsh" ] diff --git a/docker/community/archlinux/Dockerfile b/docker/community/archlinux/Dockerfile index 9fbf0ca532d..2ef0f170a8e 100644 --- a/docker/community/archlinux/Dockerfile +++ b/docker/community/archlinux/Dockerfile @@ -25,12 +25,12 @@ LABEL maintainer="PowerShell Community " \ org.label-schema.name="powershell" \ org.label-schema.vendor="PowerShell" \ org.label-schema.schema-version="1.0" \ - org.label-schema.docker.cmd="docker run ${IMAGE_NAME} powershell -c '$psversiontable'" \ + org.label-schema.docker.cmd="docker run ${IMAGE_NAME} pwsh -c '$psversiontable'" \ org.label-schema.docker.cmd.devel="docker run ${IMAGE_NAME}" \ - org.label-schema.docker.cmd.test="docker run ${IMAGE_NAME} powershell -c Invoke-Pester" \ - org.label-schema.docker.cmd.help="docker run ${IMAGE_NAME} powershell -c Get-Help" + org.label-schema.docker.cmd.test="docker run ${IMAGE_NAME} pwsh -c Invoke-Pester" \ + org.label-schema.docker.cmd.help="docker run ${IMAGE_NAME} pwsh -c Get-Help" COPY --from=build-env /build/powershell-bin/*.xz /powershell-package/ RUN ls /powershell-package/* RUN pacman -Syu --noconfirm libunwind; \ - pacman -U --noconfirm /powershell-package/*.xz \ No newline at end of file + pacman -U --noconfirm /powershell-package/*.xz diff --git a/docker/release/centos7/Dockerfile b/docker/release/centos7/Dockerfile index af6acfb0867..0a5eda16980 100644 --- a/docker/release/centos7/Dockerfile +++ b/docker/release/centos7/Dockerfile @@ -15,10 +15,10 @@ LABEL maintainer="PowerShell Team " \ org.label-schema.vendor="PowerShell" \ org.label-schema.version=${POWERSHELL_VERSION} \ org.label-schema.schema-version="1.0" \ - org.label-schema.docker.cmd="docker run ${IMAGE_NAME} powershell -c '$psversiontable'" \ + org.label-schema.docker.cmd="docker run ${IMAGE_NAME} pwsh -c '$psversiontable'" \ org.label-schema.docker.cmd.devel="docker run ${IMAGE_NAME}" \ - org.label-schema.docker.cmd.test="docker run ${IMAGE_NAME} powershell -c Invoke-Pester" \ - org.label-schema.docker.cmd.help="docker run ${IMAGE_NAME} powershell -c Get-Help" + org.label-schema.docker.cmd.test="docker run ${IMAGE_NAME} pwsh -c Invoke-Pester" \ + org.label-schema.docker.cmd.help="docker run ${IMAGE_NAME} pwsh -c Get-Help" # TODO: addd LABEL org.label-schema.vcs-ref=${VCS_REF} @@ -42,4 +42,4 @@ RUN yum install -y \ # Use PowerShell as the default shell # Use array to avoid Docker prepending /bin/sh -c -CMD [ "powershell" ] +CMD [ "pwsh" ] diff --git a/docker/release/fedora25/Dockerfile b/docker/release/fedora25/Dockerfile index a8010f9c4f9..3a9e0da8865 100644 --- a/docker/release/fedora25/Dockerfile +++ b/docker/release/fedora25/Dockerfile @@ -15,10 +15,10 @@ LABEL maintainer="PowerShell Team " \ org.label-schema.vendor="PowerShell" \ org.label-schema.version=${POWERSHELL_VERSION} \ org.label-schema.schema-version="1.0" \ - org.label-schema.docker.cmd="docker run ${IMAGE_NAME} powershell -c '$psversiontable'" \ + org.label-schema.docker.cmd="docker run ${IMAGE_NAME} pwsh -c '$psversiontable'" \ org.label-schema.docker.cmd.devel="docker run ${IMAGE_NAME}" \ - org.label-schema.docker.cmd.test="docker run ${IMAGE_NAME} powershell -c Invoke-Pester" \ - org.label-schema.docker.cmd.help="docker run ${IMAGE_NAME} powershell -c Get-Help" + org.label-schema.docker.cmd.test="docker run ${IMAGE_NAME} pwsh -c Invoke-Pester" \ + org.label-schema.docker.cmd.help="docker run ${IMAGE_NAME} pwsh -c Get-Help" # TODO: addd LABEL org.label-schema.vcs-ref=${VCS_REF} @@ -40,4 +40,4 @@ RUN curl https://packages.microsoft.com/config/rhel/7/prod.repo | tee /etc/yum.r RUN dnf install -y powershell # Use array to avoid Docker prepending /bin/sh -c -CMD [ "powershell" ] +CMD [ "pwsh" ] diff --git a/docker/release/fedora26/Dockerfile b/docker/release/fedora26/Dockerfile index db57ce3adf6..212fcbbf931 100644 --- a/docker/release/fedora26/Dockerfile +++ b/docker/release/fedora26/Dockerfile @@ -15,10 +15,10 @@ LABEL maintainer="PowerShell Team " \ org.label-schema.vendor="PowerShell" \ org.label-schema.version=${POWERSHELL_VERSION} \ org.label-schema.schema-version="1.0" \ - org.label-schema.docker.cmd="docker run ${IMAGE_NAME} powershell -c '$psversiontable'" \ + org.label-schema.docker.cmd="docker run ${IMAGE_NAME} pwsh -c '$psversiontable'" \ org.label-schema.docker.cmd.devel="docker run ${IMAGE_NAME}" \ - org.label-schema.docker.cmd.test="docker run ${IMAGE_NAME} powershell -c Invoke-Pester" \ - org.label-schema.docker.cmd.help="docker run ${IMAGE_NAME} powershell -c Get-Help" + org.label-schema.docker.cmd.test="docker run ${IMAGE_NAME} pwsh -c Invoke-Pester" \ + org.label-schema.docker.cmd.help="docker run ${IMAGE_NAME} pwsh -c Get-Help" # TODO: addd LABEL org.label-schema.vcs-ref=${VCS_REF} @@ -40,4 +40,4 @@ RUN curl https://packages.microsoft.com/config/rhel/7/prod.repo | tee /etc/yum.r RUN dnf install -y powershell # Use array to avoid Docker prepending /bin/sh -c -CMD [ "powershell" ] +CMD [ "pwsh" ] diff --git a/docker/release/nanoserver-insider/Dockerfile b/docker/release/nanoserver-insider/Dockerfile index 2a20c8b5c8a..b4ca7f8198e 100755 --- a/docker/release/nanoserver-insider/Dockerfile +++ b/docker/release/nanoserver-insider/Dockerfile @@ -37,19 +37,19 @@ LABEL maintainer="PowerShell Team " ` org.label-schema.vendor="PowerShell" ` org.label-schema.version=${PS_VERSION} ` org.label-schema.schema-version="1.0" ` - org.label-schema.docker.cmd="docker run ${IMAGE_NAME} powershell -c '$psversiontable'" ` + org.label-schema.docker.cmd="docker run ${IMAGE_NAME} pwsh -c '$psversiontable'" ` org.label-schema.docker.cmd.devel="docker run ${IMAGE_NAME}" ` - org.label-schema.docker.cmd.test="docker run ${IMAGE_NAME} powershell -c Invoke-Pester" ` - org.label-schema.docker.cmd.help="docker run ${IMAGE_NAME} powershell -c Get-Help" + org.label-schema.docker.cmd.test="docker run ${IMAGE_NAME} pwsh -c Invoke-Pester" ` + org.label-schema.docker.cmd.help="docker run ${IMAGE_NAME} pwsh -c Get-Help" -# Copy Powershell from the installer containter +# Copy Powershell Core from the installer containter ENV ProgramFiles C:\Program Files COPY --from=installer-env ["\\PowerShell\\", "$ProgramFiles\\PowerShell"] # Persist %PSCORE% ENV variable for user convenience -ENV PSCORE="$ProgramFiles\PowerShell\PowerShell.exe" +ENV PSCORE="$ProgramFiles\PowerShell\pwsh.exe" # Set the path RUN setx PATH "%PATH%;%ProgramFiles%\PowerShell" -CMD ["PowerShell.exe"] +CMD ["pwsh.exe"] diff --git a/docker/release/nanoserver/Dockerfile b/docker/release/nanoserver/Dockerfile index 47569baefb5..713d1a4f5df 100644 --- a/docker/release/nanoserver/Dockerfile +++ b/docker/release/nanoserver/Dockerfile @@ -15,10 +15,10 @@ LABEL maintainer="PowerShell Team " ` org.label-schema.vendor="PowerShell" ` org.label-schema.version=${POWERSHELL_VERSION} ` org.label-schema.schema-version="1.0" ` - org.label-schema.docker.cmd="docker run ${IMAGE_NAME} powershell -c '$psversiontable'" ` + org.label-schema.docker.cmd="docker run ${IMAGE_NAME} pwsh -c '$psversiontable'" ` org.label-schema.docker.cmd.devel="docker run ${IMAGE_NAME}" ` - org.label-schema.docker.cmd.test="docker run ${IMAGE_NAME} powershell -c Invoke-Pester" ` - org.label-schema.docker.cmd.help="docker run ${IMAGE_NAME} powershell -c Get-Help" + org.label-schema.docker.cmd.test="docker run ${IMAGE_NAME} pwsh -c Invoke-Pester" ` + org.label-schema.docker.cmd.help="docker run ${IMAGE_NAME} pwsh -c Get-Help" # TODO: addd LABEL org.label-schema.vcs-ref=${VCS_REF} @@ -41,13 +41,13 @@ RUN $ErrorActionPreference='Stop'; ` [System.IO.DirectoryInfo]$PsFolder=New-Item -Path $Env:ProgramFiles\PowerShell -ItemType Directory -Force ; ` Add-Type -AssemblyName System.IO.Compression.ZipFile ; ` [System.IO.Compression.ZipFile]::ExtractToDirectory($ZipFile,$PsFolder) ; ` - if (Get-ChildItem -Path $PsFolder/powershell.exe) { ` + if (Get-ChildItem -Path $PsFolder/pwsh.exe) { ` Remove-Item -Path $ZipFile ; ` New-Item -Type SymbolicLink -Path $PsFolder\ -Name latest -Value $PsFolder ` } else { throw 'Installation failed! See c:\Dockerfile.log' } ; -# Verify New Powershell.exe runs -SHELL ["C:\\Program Files\\PowerShell\\latest\\PowerShell.exe", "-command"] +# Verify New pwsh.exe runs +SHELL ["C:\\Program Files\\PowerShell\\latest\\pwsh.exe", "-command"] RUN Start-Transcript -path C:\Dockerfile.log -append -IncludeInvocationHeader ; ` $ErrorActionPreference='Stop'; ` Write-Output $PSVersionTable ; ` @@ -56,6 +56,6 @@ RUN Start-Transcript -path C:\Dockerfile.log -append -IncludeInvocationHeader ; } ; # Persist %PSCORE% ENV variable for user convenience -ENV PSCORE='"C:\Program Files\PowerShell\latest\PowerShell.exe"' +ENV PSCORE='"C:\Program Files\PowerShell\latest\pwsh.exe"' -CMD ["PowerShell.exe"] +CMD ["pwsh.exe"] diff --git a/docker/release/opensuse42.2/Dockerfile b/docker/release/opensuse42.2/Dockerfile index ded9ba4824b..aed080377b7 100644 --- a/docker/release/opensuse42.2/Dockerfile +++ b/docker/release/opensuse42.2/Dockerfile @@ -16,10 +16,10 @@ LABEL maintainer="PowerShell Team " \ org.label-schema.vendor="PowerShell" \ org.label-schema.version=${POWERSHELL_VERSION} \ org.label-schema.schema-version="1.0" \ - org.label-schema.docker.cmd="docker run ${IMAGE_NAME} powershell -c '$psversiontable'" \ + org.label-schema.docker.cmd="docker run ${IMAGE_NAME} pwsh -c '$psversiontable'" \ org.label-schema.docker.cmd.devel="docker run ${IMAGE_NAME}" \ - org.label-schema.docker.cmd.test="docker run ${IMAGE_NAME} powershell -c Invoke-Pester" \ - org.label-schema.docker.cmd.help="docker run ${IMAGE_NAME} powershell -c Get-Help" + org.label-schema.docker.cmd.test="docker run ${IMAGE_NAME} pwsh -c Invoke-Pester" \ + org.label-schema.docker.cmd.help="docker run ${IMAGE_NAME} pwsh -c Get-Help" # TODO: addd LABEL org.label-schema.vcs-ref=${VCS_REF} @@ -54,4 +54,4 @@ RUN /InstallTarballPackage.sh $POWERSHELL_VERSION $POWERSHELL_PACKAGE # Remove the script RUN rm -f /InstallTarballPackage.sh -CMD [ "powershell" ] +CMD [ "pwsh" ] diff --git a/docker/release/ubuntu14.04/Dockerfile b/docker/release/ubuntu14.04/Dockerfile index bfaedd808b8..4b2ed102754 100644 --- a/docker/release/ubuntu14.04/Dockerfile +++ b/docker/release/ubuntu14.04/Dockerfile @@ -15,10 +15,10 @@ LABEL maintainer="PowerShell Team " \ org.label-schema.vendor="PowerShell" \ org.label-schema.version=${POWERSHELL_VERSION} \ org.label-schema.schema-version="1.0" \ - org.label-schema.docker.cmd="docker run ${IMAGE_NAME} powershell -c '$psversiontable'" \ + org.label-schema.docker.cmd="docker run ${IMAGE_NAME} pwsh -c '$psversiontable'" \ org.label-schema.docker.cmd.devel="docker run ${IMAGE_NAME}" \ - org.label-schema.docker.cmd.test="docker run ${IMAGE_NAME} powershell -c Invoke-Pester" \ - org.label-schema.docker.cmd.help="docker run ${IMAGE_NAME} powershell -c Get-Help" + org.label-schema.docker.cmd.test="docker run ${IMAGE_NAME} pwsh -c Invoke-Pester" \ + org.label-schema.docker.cmd.help="docker run ${IMAGE_NAME} pwsh -c Get-Help" # TODO: addd LABEL org.label-schema.vcs-ref=${VCS_REF} @@ -49,4 +49,4 @@ RUN apt-get update \ # Use PowerShell as the default shell # Use array to avoid Docker prepending /bin/sh -c -CMD [ "powershell" ] +CMD [ "pwsh" ] diff --git a/docker/release/ubuntu16.04/Dockerfile b/docker/release/ubuntu16.04/Dockerfile index 6190970a419..13c132e9be7 100644 --- a/docker/release/ubuntu16.04/Dockerfile +++ b/docker/release/ubuntu16.04/Dockerfile @@ -15,10 +15,10 @@ LABEL maintainer="PowerShell Team " \ org.label-schema.vendor="PowerShell" \ org.label-schema.version=${POWERSHELL_VERSION} \ org.label-schema.schema-version="1.0" \ - org.label-schema.docker.cmd="docker run ${IMAGE_NAME} powershell -c '$psversiontable'" \ + org.label-schema.docker.cmd="docker run ${IMAGE_NAME} pwsh -c '$psversiontable'" \ org.label-schema.docker.cmd.devel="docker run ${IMAGE_NAME}" \ - org.label-schema.docker.cmd.test="docker run ${IMAGE_NAME} powershell -c Invoke-Pester" \ - org.label-schema.docker.cmd.help="docker run ${IMAGE_NAME} powershell -c Get-Help" + org.label-schema.docker.cmd.test="docker run ${IMAGE_NAME} pwsh -c Invoke-Pester" \ + org.label-schema.docker.cmd.help="docker run ${IMAGE_NAME} pwsh -c Get-Help" # TODO: addd LABEL org.label-schema.vcs-ref=${VCS_REF} @@ -50,4 +50,4 @@ RUN apt-get update \ # Use PowerShell as the default shell # Use array to avoid Docker prepending /bin/sh -c -CMD [ "powershell" ] +CMD [ "pwsh" ] diff --git a/docker/release/windowsservercore/Dockerfile b/docker/release/windowsservercore/Dockerfile index c5c19780360..ce4e1663363 100644 --- a/docker/release/windowsservercore/Dockerfile +++ b/docker/release/windowsservercore/Dockerfile @@ -15,10 +15,10 @@ LABEL maintainer="PowerShell Team " ` org.label-schema.vendor="PowerShell" ` org.label-schema.version=${POWERSHELL_VERSION} ` org.label-schema.schema-version="1.0" ` - org.label-schema.docker.cmd="docker run ${IMAGE_NAME} powershell -c '$psversiontable'" ` + org.label-schema.docker.cmd="docker run ${IMAGE_NAME} pwsh -c '$psversiontable'" ` org.label-schema.docker.cmd.devel="docker run ${IMAGE_NAME}" ` - org.label-schema.docker.cmd.test="docker run ${IMAGE_NAME} powershell -c Invoke-Pester" ` - org.label-schema.docker.cmd.help="docker run ${IMAGE_NAME} powershell -c Get-Help" + org.label-schema.docker.cmd.test="docker run ${IMAGE_NAME} pwsh -c Invoke-Pester" ` + org.label-schema.docker.cmd.help="docker run ${IMAGE_NAME} pwsh -c Get-Help" # TODO: addd LABEL org.label-schema.vcs-ref=${VCS_REF} @@ -42,12 +42,12 @@ RUN $ErrorActionPreference='Stop'; ` $log=get-content -Path C:\PowerShell-win-x64.msi.log -Last 10 ; ` if ($log -match 'Installation success or error status: 0') { ` Remove-Item -Path $MsiFile ; ` - $psexe=Get-Item -Path $Env:ProgramFiles\PowerShell\*\powershell.exe ; ` + $psexe=Get-Item -Path $Env:ProgramFiles\PowerShell\*\pwsh.exe ; ` New-Item -Type SymbolicLink -Path $Env:ProgramFiles\PowerShell\ -Name latest -Value $psexe.DirectoryName ` } else { throw 'Installation failed! See c:\PowerShell-win-x64.msi.log' } ; -# Verify New Powershell.exe runs -SHELL ["C:\\Program Files\\PowerShell\\latest\\PowerShell.exe", "-command"] +# Verify New pwsh.exe runs +SHELL ["C:\\Program Files\\PowerShell\\latest\\pwsh.exe", "-command"] RUN Start-Transcript -path C:\Dockerfile.log -append -IncludeInvocationHeader ; ` $ErrorActionPreference='Stop'; ` Write-Output $PSVersionTable ; ` @@ -56,6 +56,6 @@ RUN Start-Transcript -path C:\Dockerfile.log -append -IncludeInvocationHeader ; } ; # Persist %PSCORE% ENV variable for user convenience -ENV PSCORE='"C:\Program Files\PowerShell\latest\PowerShell.exe"' +ENV PSCORE='"C:\Program Files\PowerShell\latest\pwsh.exe"' -CMD ["PowerShell.exe"] +CMD ["pwsh.exe"] diff --git a/docker/tests/containerTestCommon.psm1 b/docker/tests/containerTestCommon.psm1 index 5a548c16d19..5b3971e5cb2 100644 --- a/docker/tests/containerTestCommon.psm1 +++ b/docker/tests/containerTestCommon.psm1 @@ -178,7 +178,7 @@ function Get-ContainerPowerShellVersion } $runParams += $imageTag - $runParams += 'powershell' + $runParams += 'pwsh' $runParams += '-c' $runParams += ('$PSVersionTable.PSVersion.ToString() | out-string | out-file -encoding ascii -FilePath '+$testContext.containerLogPath) From 8051977ef5df563b29f3f7932f22af9dfd3b169a Mon Sep 17 00:00:00 2001 From: Travis Plunk Date: Mon, 23 Oct 2017 13:58:03 -0700 Subject: [PATCH 035/617] Log sending daily web hook. (#5203) Make sure we count xunit tests failures as a CI failure. --- tools/travis.ps1 | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/tools/travis.ps1 b/tools/travis.ps1 index bc438521735..fe665737f62 100644 --- a/tools/travis.ps1 +++ b/tools/travis.ps1 @@ -15,6 +15,7 @@ function Send-DailyWebHook # Varible should be set in Travis-CI.org settings if ($env:WebHookUrl) { + log "Sending DailyWebHook with result '$result'." $webhook = $env:WebHookUrl $Body = @{ @@ -230,6 +231,17 @@ else $result = "FAIL" } + try { + Start-PSxUnit + } + catch { + $result = "FAIL" + if (!$resultError) + { + $resultError = $_ + } + } + if (-not $isPr) { # Run 'CrossGen' for push commit, so that we can generate package. # It won't rebuild powershell, but only CrossGen the already built assemblies. @@ -266,7 +278,7 @@ else write-warning "Could not retrieve $result badge" } else { - Write-Verbose -verbose "Setting status badge to '$result'" + log "Setting status badge to '$result'" Set-DailyBuildBadge -content $svgData } } @@ -286,6 +298,4 @@ else if ( $result -eq "FAIL" ) { Throw $resultError } - - Start-PSxUnit } From d85b9a472c9cff4379a0fe38f665ad0c46f069aa Mon Sep 17 00:00:00 2001 From: Steve Lee Date: Mon, 23 Oct 2017 17:54:28 -0700 Subject: [PATCH 036/617] Put command discovery before scripts for Unix (#5116) * put command discovery before scripts for Unix * remove unnecessary test --- .../engine/CommandPathSearch.cs | 2 +- .../NativeLinuxCommands.Tests.ps1 | 42 ++++++++++++------- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/System.Management.Automation/engine/CommandPathSearch.cs b/src/System.Management.Automation/engine/CommandPathSearch.cs index 4eb175d2a7b..75a27f03b20 100644 --- a/src/System.Management.Automation/engine/CommandPathSearch.cs +++ b/src/System.Management.Automation/engine/CommandPathSearch.cs @@ -65,7 +65,7 @@ internal CommandPathSearch( // Porting note: on non-Windows platforms, we want to always allow just 'commandName' // as an acceptable command name. However, we also want to allow commands to be // called with the .ps1 extension, so that 'script.ps1' can be called by 'script'. - commandPatterns = new[] { commandName + ".ps1", commandName }; + commandPatterns = new[] { commandName, commandName + ".ps1" }; } _postProcessEnumeratedFiles = CheckAgainstAcceptableCommandNames; _acceptableCommandNames = acceptableCommandNames; diff --git a/test/powershell/Language/Scripting/NativeExecution/NativeLinuxCommands.Tests.ps1 b/test/powershell/Language/Scripting/NativeExecution/NativeLinuxCommands.Tests.ps1 index 88d2a78ea6d..a333adb4091 100644 --- a/test/powershell/Language/Scripting/NativeExecution/NativeLinuxCommands.Tests.ps1 +++ b/test/powershell/Language/Scripting/NativeExecution/NativeLinuxCommands.Tests.ps1 @@ -1,39 +1,51 @@ -if ( $IsWindows ) { - $PesterSkipOrPending = @{ Skip = $true } -} -else { - $PesterSkipOrPending = @{} -} Describe "NativeLinuxCommands" -tags "CI" { - It "Should return a type of 'string' for hostname cmdlet" { - $result = hostname - $result | Should Not BeNullOrEmpty - $result | Should BeOfType string + BeforeAll { + $originalDefaultParams = $PSDefaultParameterValues.Clone() + $PSDefaultParameterValues["It:Skip"] = $IsWindows + $originalPath = $env:PATH + $env:PATH += [IO.Path]::PathSeparator + $TestDrive } - It "Should find Application grep" @PesterSkipOrPending { + AfterAll { + $global:PSDefaultParameterValues = $originalDefaultParams + $env:PATH = $originalPath + } + + It "Should find Application grep" { (get-command grep).CommandType | Should Be Application } - It "Should pipe to grep and get result" @PesterSkipOrPending { + It "Should pipe to grep and get result" { "hello world" | grep hello | Should Be "hello world" } - It "Should find Application touch" @PesterSkipOrPending { + It "Should find Application touch" { (get-command touch).CommandType | Should Be Application } - It "Should not redirect standard input if native command is the first command in pipeline (1)" @PesterSkipOrPending { + It "Should not redirect standard input if native command is the first command in pipeline (1)" { df | ForEach-Object -Begin { $out = @() } -Process { $out += $_ } $out.Length -gt 0 | Should Be $true $out[0] -like "Filesystem*Available*" | Should Be $true } - It "Should not redirect standard input if native command is the first command in pipeline (2)" @PesterSkipOrPending { + It "Should not redirect standard input if native command is the first command in pipeline (2)" { $out = df $out.Length -gt 0 | Should Be $true $out[0] -like "Filesystem*Available*" | Should Be $true } + + It "Should find command before script with same name" { + Set-Content "$TestDrive\foo" -Value @" +#!/usr/bin/env bash +echo 'command' +"@ -Encoding Ascii + chmod +x "$TestDrive/foo" + Set-Content "$TestDrive\foo.ps1" -Value @" +'script' +"@ -Encoding Ascii + foo | Should BeExactly 'command' + } } Describe "Scripts with extensions" -tags "CI" { From be700729d689f7998110a38889b7962e890e387d Mon Sep 17 00:00:00 2001 From: "James Truher [MSFT]" Date: Mon, 23 Oct 2017 19:46:27 -0700 Subject: [PATCH 037/617] Unify cmdlets with parameter 'Encoding' to be of type System.Text.Encoding (#5080) This unifies file encoding across the inbox cmdlets to be UTF-8 without a BOM for all platforms. This is a breaking change as cmdlets on windows have a number of different encodings. This supports better interoperability with tradition Linux shells as we are using the same encoding. Validate that files are created with UTF-8 encoding without BOM Update tests to validate Encoding parameter to new type and create new tests for parameter type validation. [Breaking Change] The '-Encoding Byte' has been removed from the filesystem provider cmdlets. A new parameter '-AsByteStream' is now added to indicate that a byte stream is required as input, or output will be a stream of bytes. --- .../commands/utility/CSVCommands.cs | 34 +++- .../FormatAndOutput/format-hex/Format-Hex.cs | 21 ++- .../FormatAndOutput/out-file/Out-File.cs | 32 ++-- .../utility/ImplicitRemotingCommands.cs | 29 ++-- .../commands/utility/MatchString.cs | 34 ++-- .../commands/utility/Send-MailMessage.cs | 62 ++----- .../commands/utility/XmlCommands.cs | 16 +- .../engine/Utils.cs | 82 ++-------- .../engine/hostifaces/MshHostUserInterface.cs | 10 +- .../namespaces/FileSystemProvider.cs | 154 ++++++------------ .../resources/FileSystemProviderStrings.resx | 3 + .../utils/ClrFacade.cs | 18 +- .../utils/EncodingUtils.cs | 106 ++++++++++++ .../utils/PathUtils.cs | 91 +---------- .../Parser/RedirectionOperator.Tests.ps1 | 35 ++-- .../TestGetCommand.Tests.ps1 | 48 +++--- .../Get-Content.Tests.ps1 | 57 ++++--- ...mands.Cmdlets.NoNewlineParameter.Tests.ps1 | 6 +- .../Set-Content.Tests.ps1 | 54 +++--- .../engine/Basic/Encoding.Tests.ps1 | 73 +++++++++ .../engine/Module/NewModuleManifest.Tests.ps1 | 2 +- 21 files changed, 481 insertions(+), 486 deletions(-) create mode 100644 src/System.Management.Automation/utils/EncodingUtils.cs create mode 100644 test/powershell/engine/Basic/Encoding.Tests.ps1 diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/CSVCommands.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/CSVCommands.cs index ca7752da8bc..5e3e247a376 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/CSVCommands.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/CSVCommands.cs @@ -212,8 +212,20 @@ public SwitchParameter NoClobber /// Encoding optional flag ///
    [Parameter()] - [ValidateSetAttribute(new string[] { "Unicode", "UTF7", "UTF8", "ASCII", "UTF32", "BigEndianUnicode", "Default", "OEM" })] - public string Encoding { get; set; } + [ArgumentToEncodingTransformationAttribute()] + [ArgumentCompletions( + EncodingConversion.Ascii, + EncodingConversion.BigEndianUnicode, + EncodingConversion.OEM, + EncodingConversion.Unicode, + EncodingConversion.Utf7, + EncodingConversion.Utf8, + EncodingConversion.Utf8Bom, + EncodingConversion.Utf8NoBom, + EncodingConversion.Utf32 + )] + [ValidateNotNullOrEmpty] + public Encoding Encoding { get; set; } = ClrFacade.GetDefaultEncoding(); /// /// Property that sets append parameter. @@ -373,7 +385,7 @@ private void CreateFileStream() PathUtils.MasterStreamOpen( this, this.Path, - Encoding ?? "ASCII", + Encoding, false, // defaultEncoding Append, Force, @@ -577,8 +589,20 @@ public SwitchParameter UseCulture /// Encoding optional flag /// [Parameter()] - [ValidateSetAttribute(new[] { "Unicode", "UTF7", "UTF8", "ASCII", "UTF32", "BigEndianUnicode", "Default", "OEM" })] - public string Encoding { get; set; } + [ArgumentToEncodingTransformationAttribute()] + [ArgumentCompletions( + EncodingConversion.Ascii, + EncodingConversion.BigEndianUnicode, + EncodingConversion.OEM, + EncodingConversion.Unicode, + EncodingConversion.Utf7, + EncodingConversion.Utf8, + EncodingConversion.Utf8Bom, + EncodingConversion.Utf8NoBom, + EncodingConversion.Utf32 + )] + [ValidateNotNullOrEmpty] + public Encoding Encoding { get; set; } = ClrFacade.GetDefaultEncoding(); /// /// Avoid writing out duplicate warning messages when there are diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/format-hex/Format-Hex.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/format-hex/Format-Hex.cs index b1c65d3f2b1..bc90a9536ba 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/format-hex/Format-Hex.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/format-hex/Format-Hex.cs @@ -46,14 +46,20 @@ public sealed class FormatHex : PSCmdlet /// Type of character encoding for InputObject /// [Parameter(ParameterSetName = "ByInputObject")] - [ValidateSetAttribute(new string[] { - EncodingConversion.Unicode, + [ArgumentToEncodingTransformationAttribute()] + [ArgumentCompletions( + EncodingConversion.Ascii, EncodingConversion.BigEndianUnicode, - EncodingConversion.Utf8, + EncodingConversion.OEM, + EncodingConversion.Unicode, EncodingConversion.Utf7, - EncodingConversion.Utf32, - EncodingConversion.Ascii})] - public string Encoding { get; set; } = "Ascii"; + EncodingConversion.Utf8, + EncodingConversion.Utf8Bom, + EncodingConversion.Utf8NoBom, + EncodingConversion.Utf32 + )] + [ValidateNotNullOrEmpty] + public Encoding Encoding { get; set; } = ClrFacade.GetDefaultEncoding(); /// /// This parameter is no-op @@ -239,8 +245,7 @@ private void ProcessObjectContent(PSObject inputObject) else if (obj is string) { string inputString = obj.ToString(); - Encoding resolvedEncoding = EncodingConversion.Convert(this, Encoding); - inputBytes = resolvedEncoding.GetBytes(inputString); + inputBytes = Encoding.GetBytes(inputString); } else if (obj is byte) diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/out-file/Out-File.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/out-file/Out-File.cs index b8fd1cc09b6..d7c0d43c58c 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/out-file/Out-File.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/out-file/Out-File.cs @@ -3,6 +3,7 @@ --********************************************************************/ using System; +using System.Text; using System.Management.Automation; using System.Management.Automation.Internal; using System.Management.Automation.Host; @@ -72,25 +73,20 @@ public string LiteralPath /// /// [Parameter(Position = 1)] - [ValidateNotNullOrEmpty] - [ValidateSetAttribute(new string[] { - EncodingConversion.Unknown, - EncodingConversion.String, - EncodingConversion.Unicode, + [ArgumentToEncodingTransformationAttribute()] + [ArgumentCompletions( + EncodingConversion.Ascii, EncodingConversion.BigEndianUnicode, - EncodingConversion.Utf8, + EncodingConversion.OEM, + EncodingConversion.Unicode, EncodingConversion.Utf7, - EncodingConversion.Utf32, - EncodingConversion.Ascii, - EncodingConversion.Default, - EncodingConversion.OEM })] - public string Encoding - { - get { return _encoding; } - set { _encoding = value; } - } - - private string _encoding; + EncodingConversion.Utf8, + EncodingConversion.Utf8Bom, + EncodingConversion.Utf8NoBom, + EncodingConversion.Utf32 + )] + [ValidateNotNullOrEmpty] + public Encoding Encoding { get; set; } = ClrFacade.GetDefaultEncoding(); /// /// Property that sets append parameter. @@ -196,7 +192,7 @@ private LineOutput InstantiateLineOutputInterface() PathUtils.MasterStreamOpen( this, FilePath, - _encoding, + Encoding, false, // defaultEncoding Append, Force, diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ImplicitRemotingCommands.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ImplicitRemotingCommands.cs index e694403c6b8..7cd0138844e 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ImplicitRemotingCommands.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ImplicitRemotingCommands.cs @@ -77,19 +77,20 @@ public SwitchParameter Force /// Encoding optional flag /// [Parameter] - [ValidateSetAttribute(new string[] { "Unicode", "UTF7", "UTF8", "ASCII", "UTF32", "BigEndianUnicode", "Default", "OEM" })] - public string Encoding - { - get - { - return _encoding.GetType().Name; - } - set - { - _encoding = EncodingConversion.Convert(this, value); - } - } - private Encoding _encoding = System.Text.Encoding.UTF8; + [ArgumentToEncodingTransformationAttribute()] + [ArgumentCompletions( + EncodingConversion.Ascii, + EncodingConversion.BigEndianUnicode, + EncodingConversion.OEM, + EncodingConversion.Unicode, + EncodingConversion.Utf7, + EncodingConversion.Utf8, + EncodingConversion.Utf8Bom, + EncodingConversion.Utf8NoBom, + EncodingConversion.Utf32 + )] + [ValidateNotNullOrEmpty] + public Encoding Encoding { get; set; } = ClrFacade.GetDefaultEncoding(); #endregion Parameters @@ -144,7 +145,7 @@ protected override void BeginProcessing() List generatedFiles = GenerateProxyModule( tempDirectory, Path.GetFileName(directory.FullName), - _encoding, + Encoding, _force, listOfCommandMetadata, alias2resolvedCommandName, diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/MatchString.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/MatchString.cs index deaa37323db..e6bcadf02bf 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/MatchString.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/MatchString.cs @@ -3,6 +3,7 @@ --********************************************************************/ using System; +using System.Text; using System.Text.RegularExpressions; using System.IO; using System.Collections; @@ -1201,19 +1202,20 @@ public SwitchParameter AllMatches /// The text encoding to process each file as. ///
    [Parameter] - [ValidateNotNullOrEmpty] - [ValidateSetAttribute(new string[] { + [ArgumentToEncodingTransformationAttribute()] + [ArgumentCompletions( + EncodingConversion.Ascii, + EncodingConversion.BigEndianUnicode, + EncodingConversion.OEM, EncodingConversion.Unicode, EncodingConversion.Utf7, EncodingConversion.Utf8, - EncodingConversion.Utf32, - EncodingConversion.Ascii, - EncodingConversion.BigEndianUnicode, - EncodingConversion.Default, - EncodingConversion.OEM })] - public string Encoding { get; set; } - - private System.Text.Encoding _textEncoding; + EncodingConversion.Utf8Bom, + EncodingConversion.Utf8NoBom, + EncodingConversion.Utf32 + )] + [ValidateNotNullOrEmpty] + public Encoding Encoding { get; set; } = ClrFacade.GetDefaultEncoding(); /// /// The number of context lines to collect. If set to a @@ -1282,16 +1284,6 @@ public SwitchParameter AllMatches /// protected override void BeginProcessing() { - // Process encoding switch. - if (Encoding != null) - { - _textEncoding = EncodingConversion.Convert(this, Encoding); - } - else - { - _textEncoding = new System.Text.UTF8Encoding(); - } - if (!_simpleMatch) { RegexOptions regexOptions = (_caseSensitive) ? RegexOptions.None : RegexOptions.IgnoreCase; @@ -1434,7 +1426,7 @@ private bool ProcessFile(string filename) using (FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { - using (StreamReader sr = new StreamReader(fs, _textEncoding)) + using (StreamReader sr = new StreamReader(fs, Encoding)) { String line; int lineNo = 0; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Send-MailMessage.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Send-MailMessage.cs index b2667207242..58328c56b35 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Send-MailMessage.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Send-MailMessage.cs @@ -89,20 +89,24 @@ public SwitchParameter BodyAsHtml /// /// Specifies the encoding used for the content of the body and also the subject. + /// This is set to ASCII to ensure there are no problems with any email server /// [Parameter()] [Alias("BE")] [ValidateNotNullOrEmpty] - [ArgumentToEncodingNameTransformationAttribute()] - public Encoding Encoding - { - get { return _encoding; } - set - { - _encoding = value; - } - } - private Encoding _encoding = new ASCIIEncoding(); + [ArgumentCompletions( + EncodingConversion.Ascii, + EncodingConversion.BigEndianUnicode, + EncodingConversion.OEM, + EncodingConversion.Unicode, + EncodingConversion.Utf7, + EncodingConversion.Utf8, + EncodingConversion.Utf8Bom, + EncodingConversion.Utf8NoBom, + EncodingConversion.Utf32 + )] + [ArgumentToEncodingTransformationAttribute()] + public Encoding Encoding { get; set; } = Encoding.ASCII; /// /// Specifies the address collection that contains the @@ -369,8 +373,8 @@ protected override _mMailMessage.Body = _body; //set the subject and body encoding - _mMailMessage.SubjectEncoding = _encoding; - _mMailMessage.BodyEncoding = _encoding; + _mMailMessage.SubjectEncoding = Encoding; + _mMailMessage.BodyEncoding = Encoding; // Set the format of the mail message body as HTML _mMailMessage.IsBodyHtml = _bodyashtml; @@ -490,37 +494,5 @@ protected override void EndProcessing() #endregion } - /// - /// To make it easier to specify -Encoding parameter, we add an ArgumentTransformationAttribute here. - /// When the input data is of type string and is valid to be converted to System.Text.Encoding, we do - /// the conversion and return the converted value. Otherwise, we just return the input data. - /// - internal sealed class ArgumentToEncodingNameTransformationAttribute : ArgumentTransformationAttribute - { - public override object Transform(EngineIntrinsics engineIntrinsics, object inputData) - { - string encodingName; - if (LanguagePrimitives.TryConvertTo(inputData, out encodingName)) - { - if (string.Equals(encodingName, EncodingConversion.Unknown, StringComparison.OrdinalIgnoreCase) || - string.Equals(encodingName, EncodingConversion.String, StringComparison.OrdinalIgnoreCase) || - string.Equals(encodingName, EncodingConversion.Unicode, StringComparison.OrdinalIgnoreCase) || - string.Equals(encodingName, EncodingConversion.BigEndianUnicode, StringComparison.OrdinalIgnoreCase) || - string.Equals(encodingName, EncodingConversion.Utf8, StringComparison.OrdinalIgnoreCase) || - string.Equals(encodingName, EncodingConversion.Utf7, StringComparison.OrdinalIgnoreCase) || - string.Equals(encodingName, EncodingConversion.Utf32, StringComparison.OrdinalIgnoreCase) || - string.Equals(encodingName, EncodingConversion.Ascii, StringComparison.OrdinalIgnoreCase) || - string.Equals(encodingName, EncodingConversion.Default, StringComparison.OrdinalIgnoreCase) || - string.Equals(encodingName, EncodingConversion.OEM, StringComparison.OrdinalIgnoreCase)) - { - // the encodingName is guaranteed to be valid, so it is safe to pass null to method - // Convert(Cmdlet cmdlet, string encoding) as the value of 'cmdlet'. - return EncodingConversion.Convert(null, encodingName); - } - } - return inputData; - } - } - #endregion -} \ No newline at end of file +} diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/XmlCommands.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/XmlCommands.cs index 50edf754d29..4f87989f169 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/XmlCommands.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/XmlCommands.cs @@ -108,8 +108,20 @@ public SwitchParameter NoClobber /// /// [Parameter] - [ValidateSetAttribute(new string[] { "Unicode", "UTF7", "UTF8", "ASCII", "UTF32", "BigEndianUnicode", "Default", "OEM" })] - public string Encoding { get; set; } = "Unicode"; + [ArgumentToEncodingTransformationAttribute()] + [ArgumentCompletions( + EncodingConversion.Ascii, + EncodingConversion.BigEndianUnicode, + EncodingConversion.OEM, + EncodingConversion.Unicode, + EncodingConversion.Utf7, + EncodingConversion.Utf8, + EncodingConversion.Utf8Bom, + EncodingConversion.Utf8NoBom, + EncodingConversion.Utf32 + )] + [ValidateNotNullOrEmpty] + public Encoding Encoding { get; set; } = ClrFacade.GetDefaultEncoding(); #endregion Command Line Parameters diff --git a/src/System.Management.Automation/engine/Utils.cs b/src/System.Management.Automation/engine/Utils.cs index dc50286acf9..f6b6449c9d8 100644 --- a/src/System.Management.Automation/engine/Utils.cs +++ b/src/System.Management.Automation/engine/Utils.cs @@ -1147,11 +1147,12 @@ internal static bool Succeeded(int hresult) return hresult >= 0; } - internal static FileSystemCmdletProviderEncoding GetEncoding(string path) + // Attempt to determine the existing encoding + internal static Encoding GetEncoding(string path) { if (!File.Exists(path)) { - return FileSystemCmdletProviderEncoding.Default; + return ClrFacade.GetDefaultEncoding(); } byte[] initialBytes = new byte[100]; @@ -1169,12 +1170,12 @@ internal static FileSystemCmdletProviderEncoding GetEncoding(string path) } catch (IOException) { - return FileSystemCmdletProviderEncoding.Default; + return ClrFacade.GetDefaultEncoding(); } // Test for four-byte preambles string preamble = null; - FileSystemCmdletProviderEncoding foundEncoding = FileSystemCmdletProviderEncoding.Default; + Encoding foundEncoding = ClrFacade.GetDefaultEncoding(); if (bytesRead > 3) { @@ -1210,77 +1211,26 @@ internal static FileSystemCmdletProviderEncoding GetEncoding(string path) string initialBytesAsAscii = System.Text.Encoding.ASCII.GetString(initialBytes, 0, bytesRead); if (initialBytesAsAscii.IndexOfAny(nonPrintableCharacters) >= 0) { - return FileSystemCmdletProviderEncoding.Byte; + return Encoding.Unicode; } - return FileSystemCmdletProviderEncoding.Ascii; + return Encoding.ASCII; } - internal static Encoding GetEncodingFromEnum(FileSystemCmdletProviderEncoding encoding) - { - // Default to unicode encoding - Encoding result = Encoding.Unicode; - - switch (encoding) - { - case FileSystemCmdletProviderEncoding.String: - result = Encoding.Unicode; - break; - - case FileSystemCmdletProviderEncoding.Unicode: - result = Encoding.Unicode; - break; - - case FileSystemCmdletProviderEncoding.BigEndianUnicode: - result = Encoding.BigEndianUnicode; - break; - - case FileSystemCmdletProviderEncoding.UTF8: - result = Encoding.UTF8; - break; - - case FileSystemCmdletProviderEncoding.UTF7: - result = Encoding.UTF7; - break; - - case FileSystemCmdletProviderEncoding.UTF32: - result = Encoding.UTF32; - break; - - case FileSystemCmdletProviderEncoding.BigEndianUTF32: - result = Encoding.BigEndianUnicode; - break; - - case FileSystemCmdletProviderEncoding.Ascii: - result = Encoding.ASCII; - break; - - case FileSystemCmdletProviderEncoding.Default: - result = ClrFacade.GetDefaultEncoding(); - break; - - case FileSystemCmdletProviderEncoding.Oem: - result = ClrFacade.GetOEMEncoding(); - break; - - default: - break; - } - - return result; - } // GetEncodingFromEnum + // BigEndianUTF32 encoding is possible, but requires creation + internal static Encoding BigEndianUTF32Encoding = new UTF32Encoding(bigEndian: true, byteOrderMark: true); // [System.Text.Encoding]::GetEncodings() | Where-Object { $_.GetEncoding().GetPreamble() } | // Add-Member ScriptProperty Preamble { $this.GetEncoding().GetPreamble() -join "-" } -PassThru | // Format-Table -Auto - internal static Dictionary encodingMap = - new Dictionary() + internal static Dictionary encodingMap = + new Dictionary() { - { "255-254", FileSystemCmdletProviderEncoding.Unicode }, - { "254-255", FileSystemCmdletProviderEncoding.BigEndianUnicode }, - { "255-254-0-0", FileSystemCmdletProviderEncoding.UTF32 }, - { "0-0-254-255", FileSystemCmdletProviderEncoding.BigEndianUTF32 }, - { "239-187-191", FileSystemCmdletProviderEncoding.UTF8 }, + { "255-254", Encoding.Unicode }, + { "254-255", Encoding.BigEndianUnicode }, + { "255-254-0-0", Encoding.UTF32 }, + { "0-0-254-255", BigEndianUTF32Encoding }, + { "239-187-191", Encoding.UTF8 }, }; internal static char[] nonPrintableCharacters = { diff --git a/src/System.Management.Automation/engine/hostifaces/MshHostUserInterface.cs b/src/System.Management.Automation/engine/hostifaces/MshHostUserInterface.cs index d3cf16bc0a8..6d64065a5bd 100644 --- a/src/System.Management.Automation/engine/hostifaces/MshHostUserInterface.cs +++ b/src/System.Management.Automation/engine/hostifaces/MshHostUserInterface.cs @@ -1068,14 +1068,8 @@ internal string Path set { _path = value; - - Encoding = Encoding.UTF8; - FileSystemCmdletProviderEncoding fileEncoding = Utils.GetEncoding(value); - - if (fileEncoding != FileSystemCmdletProviderEncoding.Default) - { - Encoding = Utils.GetEncodingFromEnum(fileEncoding); - } + // Get the encoding from the file, or default (UTF8-NoBom) + Encoding = Utils.GetEncoding(value); } } private string _path; diff --git a/src/System.Management.Automation/namespaces/FileSystemProvider.cs b/src/System.Management.Automation/namespaces/FileSystemProvider.cs index 172e8849570..d08125db5c2 100644 --- a/src/System.Management.Automation/namespaces/FileSystemProvider.cs +++ b/src/System.Management.Automation/namespaces/FileSystemProvider.cs @@ -6614,12 +6614,17 @@ public IContentReader GetContentReader(string path) delimiter = dynParams.Delimiter; // Get the stream type - usingByteEncoding = dynParams.UsingByteEncoding; + usingByteEncoding = dynParams.AsByteStream; streamTypeSpecified = dynParams.WasStreamTypeSpecified; + if (usingByteEncoding && streamTypeSpecified) + { + WriteWarning(FileSystemProviderStrings.EncodingNotUsed); + } + if (streamTypeSpecified) { - encoding = dynParams.EncodingType; + encoding = dynParams.Encoding; } // Get the wait value @@ -6765,12 +6770,17 @@ public IContentWriter GetContentWriter(string path) if (dynParams != null) { - usingByteEncoding = dynParams.UsingByteEncoding; + usingByteEncoding = dynParams.AsByteStream; streamTypeSpecified = dynParams.WasStreamTypeSpecified; + if (usingByteEncoding && streamTypeSpecified) + { + WriteWarning(FileSystemProviderStrings.EncodingNotUsed); + } + if (streamTypeSpecified) { - encoding = dynParams.EncodingType; + encoding = dynParams.Encoding; } #if !UNIX @@ -7477,73 +7487,6 @@ public static Hashtable Invoke(System.Management.Automation.PowerShell ps, FileS } } - /// - /// Defines the values that can be supplied as the encoding parameter in the - /// FileSystemContentDynamicParametersBase class. - /// - public enum FileSystemCmdletProviderEncoding - { - /// - /// No encoding. - /// - Unknown, - - /// - /// Unicode encoding. - /// - String, - - /// - /// Unicode encoding. - /// - Unicode, - - /// - /// Byte encoding. - /// - Byte, - - /// - /// Big Endian Unicode encoding. - /// - BigEndianUnicode, - - /// - /// UTF8 encoding. - /// - UTF8, - - /// - /// UTF7 encoding. - /// - UTF7, - - /// - /// UTF32 encoding. - /// - UTF32, - - /// - /// ASCII encoding. - /// - Ascii, - - /// - /// Default encoding. - /// - Default, - - /// - /// OEM encoding. - /// - Oem, - - /// - /// Big Endian UTF32 encoding. - /// - BigEndianUTF32, - } // FileSystemCmdletProviderEncoding - #endregion #region Dynamic Parameters @@ -7647,7 +7590,39 @@ public class FileSystemContentDynamicParametersBase /// reading data from the file. ///
    [Parameter] - public FileSystemCmdletProviderEncoding Encoding { get; set; } = FileSystemCmdletProviderEncoding.String; + [ArgumentToEncodingTransformationAttribute()] + [ArgumentCompletions( + EncodingConversion.Ascii, + EncodingConversion.BigEndianUnicode, + EncodingConversion.OEM, + EncodingConversion.Unicode, + EncodingConversion.Utf7, + EncodingConversion.Utf8, + EncodingConversion.Utf8Bom, + EncodingConversion.Utf8NoBom, + EncodingConversion.Utf32 + )] + [ValidateNotNullOrEmpty] + public Encoding Encoding + { + get + { + return _encoding; + } + set + { + _encoding = value; + // If an encoding was explicitly set, be sure to capture that. + WasStreamTypeSpecified = true; + } + } + private Encoding _encoding = ClrFacade.GetDefaultEncoding(); + + /// + /// Return file contents as a byte stream or create file from a series of bytes + /// + [Parameter] + public SwitchParameter AsByteStream { get; set; } #if !UNIX /// @@ -7657,40 +7632,11 @@ public class FileSystemContentDynamicParametersBase public String Stream { get; set; } #endif - /// - /// Gets the encoding from the specified StreamType parameter. - /// - public Encoding EncodingType - { - get - { - return Utils.GetEncodingFromEnum(Encoding); - } - } // EncodingType - - /// - /// Gets the Byte Encoding status of the StreamType parameter. Returns true - /// if the stream was opened with "Byte" encoding, false otherwise. - /// - public bool UsingByteEncoding - { - get - { - return Encoding == FileSystemCmdletProviderEncoding.Byte; - } // get - } // UsingByteEncoding - /// /// Gets the status of the StreamType parameter. Returns true /// if the stream was opened with a user-specified encoding, false otherwise. /// - public bool WasStreamTypeSpecified - { - get - { - return (Encoding != FileSystemCmdletProviderEncoding.String); - } // get - } // WasStreamTypeSpecified + public bool WasStreamTypeSpecified { get; private set; } } // class FileSystemContentDynamicParametersBase @@ -7748,13 +7694,13 @@ public string Delimiter get { return _delimiter; - } // get + } set { DelimiterSpecified = true; _delimiter = value; - } // set + } } private string _delimiter = "\n"; diff --git a/src/System.Management.Automation/resources/FileSystemProviderStrings.resx b/src/System.Management.Automation/resources/FileSystemProviderStrings.resx index 696fefc7380..36894977dca 100644 --- a/src/System.Management.Automation/resources/FileSystemProviderStrings.resx +++ b/src/System.Management.Automation/resources/FileSystemProviderStrings.resx @@ -243,6 +243,9 @@ Cannot process path '{0}' because the target represents a reserved device name. + + Encoding not used when '-AsByteStream' specified. + Cannot proceed with byte encoding. When using byte encoding the content must be of type byte. diff --git a/src/System.Management.Automation/utils/ClrFacade.cs b/src/System.Management.Automation/utils/ClrFacade.cs index 03c4b252c88..f8eafa3622e 100644 --- a/src/System.Management.Automation/utils/ClrFacade.cs +++ b/src/System.Management.Automation/utils/ClrFacade.cs @@ -93,14 +93,9 @@ internal static Encoding GetDefaultEncoding() { if (s_defaultEncoding == null) { -#if UNIX // PowerShell Core on Unix - s_defaultEncoding = new UTF8Encoding(false); -#else // PowerShell Core on Windows + // load all available encodings EncodingRegisterProvider(); - - uint currentAnsiCp = NativeMethods.GetACP(); - s_defaultEncoding = Encoding.GetEncoding((int)currentAnsiCp); -#endif + s_defaultEncoding = new UTF8Encoding(false); } return s_defaultEncoding; } @@ -109,16 +104,17 @@ internal static Encoding GetDefaultEncoding() /// /// Facade for getting OEM encoding + /// OEM encodings work on all platforms, or rather codepage 437 is available on both Windows and Non-Windows /// internal static Encoding GetOEMEncoding() { if (s_oemEncoding == null) { -#if UNIX // PowerShell Core on Unix - s_oemEncoding = GetDefaultEncoding(); -#else // PowerShell Core on Windows + // load all available encodings EncodingRegisterProvider(); - +#if UNIX + s_oemEncoding = new UTF8Encoding(false); +#else uint oemCp = NativeMethods.GetOEMCP(); s_oemEncoding = Encoding.GetEncoding((int)oemCp); #endif diff --git a/src/System.Management.Automation/utils/EncodingUtils.cs b/src/System.Management.Automation/utils/EncodingUtils.cs new file mode 100644 index 00000000000..e98ef8968a1 --- /dev/null +++ b/src/System.Management.Automation/utils/EncodingUtils.cs @@ -0,0 +1,106 @@ +/********************************************************************++ +Copyright (c) Microsoft Corporation. All rights reserved. +--********************************************************************/ + +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Text; + +using System.Management.Automation.Internal; + +namespace System.Management.Automation +{ + + internal static class EncodingConversion + { + internal const string Unknown = "unknown"; + internal const string String = "string"; + internal const string Unicode = "unicode"; + internal const string BigEndianUnicode = "bigendianunicode"; + internal const string Ascii = "ascii"; + internal const string Utf8 = "utf8"; + internal const string Utf8NoBom = "utf8NoBOM"; + internal const string Utf8Bom = "utf8BOM"; + internal const string Utf7 = "utf7"; + internal const string Utf32 = "utf32"; + internal const string Default = "default"; + internal const string OEM = "oem"; + internal static readonly string[] TabCompletionResults = { + Ascii, BigEndianUnicode, OEM, Unicode, Utf7, Utf8, Utf8Bom, Utf8NoBom, Utf32 + }; + + internal static Dictionary encodingMap = new Dictionary(StringComparer.OrdinalIgnoreCase) + { + { Ascii, System.Text.Encoding.ASCII }, + { BigEndianUnicode, System.Text.Encoding.BigEndianUnicode }, + { Default, ClrFacade.GetDefaultEncoding() }, + { OEM, ClrFacade.GetOEMEncoding() }, + { Unicode, System.Text.Encoding.Unicode }, + { Utf7, System.Text.Encoding.UTF7 }, + { Utf8, ClrFacade.GetDefaultEncoding() }, + { Utf8Bom, System.Text.Encoding.UTF8 }, + { Utf8NoBom, ClrFacade.GetDefaultEncoding() }, + { Utf32, System.Text.Encoding.UTF32 }, + { String, System.Text.Encoding.Unicode }, + { Unknown, System.Text.Encoding.Unicode }, + }; + + /// + /// retrieve the encoding parameter from the command line + /// it throws if the encoding does not match the known ones + /// + /// a System.Text.Encoding object (null if no encoding specified) + internal static Encoding Convert(Cmdlet cmdlet, string encoding) + { + if (string.IsNullOrEmpty(encoding)) + { + // no parameter passed, default to UTF8 + return ClrFacade.GetDefaultEncoding(); + } + + Encoding foundEncoding; + if (encodingMap.TryGetValue(encoding, out foundEncoding)) + { + return foundEncoding; + } + + // error condition: unknown encoding value + string validEncodingValues = string.Join(", ", TabCompletionResults); + string msg = StringUtil.Format(PathUtilsStrings.OutFile_WriteToFileEncodingUnknown, encoding, validEncodingValues); + + ErrorRecord errorRecord = new ErrorRecord( + PSTraceSource.NewArgumentException("Encoding"), + "WriteToFileEncodingUnknown", + ErrorCategory.InvalidArgument, + null); + + errorRecord.ErrorDetails = new ErrorDetails(msg); + cmdlet.ThrowTerminatingError(errorRecord); + + return null; + } + + } + + /// + /// To make it easier to specify -Encoding parameter, we add an ArgumentTransformationAttribute here. + /// When the input data is of type string and is valid to be converted to System.Text.Encoding, we do + /// the conversion and return the converted value. Otherwise, we just return the input data. + /// + internal sealed class ArgumentToEncodingTransformationAttribute : ArgumentTransformationAttribute + { + public override object Transform(EngineIntrinsics engineIntrinsics, object inputData) + { + string encodingName = inputData as String; + Encoding foundEncoding; + if (encodingName != null && EncodingConversion.encodingMap.TryGetValue(encodingName, out foundEncoding)) + { + return foundEncoding; + } + return inputData; + } + + } + +} diff --git a/src/System.Management.Automation/utils/PathUtils.cs b/src/System.Management.Automation/utils/PathUtils.cs index 632938e40e7..62ffc54faea 100644 --- a/src/System.Management.Automation/utils/PathUtils.cs +++ b/src/System.Management.Automation/utils/PathUtils.cs @@ -188,17 +188,10 @@ internal static void ReportFileOpenFailure(Cmdlet cmdlet, string filePath, Excep cmdlet.ThrowTerminatingError(errorRecord); } - internal static StreamReader OpenStreamReader(PSCmdlet command, string filePath, string encoding, bool isLiteralPath) + internal static StreamReader OpenStreamReader(PSCmdlet command, string filePath, Encoding encoding, bool isLiteralPath) { FileStream fileStream = OpenFileStream(filePath, command, isLiteralPath); - if (encoding == null) - { - return new StreamReader(fileStream); - } - else - { - return new StreamReader(fileStream, EncodingConversion.Convert(command, encoding)); - } + return new StreamReader(fileStream, encoding); } internal static FileStream OpenFileStream(string filePath, PSCmdlet command, bool isLiteralPath) @@ -436,84 +429,4 @@ internal static DirectoryInfo CreateTemporaryDirectory() return new DirectoryInfo(moduleDirectory.FullName); } } - - internal static class EncodingConversion - { - internal const string Unknown = "unknown"; - internal const string String = "string"; - internal const string Unicode = "unicode"; - internal const string BigEndianUnicode = "bigendianunicode"; - internal const string Ascii = "ascii"; - internal const string Utf8 = "utf8"; - internal const string Utf7 = "utf7"; - internal const string Utf32 = "utf32"; - internal const string Default = "default"; - internal const string OEM = "oem"; - - /// - /// retrieve the encoding parameter from the command line - /// it throws if the encoding does not match the known ones - /// - /// a System.Text.Encoding object (null if no encoding specified) - internal static Encoding Convert(Cmdlet cmdlet, string encoding) - { - if (string.IsNullOrEmpty(encoding)) - { - // no parameter passed, default to Unicode (OS preferred) - return System.Text.Encoding.Unicode; - } - - // Default to unicode (this matches Get-Content) - if (string.Equals(encoding, Unknown, StringComparison.OrdinalIgnoreCase)) - return System.Text.Encoding.Unicode; - - if (string.Equals(encoding, String, StringComparison.OrdinalIgnoreCase)) - return System.Text.Encoding.Unicode; - - // these are the encodings the CLR supports - if (string.Equals(encoding, Unicode, StringComparison.OrdinalIgnoreCase)) - return System.Text.Encoding.Unicode; - - if (string.Equals(encoding, BigEndianUnicode, StringComparison.OrdinalIgnoreCase)) - return System.Text.Encoding.BigEndianUnicode; - - if (string.Equals(encoding, Utf8, StringComparison.OrdinalIgnoreCase)) - return System.Text.Encoding.UTF8; - - if (string.Equals(encoding, Ascii, StringComparison.OrdinalIgnoreCase)) - return System.Text.Encoding.ASCII; - - if (string.Equals(encoding, Utf7, StringComparison.OrdinalIgnoreCase)) - return System.Text.Encoding.UTF7; - - if (string.Equals(encoding, Utf32, StringComparison.OrdinalIgnoreCase)) - return System.Text.Encoding.UTF32; - - if (string.Equals(encoding, Default, StringComparison.OrdinalIgnoreCase)) - return ClrFacade.GetDefaultEncoding(); - - if (string.Equals(encoding, OEM, StringComparison.OrdinalIgnoreCase)) - { - return ClrFacade.GetOEMEncoding(); - } - - // error condition: unknown encoding value - string validEncodingValues = string.Join( - ", ", - new string[] { Unknown, String, Unicode, BigEndianUnicode, Ascii, Utf8, Utf7, Utf32, Default, OEM }); - string msg = StringUtil.Format(PathUtilsStrings.OutFile_WriteToFileEncodingUnknown, - encoding, validEncodingValues); - - ErrorRecord errorRecord = new ErrorRecord( - PSTraceSource.NewArgumentException("Encoding"), - "WriteToFileEncodingUnknown", - ErrorCategory.InvalidArgument, - null); - - errorRecord.ErrorDetails = new ErrorDetails(msg); - cmdlet.ThrowTerminatingError(errorRecord); - - return null; - } - } } diff --git a/test/powershell/Language/Parser/RedirectionOperator.Tests.ps1 b/test/powershell/Language/Parser/RedirectionOperator.Tests.ps1 index e4e5fc7efcb..0b7d9a7f9e0 100644 --- a/test/powershell/Language/Parser/RedirectionOperator.Tests.ps1 +++ b/test/powershell/Language/Parser/RedirectionOperator.Tests.ps1 @@ -10,7 +10,7 @@ Describe "Redirection operator now supports encoding changes" -Tags "CI" { } - # If out-file -encoding happens to have a default, be sure to + # If Out-File -Encoding happens to have a default, be sure to # save it away $SavedValue = $null $oldDefaultParameterValues = $psDefaultParameterValues.Clone() @@ -22,21 +22,22 @@ Describe "Redirection operator now supports encoding changes" -Tags "CI" { } BeforeEach { # start each test with a clean plate! - $psdefaultParameterValues.Remove("out-file:encoding") + $psdefaultParameterValues.Remove("Out-File:Encoding") } AfterEach { # end each test with a clean plate! - $psdefaultParameterValues.Remove("out-file:encoding") + $psdefaultParameterValues.Remove("Out-File:Encoding") } - It "If encoding is unset, redirection should be Unicode" { + It "If encoding is unset, redirection should be UTF8 without bom" { $asciiString > TESTDRIVE:\file.txt - $bytes = get-content -encoding byte TESTDRIVE:\file.txt - # create the expected - $BOM = [text.encoding]::unicode.GetPreamble() - $TXT = [text.encoding]::unicode.GetBytes($asciiString) - $CR = [text.encoding]::unicode.GetBytes($asciiCR) - $expectedBytes = .{ $BOM; $TXT; $CR } + $bytes = Get-Content -AsByteStream TESTDRIVE:\file.txt + # create the expected - utf8 encoding without a bom + $encoding = [Text.UTF8Encoding]::new($false) + # we know that there will be no preamble, so don't provide any bytes + $TXT = $encoding.GetBytes($asciiString) + $CR = $encoding.GetBytes($asciiCR) + $expectedBytes = .{ $TXT; $CR } $bytes.Count | should be $expectedBytes.count for($i = 0; $i -lt $bytes.count; $i++) { $bytes[$i] | Should be $expectedBytes[$i] @@ -44,7 +45,7 @@ Describe "Redirection operator now supports encoding changes" -Tags "CI" { } # $availableEncodings = "unknown","string","unicode","bigendianunicode","utf8","utf7", "utf32","ascii","default","oem" - $availableEncodings = (get-command out-file).Parameters["Encoding"].Attributes.ValidValues + $availableEncodings = (Get-Command Out-File).Parameters["Encoding"].Attributes.ValidValues foreach($encoding in $availableEncodings) { $skipTest = $false @@ -56,21 +57,21 @@ Describe "Redirection operator now supports encoding changes" -Tags "CI" { $skipTest = $true } - # some of the encodings accepted by out-file aren't real, - # and out-file has its own translation, so we'll + # some of the encodings accepted by Out-File aren't real, + # and Out-File has its own translation, so we'll # not do that logic here, but simply ignore those encodings # as they eventually are translated to "real" encoding - $enc = [system.text.encoding]::$encoding + $enc = [System.Text.Encoding]::$encoding if ( $enc ) { - $msg = "Overriding encoding for out-file is respected for $encoding" + $msg = "Overriding encoding for Out-File is respected for $encoding" $BOM = $enc.GetPreamble() $TXT = $enc.GetBytes($asciiString) $CR = $enc.GetBytes($asciiCR) $expectedBytes = .{ $BOM; $TXT; $CR } - $psdefaultparameterValues["out-file:encoding"] = "$encoding" + $psdefaultparameterValues["Out-File:Encoding"] = "$encoding" $asciiString > TESTDRIVE:/file.txt - $observedBytes = Get-Content -encoding Byte TESTDRIVE:/file.txt + $observedBytes = Get-Content -AsByteStream TESTDRIVE:/file.txt # THE TEST It $msg -Skip:$skipTest { $observedBytes.Count | Should be $expectedBytes.Count diff --git a/test/powershell/Modules/Microsoft.PowerShell.Core/TestGetCommand.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Core/TestGetCommand.Tests.ps1 index 8f48d529620..11b0e6f7841 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Core/TestGetCommand.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Core/TestGetCommand.Tests.ps1 @@ -13,11 +13,11 @@ ) DynamicParam { - if ( ! $testToRun ) { - $testToRun = "returnnull" + if ( ! $TestToRun ) { + $TestToRun = "returnnull" } $dynamicParamDictionary = [System.Management.Automation.RuntimeDefinedParameterDictionary]::new() - switch ( $testToRun ) + switch ( $TestToRun ) { "returnnull" { $dynamicParamDictionary = $null @@ -161,16 +161,16 @@ } } - It "Verify that get-command get-content includes the dynamic parameters when the cmdlet is checked against the file system provider implementation" { + It "Verify that Get-Command Get-Content includes the dynamic parameters when the cmdlet is checked against the file system provider implementation" { $fullPath = Join-Path $TestDrive -ChildPath "blah" New-Item -Path $fullPath -ItemType directory -Force - $results = get-command get-content -path $fullPath + $results = Get-Command Get-Content -Path $fullPath $dynamicParameter = "Wait", "Encoding", "Delimiter" VerifyDynamicParametersExist -cmdlet $results[0] -parameterNames $dynamicParameter } - It "Verify that get-command get-content doesn't have any dynamic parameters for Function provider" { - $results =get-command get-content -path function: + It "Verify that Get-Command Get-Content doesn't have any dynamic parameters for Function provider" { + $results =Get-Command Get-Content -Path function: $dynamicParameter = "Wait", "Encoding", "Delimiter" foreach ($dynamicPara in $dynamicParameter) { @@ -179,14 +179,14 @@ } It "Verify that the specified dynamic parameter exists in the CmdletInfo result returned" { - $results = get-command testgetcommand-dynamicparametersdcr -testtorun return1 + $results = Get-Command TestGetCommand-DynamicParametersDCR -TestToRun return1 $dynamicParameter = "OneString" VerifyDynamicParametersExist -cmdlet $results[0] -parameterNames $dynamicParameter VerifyParameterType -cmdlet $results[0] -parameterName $dynamicParameter -ParameterType string } It "Verify three dynamic parameters are created properly" { - $results = get-command testgetcommand-dynamicparametersdcr -testtorun return3 + $results = Get-Command TestGetCommand-DynamicParametersDCR -TestToRun return3 $dynamicParameter = "OneString", "TwoInt", "ThreeBool" VerifyDynamicParametersExist -cmdlet $results[0] -parameterNames $dynamicParameter @@ -196,26 +196,26 @@ } It "Verify dynamic parameter type is process" { - $results = get-command testgetcommand-dynamicparametersdcr -args '-testtorun','returngenericparameter','-parametertype','System.Diagnostics.Process' + $results = Get-Command TestGetCommand-DynamicParametersDCR -Args '-TestToRun','returngenericparameter','-parametertype','System.Diagnostics.Process' VerifyParameterType -cmdlet $results[0] -parameterName "TypedValue" -parameterType System.Diagnostics.Process } It "Verify a single cmdlet returned using verb and noun parameter set syntax works properly" { $paramName = "OneString" - $results = get-command -verb testgetcommand -noun dynamicparametersdcr -testtorun Return1 + $results = Get-Command -Verb TestGetCommand -Noun DynamicParametersDCR -TestToRun Return1 VerifyDynamicParametersExist -cmdlet $results[0] -parameterNames $paramName VerifyParameterType -cmdlet $results[0] -parameterName $paramName -parameterType string } It "Verify Single Cmdlet Using Verb&Noun ParameterSet" { $paramName = "Encoding" - $results = get-command -verb get -noun content -Encoding Unicode + $results = Get-Command -Verb get -Noun content -Encoding Unicode VerifyDynamicParametersExist -cmdlet $results[0] -parameterNames $paramName - VerifyParameterType -cmdlet $results[0] -parameterName $paramName -parameterType Microsoft.PowerShell.Commands.FileSystemCmdletProviderEncoding + VerifyParameterType -cmdlet $results[0] -parameterName $paramName -parameterType System.Text.Encoding } It "Verify Single Cmdlet Using Verb&Noun ParameterSet With Usage" { - $results = get-command -verb get -noun content -Encoding Unicode -syntax + $results = Get-Command -Verb get -Noun content -Encoding Unicode -Syntax $results.ToString() | Should Match "-Encoding" $results.ToString() | Should Match "-Wait" $results.ToString() | Should Match "-Delimiter" @@ -226,24 +226,24 @@ $tempFile = "mytempfile.ps1" $fullPath = Join-Path $TestDrive -ChildPath $tempFile "$a = dir" > $fullPath - $results = get-command $fullPath + $results = Get-Command $fullPath $results.Name | Should Be $tempFile $results.Definition | Should Be $fullPath } It "Two dynamic parameters are created properly" { - $results = get-command testgetcommand-dynamicparametersdcr -testtorun return2 + $results = Get-Command TestGetCommand-DynamicParametersDCR -TestToRun return2 $dynamicParameter = "OneString", "TwoInt" VerifyDynamicParametersExist -cmdlet $results[0] -parameterNames $dynamicParameter VerifyParameterType -cmdlet $results[0] -parameterName "OneString" -ParameterType string VerifyParameterType -cmdlet $results[0] -parameterName "TwoInt" -ParameterType int } - It "Throw an Exception when set testtorun to 'returnduplicateparameter'" { + It "Throw an Exception when set TestToRun to 'returnduplicateparameter'" { try { - Get-Command testgetcommand-dynamicparametersdcr -testtorun returnduplicateparameter -ErrorAction Stop + Get-Command TestGetCommand-DynamicParametersDCR -TestToRun returnduplicateparameter -ErrorAction Stop throw "No Exception!" } catch @@ -253,22 +253,22 @@ } It "verify if get the proper dynamic parameter type skipped by issue #1430" -Pending { - $results = Get-Command testgetcommand-dynamicparametersdcr -testtorun returngenericparameter -parametertype System.Diagnostics.Process + $results = Get-Command TestGetCommand-DynamicParametersDCR -TestToRun returngenericparameter -parametertype System.Diagnostics.Process VerifyParameterType -cmdlet $results[0] -parameterName "TypedValue" -parameterType System.Diagnostics.Process } It "It works with Single Cmdlet Using Verb&Noun ParameterSet" { $paramName = "Encoding" - $results = Get-Command -verb get -noun content -encoding UTF8 + $results = Get-Command -Verb get -Noun content -encoding UTF8 VerifyDynamicParametersExist -cmdlet $results[0] -parameterNames $paramName - VerifyParameterType -cmdlet $results[0] -parameterName $paramName -ParameterType Microsoft.PowerShell.Commands.FileSystemCmdletProviderEncoding + VerifyParameterType -cmdlet $results[0] -parameterName $paramName -ParameterType System.Text.Encoding } #unsupported parameter: -synop It "[Unsupported]It works with Single Cmdlet Using Verb&Noun ParameterSet With Synopsis" -Pending { $paramName = "Encoding" - $results = get-command -verb get -noun content -encoding UTF8 -synop + $results = Get-Command -Verb get -Noun content -encoding UTF8 -Synop VerifyDynamicParametersExist -cmdlet $results[0] -parameterNames $paramName - VerifyParameterType -cmdlet $results[0] -parameterName $paramName -ParameterType Microsoft.PowerShell.Commands.FileSystemCmdletProviderEncoding + VerifyParameterType -cmdlet $results[0] -parameterName $paramName -ParameterType System.Text.Encoding } -} \ No newline at end of file +} diff --git a/test/powershell/Modules/Microsoft.PowerShell.Management/Get-Content.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Management/Get-Content.Tests.ps1 index d338a7cabea..af573035193 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Management/Get-Content.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Management/Get-Content.Tests.ps1 @@ -70,8 +70,8 @@ Describe "Get-Content" -Tags "CI" { Pop-Location } #[BugId(BugDatabase.WindowsOutOfBandReleases, 906022)] - It "should throw 'PSNotSupportedException' when you set-content to an unsupported provider" -Skip:($IsLinux -Or $IsMacOS) { - {get-content -path HKLM:\\software\\microsoft -ea stop} | Should Throw "IContentCmdletProvider interface is not implemented" + It "should throw 'PSNotSupportedException' when you Set-Content to an unsupported provider" -Skip:($IsLinux -Or $IsMacOS) { + {Get-Content -Path HKLM:\\software\\microsoft -EA stop} | Should Throw "IContentCmdletProvider interface is not implemented" } It 'Verifies -Tail reports a TailNotSupported error for unsupported providers' { {Get-Content -Path Variable:\PSHOME -Tail 1 -ErrorAction Stop} | ShouldBeErrorId 'TailNotSupported,Microsoft.PowerShell.Commands.GetContentCommand' @@ -99,53 +99,52 @@ baz "@ $expected = 'foo' $tailCount = 3 - [Microsoft.PowerShell.Commands.FileSystemCmdletProviderEncoding] $encoding = $EncodingName $testPath = Join-Path -Path $TestDrive -ChildPath 'TailWithEncoding.txt' - $content | Set-Content -Path $testPath -Encoding $encoding + $content | Set-Content -Path $testPath -Encoding $encodingName $expected = 'foo' - $actual = Get-Content -Path $testPath -Tail $tailCount -Encoding $encoding + $actual = Get-Content -Path $testPath -Tail $tailCount -Encoding $encodingName $actual.GetType() | Should Be "System.Object[]" $actual.Length | Should Be $tailCount $actual[0] | Should Be $expected } It "should Get-Content with a variety of -Tail and -ReadCount values" {#[DRT] - set-content -path $testPath "Hello,World","Hello2,World2","Hello3,World3","Hello4,World4" - $result=get-content -path $testPath -readcount:-1 -tail 5 + Set-Content -Path $testPath "Hello,World","Hello2,World2","Hello3,World3","Hello4,World4" + $result=Get-Content -Path $testPath -Readcount:-1 -Tail 5 $result.Length | Should Be 4 $expected = "Hello,World","Hello2,World2","Hello3,World3","Hello4,World4" for ($i = 0; $i -lt $result.Length ; $i++) { $result[$i] | Should BeExactly $expected[$i]} - $result=get-content -path $testPath -readcount 0 -tail 3 + $result=Get-Content -Path $testPath -Readcount 0 -Tail 3 $result.Length | Should Be 3 $expected = "Hello2,World2","Hello3,World3","Hello4,World4" for ($i = 0; $i -lt $result.Length ; $i++) { $result[$i] | Should BeExactly $expected[$i]} - $result=get-content -path $testPath -readcount 1 -tail 3 + $result=Get-Content -Path $testPath -Readcount 1 -Tail 3 $result.Length | Should Be 3 $expected = "Hello2,World2","Hello3,World3","Hello4,World4" for ($i = 0; $i -lt $result.Length ; $i++) { $result[$i] | Should BeExactly $expected[$i]} - $result=get-content -path $testPath -readcount 99999 -tail 3 + $result=Get-Content -Path $testPath -Readcount 99999 -Tail 3 $result.Length | Should Be 3 $expected = "Hello2,World2","Hello3,World3","Hello4,World4" for ($i = 0; $i -lt $result.Length ; $i++) { $result[$i] | Should BeExactly $expected[$i]} - $result=get-content -path $testPath -readcount 2 -tail 3 + $result=Get-Content -Path $testPath -Readcount 2 -Tail 3 $result.Length | Should Be 2 $expected = "Hello2,World2","Hello3,World3" $expected = $expected,"Hello4,World4" for ($i = 0; $i -lt $result.Length ; $i++) { $result[$i] | Should BeExactly $expected[$i]} - $result=get-content -path $testPath -readcount 2 -tail 2 + $result=Get-Content -Path $testPath -Readcount 2 -Tail 2 $result.Length | Should Be 2 $expected = "Hello3,World3","Hello4,World4" for ($i = 0; $i -lt $result.Length ; $i++) { $result[$i] | Should BeExactly $expected[$i]} - $result=get-content -path $testPath -delimiter "," -tail 2 + $result=Get-Content -Path $testPath -Delimiter "," -Tail 2 $result.Length | Should Be 2 $expected = "World3${nl}Hello4", "World4${nl}" for ($i = 0; $i -lt $result.Length ; $i++) { $result[$i] | Should BeExactly $expected[$i]} - $result=get-content -path $testPath -delimiter "o" -tail 3 + $result=Get-Content -Path $testPath -Delimiter "o" -Tail 3 $result.Length | Should Be 3 $expected = "rld3${nl}Hell", '4,W', "rld4${nl}" for ($i = 0; $i -lt $result.Length ; $i++) { $result[$i] | Should BeExactly $expected[$i]} - $result=get-content -path $testPath -encoding:Byte -tail 10 + $result=Get-Content -Path $testPath -AsByteStream -Tail 10 $result.Length | Should Be 10 if ($IsWindows) { $expected = 52, 44, 87, 111, 114, 108, 100, 52, 13, 10 @@ -155,9 +154,9 @@ baz for ($i = 0; $i -lt $result.Length ; $i++) { $result[$i] | Should BeExactly $expected[$i]} } #[BugId(BugDatabase.WindowsOutOfBandReleases, 905829)] - It "should get-content that matches the input string"{ - set-content $testPath "Hello,llllWorlld","Hello2,llllWorlld2" - $result=get-content $testPath -delimiter "ll" + It "should Get-Content that matches the input string"{ + Set-Content $testPath "Hello,llllWorlld","Hello2,llllWorlld2" + $result=Get-Content $testPath -Delimiter "ll" $result.Length | Should Be 9 $expected = 'He', 'o,', '', 'Wor', "d${nl}He", 'o2,', '', 'Wor', "d2${nl}" for ($i = 0; $i -lt $result.Length ; $i++) { $result[$i] | Should BeExactly $expected[$i]} @@ -170,7 +169,7 @@ baz Get-Content $testPath | Should BeExactly $testString } - It "Should support NTFS streams using -stream" -Skip:(!$IsWindows) { + It "Should support NTFS streams using -Stream" -Skip:(!$IsWindows) { Set-Content -Path $testPath -Stream hello -Value World Get-Content -Path $testPath | Should Be $testString Get-Content -Path $testPath -Stream hello | Should Be "World" @@ -190,12 +189,12 @@ baz } It "-Stream is not a valid parameter for on Linux/Mac" -Skip:($IsWindows) -TestCases @( - @{cmdlet="get-content"}, - @{cmdlet="set-content"}, - @{cmdlet="clear-content"}, - @{cmdlet="add-content"}, - @{cmdlet="get-item"}, - @{cmdlet="remove-item"} + @{cmdlet="Get-Content"}, + @{cmdlet="Set-Content"}, + @{cmdlet="Clear-Content"}, + @{cmdlet="Add-Content"}, + @{cmdlet="Get-Item"}, + @{cmdlet="Remove-Item"} ) { param($cmdlet) (Get-Command $cmdlet).Parameters["stream"] | Should BeNullOrEmpty @@ -237,7 +236,7 @@ baz $fileContent = $firstLine,$secondLine,$thirdLine,$fourthLine } BeforeEach{ - Set-content -Path $testPath $fileContent + Set-Content -Path $testPath $fileContent } It "Should return all lines when -Tail value is more than number of lines in the file"{ $result = Get-Content -Path $testPath -ReadCount -1 -Tail 5 -Encoding UTF7 @@ -283,6 +282,10 @@ baz $expected[1] = $thirdLine Compare-Object -ReferenceObject $expected -DifferenceObject $result | Should BeNullOrEmpty } + It "A warning should be emitted if both -AsByteStream and -Encoding are used together" { + [byte[]][char[]]"test" | Set-Content -Encoding Unicode -AsByteStream "${TESTDRIVE}\bfile.txt" -WarningVariable contentWarning *>$null + $contentWarning.Message | Should Match "-AsByteStream" + } } } @@ -295,7 +298,7 @@ Describe "Get-Content -Raw test" -Tags "CI" { @{character = "a`r`nb"; testname = "CRLF-separated files without trailing newline"; filename = "crlf-nt.txt"} ) { param ($character, $filename) - Set-Content -Encoding Ascii -NoNewline "$TestDrive\$filename" -value $character + Set-Content -Encoding Ascii -NoNewline "$TestDrive\$filename" -Value $character Get-Content -Raw "$TestDrive\$filename" | Should BeExactly $character } } diff --git a/test/powershell/Modules/Microsoft.PowerShell.Management/Pester.Commands.Cmdlets.NoNewlineParameter.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Management/Pester.Commands.Cmdlets.NoNewlineParameter.Tests.ps1 index fc3231b2445..fab6e4ce6af 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Management/Pester.Commands.Cmdlets.NoNewlineParameter.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Management/Pester.Commands.Cmdlets.NoNewlineParameter.Tests.ps1 @@ -6,19 +6,19 @@ Describe "Tests for -NoNewline parameter of Out-File, Add-Content and Set-Conten It "NoNewline parameter works on Out-File" { $temp = "${TESTDRIVE}/test1.txt" 1..5 | Out-File $temp -Encoding 'ASCII' -NoNewline - (Get-Content $temp -Encoding Byte).Count | Should Be 5 + (Get-Content $temp -AsByteStream).Count | Should Be 5 } It "NoNewline parameter works on Set-Content" { $temp = "${TESTDRIVE}/test2.txt" Set-Content -Path $temp -Value 'a','b','c' -Encoding 'ASCII' -NoNewline - (Get-Content $temp -Encoding Byte).Count | Should Be 3 + (Get-Content $temp -AsByteStream).Count | Should Be 3 } It "NoNewline parameter works on Add-Content" { $temp = "${TESTDRIVE}/test3.txt" $temp = New-TemporaryFile 1..9 | ForEach-Object {Add-Content -Path $temp -Value $_ -Encoding 'ASCII' -NoNewline} - (Get-Content $temp -Encoding Byte).Count | Should Be 9 + (Get-Content $temp -AsByteStream).Count | Should Be 9 } } diff --git a/test/powershell/Modules/Microsoft.PowerShell.Management/Set-Content.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Management/Set-Content.Tests.ps1 index 087680434d1..a63295fde4f 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Management/Set-Content.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Management/Set-Content.Tests.ps1 @@ -1,17 +1,25 @@ Describe "Set-Content cmdlet tests" -Tags "CI" { BeforeAll { $file1 = "file1.txt" - $filePath1 = join-path $testdrive $file1 + $filePath1 = Join-Path $testdrive $file1 # if the registry doesn't exist, don't run those tests - $skipRegistry = ! (test-path hklm:/) + $skipRegistry = ! (Test-Path hklm:/) } + + It "A warning should be emitted if both -AsByteStream and -Encoding are used together" { + $testfile = "${TESTDRIVE}\bfile.txt" + "test" | Set-Content $testfile + $result = Get-Content -AsByteStream -Encoding Unicode -Path $testfile -WarningVariable contentWarning *>$null + $contentWarning.Message | Should Match "-AsByteStream" + } + Context "Set-Content should create a file if it does not exist" { AfterEach { - Remove-Item -path $filePath1 -Force -ErrorAction SilentlyContinue + Remove-Item -Path $filePath1 -Force -ErrorAction SilentlyContinue } It "should create a file if it does not exist" { - set-content -path $filePath1 -value "$file1" - $result = Get-Content -path $filePath1 + Set-Content -Path $filePath1 -Value "$file1" + $result = Get-Content -Path $filePath1 $result| Should be "$file1" } } @@ -20,33 +28,33 @@ Describe "Set-Content cmdlet tests" -Tags "CI" { New-Item -Path $filePath1 -ItemType File -Force } It "should set-Content of testdrive\$file1" { - set-content -path $filePath1 -value "ExpectedContent" - $result = Get-Content -path $filePath1 + Set-Content -Path $filePath1 -Value "ExpectedContent" + $result = Get-Content -Path $filePath1 $result| Should be "ExpectedContent" } It "should return expected string from testdrive\$file1" { - $result = get-content -path $filePath1 + $result = Get-Content -Path $filePath1 $result | Should BeExactly "ExpectedContent" } It "should Set-Content to testdrive\dynamicfile.txt with dynamic parameters" { - set-content -path $testdrive\dynamicfile.txt -value "ExpectedContent" - $result = Get-Content -path $testdrive\dynamicfile.txt + Set-Content -Path $testdrive\dynamicfile.txt -Value "ExpectedContent" + $result = Get-Content -Path $testdrive\dynamicfile.txt $result| Should BeExactly "ExpectedContent" } It "should return expected string from testdrive\dynamicfile.txt" { - $result = get-content -path $testdrive\dynamicfile.txt + $result = Get-Content -Path $testdrive\dynamicfile.txt $result | Should BeExactly "ExpectedContent" } It "should remove existing content from testdrive\$file1 when the -Value is `$null" { - $AsItWas=get-content $filePath1 + $AsItWas=Get-Content $filePath1 $AsItWas |Should BeExactly "ExpectedContent" - set-content -path $filePath1 -value $null -ea stop - $AsItIs=get-content $filePath1 + Set-Content -Path $filePath1 -Value $null -EA stop + $AsItIs=Get-Content $filePath1 $AsItIs| Should Not Be $AsItWas } It "should throw 'ParameterArgumentValidationErrorNullNotAllowed' when -Path is `$null" { try { - set-content -path $null -value "ShouldNotWorkBecausePathIsNull" -ea stop + Set-Content -Path $null -Value "ShouldNotWorkBecausePathIsNull" -EA stop Throw "Previous statement unexpectedly succeeded..." } catch { @@ -55,16 +63,16 @@ Describe "Set-Content cmdlet tests" -Tags "CI" { } It "should throw 'ParameterArgumentValidationErrorNullNotAllowed' when -Path is `$()" { try { - set-content -path $() -value "ShouldNotWorkBecausePathIsInvalid" -ea stop + Set-Content -Path $() -Value "ShouldNotWorkBecausePathIsInvalid" -EA stop Throw "Previous statement unexpectedly succeeded..." } catch { $_.FullyQualifiedErrorId | Should Be "ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.SetContentCommand" } } - It "should throw 'PSNotSupportedException' when you set-content to an unsupported provider" -skip:$skipRegistry { + It "should throw 'PSNotSupportedException' when you Set-Content to an unsupported provider" -skip:$skipRegistry { try { - set-content -path HKLM:\\software\\microsoft -value "ShouldNotWorkBecausePathIsUnsupported" -ea stop + Set-Content -Path HKLM:\\software\\microsoft -Value "ShouldNotWorkBecausePathIsUnsupported" -EA stop Throw "Previous statement unexpectedly succeeded..." } catch { @@ -73,8 +81,8 @@ Describe "Set-Content cmdlet tests" -Tags "CI" { } #[BugId(BugDatabase.WindowsOutOfBandReleases, 9058182)] It "should be able to pass multiple [string]`$objects to Set-Content through the pipeline to output a dynamic Path file" { - "hello","world"|set-content $testdrive\dynamicfile2.txt - $result=get-content $testdrive\dynamicfile2.txt + "hello","world"|Set-Content $testdrive\dynamicfile2.txt + $result=Get-Content $testdrive\dynamicfile2.txt $result.length |Should be 2 $result[0] |Should be "hello" $result[1] |Should be "world" @@ -87,7 +95,7 @@ Describe "Set-Content should work for PSDrive with UNC path as root" -Tags @('CI $file1 = "file1.txt" #create a random folder $randomFolderName = "TestFolder_" + (Get-Random).ToString() - $randomFolderPath = join-path $testdrive $randomFolderName + $randomFolderPath = Join-Path $testdrive $randomFolderName $null = New-Item -Path $randomFolderPath -ItemType Directory -ErrorAction SilentlyContinue } # test is Pending due to https://github.com/PowerShell/PowerShell/issues/3883 @@ -97,8 +105,8 @@ Describe "Set-Content should work for PSDrive with UNC path as root" -Tags @('CI # create share net share testshare=$randomFolderPath /grant:everyone,FULL New-PSDrive -Name Foo -Root \\localhost\testshare -PSProvider FileSystem - set-content -path Foo:\$file1 -value "$file1" - $result = Get-Content -path Foo:\$file1 + Set-Content -Path Foo:\$file1 -Value "$file1" + $result = Get-Content -Path Foo:\$file1 $result| Should be "$file1" } finally diff --git a/test/powershell/engine/Basic/Encoding.Tests.ps1 b/test/powershell/engine/Basic/Encoding.Tests.ps1 new file mode 100644 index 00000000000..309f2c26af1 --- /dev/null +++ b/test/powershell/engine/Basic/Encoding.Tests.ps1 @@ -0,0 +1,73 @@ +Describe "File encoding tests" -Tag CI { + + Context "ParameterType for parameter 'Encoding' should be 'Encoding'" { + BeforeAll { + $testCases = Get-Command -Module Microsoft.PowerShell.* | + Where-Object { $_.Parameters -and $_.Parameters['Encoding'] } | + ForEach-Object { @{ Command = $_ } } + } + It "Encoding parameter of command '' is type 'Encoding'" -Testcase $testCases { + param ( $command ) + $command.Parameters['Encoding'].ParameterType.FullName | Should BeExactly "System.Text.Encoding" + } + } + Context "File contents are UTF8 without BOM" { + BeforeAll { + $testStr = "t" + ([char]233) + "st" + $nl = [environment]::newline + $utf8Bytes = 116,195,169,115,116 + $nlBytes = [byte[]][char[]]$nl + $ExpectedWithNewline = $( $utf8Bytes ; $nlBytes ) + $outputFile = "${TESTDRIVE}/file.txt" + $utf8Preamble = [text.encoding]::UTF8.GetPreamble() + $simpleTestCases = @( + # New-Item does not add CR/NL + @{ Command = "New-Item"; Parameters = @{ type = "file";value = $testStr; Path = $outputFile }; Expected = $utf8Bytes ; Operator = "be" } + # the following commands add a CR/NL + @{ Command = "Set-Content"; Parameters = @{ value = $testStr; Path = $outputFile }; Expected = $ExpectedWithNewline ; Operator = "be" } + @{ Command = "Add-Content"; Parameters = @{ value = $testStr; Path = $outputFile }; Expected = $ExpectedWithNewline ; Operator = "be" } + @{ Command = "Out-File"; Parameters = @{ InputObject = $testStr; Path = $outputFile }; Expected = $ExpectedWithNewline ; Operator = "be" } + # Redirection + @{ Command = { $testStr > $outputFile } ; Expected = $ExpectedWithNewline ; Operator = "be" } + ) + function Get-FileBytes ( $path ) { + [io.file]::ReadAllBytes($path) + } + } + + AfterEach { + if ( Test-Path $outputFile ) { + Remove-Item -Force $outputFile + } + } + + It " produces correct content ''" -Testcases $simpleTestCases { + param ( $Command, $parameters, $Expected, $Operator) + & $command @parameters + $bytes = Get-FileBytes $outputFile + $bytes -join "-" | should ${Operator} ($Expected -join "-") + } + + It "Export-CSV creates file with UTF-8 encoding without BOM" { + [pscustomobject]@{ Key = $testStr } | Export-Csv $outputFile + $bytes = Get-FileBytes $outputFile + $bytes[0,1,2] -join "-" | should not be ($utf8Preamble -join "-") + $bytes -join "-" | should match ($utf8bytes -join "-") + } + + It "Export-CliXml creates file with UTF-8 encoding without BOM" { + [pscustomobject]@{ Key = $testStr } | Export-Clixml $outputFile + $bytes = Get-FileBytes $outputFile + $bytes[0,1,2] -join "-" | should not be ($utf8Preamble -join "-") + $bytes -join "-" | should match ($utf8bytes -join "-") + } + + It "Appends correctly on non-Windows systems" -Skip:$IsWindows { + bash -c "echo '${testStr}' > $outputFile" + ${testStr} >> $outputFile + $bytes = Get-FileBytes $outputFile + $Expected = $( $ExpectedWithNewline; $ExpectedWithNewline ) + $bytes -join "-" | should be ($Expected -join "-") + } + } +} diff --git a/test/powershell/engine/Module/NewModuleManifest.Tests.ps1 b/test/powershell/engine/Module/NewModuleManifest.Tests.ps1 index 0604dc41553..8508db33c1d 100644 --- a/test/powershell/engine/Module/NewModuleManifest.Tests.ps1 +++ b/test/powershell/engine/Module/NewModuleManifest.Tests.ps1 @@ -34,7 +34,7 @@ Describe "New-ModuleManifest tests" -tags "CI" { function TestNewModuleManifestEncoding { param ([byte[]]$expected) New-ModuleManifest -Path $testModulePath - (Get-Content -Encoding Byte -Path $testModulePath -TotalCount $expected.Length) -join ',' | Should Be ($expected -join ',') + (Get-Content -AsByteStream -Path $testModulePath -TotalCount $expected.Length) -join ',' | Should Be ($expected -join ',') } It "Verify module manifest encoding" { From e4d88aaa9d057ee9ee432a6c0c82bd54074a7ce9 Mon Sep 17 00:00:00 2001 From: Dongbo Wang Date: Mon, 23 Oct 2017 21:40:39 -0700 Subject: [PATCH 038/617] Fix appimage package name to be lower case 'powershell-..' (#5206) --- docs/installation/linux.md | 12 ++++++------ tools/appimage.sh | 4 ++-- tools/packaging/packaging.psm1 | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/installation/linux.md b/docs/installation/linux.md index 3782f78a940..857c047cd9f 100644 --- a/docs/installation/linux.md +++ b/docs/installation/linux.md @@ -553,14 +553,14 @@ For more information on installing packages from the AUR, see the [Arch Linux wi ## Linux AppImage Using a recent Linux distribution, -download the AppImage `PowerShell-6.0.0-beta.8-x86_64.AppImage` +download the AppImage `powershell-6.0.0-beta.8-x86_64.AppImage` from the [releases][] page onto the Linux machine. Then execute the following in the terminal: ```bash -chmod a+x PowerShell-6.0.0-beta.8-x86_64.AppImage -./PowerShell-6.0.0-beta.8-x86_64.AppImage +chmod a+x powershell-6.0.0-beta.8-x86_64.AppImage +./powershell-6.0.0-beta.8-x86_64.AppImage ``` The [AppImage][] lets you run PowerShell without installing it. @@ -705,13 +705,13 @@ powershell ```sh # Grab the latest App Image -wget https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.8/PowerShell-6.0.0-beta.8-x86_64.AppImage +wget https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.8/powershell-6.0.0-beta.8-x86_64.AppImage # Make executable -chmod a+x PowerShell-6.0.0-beta.8-x86_64.AppImage +chmod a+x powershell-6.0.0-beta.8-x86_64.AppImage # Start PowerShell -./PowerShell-6.0.0-beta.8-x86_64.AppImage +./powershell-6.0.0-beta.8-x86_64.AppImage ``` ### Uninstallation - Kali diff --git a/tools/appimage.sh b/tools/appimage.sh index 318622a71a0..363f47f79a0 100755 --- a/tools/appimage.sh +++ b/tools/appimage.sh @@ -427,7 +427,7 @@ mv opt/microsoft/powershell/*/* usr/bin/ cat > $APP.desktop <<\EOF [Desktop Entry] -Name=PowerShell +Name=powershell Comment=Microsoft PowerShell Exec=pwsh Keywords=shell;prompt;command;commandline;cmd; @@ -472,6 +472,6 @@ cd .. wget -c https://psgithub.blob.core.windows.net/files/appimagetool-x86_64.AppImage chmod a+x appimagetool-x86_64.AppImage ./appimagetool-x86_64.AppImage ./powershell.AppDir -cp ./PowerShell*AppImage .. +cp ./powershell*AppImage .. cd .. diff --git a/tools/packaging/packaging.psm1 b/tools/packaging/packaging.psm1 index 3f640cf96fc..49d55d09bc9 100644 --- a/tools/packaging/packaging.psm1 +++ b/tools/packaging/packaging.psm1 @@ -140,7 +140,7 @@ function Start-PSPackage { # If building a symbols package, don't include the publish build. if ($IncludeSymbols.IsPresent) { - $buildSource = Split-Path -Path $Source -Parent + $buildSource = Split-Path -Path $Source -Parent $Source = New-TempFolder Get-ChildItem -Path $buildSource | Where-Object {$_.Name -ine 'Publish'} | Copy-Item -Destination $Source -Recurse } @@ -217,7 +217,7 @@ function Start-PSPackage { if ($Environment.IsUbuntu14) { $null = Start-NativeExecution { bash -iex "$PSScriptRoot/../appimage.sh" } - $appImage = Get-Item PowerShell-*.AppImage + $appImage = Get-Item powershell-*.AppImage if ($appImage.Count -gt 1) { throw "Found more than one AppImage package, remove all *.AppImage files and try to create the package again" } From ca30054761a18bd9da316adeb005c64c49a8399b Mon Sep 17 00:00:00 2001 From: Jonas Andersen Date: Tue, 24 Oct 2017 08:54:07 +0200 Subject: [PATCH 039/617] Added BinPath, Description, UserName and Delayed Auto Start to Get-Service (#4907) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added the following to the Get-Service command: •BinaryPathName (Was suggested as ServicePath ) •Description •UserName (Was suggested as LogOnAs ) •DelayedAutoStart •ServiceStartupType The ServiceStartupType was also added, providing the user access to use services like in services.msc , having Automatic , Automatic (Delayed Start) , Manual and Disabled as options (Also includes InvalidValue as an initial value for ServiceStartupType ) --- .../commands/management/Service.cs | 340 +++++++++++++++++- .../resources/ServiceResources.resx | 9 + .../utils/PInvokeDllNames.cs | 2 + .../Set-Service.Tests.ps1 | 45 ++- 4 files changed, 378 insertions(+), 18 deletions(-) diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/Service.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/Service.cs index 29c407c50d0..24d574b0edd 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/Service.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/Service.cs @@ -571,7 +571,7 @@ protected override void ProcessRecord() { if (!DependentServices.IsPresent && !RequiredServices.IsPresent) { - WriteObject(service); + WriteObject(AddProperties(service)); } else { @@ -594,6 +594,107 @@ protected override void ProcessRecord() } #endregion Overrides + + /// + /// Adds UserName, Description, BinaryPathName, DelayedAutoStart and StartupType to a ServiceController object. + /// + /// + /// ServiceController as PSObject with UserName, Description and StartupType added + private PSObject AddProperties(ServiceController service) { + NakedWin32Handle hScManager = IntPtr.Zero; + NakedWin32Handle hService = IntPtr.Zero; + int lastError = 0; + PSObject serviceAsPSObj = PSObject.AsPSObject(service); + try + { + hScManager = NativeMethods.OpenSCManagerW( + lpMachineName: service.MachineName, + lpDatabaseName: null, + dwDesiredAccess: NativeMethods.SC_MANAGER_CONNECT + ); + if (IntPtr.Zero == hScManager) { + lastError = Marshal.GetLastWin32Error(); + Win32Exception exception = new Win32Exception(lastError); + WriteNonTerminatingError( + service, + exception, + "FailToOpenServiceControlManager", + ServiceResources.FailToOpenServiceControlManager, + ErrorCategory.PermissionDenied); + } + hService = NativeMethods.OpenServiceW( + hScManager, + service.ServiceName, + NativeMethods.SERVICE_QUERY_CONFIG + ); + if (IntPtr.Zero == hService) { + lastError = Marshal.GetLastWin32Error(); + Win32Exception exception = new Win32Exception(lastError); + WriteNonTerminatingError( + service, + exception, + "CouldNotGetServiceInfo", + ServiceResources.CouldNotGetServiceInfo, + ErrorCategory.PermissionDenied); + } + + NativeMethods.SERVICE_DESCRIPTIONW description = new NativeMethods.SERVICE_DESCRIPTIONW(); + bool querySuccessful = NativeMethods.QueryServiceConfig2(hService, NativeMethods.SERVICE_CONFIG_DESCRIPTION, out description); + + NativeMethods.SERVICE_DELAYED_AUTO_START_INFO autostartInfo = new NativeMethods.SERVICE_DELAYED_AUTO_START_INFO(); + querySuccessful = querySuccessful && NativeMethods.QueryServiceConfig2(hService, NativeMethods.SERVICE_CONFIG_DELAYED_AUTO_START_INFO, out autostartInfo); + + NativeMethods.QUERY_SERVICE_CONFIG serviceInfo = new NativeMethods.QUERY_SERVICE_CONFIG(); + querySuccessful = querySuccessful && NativeMethods.QueryServiceConfig(hService, out serviceInfo); + + if(!querySuccessful) { + WriteNonTerminatingError( + service: service, + innerException: null, + errorId: "CouldNotGetServiceInfo", + errorMessage: ServiceResources.CouldNotGetServiceInfo, + category: ErrorCategory.PermissionDenied + ); + } + + PSProperty noteProperty = new PSProperty("UserName", serviceInfo.lpServiceStartName); + serviceAsPSObj.Properties.Add(noteProperty, true); + serviceAsPSObj.TypeNames.Insert(0, "System.Service.ServiceController#UserName"); + + noteProperty = new PSProperty("Description", description.lpDescription); + serviceAsPSObj.Properties.Add(noteProperty, true); + serviceAsPSObj.TypeNames.Insert(0, "System.Service.ServiceController#Description"); + + noteProperty = new PSProperty("DelayedAutoStart", autostartInfo.fDelayedAutostart); + serviceAsPSObj.Properties.Add(noteProperty, true); + serviceAsPSObj.TypeNames.Insert(0, "System.Service.ServiceController#DelayedAutoStart"); + + noteProperty = new PSProperty("BinaryPathName", serviceInfo.lpBinaryPathName); + serviceAsPSObj.Properties.Add(noteProperty, true); + serviceAsPSObj.TypeNames.Insert(0, "System.Service.ServiceController#BinaryPathName"); + + noteProperty = new PSProperty("StartupType", NativeMethods.GetServiceStartupType(service.StartType, autostartInfo.fDelayedAutostart)); + serviceAsPSObj.Properties.Add(noteProperty, true); + serviceAsPSObj.TypeNames.Insert(0, "System.Service.ServiceController#StartupType"); + } + finally + { + if (IntPtr.Zero != hService) { + bool succeeded = NativeMethods.CloseServiceHandle(hService); + if (!succeeded) { + Diagnostics.Assert(lastError != 0, "ErrorCode not success"); + } + } + + if (IntPtr.Zero != hScManager) { + bool succeeded = NativeMethods.CloseServiceHandle(hScManager); + if (!succeeded) { + Diagnostics.Assert(lastError != 0, "ErrorCode not success"); + } + } + } // finally + return serviceAsPSObj; + } } #endregion GetServiceCommand @@ -1403,7 +1504,7 @@ public string Description [Parameter] [Alias("StartMode", "SM", "ST")] [ValidateNotNullOrEmpty] - public ServiceStartMode StartupType + public ServiceStartupType StartupType { get { return startupType; } set @@ -1413,7 +1514,7 @@ public ServiceStartMode StartupType } // We set the initial value to an invalid value so that we can // distinguish when this is and is not set. - internal ServiceStartMode startupType = (ServiceStartMode)(-1); + internal ServiceStartupType startupType = ServiceStartupType.InvalidValue; /// @@ -1530,6 +1631,7 @@ protected override void ProcessRecord() NakedWin32Handle hScManager = IntPtr.Zero; NakedWin32Handle hService = IntPtr.Zero; + IntPtr delayedAutoStartInfoBuffer = IntPtr.Zero; try { hScManager = NativeMethods.OpenSCManagerW( @@ -1567,10 +1669,9 @@ protected override void ProcessRecord() ErrorCategory.PermissionDenied); return; } - // Modify startup type or display name or credential if (!String.IsNullOrEmpty(DisplayName) - || (ServiceStartMode)(-1) != StartupType || null != Credential) + || ServiceStartupType.InvalidValue != StartupType || null != Credential) { DWORD dwStartType = NativeMethods.SERVICE_NO_CHANGE; if (!NativeMethods.TryGetNativeStartupType(StartupType, out dwStartType)) @@ -1638,6 +1739,32 @@ protected override void ProcessRecord() ErrorCategory.PermissionDenied); } + // Set the delayed auto start + NativeMethods.SERVICE_DELAYED_AUTO_START_INFO ds = new NativeMethods.SERVICE_DELAYED_AUTO_START_INFO(); + ds.fDelayedAutostart = StartupType == ServiceStartupType.AutomaticDelayedStart; + size = Marshal.SizeOf(ds); + delayedAutoStartInfoBuffer = Marshal.AllocCoTaskMem(size); + Marshal.StructureToPtr(ds, delayedAutoStartInfoBuffer, false); + + status = NativeMethods.ChangeServiceConfig2W( + hService, + NativeMethods.SERVICE_CONFIG_DELAYED_AUTO_START_INFO, + delayedAutoStartInfoBuffer); + + if (!status) + { + int lastError = Marshal.GetLastWin32Error(); + Win32Exception exception = new Win32Exception(lastError); + WriteNonTerminatingError( + Name, + DisplayName, + Name, + exception, + "CouldNotSetServiceDelayedAutoStart", + ServiceResources.CouldNotSetServiceDelayedAutoStart, + ErrorCategory.PermissionDenied); + } + // Handle the '-Status' parameter if (!string.IsNullOrEmpty(Status)) { @@ -1694,6 +1821,10 @@ protected override void ProcessRecord() } finally { + if (IntPtr.Zero != delayedAutoStartInfoBuffer) + { + Marshal.FreeCoTaskMem(delayedAutoStartInfoBuffer); + } if (IntPtr.Zero != hService) { bool succeeded = NativeMethods.CloseServiceHandle(hService); @@ -1809,12 +1940,12 @@ public string Description /// /// [Parameter] - public ServiceStartMode StartupType + public ServiceStartupType StartupType { get { return startupType; } set { startupType = value; } } - internal ServiceStartMode startupType = ServiceStartMode.Automatic; + internal ServiceStartupType startupType = ServiceStartupType.Automatic; /// /// Account under which the service should run @@ -1865,6 +1996,7 @@ protected override void BeginProcessing() NakedWin32Handle hScManager = IntPtr.Zero; NakedWin32Handle hService = IntPtr.Zero; IntPtr password = IntPtr.Zero; + IntPtr delayedAutoStartInfoBuffer = IntPtr.Zero; try { hScManager = NativeMethods.OpenSCManagerW( @@ -1987,6 +2119,34 @@ protected override void BeginProcessing() ErrorCategory.PermissionDenied); } + // Set the delayed auto start + if(StartupType == ServiceStartupType.AutomaticDelayedStart) { + NativeMethods.SERVICE_DELAYED_AUTO_START_INFO ds = new NativeMethods.SERVICE_DELAYED_AUTO_START_INFO(); + ds.fDelayedAutostart = true; + size = Marshal.SizeOf(ds); + delayedAutoStartInfoBuffer = Marshal.AllocCoTaskMem(size); + Marshal.StructureToPtr(ds, delayedAutoStartInfoBuffer, false); + + succeeded = NativeMethods.ChangeServiceConfig2W( + hService, + NativeMethods.SERVICE_CONFIG_DELAYED_AUTO_START_INFO, + delayedAutoStartInfoBuffer); + + if (!succeeded) + { + int lastError = Marshal.GetLastWin32Error(); + Win32Exception exception = new Win32Exception(lastError); + WriteNonTerminatingError( + Name, + DisplayName, + Name, + exception, + "CouldNotNewServiceDelayedAutoStart", + ServiceResources.CouldNotNewServiceDelayedAutoStart, + ErrorCategory.PermissionDenied); + } + } + // write the ServiceController for the new service using (ServiceController service = new ServiceController(Name)) // ensure dispose @@ -1996,6 +2156,11 @@ protected override void BeginProcessing() } finally { + if (IntPtr.Zero != delayedAutoStartInfoBuffer) + { + Marshal.FreeCoTaskMem(delayedAutoStartInfoBuffer); + } + if (IntPtr.Zero != password) { Marshal.ZeroFreeCoTaskMemUnicode(password); @@ -2305,6 +2470,7 @@ internal static class NativeMethods // from winuser.h internal const int ERROR_SERVICE_ALREADY_RUNNING = 1056; internal const int ERROR_SERVICE_NOT_ACTIVE = 1062; + internal const int ERROR_INSUFFICIENT_BUFFER = 122; internal const DWORD SC_MANAGER_CONNECT = 1; internal const DWORD SC_MANAGER_CREATE_SERVICE = 2; internal const DWORD SC_MANAGER_ALL_ACCESS = 0xf003f; @@ -2316,6 +2482,9 @@ internal static class NativeMethods internal const DWORD SERVICE_DEMAND_START = 0x3; internal const DWORD SERVICE_DISABLED = 0x4; internal const DWORD SERVICE_CONFIG_DESCRIPTION = 1; + internal const DWORD SERVICE_CONFIG_DELAYED_AUTO_START_INFO = 3; + internal const DWORD SERVICE_CONFIG_SERVICE_SID_INFO = 5; + internal const DWORD SERVICE_WIN32_OWN_PROCESS = 0x10; internal const DWORD SERVICE_ERROR_NORMAL = 1; @@ -2336,6 +2505,25 @@ NakedWin32Handle OpenServiceW( DWORD dwDesiredAccess ); + [DllImport(PinvokeDllNames.QueryServiceConfigDllName, CharSet = CharSet.Unicode, SetLastError = true)] + internal static extern + bool QueryServiceConfigW( + NakedWin32Handle hSCManager, + IntPtr lpServiceConfig, + DWORD cbBufSize, + out DWORD pcbBytesNeeded + ); + + [DllImport(PinvokeDllNames.QueryServiceConfig2DllName, CharSet = CharSet.Unicode, SetLastError = true)] + internal static extern + bool QueryServiceConfig2W( + NakedWin32Handle hService, + DWORD dwInfoLevel, + IntPtr lpBuffer, + DWORD cbBufSize, + out DWORD pcbBytesNeeded + ); + [DllImport(PinvokeDllNames.CloseServiceHandleDllName, CharSet = CharSet.Unicode, SetLastError = true)] internal static extern bool CloseServiceHandle( @@ -2379,6 +2567,26 @@ internal struct SERVICE_DESCRIPTIONW internal string lpDescription; }; + [StructLayout(LayoutKind.Sequential)] + internal struct QUERY_SERVICE_CONFIG + { + internal uint dwServiceType; + internal uint dwStartType; + internal uint dwErrorControl; + [MarshalAs(UnmanagedType.LPWStr)] internal string lpBinaryPathName; + [MarshalAs(UnmanagedType.LPWStr)] internal string lpLoadOrderGroup; + internal uint dwTagId; + [MarshalAs(UnmanagedType.LPWStr)] internal string lpDependencies; + [MarshalAs(UnmanagedType.LPWStr)] internal string lpServiceStartName; + [MarshalAs(UnmanagedType.LPWStr)] internal string lpDisplayName; + }; + + [StructLayout(LayoutKind.Sequential)] + internal struct SERVICE_DELAYED_AUTO_START_INFO + { + internal bool fDelayedAutostart; + }; + [DllImport(PinvokeDllNames.CreateServiceWDllName, CharSet = CharSet.Unicode, SetLastError = true)] internal static extern NakedWin32Handle CreateServiceW( @@ -2460,6 +2668,77 @@ public static extern bool QueryInformationJobObject(SafeHandle hJob, int JobObje ref JOBOBJECT_BASIC_PROCESS_ID_LIST lpJobObjectInfo, int cbJobObjectLength, IntPtr lpReturnLength); + internal static bool QueryServiceConfig(NakedWin32Handle hService, out NativeMethods.QUERY_SERVICE_CONFIG configStructure) + { + IntPtr lpBuffer = IntPtr.Zero; + configStructure = default(NativeMethods.QUERY_SERVICE_CONFIG); + DWORD bufferSize, bufferSizeNeeded = 0; + bool status = NativeMethods.QueryServiceConfigW( + hSCManager: hService, + lpServiceConfig: lpBuffer, + cbBufSize: 0, + pcbBytesNeeded: out bufferSizeNeeded); + + if (status != true && Marshal.GetLastWin32Error() != ERROR_INSUFFICIENT_BUFFER) { + return status; + } + + try + { + lpBuffer = Marshal.AllocCoTaskMem((int)bufferSizeNeeded); + bufferSize = bufferSizeNeeded; + + status = NativeMethods.QueryServiceConfigW( + hService, + lpBuffer, + bufferSize, + out bufferSizeNeeded); + configStructure = (NativeMethods.QUERY_SERVICE_CONFIG)Marshal.PtrToStructure(lpBuffer, typeof(NativeMethods.QUERY_SERVICE_CONFIG)); + } + finally + { + Marshal.FreeCoTaskMem(lpBuffer); + } + return status; + } + + internal static bool QueryServiceConfig2(NakedWin32Handle hService, DWORD infolevel, out T configStructure) + { + IntPtr lpBuffer = IntPtr.Zero; + configStructure = default(T); + DWORD bufferSize, bufferSizeNeeded = 0; + + bool status = NativeMethods.QueryServiceConfig2W( + hService: hService, + dwInfoLevel: infolevel, + lpBuffer: lpBuffer, + cbBufSize: 0, + pcbBytesNeeded: out bufferSizeNeeded); + + if (status != true && Marshal.GetLastWin32Error() != ERROR_INSUFFICIENT_BUFFER) { + return status; + } + + try + { + lpBuffer = Marshal.AllocCoTaskMem((int)bufferSizeNeeded); + bufferSize = bufferSizeNeeded; + + status = NativeMethods.QueryServiceConfig2W( + hService, + infolevel, + lpBuffer, + bufferSize, + out bufferSizeNeeded); + configStructure = (T)Marshal.PtrToStructure(lpBuffer, typeof(T)); + } + finally + { + Marshal.FreeCoTaskMem(lpBuffer); + } + return status; + } + /// /// Get appropriate win32 StartupType /// @@ -2472,22 +2751,23 @@ public static extern bool QueryInformationJobObject(SafeHandle hJob, int JobObje /// /// If a supported StartupType is provided, funciton returns true, otherwise false. /// - internal static bool TryGetNativeStartupType(ServiceStartMode StartupType, out DWORD dwStartType) + internal static bool TryGetNativeStartupType(ServiceStartupType StartupType, out DWORD dwStartType) { bool success = true; dwStartType = NativeMethods.SERVICE_NO_CHANGE; switch (StartupType) { - case ServiceStartMode.Automatic: + case ServiceStartupType.Automatic: + case ServiceStartupType.AutomaticDelayedStart: dwStartType = NativeMethods.SERVICE_AUTO_START; break; - case ServiceStartMode.Manual: + case ServiceStartupType.Manual: dwStartType = NativeMethods.SERVICE_DEMAND_START; break; - case ServiceStartMode.Disabled: + case ServiceStartupType.Disabled: dwStartType = NativeMethods.SERVICE_DISABLED; break; - case (ServiceStartMode)(-1): + case ServiceStartupType.InvalidValue: dwStartType = NativeMethods.SERVICE_NO_CHANGE; break; default: @@ -2496,8 +2776,44 @@ internal static bool TryGetNativeStartupType(ServiceStartMode StartupType, out D } return success; } + + internal static ServiceStartupType GetServiceStartupType(ServiceStartMode startMode, bool delayedAutoStart) + { + ServiceStartupType result = ServiceStartupType.Disabled; + switch(startMode) + { + case ServiceStartMode.Automatic: + result = delayedAutoStart ? ServiceStartupType.AutomaticDelayedStart : ServiceStartupType.Automatic; + break; + case ServiceStartMode.Manual: + result = ServiceStartupType.Manual; + break; + case ServiceStartMode.Disabled: + result = ServiceStartupType.Disabled; + break; + } + return result; + } } #endregion NativeMethods + + #region ServiceStartupType + /// + ///Enum for usage with StartupType. Automatic, Manual and Disabled index matched from System.ServiceProcess.ServiceStartMode + /// + public enum ServiceStartupType { + ///Invalid service + InvalidValue = -1, + ///Automatic service + Automatic = 2, + ///Manual service + Manual = 3, + ///Disabled service + Disabled = 4, + ///Automatic (Delayed Start) service + AutomaticDelayedStart = 10 + } + #endregion ServiceStartupType } #endif // Not built on Unix diff --git a/src/Microsoft.PowerShell.Commands.Management/resources/ServiceResources.resx b/src/Microsoft.PowerShell.Commands.Management/resources/ServiceResources.resx index 4a1aa45ee7d..6218714a18c 100644 --- a/src/Microsoft.PowerShell.Commands.Management/resources/ServiceResources.resx +++ b/src/Microsoft.PowerShell.Commands.Management/resources/ServiceResources.resx @@ -162,15 +162,24 @@ Service '{1} ({0})' cannot be configured due to the following error: {2} + + Service '{1} ({0})' cannot be queried due to the following error: {2} + Service '{1} ({0})' description cannot be configured due to the following error: {2} + + Service '{1} ({0})' automatic (delayed start) cannot be configured due to the following error: {2} + Service '{1} ({0})' cannot be created due to the following error: {2} Service '{1} ({0})' was created, but its description cannot be configured due to the following error: {2} + + Service '{1} ({0})' was created, but its StartupType 'Automatic (Delayed Start)' could not be configured due to the following error: {2} + Service '{1} ({0})' cannot be removed due to the following error: {2} diff --git a/src/System.Management.Automation/utils/PInvokeDllNames.cs b/src/System.Management.Automation/utils/PInvokeDllNames.cs index 619349b888f..1841115f560 100644 --- a/src/System.Management.Automation/utils/PInvokeDllNames.cs +++ b/src/System.Management.Automation/utils/PInvokeDllNames.cs @@ -136,5 +136,7 @@ internal static class PinvokeDllNames internal const string Process32NextDllName = "api-ms-win-core-toolhelp-l1-1-0"; /*122*/ internal const string GetACPDllName = "api-ms-win-core-localization-l1-2-0.dll"; /*123*/ internal const string DeleteServiceDllName = "api-ms-win-service-management-l1-1-0.dll"; /*124*/ + internal const string QueryServiceConfigDllName = "api-ms-win-service-management-l2-1-0.dll"; /*125*/ + internal const string QueryServiceConfig2DllName = "api-ms-win-service-management-l2-1-0.dll"; /*126*/ } } diff --git a/test/powershell/Modules/Microsoft.PowerShell.Management/Set-Service.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Management/Set-Service.Tests.ps1 index 77f3fc62667..e3f189a65d3 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Management/Set-Service.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Management/Set-Service.Tests.ps1 @@ -4,9 +4,19 @@ Describe "Set/New/Remove-Service cmdlet tests" -Tags "Feature", "RequireAdminOnW if ( -not $IsWindows ) { $PSDefaultParameterValues["it:skip"] = $true } + if ($IsWindows) { + $userName = "testuserservices" + $testPass = "Secret123!" + net user $userName $testPass /add > $null + $password = ConvertTo-SecureString $testPass -AsPlainText -Force + $creds = [pscredential]::new(".\$userName", $password) + } } AfterAll { $global:PSDefaultParameterValues = $originalDefaultParameterValues + if ($IsWindows) { + net user $userName /delete > $null + } } It "SetServiceCommand can be used as API for '' with ''" -TestCases @( @@ -14,10 +24,8 @@ Describe "Set/New/Remove-Service cmdlet tests" -Tags "Feature", "RequireAdminOnW @{parameter = "DisplayName" ; value = "hello"}, @{parameter = "Description" ; value = "hello world"}, @{parameter = "StartupType" ; value = "Automatic"}, - @{parameter = "StartupType" ; value = "Boot"}, @{parameter = "StartupType" ; value = "Disabled"}, @{parameter = "StartupType" ; value = "Manual"}, - @{parameter = "StartupType" ; value = "System"}, @{parameter = "Status" ; value = "Running"}, @{parameter = "Status" ; value = "Stopped"}, @{parameter = "Status" ; value = "Paused"}, @@ -96,10 +104,8 @@ Describe "Set/New/Remove-Service cmdlet tests" -Tags "Feature", "RequireAdminOnW @{parameter = "DisplayName" ; value = "hello world"}, @{parameter = "Description" ; value = "this is a test"}, @{parameter = "StartupType" ; value = "Automatic"}, - @{parameter = "StartupType" ; value = "Boot"}, @{parameter = "StartupType" ; value = "Disabled"}, @{parameter = "StartupType" ; value = "Manual"}, - @{parameter = "StartupType" ; value = "System"}, @{parameter = "Credential" ; value = ( [System.Management.Automation.PSCredential]::new("username", #[SuppressMessage("Microsoft.Security", "CS002:SecretInNextLine", Justification="Demo/doc/test secret.")] @@ -235,6 +241,33 @@ Describe "Set/New/Remove-Service cmdlet tests" -Tags "Feature", "RequireAdminOnW { Remove-Service -Name "testremoveservice" -ErrorAction 'Stop' } | ShouldBeErrorId "InvalidOperationException,Microsoft.PowerShell.Commands.RemoveServiceCommand" } + It "Get-Service can get the '' of a service" -TestCases @( + @{property = "Description"; value = "This is a test description"} + @{property = "BinaryPathName"; value = "$PSHOME\powershell.exe";}, + @{property = "UserName"; value = $creds.UserName; parameters = @{ Credential = $creds }}, + @{property = "StartupType"; value = "AutomaticDelayedStart";} + ) { + param($property, $value, $parameters) + try { + $servicename = "testgetservice" + $startparameters = @{Name = $servicename; BinaryPathName = "$PSHOME\powershell.exe"} + if($parameters -ne $null) { + foreach($key in $parameters.Keys) { + $startparameters.$key = $parameters.$key + } + } else { + $startparameters.$property = $value + } + $service = New-Service @startparameters + $service | Should Not BeNullOrEmpty + $service = Get-Service -Name $servicename + $service.$property | Should BeExactly $value + } + finally { + Get-CimInstance Win32_Service -Filter "name='$servicename'" | Remove-CimInstance -ErrorAction SilentlyContinue + } + } + It "Set-Service can accept a ServiceController as pipeline input" { try { $servicename = "testsetservice" @@ -281,11 +314,11 @@ Describe "Set/New/Remove-Service cmdlet tests" -Tags "Feature", "RequireAdminOnW (ConvertTo-SecureString "PlainTextPassword" -AsPlainText -Force))); errorid = "CouldNotNewService,Microsoft.PowerShell.Commands.NewServiceCommand"}, @{cmdlet="New-Service"; name = 'badstarttype'; parameter = "StartupType"; value = "System"; - errorid = "CouldNotNewService,Microsoft.PowerShell.Commands.NewServiceCommand"}, + errorid = "CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.NewServiceCommand"}, @{cmdlet="New-Service"; name = 'winmgmt' ; parameter = "DisplayName"; value = "foo"; errorid = "CouldNotNewService,Microsoft.PowerShell.Commands.NewServiceCommand"}, @{cmdlet="Set-Service"; name = 'winmgmt' ; parameter = "StartupType"; value = "Boot"; - errorid = "CouldNotSetService,Microsoft.PowerShell.Commands.SetServiceCommand"} + errorid = "CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.SetServiceCommand"} ) { param($cmdlet, $name, $parameter, $value, $errorid) $parameters = @{$parameter = $value; Name = $name; ErrorAction = "Stop"} From 1702358e755ff357d1036730affc6ceeac4df2e6 Mon Sep 17 00:00:00 2001 From: Dongbo Wang Date: Tue, 24 Oct 2017 11:13:17 -0700 Subject: [PATCH 040/617] Update installation doc and README.md to include the powershell binary archive packages (#5212) * Update README.md * Update docs for powershell binary archive packages * Update the chart --- .spelling | 20 ++++- README.md | 16 +++- docs/installation/linux.md | 167 ++++++++++++++++++++--------------- docs/installation/windows.md | 11 ++- 4 files changed, 141 insertions(+), 73 deletions(-) diff --git a/.spelling b/.spelling index 9c3c046a124..fe3276e55ba 100644 --- a/.spelling +++ b/.spelling @@ -597,9 +597,27 @@ sample-dotnet2 #region docs/installation/linux.md Overrides - docs/installation/linux.md +compat-openssl10 +dockerfile +libc6 libcurl +libcurl3 +libgcc1 +libgssapi-krb5-2 +libicu +libicu52 +libicu55 +libicu57 +liblttng-ust0 +libssl1.0.0 +libssl1.0.2 +libstdc +libunwind +libunwind8 +libuuid1 +openssl-libs OpenSUSE -TravisEz13 +zlib1g zypper #endregion diff --git a/README.md b/README.md index f8924d4b579..aff51bfe0a2 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,15 @@ You can download and install a PowerShell package for any of the following platf | Many Linux distributions | [.AppImage][rl-ai] | [Instructions][in-appimage] | | macOS 10.12 | [.pkg][rl-macos] | [Instructions][in-macos] | | Docker | | [Instructions][in-docker] | -| Kali Linux | [.deb][rl-ubuntu16] | [Instructions][in-kali] +| Kali Linux | [.deb][rl-ubuntu16] | [Instructions][in-kali] | + +You can also download the PowerShell binary archives for Windows, macOS and Linux. + +| Platform | Downloads | How to Install | +| ------------ | ----------------------------------------------- | ------------------------------ | +| Windows | [32-bit][rl-winx86-zip]/[64-bit][rl-winx64-zip] | [Instructions][in-windows-zip] | +| macOS | [64-bit][rl-macos-tar] | [Instructions][in-tar] | +| Linux | [64-bit][rl-linux-tar] | [Instructions][in-tar] | [rl-windows-64]: https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.8/PowerShell-6.0.0-beta.8-win-x64.msi [rl-windows-86]: https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.8/PowerShell-6.0.0-beta.8-win-x86.msi @@ -55,6 +63,10 @@ You can download and install a PowerShell package for any of the following platf [rl-centos]: https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.8/powershell-6.0.0_beta.8-1.rhel.7.x86_64.rpm [rl-ai]: https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.8/PowerShell-6.0.0-beta.8-x86_64.AppImage [rl-macos]: https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.8/powershell-6.0.0-beta.8-osx.10.12-x64.pkg +[rl-winx86-zip]: https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.8/PowerShell-6.0.0-beta.8-win-x86.zip +[rl-winx64-zip]: https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.8/PowerShell-6.0.0-beta.8-win-x64.zip +[rl-macos-tar]: TBD +[rl-linux-tar]: TBD [installation]: docs/installation [in-windows]: docs/installation/windows.md#msi @@ -73,6 +85,8 @@ You can download and install a PowerShell package for any of the following platf [in-macos]: docs/installation/linux.md#macos-1012 [in-docker]: docker [in-kali]: docs/installation/linux.md#kali +[in-windows-zip]: docs/installation/windows.md#zip +[in-tar]: docs/installation/linux.md#binary-archives To install a specific version, visit [releases](https://github.com/PowerShell/PowerShell/releases). diff --git a/docs/installation/linux.md b/docs/installation/linux.md index 857c047cd9f..17adb68d64e 100644 --- a/docs/installation/linux.md +++ b/docs/installation/linux.md @@ -2,19 +2,15 @@ Supports [Ubuntu 14.04][u14], [Ubuntu 16.04][u16], [Ubuntu 17.04][u17], [Debian 8][deb8], [Debian 9][deb9], [CentOS 7][cos], [Red Hat Enterprise Linux (RHEL) 7][rhel7], [OpenSUSE 42.2][opensuse], [Fedora 25][fed25], -[Fedora 26][fed26], [Arch Linux][arch], [many Linux distributions (AppImage)][lai], and [macOS 10.12][mac]. -All packages are available on our GitHub [releases][] page. - -All of these steps can be done automatically by the [`download.sh`][download] script. -You should *never* run a script without reading it first! +[Fedora 26][fed26], [Arch Linux][arch], and [macOS 10.12][mac]. -Please **read the [download][] script first**, and then if you want to run it, use: +For Linux distributions that are not officially supported, +you can try using the [PowerShell AppImage][lai]. +You can also try deploying PowerShell binaries directly using the Linux [`tar.gz` archive][tar], +but you would need to set up the necessary dependencies based on the OS in separate steps. -```sh -bash <(curl -fsSL https://raw.githubusercontent.com/PowerShell/PowerShell/master/tools/download.sh) -``` - -Once the package is installed, run `powershell` from a terminal. +All packages are available on our GitHub [releases][] page. +Once the package is installed, run `pwsh` from a terminal. [u14]: #ubuntu-1404 [u16]: #ubuntu-1604 @@ -29,7 +25,7 @@ Once the package is installed, run `powershell` from a terminal. [arch]: #arch-linux [lai]: #linux-appimage [mac]: #macos-1012 -[download]: https://github.com/PowerShell/PowerShell/blob/master/tools/download.sh +[tar]: #binary-archives ## Ubuntu 14.04 @@ -52,7 +48,7 @@ sudo apt-get update sudo apt-get install -y powershell # Start PowerShell -powershell +pwsh ``` After registering the Microsoft repository once as superuser, @@ -102,7 +98,7 @@ sudo apt-get update sudo apt-get install -y powershell # Start PowerShell -powershell +pwsh ``` After registering the Microsoft repository once as superuser, @@ -152,7 +148,7 @@ sudo apt-get update sudo apt-get install -y powershell # Start PowerShell -powershell +pwsh ``` After registering the Microsoft repository once as superuser, @@ -206,7 +202,7 @@ sudo apt-get update sudo apt-get install -y powershell # Start PowerShell -powershell +pwsh ``` After registering the Microsoft repository once as superuser, @@ -260,7 +256,7 @@ sudo apt-get update sudo apt-get install -y powershell # Start PowerShell -powershell +pwsh ``` After registering the Microsoft repository once as superuser, @@ -305,7 +301,7 @@ curl https://packages.microsoft.com/config/rhel/7/prod.repo | sudo tee /etc/yum. sudo yum install -y powershell # Start PowerShell -powershell +pwsh ``` After registering the Microsoft repository once as superuser, @@ -351,7 +347,7 @@ curl https://packages.microsoft.com/config/rhel/7/prod.repo | sudo tee /etc/yum. sudo yum install -y powershell # Start PowerShell -powershell +pwsh ``` After registering the Microsoft repository once as superuser, @@ -406,7 +402,7 @@ sudo zypper update sudo zypper install powershell # Start PowerShell -powershell +pwsh ``` ### Installation via Direct Download - OpenSUSE 42.2 @@ -452,7 +448,7 @@ sudo dnf update sudo dnf install -y powershell # Start PowerShell -powershell +pwsh ``` ### Installation via Direct Download - Fedora 25 @@ -502,7 +498,7 @@ sudo dnf install compat-openssl10 sudo dnf install -y powershell # Start PowerShell -powershell +pwsh ``` ### Installation via Direct Download - Fedora 26 @@ -630,7 +626,7 @@ If you installed PowerShell via direct download, PowerShell must be removed manually: ```sh -sudo rm -rf /usr/local/bin/powershell /usr/local/microsoft/powershell +sudo rm -rf /usr/local/bin/pwsh /usr/local/microsoft/powershell ``` To uninstall the additional PowerShell paths (such as the user profile path) @@ -640,50 +636,6 @@ and remove the desired the paths with `sudo rm`. [paths]:#paths -### OpenSSL on macOS - -On macOS, .NET Core requires Homebrew's OpenSSL -because the "OpenSSL" system libraries on macOS are not OpenSSL, -as Apple deprecated OpenSSL in favor of their own libraries. -This requirement is not a hard requirement for all of PowerShell. -However, most networking functions (such as `Invoke-WebRequest`) -do require OpenSSL to work properly. - -The PowerShell formula for Homebrew includes this OpenSSL as a dependency, -so you if you installed via Homebrew, you shouldn't run into these problems. - -If you installed via direct download (or through some means other than Homebrew), -the easiest fix for these issues is to install [Homebrew's OpenSSL][openssl]: - -```bash -brew install openssl -brew install curl --with-openssl -``` - -**Please ignore** .NET Core's installation instructions to manually link the OpenSSL libraries. -This is **not** required for PowerShell as we patch .NET Core's cryptography libraries to find Homebrew's OpenSSL in its installed location. -Again, **do not** run `brew link --force` nor `ln -s` for OpenSSL, regardless of other instructions. - -Homebrew previously allowed OpenSSL libraries to be linked to the system library location; -however, this created major security holes and is [no longer allowed][homebrew-patch]. -Because .NET Core's 1.0.0 release libraries still look in the prior system location for OpenSSL, -they will fail to work unless the libraries are manually placed there (security risk), -or their libraries are patched (which we do). -To patch .NET Core's cryptography libraries, we use `install_name_tool`: - -```bash -find ~/.nuget -name System.Security.Cryptography.Native.dylib | xargs sudo install_name_tool -add_rpath /usr/local/opt/openssl/lib -find ~/.nuget -name System.Net.Http.Native.dylib | xargs sudo install_name_tool -change /usr/lib/libcurl.4.dylib /usr/local/opt/curl/lib/libcurl.4.dylib -``` - -This updates .NET Core's library to look in Homebrew's OpenSSL installation location instead of the system library location. -The PowerShell macOS package come with the necessary libraries patched, -and the build script patches the libraries on-the-fly when building from source. -You *can* run this command manually if you're having trouble with .NET Core's cryptography libraries. - -[openssl]: https://github.com/Homebrew/homebrew-core/blob/master/Formula/openssl.rb -[homebrew-patch]: https://github.com/Homebrew/brew/pull/597 - ## Kali ### Installation @@ -698,7 +650,7 @@ dpkg -i libssl1.0.0_1.0.1t-1+deb8u6_amd64.deb dpkg -i powershell_6.0.0-beta.8-1.ubuntu.16.04_amd64.deb # Start PowerShell -powershell +pwsh ``` ### Run PowerShell in latest Kali (Kali GNU/Linux Rolling) without installing it @@ -720,6 +672,83 @@ chmod a+x powershell-6.0.0-beta.8-x86_64.AppImage dpkg -r powershell_6.0.0-beta.8-1.ubuntu.16.04_amd64.deb ``` +## Binary Archives + +PowerShell binary `tar.gz` archives are provided for macOS and Linux platforms to enable advanced deployment scenarios. + +### Dependencies + +For Linux, PowerShell builds portable binaries for all Linux distributions. +But .NET Core runtime requires different dependencies on different distributions, +and hence PowerShell does the same. + +The following chart shows the .NET Core 2.0 dependencies on different Linux distributions that are officially supported. + +| OS | Dependencies | +| ------------------ | ------------ | +| Ubuntu 14.04 | libc6, libgcc1, libgssapi-krb5-2, liblttng-ust0, libstdc++6,
    libcurl3, libunwind8, libuuid1, zlib1g, libssl1.0.0, libicu52 | +| Ubuntu 16.04 | libc6, libgcc1, libgssapi-krb5-2, liblttng-ust0, libstdc++6,
    libcurl3, libunwind8, libuuid1, zlib1g, libssl1.0.0, libicu55 | +| Ubuntu 17.04 | libc6, libgcc1, libgssapi-krb5-2, liblttng-ust0, libstdc++6,
    libcurl3, libunwind8, libuuid1, zlib1g, libssl1.0.0, libicu57 | +| Debian 8 (Jessie) | libc6, libgcc1, libgssapi-krb5-2, liblttng-ust0, libstdc++6,
    libcurl3, libunwind8, libuuid1, zlib1g, libssl1.0.0, libicu52 | +| Debian 9 (Stretch) | libc6, libgcc1, libgssapi-krb5-2, liblttng-ust0, libstdc++6,
    libcurl3, libunwind8, libuuid1, zlib1g, libssl1.0.2, libicu57 | +| CentOS 7
    Oracle Linux 7
    RHEL 7
    OpenSUSE 42.2
    Fedora 25 | libunwind, libcurl, openssl-libs, libicu | +| Fedora 26 | libunwind, libcurl, openssl-libs, libicu, compat-openssl10 | + +In order to deploy PowerShell binaries on Linux distributions that are not officially supported, +you would need to install the necessary dependencies for the target OS in separate steps. +For example, our [Amazon Linux dockerfile][amazon-dockerfile] installs dependencies first, +and then extracts the Linux `tar.gz` archive. + +[amazon-dockerfile]: https://github.com/PowerShell/PowerShell/blob/master/docker/community/amazonlinux/Dockerfile + +### Installation - Binary Archives + +#### Linux + +```sh +# Download the powershell '.tar.gz' archive +curl -L -o /tmp/powershell.tar.gz https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.9/powershell-6.0.0-beta.9-linux-x64.tar.gz + +# Create the target folder where powershell will be placed +sudo mkdir -p /opt/microsoft/powershell/6.0.0-beta.9 + +# Expand powershell to the target folder +sudo tar zxf /tmp/powershell.tar.gz -C /opt/microsoft/powershell/6.0.0-beta.9 + +# Create the symbolic link that points to pwsh +sudo ln -s /opt/microsoft/powershell/6.0.0-beta.9/pwsh /usr/bin/pwsh +``` + +#### macOS + +```sh +# Download the powershell '.tar.gz' archive +curl -L -o /tmp/powershell.tar.gz https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.9/powershell-6.0.0-beta.9-osx-x64.tar.gz + +# Create the target folder where powershell will be placed +sudo mkdir -p /usr/local/microsoft/powershell/6.0.0-beta.9 + +# Expand powershell to the target folder +sudo tar zxf /tmp/powershell.tar.gz -C /usr/local/microsoft/powershell/6.0.0-beta.9 + +# Create the symbolic link that points to pwsh +sudo ln -s /usr/local/microsoft/powershell/6.0.0-beta.9/pwsh /usr/local/bin/pwsh +``` + +### Uninstallation - Binary Archives + +#### Linux + +```sh +sudo rm -rf /usr/bin/pwsh /opt/microsoft/powershell +``` + +#### macOS + +```sh +sudo rm -rf /usr/local/bin/pwsh /usr/local/microsoft/powershell +``` + ## Paths * `$PSHOME` is `/opt/microsoft/powershell/6.0.0-beta.8/` @@ -738,7 +767,7 @@ On Linux and macOS, the [XDG Base Directory Specification][xdg-bds] is respected Note that because macOS is a derivation of BSD, instead of `/opt`, the prefix used is `/usr/local`. Thus, `$PSHOME` is `/usr/local/microsoft/powershell/6.0.0-beta.8/`, -and the symlink is placed at `/usr/local/bin/powershell`. +and the symlink is placed at `/usr/local/bin/pwsh`. [releases]: https://github.com/PowerShell/PowerShell/releases/latest [xdg-bds]: https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html diff --git a/docs/installation/windows.md b/docs/installation/windows.md index 47a307aae88..c26bcd32bdd 100644 --- a/docs/installation/windows.md +++ b/docs/installation/windows.md @@ -10,7 +10,7 @@ Once downloaded, double-click the installer and follow the prompts. There is a shortcut placed in the Start Menu upon installation. * By default the package is installed to `$env:ProgramFiles\PowerShell\` -* You can launch PowerShell via the Start Menu or `$env:ProgramFiles\PowerShell\powershell.exe` +* You can launch PowerShell via the Start Menu or `$env:ProgramFiles\PowerShell\pwsh.exe` ### Prerequisites @@ -23,6 +23,13 @@ To enable PowerShell remoting over WinRM, the following prerequisites need to be or newer ([5.0](https://www.microsoft.com/download/details.aspx?id=50395), [5.1](https://www.microsoft.com/download/details.aspx?id=54616)) on Windows 7. +## ZIP + +PowerShell binary ZIP archives are provided to enable advanced deployment scenarios. +Be noted that when using the ZIP archive, you won't get the prerequisites check as in the MSI package. +So in order for remoting over WinRM to work properly on Windows versions prior to Windows 10, +you need to make sure the [prerequisites](#prerequisites) are met. + ## Deploying on Nano Server These instructions assume that Windows PowerShell is running on the Nano Server image and that it has been generated by the [Nano Server Image Builder](https://technet.microsoft.com/windows-server-docs/get-started/deploy-nano-server). @@ -142,4 +149,4 @@ We publish an archive with CoreCLR bits on every CI build with [AppVeyor][]. * Unblock zip file: right-click in File Explorer -> Properties -> check 'Unblock' box -> apply * Extract zip file to `bin` directory -* `./bin/powershell.exe` +* `./bin/pwsh.exe` From d0806811e4dd08c57de448f201102e8d584a6f53 Mon Sep 17 00:00:00 2001 From: Aditya Patwardhan Date: Tue, 24 Oct 2017 16:28:22 -0700 Subject: [PATCH 041/617] Update docs and scripts for beta.9 (#5217) --- build.psm1 | 4 +- docker/InstallTarballPackage.sh | 2 +- docker/community/amazonlinux/Dockerfile | 6 +- docker/release/centos7/Dockerfile | 4 +- docker/release/fedora25/Dockerfile | 4 +- docker/release/fedora26/Dockerfile | 4 +- docker/release/nanoserver-insider/Dockerfile | 4 +- docker/release/nanoserver/Dockerfile | 4 +- docker/release/opensuse42.2/Dockerfile | 4 +- docker/release/ubuntu14.04/Dockerfile | 6 +- docker/release/ubuntu16.04/Dockerfile | 4 +- docker/release/windowsservercore/Dockerfile | 4 +- docs/installation/linux.md | 74 ++++++++++---------- tools/download.sh | 12 ++-- 14 files changed, 68 insertions(+), 68 deletions(-) diff --git a/build.psm1 b/build.psm1 index 43abc2d8c79..43124942bba 100644 --- a/build.psm1 +++ b/build.psm1 @@ -372,7 +372,7 @@ function Start-PSBuild { } function Stop-DevPowerShell { - Get-Process powershell* | + Get-Process pwsh* | Where-Object { $_.Modules | Where-Object { @@ -1597,7 +1597,7 @@ function Start-DevPowerShell { # splatting for the win $startProcessArgs = @{ - FilePath = "$binDir\powershell" + FilePath = "$binDir\pwsh" ArgumentList = "$ArgumentList" } diff --git a/docker/InstallTarballPackage.sh b/docker/InstallTarballPackage.sh index 6b09b787f81..1bc807a0b92 100644 --- a/docker/InstallTarballPackage.sh +++ b/docker/InstallTarballPackage.sh @@ -5,7 +5,7 @@ set -e # # Example use: -# ./InstallTarballPackage.sh "6.0.0-beta.8" "powershell-6.0.0-beta.8-linux-x64.tar.gz" +# ./InstallTarballPackage.sh "6.0.0-beta.9" "powershell-6.0.0-beta.9-linux-x64.tar.gz" # usage() { echo "usage: $0 " diff --git a/docker/community/amazonlinux/Dockerfile b/docker/community/amazonlinux/Dockerfile index 02b98e59c76..423a9404e6c 100644 --- a/docker/community/amazonlinux/Dockerfile +++ b/docker/community/amazonlinux/Dockerfile @@ -2,8 +2,8 @@ FROM amazonlinux:latest -ARG POWERSHELL_VERSION=6.0.0-beta.8 -ARG POWERSHELL_PACKAGE=powershell-6.0.0-beta.8-linux-x64.tar.gz +ARG POWERSHELL_VERSION=6.0.0-beta.9 +ARG POWERSHELL_PACKAGE=powershell-6.0.0-beta.9-linux-x64.tar.gz ARG IMAGE_NAME=microsoft/powershell:amazonlinux LABEL maintainer="PowerShell Team " \ @@ -29,7 +29,7 @@ ENV LC_ALL $LANG RUN localedef --charmap=UTF-8 --inputfile=en_US $LANG # Install dependencies and clean up -RUN yum install -y \ +RUN yum install -y \ curl \ libunwind \ libicu \ diff --git a/docker/release/centos7/Dockerfile b/docker/release/centos7/Dockerfile index 0a5eda16980..20a8bfd6a2e 100644 --- a/docker/release/centos7/Dockerfile +++ b/docker/release/centos7/Dockerfile @@ -2,7 +2,7 @@ FROM centos:7 -ARG POWERSHELL_VERSION=6.0.0-beta.8 +ARG POWERSHELL_VERSION=6.0.0-beta.9 ARG IMAGE_NAME=microsoft/powershell:centos7 LABEL maintainer="PowerShell Team " \ @@ -29,7 +29,7 @@ ENV LC_ALL $LANG RUN localedef --charmap=UTF-8 --inputfile=en_US $LANG # Install dependencies and clean up -RUN yum install -y \ +RUN yum install -y \ curl \ && yum clean all diff --git a/docker/release/fedora25/Dockerfile b/docker/release/fedora25/Dockerfile index 3a9e0da8865..a66589caa88 100644 --- a/docker/release/fedora25/Dockerfile +++ b/docker/release/fedora25/Dockerfile @@ -2,7 +2,7 @@ FROM fedora:25 -ARG POWERSHELL_VERSION=6.0.0-beta.8 +ARG POWERSHELL_VERSION=6.0.0-beta.9 ARG IMAGE_NAME=microsoft/powershell:fedora25 LABEL maintainer="PowerShell Team " \ @@ -23,7 +23,7 @@ LABEL maintainer="PowerShell Team " \ # TODO: addd LABEL org.label-schema.vcs-ref=${VCS_REF} # Install dependencies and clean up -RUN dnf install -y \ +RUN dnf install -y \ curl \ glibc-locale-source \ && dnf clean all diff --git a/docker/release/fedora26/Dockerfile b/docker/release/fedora26/Dockerfile index 212fcbbf931..c0f161825e8 100644 --- a/docker/release/fedora26/Dockerfile +++ b/docker/release/fedora26/Dockerfile @@ -2,7 +2,7 @@ FROM fedora:26 -ARG POWERSHELL_VERSION=6.0.0-beta.8 +ARG POWERSHELL_VERSION=6.0.0-beta.9 ARG IMAGE_NAME=microsoft/powershell:fedora26 LABEL maintainer="PowerShell Team " \ @@ -23,7 +23,7 @@ LABEL maintainer="PowerShell Team " \ # TODO: addd LABEL org.label-schema.vcs-ref=${VCS_REF} # Install dependencies and clean up -RUN dnf install -y \ +RUN dnf install -y \ curl \ glibc-locale-source \ && dnf clean all diff --git a/docker/release/nanoserver-insider/Dockerfile b/docker/release/nanoserver-insider/Dockerfile index b4ca7f8198e..1146233b52a 100755 --- a/docker/release/nanoserver-insider/Dockerfile +++ b/docker/release/nanoserver-insider/Dockerfile @@ -10,7 +10,7 @@ ARG NanoServerRepo=microsoft/nanoserver-insider FROM ${WindowsServerCoreRepo}:$WindowsServerCoreVersion AS installer-env # Arguments for installing powershell, must be defined in the container they are used -ARG PS_VERSION=6.0.0-beta.8 +ARG PS_VERSION=6.0.0-beta.9 ENV PS_DOWNLOAD_URL https://github.com/PowerShell/PowerShell/releases/download/v$PS_VERSION/PowerShell-$PS_VERSION-win-x64.zip @@ -23,7 +23,7 @@ RUN Expand-Archive powershell.zip -DestinationPath \PowerShell FROM ${NanoServerRepo}:$NanoServerVersion ARG VCS_REF="none" -ARG PS_VERSION=6.0.0-beta.8 +ARG PS_VERSION=6.0.0-beta.9 ARG IMAGE_NAME=microsoft/nanoserver-insider-powershell LABEL maintainer="PowerShell Team " ` diff --git a/docker/release/nanoserver/Dockerfile b/docker/release/nanoserver/Dockerfile index 713d1a4f5df..34f791428b2 100644 --- a/docker/release/nanoserver/Dockerfile +++ b/docker/release/nanoserver/Dockerfile @@ -1,8 +1,8 @@ # escape=` FROM microsoft/nanoserver:latest -ARG POWERSHELL_ZIP=https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.8/PowerShell-6.0.0-beta.8-win-x64.zip -ARG POWERSHELL_VERSION=6.0.0-beta.8 +ARG POWERSHELL_ZIP=https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.9/PowerShell-6.0.0-beta.9-win-x64.zip +ARG POWERSHELL_VERSION=6.0.0-beta.9 ARG IMAGE_NAME=microsoft/powershell:nanoserver LABEL maintainer="PowerShell Team " ` diff --git a/docker/release/opensuse42.2/Dockerfile b/docker/release/opensuse42.2/Dockerfile index aed080377b7..c365b1020c9 100644 --- a/docker/release/opensuse42.2/Dockerfile +++ b/docker/release/opensuse42.2/Dockerfile @@ -2,8 +2,8 @@ FROM opensuse:42.2 -ARG POWERSHELL_VERSION=6.0.0-beta.8 -ARG POWERSHELL_PACKAGE=powershell-6.0.0-beta.8-linux-x64.tar.gz +ARG POWERSHELL_VERSION=6.0.0-beta.9 +ARG POWERSHELL_PACKAGE=powershell-6.0.0-beta.9-linux-x64.tar.gz ARG IMAGE_NAME=microsoft/powershell:opensuse42.2 LABEL maintainer="PowerShell Team " \ diff --git a/docker/release/ubuntu14.04/Dockerfile b/docker/release/ubuntu14.04/Dockerfile index 4b2ed102754..334e6be2149 100644 --- a/docker/release/ubuntu14.04/Dockerfile +++ b/docker/release/ubuntu14.04/Dockerfile @@ -2,7 +2,7 @@ FROM ubuntu:trusty -ARG POWERSHELL_VERSION=6.0.0-beta.8 +ARG POWERSHELL_VERSION=6.0.0-beta.9 ARG IMAGE_NAME=microsoft/powershell:ubuntu14.04 LABEL maintainer="PowerShell Team " \ @@ -33,12 +33,12 @@ RUN apt-get update \ apt-utils \ ca-certificates \ curl \ - apt-transport-https \ + apt-transport-https \ && rm -rf /var/lib/apt/lists/* # Import the public repository GPG keys for Microsoft RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - - + # Register the Microsoft Ubuntu 14.04 repository RUN curl https://packages.microsoft.com/config/ubuntu/14.04/prod.list | tee /etc/apt/sources.list.d/microsoft.list diff --git a/docker/release/ubuntu16.04/Dockerfile b/docker/release/ubuntu16.04/Dockerfile index 13c132e9be7..b5a9faf53ea 100644 --- a/docker/release/ubuntu16.04/Dockerfile +++ b/docker/release/ubuntu16.04/Dockerfile @@ -2,7 +2,7 @@ FROM ubuntu:xenial -ARG POWERSHELL_VERSION=6.0.0-beta.8 +ARG POWERSHELL_VERSION=6.0.0-beta.9 ARG IMAGE_NAME=microsoft/powershell:ubuntu16.04 LABEL maintainer="PowerShell Team " \ @@ -39,7 +39,7 @@ RUN locale-gen $LANG && update-locale # Import the public repository GPG keys for Microsoft RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - - + # Register the Microsoft Ubuntu 16.04 repository RUN curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list | tee /etc/apt/sources.list.d/microsoft.list diff --git a/docker/release/windowsservercore/Dockerfile b/docker/release/windowsservercore/Dockerfile index ce4e1663363..3157356c374 100644 --- a/docker/release/windowsservercore/Dockerfile +++ b/docker/release/windowsservercore/Dockerfile @@ -1,8 +1,8 @@ # escape=` FROM microsoft/windowsservercore:latest -ARG POWERSHELL_MSI=https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.8/PowerShell-6.0.0-beta.8-win-x64.msi -ARG POWERSHELL_VERSION=6.0.0-beta.8 +ARG POWERSHELL_MSI=https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.9/PowerShell-6.0.0-beta.9-win-x64.msi +ARG POWERSHELL_VERSION=6.0.0-beta.9 ARG IMAGE_NAME=microsoft/powershell:windowsservercore LABEL maintainer="PowerShell Team " ` diff --git a/docs/installation/linux.md b/docs/installation/linux.md index 17adb68d64e..67e08e5e965 100644 --- a/docs/installation/linux.md +++ b/docs/installation/linux.md @@ -57,13 +57,13 @@ from then on, you just need to use `sudo apt-get upgrade powershell` to update i ### Installation via Direct Download - Ubuntu 14.04 Download the Debian package -`powershell_6.0.0-beta.8-1.ubuntu.14.04_amd64.deb` +`powershell_6.0.0-beta.9-1.ubuntu.14.04_amd64.deb` from the [releases][] page onto the Ubuntu machine. Then execute the following in the terminal: ```sh -sudo dpkg -i powershell_6.0.0-beta.8-1.ubuntu.14.04_amd64.deb +sudo dpkg -i powershell_6.0.0-beta.9-1.ubuntu.14.04_amd64.deb sudo apt-get install -f ``` @@ -107,13 +107,13 @@ from then on, you just need to use `sudo apt-get upgrade powershell` to update i ### Installation via Direct Download - Ubuntu 16.04 Download the Debian package -`powershell_6.0.0-beta.8-1.ubuntu.16.04_amd64.deb` +`powershell_6.0.0-beta.9-1.ubuntu.16.04_amd64.deb` from the [releases][] page onto the Ubuntu machine. Then execute the following in the terminal: ```sh -sudo dpkg -i powershell_6.0.0-beta.8-1.ubuntu.16.04_amd64.deb +sudo dpkg -i powershell_6.0.0-beta.9-1.ubuntu.16.04_amd64.deb sudo apt-get install -f ``` @@ -157,13 +157,13 @@ from then on, you just need to use `sudo apt-get upgrade powershell` to update i ### Installation via Direct Download - Ubuntu 17.04 Download the Debian package -`powershell_6.0.0-beta.8-1.ubuntu.17.04_amd64.deb` +`powershell_6.0.0-beta.9-1.ubuntu.17.04_amd64.deb` from the [releases][] page onto the Ubuntu machine. Then execute the following in the terminal: ```sh -sudo dpkg -i powershell_6.0.0-beta.8-1.ubuntu.17.04_amd64.deb +sudo dpkg -i powershell_6.0.0-beta.9-1.ubuntu.17.04_amd64.deb sudo apt-get install -f ``` @@ -211,13 +211,13 @@ from then on, you just need to use `sudo apt-get upgrade powershell` to update i ### Installation via Direct Download - Debian 8 Download the Debian package -`powershell_6.0.0-beta.8-1.debian.8_amd64.deb` +`powershell_6.0.0-beta.9-1.debian.8_amd64.deb` from the [releases][] page onto the Debian machine. Then execute the following in the terminal: ```sh -sudo dpkg -i powershell_6.0.0-beta.8-1.debian.8_amd64.deb +sudo dpkg -i powershell_6.0.0-beta.9-1.debian.8_amd64.deb sudo apt-get install -f ``` @@ -265,13 +265,13 @@ from then on, you just need to use `sudo apt-get upgrade powershell` to update i ### Installation via Direct Download - Debian 9 Download the Debian package -`powershell_6.0.0-beta.8-1.debian.9_amd64.deb` +`powershell_6.0.0-beta.9-1.debian.9_amd64.deb` from the [releases][] page onto the Debian machine. Then execute the following in the terminal: ```sh -sudo dpkg -i powershell_6.0.0-beta.8-1.debian.9_amd64.deb +sudo dpkg -i powershell_6.0.0-beta.9-1.debian.9_amd64.deb sudo apt-get install -f ``` @@ -310,19 +310,19 @@ you just need to use `sudo yum update powershell` to update PowerShell. ### Installation via Direct Download - CentOS 7 Using [CentOS 7][], download the RPM package -`powershell-6.0.0_beta.8-1.rhel.7.x86_64.rpm` +`powershell-6.0.0_beta.9-1.rhel.7.x86_64.rpm` from the [releases][] page onto the CentOS machine. Then execute the following in the terminal: ```sh -sudo yum install powershell-6.0.0_beta.8-1.rhel.7.x86_64.rpm +sudo yum install powershell-6.0.0_beta.9-1.rhel.7.x86_64.rpm ``` You can also install the RPM without the intermediate step of downloading it: ```sh -sudo yum install https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.8/powershell-6.0.0_beta.8-1.rhel.7.x86_64.rpm +sudo yum install https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.9/powershell-6.0.0_beta.9-1.rhel.7.x86_64.rpm ``` ### Uninstallation - CentOS 7 @@ -356,19 +356,19 @@ you just need to use `sudo yum update powershell` to update PowerShell. ### Installation via Direct Download - Red Hat Enterprise Linux (RHEL) 7 Download the RPM package -`powershell-6.0.0_beta.8-1.rhel.7.x86_64.rpm` +`powershell-6.0.0_beta.9-1.rhel.7.x86_64.rpm` from the [releases][] page onto the Red Hat Enterprise Linux machine. Then execute the following in the terminal: ```sh -sudo yum install powershell-6.0.0_beta.8-1.rhel.7.x86_64.rpm +sudo yum install powershell-6.0.0_beta.9-1.rhel.7.x86_64.rpm ``` You can also install the RPM without the intermediate step of downloading it: ```sh -sudo yum install https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.8/powershell-6.0.0_beta.8-1.rhel.7.x86_64.rpm +sudo yum install https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.9/powershell-6.0.0_beta.9-1.rhel.7.x86_64.rpm ``` ### Uninstallation - Red Hat Enterprise Linux (RHEL) 7 @@ -407,19 +407,19 @@ pwsh ### Installation via Direct Download - OpenSUSE 42.2 -Download the RPM package `powershell-6.0.0_beta.8-1.rhel.7.x86_64.rpm` +Download the RPM package `powershell-6.0.0_beta.9-1.rhel.7.x86_64.rpm` from the [releases][] page onto the OpenSUSE machine. ```sh sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc -sudo zypper install powershell-6.0.0_beta.8-1.rhel.7.x86_64.rpm +sudo zypper install powershell-6.0.0_beta.9-1.rhel.7.x86_64.rpm ``` You can also install the RPM without the intermediate step of downloading it: ```sh sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc -sudo zypper install https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.8/powershell-6.0.0_beta.8-1.rhel.7.x86_64.rpm +sudo zypper install https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.9/powershell-6.0.0_beta.9-1.rhel.7.x86_64.rpm ``` ### Uninstallation - OpenSUSE 42.2 @@ -454,19 +454,19 @@ pwsh ### Installation via Direct Download - Fedora 25 Download the RPM package -`powershell-6.0.0_beta.8-1.rhel.7.x86_64.rpm` +`powershell-6.0.0_beta.9-1.rhel.7.x86_64.rpm` from the [releases][] page onto the Red Hat Enterprise Linux machine. Then execute the following in the terminal: ```sh -sudo dnf install powershell-6.0.0_beta.8-1.rhel.7.x86_64.rpm +sudo dnf install powershell-6.0.0_beta.9-1.rhel.7.x86_64.rpm ``` You can also install the RPM without the intermediate step of downloading it: ```sh -sudo dnf install https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.8/powershell-6.0.0_beta.8-1.rhel.7.x86_64.rpm +sudo dnf install https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.9/powershell-6.0.0_beta.9-1.rhel.7.x86_64.rpm ``` ### Uninstallation - Fedora 25 @@ -504,7 +504,7 @@ pwsh ### Installation via Direct Download - Fedora 26 Download the RPM package -`powershell-6.0.0_beta.8-1.rhel.7.x86_64.rpm` +`powershell-6.0.0_beta.9-1.rhel.7.x86_64.rpm` from the [releases][] page onto the Red Hat Enterprise Linux machine. Then execute the following in the terminal: @@ -512,7 +512,7 @@ Then execute the following in the terminal: ```sh sudo dnf update sudo dnf install compat-openssl10 -sudo dnf install powershell-6.0.0_beta.8-1.rhel.7.x86_64.rpm +sudo dnf install powershell-6.0.0_beta.9-1.rhel.7.x86_64.rpm ``` You can also install the RPM without the intermediate step of downloading it: @@ -520,7 +520,7 @@ You can also install the RPM without the intermediate step of downloading it: ```sh sudo dnf update sudo dnf install compat-openssl10 -sudo dnf install https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.8/powershell-6.0.0_beta.8-1.rhel.7.x86_64.rpm +sudo dnf install https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.9/powershell-6.0.0_beta.9-1.rhel.7.x86_64.rpm ``` ### Uninstallation - Fedora 26 @@ -549,14 +549,14 @@ For more information on installing packages from the AUR, see the [Arch Linux wi ## Linux AppImage Using a recent Linux distribution, -download the AppImage `powershell-6.0.0-beta.8-x86_64.AppImage` +download the AppImage `powershell-6.0.0-beta.9-x86_64.AppImage` from the [releases][] page onto the Linux machine. Then execute the following in the terminal: ```bash -chmod a+x powershell-6.0.0-beta.8-x86_64.AppImage -./powershell-6.0.0-beta.8-x86_64.AppImage +chmod a+x powershell-6.0.0-beta.9-x86_64.AppImage +./powershell-6.0.0-beta.9-x86_64.AppImage ``` The [AppImage][] lets you run PowerShell without installing it. @@ -604,14 +604,14 @@ brew cask reinstall powershell ### Installation via Direct Download - macOS 10.12 Using macOS 10.12, download the PKG package -`powershell-6.0.0-beta.8-osx.10.12-x64.pkg` +`powershell-6.0.0-beta.9-osx.10.12-x64.pkg` from the [releases][] page onto the macOS machine. Either double-click the file and follow the prompts, or install it from the terminal: ```sh -sudo installer -pkg powershell-6.0.0-beta.8-osx.10.12-x64.pkg -target / +sudo installer -pkg powershell-6.0.0-beta.9-osx.10.12-x64.pkg -target / ``` ### Uninstallation - macOS 10.12 @@ -647,7 +647,7 @@ wget http://security.debian.org/debian-security/pool/updates/main/o/openssl/libs dpkg -i libssl1.0.0_1.0.1t-1+deb8u6_amd64.deb # Install PowerShell -dpkg -i powershell_6.0.0-beta.8-1.ubuntu.16.04_amd64.deb +dpkg -i powershell_6.0.0-beta.9-1.ubuntu.16.04_amd64.deb # Start PowerShell pwsh @@ -657,19 +657,19 @@ pwsh ```sh # Grab the latest App Image -wget https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.8/powershell-6.0.0-beta.8-x86_64.AppImage +wget https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.9/powershell-6.0.0-beta.9-x86_64.AppImage # Make executable -chmod a+x powershell-6.0.0-beta.8-x86_64.AppImage +chmod a+x powershell-6.0.0-beta.9-x86_64.AppImage # Start PowerShell -./powershell-6.0.0-beta.8-x86_64.AppImage +./powershell-6.0.0-beta.9-x86_64.AppImage ``` ### Uninstallation - Kali ```sh -dpkg -r powershell_6.0.0-beta.8-1.ubuntu.16.04_amd64.deb +dpkg -r powershell_6.0.0-beta.9-1.ubuntu.16.04_amd64.deb ``` ## Binary Archives @@ -751,7 +751,7 @@ sudo rm -rf /usr/local/bin/pwsh /usr/local/microsoft/powershell ## Paths -* `$PSHOME` is `/opt/microsoft/powershell/6.0.0-beta.8/` +* `$PSHOME` is `/opt/microsoft/powershell/6.0.0-beta.9/` * User profiles will be read from `~/.config/powershell/profile.ps1` * Default profiles will be read from `$PSHOME/profile.ps1` * User modules will be read from `~/.local/share/powershell/Modules` @@ -766,7 +766,7 @@ On Linux and macOS, the [XDG Base Directory Specification][xdg-bds] is respected Note that because macOS is a derivation of BSD, instead of `/opt`, the prefix used is `/usr/local`. -Thus, `$PSHOME` is `/usr/local/microsoft/powershell/6.0.0-beta.8/`, +Thus, `$PSHOME` is `/usr/local/microsoft/powershell/6.0.0-beta.9/`, and the symlink is placed at `/usr/local/bin/pwsh`. [releases]: https://github.com/PowerShell/PowerShell/releases/latest diff --git a/tools/download.sh b/tools/download.sh index 277ca325af8..30230f97c97 100755 --- a/tools/download.sh +++ b/tools/download.sh @@ -13,7 +13,7 @@ get_url() { } fork="PowerShell" -release=v6.0.0-beta.8 +release=v6.0.0-beta.9 # Get OS specific asset ID and package name case "$OSTYPE" in linux*) @@ -26,7 +26,7 @@ case "$OSTYPE" in sudo yum install -y curl fi - powershell-6.0.0_beta.8-1.rhel.7.x86_64.rpm + powershell-6.0.0_beta.9-1.rhel.7.x86_64.rpm ;; ubuntu) if ! hash curl 2>/dev/null; then @@ -36,10 +36,10 @@ case "$OSTYPE" in case "$VERSION_ID" in 14.04) - package=powershell_6.0.0-beta.8-1.ubuntu.14.04_amd64.deb + package=powershell_6.0.0-beta.9-1.ubuntu.14.04_amd64.deb ;; 16.04) - package=powershell_6.0.0-beta.8-1.ubuntu.16.04_amd64.deb + package=powershell_6.0.0-beta.9-1.ubuntu.16.04_amd64.deb ;; *) echo "Ubuntu $VERSION_ID is not supported!" >&2 @@ -52,7 +52,7 @@ case "$OSTYPE" in sudo zypper install -y curl fi - + case "$VERSION_ID" in 42.1) package=powershell-6.0.0_beta.6-1.suse.42.1.x86_64.rpm @@ -70,7 +70,7 @@ case "$OSTYPE" in ;; darwin*) # We don't check for curl as macOS should have a system version - package=powershell-6.0.0-beta.8-osx.10.12-x64.pkg + package=powershell-6.0.0-beta.9-osx.10.12-x64.pkg ;; *) echo "$OSTYPE is not supported!" >&2 From 44f0296f85b653c327a0a4f6268fbe2f3a0756fd Mon Sep 17 00:00:00 2001 From: Dongbo Wang Date: Tue, 24 Oct 2017 17:35:13 -0700 Subject: [PATCH 042/617] Update ChangeLog for beta.9 release (#5216) --- .spelling | 17 ++++++++- CHANGELOG.md | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 116 insertions(+), 2 deletions(-) diff --git a/.spelling b/.spelling index fe3276e55ba..6ad047837fd 100644 --- a/.spelling +++ b/.spelling @@ -237,6 +237,7 @@ beta.4 beta.5 beta.6 beta.8 +beta.9 binding bool CDXML @@ -245,6 +246,7 @@ CI cleanup CodeMethod CodeOwner +codepage CommandNotFoundException ContentType ConvertTo-Html @@ -252,11 +254,14 @@ CoreConsoleHost crossgen'ing DarwinJS dchristian3188 +DdWr deserialization deserialize +dlwyatt +dotnet enums -ExecutionPolicy EXE's +ExecutionPolicy FileCatalog FilterHashtable foreach @@ -280,9 +285,11 @@ KeyHandler KirkMunro kittholland kwiknick +kylesferrazza LDSpits Lee303 libpsl-native +libunwind8 LoadFrom markekraus meta @@ -295,6 +302,7 @@ nanoserver-insider non-22 non-CIM non-R2 +OAuth oising oneget.org PetSerAl @@ -310,9 +318,10 @@ PSScriptAnalyzer PSVersion PVS-Studio Pwrshplughin.dll +raghav710 +Raspbian rc2-24027 rc3-24011 -Raspbian README.md RelationLink richardszalay @@ -330,14 +339,17 @@ system.manage Tadas TestCase TheFlyingCorpse +thezim TimCurwick timestamp TimeZone TPA Travis +travisty TTY's UserAgent UserData +UserVoice Utf8 UTF8NoBOM v0.1.0 @@ -351,6 +363,7 @@ ValidateNotNullOrEmpty WebListener WebRequest win7-x86 +Windos WindowsVersion WSManCredSSP XPath diff --git a/CHANGELOG.md b/CHANGELOG.md index 59b29f0d108..91da202109b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,106 @@ # Changelog +## v6.0.0-beta.9 - 2017-10-24 + +### Breaking changes + +- Fix `ValueFromRemainingArguments` to have consistent behavior between script and C# cmdlets. (#2038) (Thanks @dlwyatt) +- Remove parameters `-importsystemmodules` and `-psconsoleFile` from `powershell.exe`. (#4995) +- Removed code to show a GUI prompt for credentials as PowerShell Core prompts in console. (#4995) +- Remove `-ComputerName` from `Get/Set/Remove-Service`. (#5094) +- Rename the executable name from `powershell` to `pwsh`. (#5101) +- Remove `RunspaceConfiguration` support. (#4942) +- Remove `-ComputerName` support since .NET Core `Process.GetProcesses(computer)` returns local processes. (#4960) +- Make `-NoTypeInformation` the default on `Export-Csv` and `ConvertTo-Csv`. (#5164) (Thanks @markekraus) +- Unify cmdlets with parameter `-Encoding` to be of type `System.Text.Encoding`. (#5080) + +### Engine updates and fixes + +- Fix PowerShell to update the `PATH` environment variable only if `PATH` exists. (#5021) +- Enable support of folders and files with colon in name on Unix. (#4959) +- Fix detection of whether `-LiteralPath` was used to suppress wildcard expansion for navigation cmdlets. (#5038) +- Enable using filesystem from a UNC location. (#4998) +- Escape trailing backslash when dealing with native command arguments. (#4965) +- Change location of `ModuleAnalysisCache` so it isn't shared with Windows PowerShell. (#5133) +- Put command discovery before scripts for Unix. (#5116) + +### General cmdlet updates and fixes + +- Correct comma position in `SecureStringCommands.resx`. (#5033) (Thanks @markekraus) +- User Agent of Web Cmdlets now reports the OS platform (#4937) (Thanks @LDSpits) +- Add the positional parameter attribute to `-InputObject` for `Set-Service`. (#5017) (Thanks @travisty-) +- Add `ValidateNotNullOrEmpty` attribute to `-UFormat` for `Get-Date`. (#5055) (Thanks @DdWr) +- Add `-NoNewLine` switch for `Out-String`. (#5056) (Thanks @raghav710) +- Improve progress messages written by Web Cmdlets. (#5078) (Thanks @markekraus) +- Add verb descriptions and alias prefixes for `Get-Verb`. (#4746) (Thanks @Tadas) +- Fix `Get-Content -Raw` to not miss the last line feed character. (#5076) +- Add authentication parameters to Web Cmdlets. (#5052) (Thanks @markekraus) + - Add `-Authentication` that provides three options: Basic, OAuth, and Bearer. + - Add `-Token` to get the bearer token for OAuth and Bearer options. + - Add `-AllowUnencryptedAuthentication` to bypass authentication that is provided for any transport scheme other than HTTPS. +- Fix `MatchInfoContext` clone implementation (#5121) (Thanks @dee-see) +- Exclude `PSHostProcess` cmdlets from Unix platforms. (#5105) +- Fix `Add-Member` to fetch resource string correctly. (#5114) +- Enable `Import-Module` to be case insensitive. (#5097) +- Add exports for `syslog` APIs in `libpsl-native`. (#5149) +- Fix `Get-ChildItem` to not ignore `-Depth` parameter when using with `-Include` or `-Exclude`. (#4985) (Thanks @Windos) +- Added properties `UserName`, `Description`, `DelayedAutoStart`, `BinaryPathName` and `StartupType` to the `ServiceController` objects returned by `Get-Service`. (#4907) (Thanks @joandrsn) + +### Build and Packaging Improvements + +- Treat `.rtf` files as binary so EOL don't get changed. (#5020) +- Improve the output of `tools/installpsh-osx.sh` and update Travis-CI to use Ruby 2.3.3. (#5065) +- Improve `Start-PSBootstrap` to locate dotnet SDK before installing it. (#5059) (Thanks @PetSerAl) +- Fix the prerequisite check of the MSI package. (#5070) +- Support creating `tar.gz` package for Linux and macOS. (#5085) +- Add release builds that produce symbols for compliance scans. (#5086) +- Update existing Docker files for the Linux package changes. (#5102) +- Add compiler switches and replace dangerous function with safer ones. (#5089) +- Add macOS launcher. (#5138) (Thanks @thezim) +- Replace `httpbin.org/response-headers` Tests with WebListener. (#5058) (Thanks @markekraus) +- Update `appimage.sh` to reflect the new name `pwsh`. (#5172) +- Update the man help file used in packaging. (#5173) +- Update to use `pwsh` in macOS launcher. (#5174) (Thanks @thezim) +- Add code to send web hook for Travis-CI daily build. (#5183) +- Add `global.json` to pick correct SDK version. (#5118) (Thanks @rkeithhill) +- Update packaging to only package PowerShell binaries when packaging symbols. (#5145) +- Update Docker files and related due to the name change. (#5156) + +### Code Cleanup + +- Clean up Json cmdlets. (#5001) (Thanks @iSazonov) +- Remove code guarded by `RELATIONSHIP_SUPPORTED` and `SUPPORTS_IMULTIVALUEPROPERTYCMDLETPROVIDER`, which has never been used. (#5066) +- Remove PSMI code that has never been used. (#5075) +- Remove unreachable code for `Stop-Job`. (#5091) (Thanks @travisty-) +- Removed font and codepage handling code that is only applicable to Windows PowerShell. (#4995) + +### Test + +- Fix a race condition between `WebListener` and Web Cmdlets tests. (#5035) (Thanks @markekraus) +- Add warning to `Start-PSPester` if Pester module is not found (#5069) (Thanks @DdWr) +- Add tests for DSC configuration compilation on Windows. (#5011) +- Test fixes and code coverage automation fixes. (#5046) + +### Documentation and Help Content + +- Update Pi demo instructions about installing libunwind8. (#4974) +- Add links on best practice guidelines in coding guideline. (#4983) (Thanks @iSazonov) +- Reformat command line help for `powershell -help` (#4989) (Thanks @iSazonov) +- Change logo in readme to current black icon. (#5030) +- Fix RPM package name in `README.md`. (#5044) +- Update `docs/building/linux.md` to reflect the current status of powershell build. (#5068) (Thanks @dee-see) +- Add black version of `.icns` file for macOS. (#5073) (Thanks @thezim) +- Update Arch Linux installation instructions. (#5048) (Thanks @kylesferrazza) +- Add submodule reminder to `testing-guidelines.md`. (#5061) (Thanks @DdWr) +- Update instructions in `docs/building/internals.md` for building from source. (#5072) (Thanks @kylesferrazza) +- Add UserVoice link to Issue Template. (#5100) (Thanks @markekraus) +- Add `Get-WebListenerUrl` Based Examples to WebListener `README.md`. (#4981) (Thanks @markekraus) +- Add document about how to create cmdlet with dotnet CLI. (#5117) (Thanks @rkeithhill) +- Update the help text for PowerShell executable with the new name `pwsh`. (#5182) +- Add new forward links for PowerShell 6.0.0 help content. (#4978) +- Fix VSCode `launch.json` to point to `pwsh`. (#5189) +- Add example of how to create .NET Core cmdlet with Visual Studio. (#5096) + ## v6.0.0-beta.8 - 2017-10-05 ### Breaking changes From bfce69ed837e022f8b199680d92492d474cbdb7d Mon Sep 17 00:00:00 2001 From: Dongbo Wang Date: Wed, 25 Oct 2017 08:25:35 -0700 Subject: [PATCH 043/617] Update install/build scripts and dockerfiles (#5222) --- .travis.yml | 4 ++-- tools/debug.sh | 2 +- tools/installpsh-debian.sh | 2 +- tools/installpsh-osx.sh | 4 ++-- tools/installpsh-redhat.sh | 2 +- .../Images/microsoft_powershell_centos7/Dockerfile | 2 +- .../Images/microsoft_powershell_ubuntu14.04/Dockerfile | 2 +- .../Images/microsoft_powershell_ubuntu16.04/Dockerfile | 2 +- tools/releaseBuild/vstsbuild.sh | 2 +- 9 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.travis.yml b/.travis.yml index b0a5387a276..ddbdf11f07a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -35,10 +35,10 @@ install: npm install -g markdown-spellcheck@0.11.0; fi - ulimit -n 4096 - - powershell -File tools/travis.ps1 -Bootstrap + - pwsh -File tools/travis.ps1 -Bootstrap script: - - powershell -File tools/travis.ps1 + - pwsh -File tools/travis.ps1 # spellcheck - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then mdspell '**/*.md' '!powershell/**/*.md' --ignore-numbers --ignore-acronyms --report; diff --git a/tools/debug.sh b/tools/debug.sh index 6a542ab9249..68a22edc36f 100755 --- a/tools/debug.sh +++ b/tools/debug.sh @@ -18,5 +18,5 @@ Most useful commands are 'clrstack', 'clrthreads', and 'pe'. EOF pushd debug -lldb-3.6 -o "plugin load libsosplugin.so" -- ./powershell $@ +lldb-3.6 -o "plugin load libsosplugin.so" -- ./pwsh $@ popd diff --git a/tools/installpsh-debian.sh b/tools/installpsh-debian.sh index acec6402b91..2d82ff6009b 100755 --- a/tools/installpsh-debian.sh +++ b/tools/installpsh-debian.sh @@ -132,7 +132,7 @@ $SUDO apt-get update # Install PowerShell $SUDO apt-get install -y powershell -powershell -noprofile -c '"Congratulations! PowerShell is installed at $PSHOME"' +pwsh -noprofile -c '"Congratulations! PowerShell is installed at $PSHOME"' success=$? if [[ "$success" != 0 ]]; then diff --git a/tools/installpsh-osx.sh b/tools/installpsh-osx.sh index e3b2ae0a586..7dc223b77ec 100755 --- a/tools/installpsh-osx.sh +++ b/tools/installpsh-osx.sh @@ -141,7 +141,7 @@ if [[ ! -d $(brew --prefix cask) ]]; then fi fi -if ! hash powershell 2>/dev/null; then +if ! hash pwsh 2>/dev/null; then echo "Installing PowerShell..." if ! brew cask install powershell; then echo "ERROR: PowerShell failed to install! Cannot install powershell..." >&2 @@ -165,7 +165,7 @@ if [[ "'$*'" =~ includeide ]] ; then code --install-extension ms-vscode.PowerShell fi -powershell -noprofile -c '"Congratulations! PowerShell is installed at $PSHOME"' +pwsh -noprofile -c '"Congratulations! PowerShell is installed at $PSHOME"' success=$? if [[ "$success" != 0 ]]; then diff --git a/tools/installpsh-redhat.sh b/tools/installpsh-redhat.sh index cc70d18d338..40e29844d14 100755 --- a/tools/installpsh-redhat.sh +++ b/tools/installpsh-redhat.sh @@ -129,7 +129,7 @@ echo "*** Setting up PowerShell Core repo..." $SUDO curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/microsoft.repo $SUDO yum install -y powershell -powershell -noprofile -c '"Congratulations! PowerShell is installed at $PSHOME"' +pwsh -noprofile -c '"Congratulations! PowerShell is installed at $PSHOME"' success=$? if [[ "$success" != 0 ]]; then diff --git a/tools/releaseBuild/Images/microsoft_powershell_centos7/Dockerfile b/tools/releaseBuild/Images/microsoft_powershell_centos7/Dockerfile index a49a7cc8f0b..b7a59971823 100644 --- a/tools/releaseBuild/Images/microsoft_powershell_centos7/Dockerfile +++ b/tools/releaseBuild/Images/microsoft_powershell_centos7/Dockerfile @@ -24,4 +24,4 @@ RUN yum install -y \ COPY PowerShellPackage.ps1 / # Use PowerShell as the default shell -ENTRYPOINT [ "powershell" ] +ENTRYPOINT [ "pwsh" ] diff --git a/tools/releaseBuild/Images/microsoft_powershell_ubuntu14.04/Dockerfile b/tools/releaseBuild/Images/microsoft_powershell_ubuntu14.04/Dockerfile index b27b3a331d6..debdc50b072 100644 --- a/tools/releaseBuild/Images/microsoft_powershell_ubuntu14.04/Dockerfile +++ b/tools/releaseBuild/Images/microsoft_powershell_ubuntu14.04/Dockerfile @@ -33,4 +33,4 @@ RUN apt-get update \ COPY PowerShellPackage.ps1 / # Use PowerShell as the default shell -ENTRYPOINT [ "powershell" ] +ENTRYPOINT [ "pwsh" ] diff --git a/tools/releaseBuild/Images/microsoft_powershell_ubuntu16.04/Dockerfile b/tools/releaseBuild/Images/microsoft_powershell_ubuntu16.04/Dockerfile index cfd7c076e9c..5c036ebab26 100644 --- a/tools/releaseBuild/Images/microsoft_powershell_ubuntu16.04/Dockerfile +++ b/tools/releaseBuild/Images/microsoft_powershell_ubuntu16.04/Dockerfile @@ -31,4 +31,4 @@ RUN apt-get update \ COPY PowerShellPackage.ps1 / # Use PowerShell as the default shell -ENTRYPOINT [ "powershell" ] +ENTRYPOINT [ "pwsh" ] diff --git a/tools/releaseBuild/vstsbuild.sh b/tools/releaseBuild/vstsbuild.sh index d805992aa46..d7d0363745f 100644 --- a/tools/releaseBuild/vstsbuild.sh +++ b/tools/releaseBuild/vstsbuild.sh @@ -1 +1 @@ -powershell -command ".\vstsbuild.ps1 $*" +pwsh -command ".\vstsbuild.ps1 $*" From f5f0d3afc58d69b709a6c1e6691dcf53c3f2e830 Mon Sep 17 00:00:00 2001 From: bergmeister Date: Wed, 25 Oct 2017 16:57:05 +0100 Subject: [PATCH 044/617] Add -AsHashtable switch to ConvertFrom-Json for issue #3623 (#5043) Address #3623. Implementation symmetric to traditional code path that returns a PSCustomObject. Code is shared on the top level but 2 low level methods were difficult to share, therefore 2 separate but similar methods were created for HashTables. All existing tests related to this change were adapted to also test against this new switch and were slightly improved. -AsHashtable is an existing pattern used in Group-Object --- .../Common/WebRequestPSCmdlet.Common.cs | 2 +- .../WebCmdlet/ConvertFromJsonCommand.cs | 14 +- .../commands/utility/WebCmdlet/JsonObject.cs | 165 +++++++++++++++++- .../resources/WebCmdletStrings.resx | 10 +- .../ConvertFrom-Json.Tests.ps1 | 32 +++- .../JsonObject.Tests.ps1 | 92 ++++++---- 6 files changed, 261 insertions(+), 54 deletions(-) diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/WebRequestPSCmdlet.Common.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/WebRequestPSCmdlet.Common.cs index a63d0e4c39b..5c026381392 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/WebRequestPSCmdlet.Common.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/WebRequestPSCmdlet.Common.cs @@ -416,7 +416,7 @@ internal virtual void ValidateParameters() { if (Directory.Exists(providerPaths[0])) { - errorRecord = GetValidationError(WebCmdletStrings.DirecotryPathSpecified, + errorRecord = GetValidationError(WebCmdletStrings.DirectoryPathSpecified, "WebCmdletInFileNotFilePathException", InFile); } _originalFilePath = InFile; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/ConvertFromJsonCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/ConvertFromJsonCommand.cs index 4057ea82a3a..ebf9ada8a21 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/ConvertFromJsonCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/ConvertFromJsonCommand.cs @@ -20,17 +20,23 @@ public class ConvertFromJsonCommand : Cmdlet #region parameters /// - /// gets or sets the InputString property + /// Gets or sets the InputString property. /// [Parameter(Mandatory = true, Position = 0, ValueFromPipeline = true)] [AllowEmptyString] public string InputObject { get; set; } /// - /// inputObjectBuffer buffers all InputObjet contents available in the pipeline. + /// InputObjectBuffer buffers all InputObject contents available in the pipeline. /// private List _inputObjectBuffer = new List(); + /// + /// Returned data structure is a Hashtable instead a CustomPSObject. + /// + [Parameter()] + public SwitchParameter AsHashtable { get; set; } + #endregion parameters #region overrides @@ -44,7 +50,7 @@ protected override void ProcessRecord() } /// - /// the main execution method for the convertfrom-json command + /// The main execution method for the ConvertFrom-Json command. /// protected override void EndProcessing() { @@ -95,7 +101,7 @@ protected override void EndProcessing() private bool ConvertFromJsonHelper(string input) { ErrorRecord error = null; - object result = JsonObject.ConvertFromJson(input, out error); + object result = JsonObject.ConvertFromJson(input, AsHashtable.IsPresent, out error); if (error != null) { diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/JsonObject.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/JsonObject.cs index 215fec32829..68fc2a4f57a 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/JsonObject.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/JsonObject.cs @@ -10,8 +10,10 @@ using System.Text.RegularExpressions; using Newtonsoft.Json; using Newtonsoft.Json.Linq; +using System.Collections; using System.Collections.ObjectModel; using System.IO; +using System.Linq; using System.Management.Automation.Internal; using System.Reflection; @@ -26,13 +28,26 @@ public static class JsonObject private const int maxDepthAllowed = 100; /// - /// Convert a Json string back to an object + /// Convert a Json string back to an object of type PSObject. /// /// /// - /// + /// A PSObject. [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly")] public static object ConvertFromJson(string input, out ErrorRecord error) + { + return ConvertFromJson(input, false, out error); + } + + /// + /// Convert a Json string back to an object of type PSObject or Hashtable depending on parameter . + /// + /// + /// + /// + /// A PSObject or a Hashtable if the parameter is true. + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly")] + public static object ConvertFromJson(string input, bool returnHashTable, out ErrorRecord error) { if (input == null) { @@ -65,7 +80,14 @@ public static object ConvertFromJson(string input, out ErrorRecord error) var dictionary = obj as JObject; if (dictionary != null) { - obj = PopulateFromJDictionary(dictionary, out error); + if (returnHashTable) + { + obj = PopulateHashTableFromJDictionary(dictionary, out error); + } + else + { + obj = PopulateFromJDictionary(dictionary, out error); + } } else { @@ -73,7 +95,14 @@ public static object ConvertFromJson(string input, out ErrorRecord error) var list = obj as JArray; if (list != null) { - obj = PopulateFromJArray(list, out error); + if (returnHashTable) + { + obj = PopulateHashTableFromJArray(list, out error); + } + else + { + obj = PopulateFromJArray(list, out error); + } } } } @@ -93,14 +122,42 @@ private static PSObject PopulateFromJDictionary(JObject entries, out ErrorRecord PSObject result = new PSObject(); foreach (var entry in entries) { + if (string.IsNullOrEmpty(entry.Key)) + { + string errorMsg = string.Format(CultureInfo.InvariantCulture, + WebCmdletStrings.EmptyKeyInJsonString); + error = new ErrorRecord( + new InvalidOperationException(errorMsg), + "EmptyKeyInJsonString", + ErrorCategory.InvalidOperation, + null); + return null; + } + + // Case sensitive duplicates should normally not occur since JsonConvert.DeserializeObject + // does not throw when encountering duplicates and just uses the last entry. + if (result.Properties.Any(psPropertyInfo => psPropertyInfo.Name.Equals(entry.Key, StringComparison.InvariantCulture))) + { + string errorMsg = string.Format(CultureInfo.InvariantCulture, + WebCmdletStrings.DuplicateKeysInJsonString, entry.Key); + error = new ErrorRecord( + new InvalidOperationException(errorMsg), + "DuplicateKeysInJsonString", + ErrorCategory.InvalidOperation, + null); + return null; + } + + // Compare case insensitive to tell the user to use the -AsHashTable option instead. + // This is because PSObject cannot have keys with different casing. PSPropertyInfo property = result.Properties[entry.Key]; if (property != null) { string errorMsg = string.Format(CultureInfo.InvariantCulture, - WebCmdletStrings.DuplicateKeysInJsonString, property.Name, entry.Key); + WebCmdletStrings.KeysWithDifferentCasingInJsonString, property.Name, entry.Key); error = new ErrorRecord( new InvalidOperationException(errorMsg), - "DuplicateKeysInJsonString", + "KeysWithDifferentCasingInJsonString", ErrorCategory.InvalidOperation, null); return null; @@ -180,5 +237,101 @@ private static ICollection PopulateFromJArray(JArray list, out ErrorReco } return result.ToArray(); } + + // This function is a clone of PopulateFromDictionary using JObject as an input. + private static Hashtable PopulateHashTableFromJDictionary(JObject entries, out ErrorRecord error) + { + error = null; + Hashtable result = new Hashtable(); + foreach (var entry in entries) + { + // Case sensitive duplicates should normally not occur since JsonConvert.DeserializeObject + // does not throw when encountering duplicates and just uses the last entry. + if (result.ContainsKey(entry.Key)) + { + string errorMsg = string.Format(CultureInfo.InvariantCulture, + WebCmdletStrings.DuplicateKeysInJsonString, entry.Key); + error = new ErrorRecord( + new InvalidOperationException(errorMsg), + "DuplicateKeysInJsonString", + ErrorCategory.InvalidOperation, + null); + return null; + } + + // Array + else if (entry.Value is JArray) + { + JArray list = entry.Value as JArray; + ICollection listResult = PopulateHashTableFromJArray(list, out error); + if (error != null) + { + return null; + } + result.Add(entry.Key, listResult); + } + + // Dictionary + else if (entry.Value is JObject) + { + JObject dic = entry.Value as JObject; + Hashtable dicResult = PopulateHashTableFromJDictionary(dic, out error); + if (error != null) + { + return null; + } + result.Add(entry.Key, dicResult); + } + + // Value + else // (entry.Value is JValue) + { + JValue theValue = entry.Value as JValue; + result.Add(entry.Key, theValue.Value); + } + } + return result; + } + + // This function is a clone of PopulateFromList using JArray as input. + private static ICollection PopulateHashTableFromJArray(JArray list, out ErrorRecord error) + { + error = null; + List result = new List(); + + foreach (var element in list) + { + // Array + if (element is JArray) + { + JArray subList = element as JArray; + ICollection listResult = PopulateHashTableFromJArray(subList, out error); + if (error != null) + { + return null; + } + result.Add(listResult); + } + + // Dictionary + else if (element is JObject) + { + JObject dic = element as JObject; + Hashtable dicResult = PopulateHashTableFromJDictionary(dic, out error); + if (error != null) + { + return null; + } + result.Add(dicResult); + } + + // Value + else // (element is JValue) + { + result.Add(((JValue)element).Value); + } + } + return result.ToArray(); + } } } diff --git a/src/Microsoft.PowerShell.Commands.Utility/resources/WebCmdletStrings.resx b/src/Microsoft.PowerShell.Commands.Utility/resources/WebCmdletStrings.resx index 5ee6d6baf8c..4e139d7f7e3 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/resources/WebCmdletStrings.resx +++ b/src/Microsoft.PowerShell.Commands.Utility/resources/WebCmdletStrings.resx @@ -141,11 +141,17 @@ The cmdlet cannot run because the following conflicting parameters are specified: Credential and UseDefaultCredentials. Specify either Credential or UseDefaultCredentials, then retry. - + Path '{0}' resolves to a directory. Specify a path including a file name, and then retry the command. + + The provided JSON includes a property whose name is an empty string, this is only supported using the -AsHashTable switch. + - Cannot convert the JSON string because a dictionary that was converted from the string contains the duplicated keys '{0}' and '{1}'. + Cannot convert the JSON string because a dictionary that was converted from the string contains the duplicated key '{0}'. + + + Cannot convert the JSON string because it contains keys with different casing. Please use the -AsHashTable switch instead. The key that was attempted to be added to the exisiting key '{0}' was '{1}'. The ConvertTo-Json and ConvertFrom-Json cmdlets require the installation of the .NET Client Profile, sometimes called the .NET extended profile. diff --git a/test/powershell/Modules/Microsoft.PowerShell.Utility/ConvertFrom-Json.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Utility/ConvertFrom-Json.Tests.ps1 index 985cf608ec4..a13c3067883 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Utility/ConvertFrom-Json.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Utility/ConvertFrom-Json.Tests.ps1 @@ -1,16 +1,36 @@ Describe 'ConvertFrom-Json' -tags "CI" { - It 'can convert a single-line object' { - ('{"a" : "1"}' | ConvertFrom-Json).a | Should Be 1 + + BeforeAll { + $testCasesWithAndWithoutAsHashtableSwitch = @( + @{ AsHashtable = $true } + @{ AsHashtable = $false } + ) } - It 'can convert one string-per-object' { - $json = @('{"a" : "1"}', '{"a" : "x"}') | ConvertFrom-Json + + It 'Can convert a single-line object with AsHashtable switch set to ' -TestCase $testCasesWithAndWithoutAsHashtableSwitch { + Param($AsHashtable) + ('{"a" : "1"}' | ConvertFrom-Json -AsHashtable:$AsHashtable).a | Should Be 1 + } + + It 'Can convert one string-per-object with AsHashtable switch set to ' -TestCase $testCasesWithAndWithoutAsHashtableSwitch { + Param($AsHashtable) + $json = @('{"a" : "1"}', '{"a" : "x"}') | ConvertFrom-Json -AsHashtable:$AsHashtable $json.Count | Should Be 2 $json[1].a | Should Be 'x' + if ($AsHashtable) + { + $json | Should BeOfType Hashtable + } } - It 'can convert multi-line object' { - $json = @('{"a" :', '"x"}') | ConvertFrom-Json + It 'Can convert multi-line object with AsHashtable switch set to ' -TestCase $testCasesWithAndWithoutAsHashtableSwitch { + Param($AsHashtable) + $json = @('{"a" :', '"x"}') | ConvertFrom-Json -AsHashtable:$AsHashtable $json.a | Should Be 'x' + if ($AsHashtable) + { + $json | Should BeOfType Hashtable + } } } diff --git a/test/powershell/Modules/Microsoft.PowerShell.Utility/JsonObject.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Utility/JsonObject.Tests.ps1 index 525692a0779..b9e83d924ec 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Utility/JsonObject.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Utility/JsonObject.Tests.ps1 @@ -1,46 +1,68 @@ Describe 'Unit tests for JsonObject' -tags "CI" { - function ShouldThrow - { - param ( - [Parameter(ValueFromPipeline = $true)] - $InputObject, - [Parameter(Position = 0)] - $ExpectedException - ) - - try - { - & $InputObject - throw "Should throw exception" - } - catch - { - $_.FullyQualifiedErrorId | should be $ExpectedException - } + BeforeAll { + $jsonWithEmptyKey = '{"": "Value"}' + $jsonContainingKeysWithDifferentCasing = '{"key1": "Value1", "Key1": "Value2"}' } - $validStrings = @( - @{ name = "empty"; str = "" } - @{ name = "spaces"; str = " " } - @{ name = "object"; str = "{a:1}" } - ) - - It 'no error for valid string - ' -TestCase $validStrings { - param ($str) + It 'No error for valid string '''' with -ReturnHashTable:$' -TestCase @( + @{ name = "null"; str = $null; ReturnHashTable = $true } + @{ name = "empty"; str = ""; ReturnHashTable = $true } + @{ name = "spaces"; str = " "; ReturnHashTable = $true } + @{ name = "object"; str = "{a:1}"; ReturnHashTable = $true } + @{ name = "null"; str = $null; ReturnHashTable = $false } + @{ name = "empty"; str = ""; ReturnHashTable = $false } + @{ name = "spaces"; str = " "; ReturnHashTable = $false } + @{ name = "object"; str = "{a:1}"; ReturnHashTable = $false } + ) { + param ($str, $ReturnHashTable) $errRecord = $null - [Microsoft.PowerShell.Commands.JsonObject]::ConvertFromJson($str, [ref]$errRecord) + [Microsoft.PowerShell.Commands.JsonObject]::ConvertFromJson($str, $ReturnHashTable, [ref]$errRecord) $errRecord | Should BeNullOrEmpty } - $invalidStrings = @( - @{ name = "plain text"; str = "plaintext" } - @{ name = "part"; str = '{"a" :' } - ) - - It 'throw ArgumentException for invalid string - ' -TestCase $invalidStrings { - param ($str) + It 'Throw ArgumentException for invalid string '''' with -ReturnHashTable:$' -TestCase @( + @{ name = "plain text"; str = "plaintext"; ReturnHashTable = $true } + @{ name = "part"; str = '{"a" :'; ReturnHashTable = $true } + @{ name = "plain text"; str = "plaintext"; ReturnHashTable = $false } + @{ name = "part"; str = '{"a" :'; ReturnHashTable = $false } + ) { + param ($str, $ReturnHashTable) $errRecord = $null - { [Microsoft.PowerShell.Commands.JsonObject]::ConvertFromJson($str, [ref]$errRecord) } | ShouldThrow 'ArgumentException' + { [Microsoft.PowerShell.Commands.JsonObject]::ConvertFromJson($str, $ReturnHashTable, [ref]$errRecord) } | ShouldBeErrorId "ArgumentException" + } + + Context 'Empty key name' { + It 'Throw InvalidOperationException when json contains empty key name' { + $errorRecord = $null + [Microsoft.PowerShell.Commands.JsonObject]::ConvertFromJson($jsonWithEmptyKey, [ref]$errorRecord) + $errorRecord.FullyQualifiedErrorId | Should Be 'EmptyKeyInJsonString' + } + + It 'Not throw when json contains empty key name when ReturnHashTable is true' { + $errorRecord = $null + $result = [Microsoft.PowerShell.Commands.JsonObject]::ConvertFromJson($jsonWithEmptyKey, $true, [ref]$errorRecord) + $result | Should Not Be $null + $result.Count | Should Be 1 + $result.'' | Should Be 'Value' + } + } + + Context 'Keys with different casing ' { + + It 'Throw InvalidOperationException when json contains key with different casing' { + $errorRecord = $null + [Microsoft.PowerShell.Commands.JsonObject]::ConvertFromJson($jsonContainingKeysWithDifferentCasing, [ref]$errorRecord) + $errorRecord.FullyQualifiedErrorId | Should Be 'KeysWithDifferentCasingInJsonString' + } + + It 'Not throw when json contains key (same casing) when ReturnHashTable is true' { + $errorRecord = $null + $result = [Microsoft.PowerShell.Commands.JsonObject]::ConvertFromJson($jsonContainingKeysWithDifferentCasing, $true, [ref]$errorRecord) + $result | Should Not Be $null + $result.Count | Should Be 2 + $result.key1 | Should Be 'Value1' + $result.Key1 | Should Be 'Value2' + } } } From 715fe94c37fd258a4026f0b7a1448720e2e0c55d Mon Sep 17 00:00:00 2001 From: bergmeister Date: Wed, 25 Oct 2017 22:03:43 +0100 Subject: [PATCH 045/617] Fix 'demos/SSHRemoting/README.md' using the new name 'pwsh' (#5236) --- demos/SSHRemoting/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demos/SSHRemoting/README.md b/demos/SSHRemoting/README.md index a0cbbf46086..e4d8035c4ee 100644 --- a/demos/SSHRemoting/README.md +++ b/demos/SSHRemoting/README.md @@ -77,7 +77,7 @@ In addition you will need to enable password authentication and optionally key b ``` - Add a PowerShell subsystem entry ```none - Subsystem powershell /usr/bin/powershell -sshs -NoLogo -NoProfile + Subsystem powershell /usr/bin/pwsh -sshs -NoLogo -NoProfile ``` - Optionally enable key authentication ```none From 0c98b7e9635d94ac008a3f4cd27c25fbfe440d77 Mon Sep 17 00:00:00 2001 From: Sergei Vorobev Date: Wed, 25 Oct 2017 14:05:19 -0700 Subject: [PATCH 046/617] Remove @vors from engine area owners. Add the Language area. (#5223) --- .github/CODEOWNERS | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 83b30ed587f..e1efd57c009 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -41,7 +41,7 @@ demos/ @joeyaiello @SteveL-MSFT @Hem src/System.Management.Automation/DscSupport @TravisEz13 @dantraMSFT # Area: engine -src/System.Management.Automation/engine @daxian-dbw @vors @lzybkr @BrucePay +src/System.Management.Automation/engine @daxian-dbw @lzybkr @BrucePay # Area: Debugging # Must be below engine to override @@ -54,7 +54,7 @@ src/System.Management.Automation/help @Francisco-Gamino @adityapatw # @daxian-dbw @lzybkr @charub # Area: Language -# @daxian-dbw @vors @lzybkr @BrucePay +src/System.Management.Automation/engine/parser @daxian-dbw @vors @lzybkr @BrucePay # Area: Providers src/System.Management.Automation/namespaces @BrucePay @anmenaga From 00dde3d8f27a8c352e1d527a61747f5b7290bb09 Mon Sep 17 00:00:00 2001 From: Travis Plunk Date: Wed, 25 Oct 2017 15:08:52 -0700 Subject: [PATCH 047/617] Add term rules (#5213) * Add Terms Rules * remove offensive term * Add code owner for compliance files --- .github/CODEOWNERS | 4 + .../ParameterBinding.Tests.ps1 | 2 +- tools/terms/FileTypeSet.xml | 379 ++++++++++++++++++ tools/terms/PowerShell-Terms-Rules.mdb | Bin 0 -> 393216 bytes 4 files changed, 384 insertions(+), 1 deletion(-) create mode 100644 tools/terms/FileTypeSet.xml create mode 100644 tools/terms/PowerShell-Terms-Rules.mdb diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index e1efd57c009..4431b761d90 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -77,3 +77,7 @@ src/System.Management.Automation/engine/remoting @dantraMSFT @mirichmo @PaulHi build.* @daxian-dbw @TravisEz13 @adityapatwardhan tools/ @daxian-dbw @TravisEz13 @adityapatwardhan docker/ @daxian-dbw @TravisEz13 @adityapatwardhan + +# Area: Compliance +tools/terms @TravisEz13 +tools/credScan @TravisEz13 diff --git a/test/powershell/engine/ParameterBinding/ParameterBinding.Tests.ps1 b/test/powershell/engine/ParameterBinding/ParameterBinding.Tests.ps1 index e3d84164093..47a572cd943 100644 --- a/test/powershell/engine/ParameterBinding/ParameterBinding.Tests.ps1 +++ b/test/powershell/engine/ParameterBinding/ParameterBinding.Tests.ps1 @@ -150,7 +150,7 @@ try { - test-singleintparameter -Parameter1 'dookie' + test-singleintparameter -Parameter1 'exampleInvalidParam' throw "No Exception!" } catch diff --git a/tools/terms/FileTypeSet.xml b/tools/terms/FileTypeSet.xml new file mode 100644 index 00000000000..2b0821d6777 --- /dev/null +++ b/tools/terms/FileTypeSet.xml @@ -0,0 +1,379 @@ + + + + +Pure Text Files + +.txt +.des +.pwd +.asm +.cmd +.ini +.poc +.pwt +.hpj +.sql +.inf +.log +.def +.url +.bat +.aspx +.idl +.sys +.resources +.strings +.md +.yml +.yaml +.spelling +.gitignore +.gitattributes +.gitmodules +.csv +.tsv + + + +CodeFiles + +.frm +.inc +.cpp +.cls +.c +.hpp +.vbs +.java +.cs +.cxx +.h +.jav +.bas +.hxx +.js +.pl +.rc +.vb +.json +.resjson +.fs +.fsi +.fsx +.m +.psm1 +.config +.ps1 +.psd1 +.cmake +.sh +.cshtml +.plist +.mof +.mc + + + +XML Files + +.xml +.hxa +.hxk +.hxl +.xsl +.hxc +.hxt +.hxm +.resx +.hxe +.hxf +.hxv +.acctb +.accfl +.xaml +.ttml +.ddue +.sln +.props +.ps1xml +.csproj +.xsd +.svg +.clixml +.nuspec +.cdxml +.manifest + + + +Microsoft Word Documents + +.doc +.dot +.wiz + + + +Microsoft Access Database Compatible + +.mdb +.mda +.mde +.mpd +.mdt + + + +Microsoft PowerPoint Presentation + +.ppt +.pot +.pps + + + +Microsoft Publisher Files + +.pub + + + +Microsoft Excel Workbooks + +.xls +.xlt + + + +Pure Binary Files + +.com +.bin +.tlb +.drv +.fon +.blg +.gif +.png +.icns +.ico +.bmp +.pfx + + + +Localization resource databases + +.edb +.lcl +.xlf +.xliff + + + +Microsoft Project Files + +.mpp +.mpt + + + +Microsoft Visio Files + +.vsd +.vdx +.vss +.vst + + + +Windows Installer databases + +.msi +.msm + + + +Zip Files + +.zip +.accdt +.axtr + + + +Cabinet / MS Compression Files + +.cab + + + +Table driven IME lexicons + +.mb + + + +IME ( IMD ) Files + +.imd + + + +TrueType Font Files + +.ttf + + + +Microsoft Outlook Mail Files + +.msg +.oft + + + +HTML Help 2.0 Files / InfoTech5.x Storage System Files + +.its +.hxh +.hxr +.hxw +.hxi +.hxs +.hxq + + + +Adobe Acrobat PDF Files + +.pdf + + + +HTML Files / Web Page + +.htm +.dtd +.hhk +.htw +.asp +.htc +.htx +.html +.hhc +.css +.stm + + + +Rich Text Files + +.rtf + + + +Windows 3.x Write Files + +.wri + + + +MHTML Files + +.eml +.nws +.mht + + + +Word 2007 Files + +.docx +.docm +.dotx +.dotm + + + +Excel 2007 Files + +.xlsx +.xlsm +.xltx +.xltm +.xlsb +.xlam + + + +Power Point 2007 Files + +.pptx +.pptm +.potx +.potm +.ppsx +.ppsm +.ppam + + + +Access 2007 Files + +.accdb +.accde +.accdr + + + +Win32/64-based executable (image) Files + +.exe +.dll +.ocx +.scr +.acm +.rll +.cpl +.mui +.ax +.ime + + + +HTML Help 1.0 Files + +.chm + + + +LocStudio lsg + +.lsg + + + +Microsoft Office OneNote Files + +.one +.onepkg + + + +Custom Parsers + + + + +Visio 2011 Files + +.vstx +.vsdx +.vssx + + + + + diff --git a/tools/terms/PowerShell-Terms-Rules.mdb b/tools/terms/PowerShell-Terms-Rules.mdb new file mode 100644 index 0000000000000000000000000000000000000000..b9dd40cf6f0ea06047ab1a759978264fc816098d GIT binary patch literal 393216 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 Date: Thu, 26 Oct 2017 07:56:07 +0300 Subject: [PATCH 048/617] Export-Csv Test Improvements (#5150) --- .../Export-Csv.Tests.ps1 | 68 +++++++------------ 1 file changed, 26 insertions(+), 42 deletions(-) diff --git a/test/powershell/Modules/Microsoft.PowerShell.Utility/Export-Csv.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Utility/Export-Csv.Tests.ps1 index 3f9b3f4a55f..0748bb61b59 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Utility/Export-Csv.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Utility/Export-Csv.Tests.ps1 @@ -1,67 +1,48 @@ Describe "Export-Csv" -Tags "CI" { - $testObject = @("test","object","array") - $testCsv = Join-Path -Path $TestDrive -ChildPath "output.csv" + BeforeAll { + $testObject = @("test","object","array") + $testCsv = Join-Path -Path $TestDrive -ChildPath "output.csv" + } AfterEach { - Remove-Item $testCsv -Force -ErrorAction SilentlyContinue + Remove-Item $testCsv -Force -ErrorAction SilentlyContinue } It "Should be able to be called without error" { - { $testObject | Export-Csv $testCsv } | Should Not Throw + { $testObject | Export-Csv $testCsv -ErrorAction Stop } | Should Not Throw } It "Should throw if an output file isn't specified" { - { $testObject | Export-Csv -ErrorAction SilentlyContinue } | Should Throw + { $testObject | Export-Csv -ErrorAction Stop } | ShouldBeErrorId "CannotSpecifyPathAndLiteralPath,Microsoft.PowerShell.Commands.ExportCsvCommand" } It "Should be a string when exporting via pipe" { - $testObject | Export-Csv $testCsv -IncludeTypeInformation + $testObject | Export-Csv $testCsv -IncludeTypeInformation - $piped = Get-Content $testCsv + $piped = Get-Content $testCsv - $piped[0] | Should Match ".String" + $piped[0] | Should BeExactly "#TYPE System.String" } It "Should be an object when exporting via the inputObject switch" { - Export-Csv -InputObject $testObject -Path $testCsv -IncludeTypeInformation + Export-Csv -InputObject $testObject -Path $testCsv -IncludeTypeInformation - $switch = Get-Content $testCsv + $switch = Get-Content $testCsv - $switch[0] | Should Match ".Object" + $switch[0] | Should BeExactly "#TYPE System.Object[]" } It "Should output a csv file containing a string of all the lengths of each element when piped input is used" { - $testObject | Export-Csv -Path $testCsv -IncludeTypeInformation - - $first = "`"" + $testObject[0].Length.ToString() + "`"" - $second = "`"" + $testObject[1].Length.ToString() + "`"" - $third = "`"" + $testObject[2].Length.ToString() + "`"" - $expected = @("#TYPE System.String", "`"Length`"", $first , $second, $third) - - for ( $i = 0; $i -lt $testCsv.Length; $i++) - { - $(Get-Content $testCsv)[$i] | Should Be $expected[$i] - } - } - - It "Should be able to use the epcsv alias without error" { - { $testObject | Export-Csv -Path $testCsv } | Should Not Throw - } - - It "Should have the same information when using the alias vs the cmdlet" { - $testObject | Export-Csv -Path $testCsv - - $aliasObject = Join-Path -Path $TestDrive -ChildPath "alias.csv" - - $testObject | epcsv -Path $aliasObject + $testObject | Export-Csv -Path $testCsv -IncludeTypeInformation - for ( $i = 0; $i -lt $testCsv.Length; $i++) - { - $(Get-Content $testCsv)[$i] | Should Be $(Get-Content $aliasObject)[$i] - } + $first = "`"" + $testObject[0].Length.ToString() + "`"" + $second = "`"" + $testObject[1].Length.ToString() + "`"" + $third = "`"" + $testObject[2].Length.ToString() + "`"" + $expected = @("#TYPE System.String", "`"Length`"", $first , $second, $third) - # Clean up after yourself - Remove-Item $aliasObject -Force + for ($i = 0; $i -lt $expected.Count; $i++) { + $(Get-Content $testCsv)[$i] | Should Be $expected[$i] + } } It "Does not include type information by default" { @@ -91,8 +72,11 @@ Describe "Export-Csv" -Tags "CI" { } Describe "Export-Csv DRT Unit Tests" -Tags "CI" { - $filePath = Join-Path $TestDrive -ChildPath "test.csv" - $newLine = [environment]::NewLine + BeforeAll { + $filePath = Join-Path $TestDrive -ChildPath "test.csv" + $newLine = [environment]::NewLine + } + It "Test basic function works well" { $input = [pscustomobject]@{ "P1" = "V11"; "P2" = "V12"; "P3" = "V13" } $input | Export-Csv -Path $filePath -NoTypeInformation From b1af9ea23043076951e4672e28c5061395c427b2 Mon Sep 17 00:00:00 2001 From: Steve Lee Date: Fri, 27 Oct 2017 04:40:14 +0800 Subject: [PATCH 049/617] -Verbose should not override $ErrorActionPreference (#5113) * -Verbose should not override $ErrorActionPreference * apply same fix to -debug and added test case * address Aditya's feedback --- .../engine/MshCommandRuntime.cs | 7 ------- .../Scripting/ActionPreference.Tests.ps1 | 19 +++++++++++++++++++ 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/System.Management.Automation/engine/MshCommandRuntime.cs b/src/System.Management.Automation/engine/MshCommandRuntime.cs index be5ce9d3089..a948940ed7a 100644 --- a/src/System.Management.Automation/engine/MshCommandRuntime.cs +++ b/src/System.Management.Automation/engine/MshCommandRuntime.cs @@ -3212,13 +3212,6 @@ internal ActionPreference ErrorAction if (IsErrorActionSet) return _errorAction; - // Debug takes preference over Verbose - if (Debug) - return ActionPreference.Inquire; - if (Verbose) - return ActionPreference.Continue; - - // fall back to $ErrorAction if (!_isErrorActionPreferenceCached) { bool defaultUsed = false; diff --git a/test/powershell/Language/Scripting/ActionPreference.Tests.ps1 b/test/powershell/Language/Scripting/ActionPreference.Tests.ps1 index 091599af880..3edf8d8aae3 100644 --- a/test/powershell/Language/Scripting/ActionPreference.Tests.ps1 +++ b/test/powershell/Language/Scripting/ActionPreference.Tests.ps1 @@ -126,4 +126,23 @@ } $num | Should Be 2 } + + It ' does not take precedence over $ErrorActionPreference' -TestCases @( + @{switch="-Verbose"}, + @{switch="-Debug"} + ) { + param($switch) + $ErrorActionPreference = "SilentlyContinue" + $params = @{ + ItemType = "File"; + Path = "$testdrive\test.txt"; + Confirm = $false + } + New-Item @params > $null + $params += @{$switch=$true} + { New-Item @params } | Should Not Throw + $ErrorActionPreference = "Stop" + { New-Item @params } | ShouldBeErrorId "NewItemIOError,Microsoft.PowerShell.Commands.NewItemCommand" + Remove-Item "$testdrive\test.txt" -Force + } } From 4bc52d2358222084738157a08907fac32d13bd3a Mon Sep 17 00:00:00 2001 From: Steve Lee Date: Fri, 27 Oct 2017 05:12:19 +0800 Subject: [PATCH 050/617] Use consistent '(c)' for copyright symbol (#5210) - Remove the year about copyright - Fix casing of `All rights reserved` - Replace Unicode characters representing single quote with a single quote --- LICENSE.txt | 28 +- assets/AppImageThirdPartyNotices.txt | 2 +- assets/pwsh.1.ronn | 2 +- demos/SSHRemoting/README.md | 2 +- demos/crontab/CronTab/CronTab.psd1 | 2 +- docker/README.md | 2 +- .../sample-dotnet1.1/Logic/UseRunspace.cs | 2 +- .../sample-dotnet1.1/MyApp/Program.cs | 8 +- .../Logic/UseRunspace.cs | 2 +- .../MyApp/Program.cs | 8 +- .../MyApp/Program.cs | 4 +- license_thirdparty_proprietary.txt | 560 +++++++++--------- .../AssemblyInfo.cs | 2 +- .../CimAsyncOperation.cs | 2 +- .../CimBaseAction.cs | 2 +- .../CimCmdletModuleInitialize.cs | 2 +- .../CimCommandBase.cs | 2 +- .../CimGetAssociatedInstance.cs | 2 +- .../CimGetCimClass.cs | 2 +- .../CimGetInstance.cs | 2 +- .../CimIndicationWatcher.cs | 2 +- .../CimInvokeCimMethod.cs | 2 +- .../CimNewCimInstance.cs | 2 +- .../CimPromptUser.cs | 2 +- .../CimRegisterCimIndication.cs | 2 +- .../CimRemoveCimInstance.cs | 2 +- .../CimResultObserver.cs | 2 +- .../CimSessionOperations.cs | 2 +- .../CimSessionProxy.cs | 2 +- .../CimSetCimInstance.cs | 2 +- .../CimWriteError.cs | 2 +- .../CimWriteMessage.cs | 2 +- .../CimWriteProgress.cs | 2 +- .../CimWriteResultObject.cs | 2 +- .../CmdletOperation.cs | 2 +- .../GetCimAssociatedInstanceCommand.cs | 2 +- .../GetCimClassCommand.cs | 2 +- .../GetCimInstanceCommand.cs | 2 +- .../GetCimSessionCommand.cs | 2 +- .../InvokeCimMethodCommand.cs | 2 +- .../NewCimInstanceCommand.cs | 2 +- .../NewCimSessionCommand.cs | 2 +- .../NewCimSessionOptionCommand.cs | 2 +- .../RegisterCimIndicationCommand.cs | 2 +- .../RemoveCimInstanceCommand.cs | 2 +- .../RemoveCimSessionCommand.cs | 2 +- .../SetCimInstanceCommand.cs | 2 +- .../Utils.cs | 2 +- .../CounterFileInfo.cs | 2 +- .../CounterSample.cs | 2 +- .../CounterSet.cs | 2 +- .../ExportCounterCommand.cs | 2 +- .../GetCounterCommand.cs | 2 +- .../GetEventCommand.cs | 2 +- .../GetEventSnapin.cs | 2 +- .../ImportCounterCommand.cs | 2 +- .../NewWinEventCommand.cs | 2 +- .../PdhHelper.cs | 2 +- .../PdhSafeHandle.cs | 2 +- .../resources/GetEventResources.txt | 2 +- .../cmdletization/SessionBasedWrapper.cs | 2 +- .../cmdletization/cim/CimJobException.cs | 2 +- .../cmdletization/cim/CreateInstanceJob.cs | 2 +- .../cmdletization/cim/DeleteInstanceJob.cs | 2 +- .../cim/EnumerateAssociatedInstancesJob.cs | 2 +- .../cim/ExtrinsicMethodInvocationJob.cs | 2 +- .../cim/InstanceMethodInvocationJob.cs | 2 +- .../cim/MethodInvocationJobBase.cs | 2 +- .../cmdletization/cim/ModifyInstanceJob.cs | 2 +- .../cmdletization/cim/PropertySettingJob.cs | 2 +- .../cimSupport/cmdletization/cim/QueryJob.cs | 2 +- .../cmdletization/cim/QueryJobBase.cs | 2 +- .../cim/StaticMethodInvocationJob.cs | 2 +- .../cim/TerminatingErrorTracker.cs | 2 +- .../cmdletization/cim/cimChildJobBase.cs | 2 +- .../cim/cimCmdletDefinitionContext.cs | 2 +- .../cim/cimCmdletInvocationContext.cs | 2 +- .../cmdletization/cim/cimConverter.cs | 2 +- .../cmdletization/cim/cimJobContext.cs | 2 +- .../cim/cimOperationOptionsHelper.cs | 2 +- .../cimSupport/cmdletization/cim/cimQuery.cs | 2 +- .../cmdletization/cim/cimWrapper.cs | 2 +- .../cmdletization/cim/clientSideQuery.cs | 2 +- .../commands/management/AddContentCommand.cs | 2 +- .../management/ClearContentCommand.cs | 2 +- .../management/ClearPropertyCommand.cs | 2 +- .../commands/management/CombinePathCommand.cs | 2 +- .../management/CommitTransactionCommand.cs | 2 +- .../commands/management/Computer.cs | 2 +- .../commands/management/ContentCommandBase.cs | 2 +- .../management/ControlPanelItemCommand.cs | 2 +- .../commands/management/ConvertPathCommand.cs | 2 +- .../management/CopyPropertyCommand.cs | 2 +- .../commands/management/Eventlog.cs | 2 +- .../commands/management/GetChildrenCommand.cs | 2 +- .../management/GetComputerInfoCommand.cs | 2 +- .../commands/management/GetContentCommand.cs | 2 +- .../commands/management/GetPropertyCommand.cs | 2 +- .../management/GetTransactionCommand.cs | 2 +- .../management/GetWMIObjectCommand.cs | 2 +- .../commands/management/Hotfix.cs | 2 +- .../management/InvokeWMIMethodCommand.cs | 2 +- .../management/MovePropertyCommand.cs | 2 +- .../commands/management/Navigation.cs | 2 +- .../commands/management/NewPropertyCommand.cs | 2 +- .../commands/management/ParsePathCommand.cs | 2 +- .../PassThroughContentCommandBase.cs | 2 +- .../PassThroughPropertyCommandBase.cs | 2 +- .../commands/management/PingPathCommand.cs | 2 +- .../commands/management/Process.cs | 2 +- .../management/PropertyCommandBase.cs | 2 +- .../management/RegisterWMIEventCommand.cs | 2 +- .../management/RemovePropertyCommand.cs | 2 +- .../management/RemoveWMIObjectCommand.cs | 2 +- .../management/RenamePropertyCommand.cs | 2 +- .../commands/management/ResolvePathCommand.cs | 2 +- .../management/RollbackTransactionCommand.cs | 2 +- .../commands/management/Service.cs | 2 +- .../commands/management/SetContentCommand.cs | 2 +- .../commands/management/SetPropertyCommand.cs | 2 +- .../management/SetWMIInstanceCommand.cs | 2 +- .../management/StartTransactionCommand.cs | 2 +- .../management/UseTransactionCommand.cs | 2 +- .../commands/management/WMIHelper.cs | 2 +- .../commands/management/WebServiceProxy.cs | 2 +- .../management/WriteContentCommandBase.cs | 2 +- .../installer/MshManagementMshSnapin.cs | 2 +- .../commands/utility/AddMember.cs | 2 +- .../commands/utility/AddType.cs | 2 +- .../commands/utility/CSVCommands.cs | 2 +- .../commands/utility/ConsoleColorCmdlet.cs | 2 +- .../utility/ConvertFrom-StringData.cs | 2 +- .../commands/utility/Csv.cs | 2 +- .../commands/utility/CustomSerialization.cs | 2 +- .../utility/CustomSerializationStrings.cs | 2 +- .../commands/utility/DebugRunspaceCommand.cs | 2 +- .../commands/utility/Disable-PSBreakpoint.cs | 2 +- .../commands/utility/Enable-PSBreakpoint.cs | 2 +- .../EnableDisableRunspaceDebugCommand.cs | 2 +- .../commands/utility/ExportAliasCommand.cs | 2 +- .../FormatAndOutput/OutGridView/ColumnInfo.cs | 2 +- .../OutGridView/ExpressionColumnInfo.cs | 2 +- .../FormatAndOutput/OutGridView/HeaderInfo.cs | 2 +- .../OutGridView/OriginalColumnInfo.cs | 2 +- .../OutGridView/OutGridViewCommand.cs | 2 +- .../OutGridView/OutWindowProxy.cs | 2 +- .../OutGridView/ScalarTypeColumnInfo.cs | 2 +- .../FormatAndOutput/OutGridView/TableView.cs | 2 +- .../common/GetFormatDataCommand.cs | 2 +- .../common/WriteFormatDataCommand.cs | 2 +- .../format-list/Format-List.cs | 2 +- .../format-object/format-object.cs | 2 +- .../format-table/Format-Table.cs | 2 +- .../format-wide/Format-Wide.cs | 2 +- .../FormatAndOutput/out-file/Out-File.cs | 2 +- .../out-printer/PrinterLineOutput.cs | 2 +- .../out-printer/out-printer.cs | 2 +- .../FormatAndOutput/out-string/out-string.cs | 2 +- .../commands/utility/Get-PSBreakpoint.cs | 2 +- .../commands/utility/Get-PSCallStack.cs | 2 +- .../commands/utility/GetAliasCommand.cs | 2 +- .../commands/utility/GetCultureCommand.cs | 2 +- .../commands/utility/GetDateCommand.cs | 2 +- .../commands/utility/GetEventCommand.cs | 2 +- .../utility/GetEventSubscriberCommand.cs | 2 +- .../commands/utility/GetHostCmdlet.cs | 2 +- .../commands/utility/GetMember.cs | 2 +- .../commands/utility/GetRandomCommand.cs | 2 +- .../commands/utility/GetRunspaceCommand.cs | 2 +- .../commands/utility/GetUICultureCommand.cs | 2 +- .../commands/utility/GetUnique.cs | 2 +- .../commands/utility/GetUptime.cs | 2 +- .../utility/ImplicitRemotingCommands.cs | 2 +- .../commands/utility/Import-LocalizedData.cs | 2 +- .../commands/utility/ImportAliasCommand.cs | 2 +- .../commands/utility/InvokeCommandCmdlet.cs | 2 +- .../commands/utility/MatchString.cs | 2 +- .../commands/utility/Measure-Object.cs | 2 +- .../commands/utility/NewAliasCommand.cs | 2 +- .../commands/utility/NewGuidCommand.cs | 2 +- .../commands/utility/NewTimeSpanCommand.cs | 2 +- .../commands/utility/ObjectCommandComparer.cs | 2 +- .../commands/utility/OrderObjectBase.cs | 2 +- .../commands/utility/ReadConsoleCmdlet.cs | 2 +- .../utility/RegisterObjectEventCommand.cs | 2 +- .../utility/RegisterPSEventCommand.cs | 2 +- .../commands/utility/Remove-PSBreakpoint.cs | 2 +- .../commands/utility/RemoveEventCommand.cs | 2 +- .../commands/utility/Send-MailMessage.cs | 2 +- .../commands/utility/Set-PSBreakpoint.cs | 2 +- .../commands/utility/SetAliasCommand.cs | 2 +- .../commands/utility/SetDateCommand.cs | 2 +- .../utility/ShowCommand/ShowCommand.cs | 2 +- .../ShowCommand/ShowCommandCommandInfo.cs | 2 +- .../ShowCommand/ShowCommandModuleInfo.cs | 6 +- .../ShowCommand/ShowCommandParameterInfo.cs | 6 +- .../ShowCommandParameterSetInfo.cs | 2 +- .../ShowCommand/ShowCommandParameterType.cs | 2 +- .../utility/ShowCommand/ShowCommandProxy.cs | 2 +- .../commands/utility/StartSleepCommand.cs | 2 +- .../commands/utility/TimeExpressionCommand.cs | 2 +- .../commands/utility/UnblockFile.cs | 2 +- .../utility/UnregisterEventCommand.cs | 2 +- .../commands/utility/Update-Data.cs | 2 +- .../commands/utility/Update-TypeData.cs | 2 +- .../commands/utility/UtilityCommon.cs | 2 +- .../commands/utility/Var.cs | 2 +- .../commands/utility/WaitEventCommand.cs | 2 +- .../BasicHtmlWebResponseObject.Common.cs | 2 +- .../WebCmdlet/Common/ContentHelper.Common.cs | 2 +- .../Common/HtmlWebResponseObject.Common.cs | 2 +- .../Common/InvokeRestMethodCommand.Common.cs | 2 +- .../Common/WebRequestPSCmdlet.Common.cs | 8 +- .../Common/WebResponseObject.Common.cs | 2 +- .../WebCmdlet/ConvertFromJsonCommand.cs | 2 +- .../utility/WebCmdlet/ConvertToJsonCommand.cs | 2 +- .../BasicHtmlWebResponseObject.CoreClr.cs | 2 +- .../CoreCLR/ContentHelper.CoreClr.cs | 8 +- .../CoreCLR/HtmlWebResponseObject.CoreClr.cs | 2 +- .../WebCmdlet/CoreCLR/HttpKnownHeaderNames.cs | 2 +- .../InvokeRestMethodCommand.CoreClr.cs | 2 +- .../InvokeWebRequestCommand.CoreClr.cs | 2 +- .../utility/WebCmdlet/CoreCLR/WebProxy.cs | 2 +- .../CoreCLR/WebRequestPSCmdlet.CoreClr.cs | 6 +- .../CoreCLR/WebResponseHelper.CoreClr.cs | 6 +- .../CoreCLR/WebResponseObject.CoreClr.cs | 4 +- .../WebResponseObjectFactory.CoreClr.cs | 2 +- .../commands/utility/WebCmdlet/FormObject.cs | 2 +- .../utility/WebCmdlet/FormObjectCollection.cs | 2 +- .../BasicHtmlWebResponseObject.FullClr.cs | 2 +- .../FullClr/ContentHelper.FullClr.cs | 2 +- .../FullClr/HtmlWebResponseObject.FullClr.cs | 2 +- .../InvokeRestMethodCommand.FullClr.cs | 2 +- .../InvokeWebRequestCommand.FullClr.cs | 2 +- .../FullClr/JsonObjectTypeResolver.cs | 2 +- .../FullClr/WebRequestPSCmdlet.FullClr.cs | 2 +- .../FullClr/WebResponseHelper.FullClr.cs | 2 +- .../FullClr/WebResponseObject.FullClr.cs | 2 +- .../WebResponseObjectFactory.FullClr.cs | 2 +- .../commands/utility/WebCmdlet/JsonObject.cs | 2 +- .../commands/utility/WebCmdlet/PSUserAgent.cs | 2 +- .../utility/WebCmdlet/StreamHelper.cs | 2 +- .../WebCmdlet/WebCmdletElementCollection.cs | 2 +- .../utility/WebCmdlet/WebRequestMethod.cs | 2 +- .../utility/WebCmdlet/WebRequestSession.cs | 2 +- .../commands/utility/Write-Object.cs | 2 +- .../commands/utility/WriteAliasCommandBase.cs | 2 +- .../commands/utility/WriteConsoleCmdlet.cs | 2 +- .../commands/utility/WriteProgressCmdlet.cs | 2 +- .../commands/utility/XmlCommands.cs | 2 +- .../commands/utility/compare-object.cs | 2 +- .../commands/utility/convert-HTML.cs | 2 +- .../commands/utility/group-object.cs | 2 +- .../commands/utility/new-object.cs | 2 +- .../commands/utility/neweventcommand.cs | 2 +- .../commands/utility/select-object.cs | 2 +- .../commands/utility/sort-object.cs | 2 +- .../commands/utility/tee-object.cs | 2 +- .../utility/trace/GetTracerCommand.cs | 2 +- .../utility/trace/MshHostTraceListener.cs | 2 +- .../utility/trace/SetTracerCommand.cs | 2 +- .../utility/trace/TraceCommandBase.cs | 2 +- .../utility/trace/TraceExpressionCommand.cs | 2 +- .../utility/trace/TraceListenerCommandBase.cs | 2 +- .../commands/utility/update-list.cs | 2 +- .../commands/utility/write.cs | 2 +- .../installer/MshUtilityMshSnapin.cs | 2 +- .../host/msh/CommandLineParameterParser.cs | 2 +- .../host/msh/ConsoleControl.cs | 2 +- .../host/msh/ConsoleHost.cs | 2 +- .../host/msh/ConsoleHostRawUserInterface.cs | 2 +- .../host/msh/ConsoleHostTranscript.cs | 2 +- .../host/msh/ConsoleHostUserInterface.cs | 2 +- .../msh/ConsoleHostUserInterfaceProgress.cs | 2 +- .../msh/ConsoleHostUserInterfacePrompt.cs | 2 +- ...ConsoleHostUserInterfacePromptForChoice.cs | 2 +- .../msh/ConsoleHostUserInterfaceSecurity.cs | 2 +- .../host/msh/ConsoleShell.cs | 2 +- .../host/msh/ConsoleTextWriter.cs | 2 +- .../host/msh/Executor.cs | 2 +- .../host/msh/ManagedEntrance.cs | 2 +- .../host/msh/PendingProgress.cs | 2 +- .../host/msh/ProgressNode.cs | 2 +- .../host/msh/ProgressPane.cs | 2 +- .../host/msh/Serialization.cs | 2 +- .../host/msh/StartTranscriptCmdlet.cs | 2 +- .../host/msh/StopTranscriptCmdlet.cs | 2 +- .../resources/ManagedEntranceStrings.resx | 2 +- .../singleshell/installer/EngineInstaller.cs | 2 +- .../singleshell/installer/MshHostMshSnapin.cs | 2 +- .../DotNetCode/Eventing/EventDescriptor.cs | 2 +- .../DotNetCode/Eventing/EventProvider.cs | 2 +- .../Eventing/EventProviderTraceListener.cs | 2 +- .../LocalAccounts/PInvokeDllNames.cs | 2 +- .../AssemblyInfo.cs | 2 +- .../BasicEditing.cs | 2 +- .../Cmdlets.cs | 2 +- .../Completion.cs | 2 +- .../Completion.vi.cs | 2 +- .../ConsoleBufferBuilder.cs | 2 +- .../ConsoleKeyChordConverter.cs | 2 +- .../ConsoleLib.cs | 2 +- .../History.cs | 2 +- .../HistoryQueue.cs | 2 +- .../KeyBindings.cs | 2 +- .../KeyBindings.vi.cs | 2 +- src/Microsoft.PowerShell.PSReadLine/Keys.cs | 2 +- .../KillYank.cs | 2 +- .../Movement.cs | 2 +- .../Movement.vi.cs | 2 +- .../Options.cs | 2 +- .../PSReadLine.psd1 | 2 +- .../PublicAPI.cs | 2 +- .../ReadLine.cs | 2 +- .../ReadLine.vi.cs | 2 +- src/Microsoft.PowerShell.PSReadLine/Render.cs | 2 +- .../Replace.vi.cs | 2 +- .../ScreenCapture.cs | 2 +- .../UndoRedo.cs | 2 +- .../UndoRedo.vi.cs | 2 +- .../VisualEditing.vi.cs | 2 +- src/Microsoft.PowerShell.PSReadLine/Words.cs | 2 +- .../Words.vi.cs | 2 +- .../YankPaste.vi.cs | 2 +- .../ScheduledJob.cs | 2 +- .../ScheduledJobDefinition.cs | 2 +- .../ScheduledJobOptions.cs | 2 +- .../ScheduledJobSourceAdapter.cs | 2 +- .../ScheduledJobStore.cs | 2 +- .../ScheduledJobTrigger.cs | 2 +- .../ScheduledJobWTS.cs | 2 +- .../commands/AddJobTrigger.cs | 2 +- .../commands/DisableJobDefinition.cs | 2 +- .../commands/DisableJobDefinitionBase.cs | 2 +- .../commands/DisableJobTrigger.cs | 2 +- .../commands/EnableDisableCmdletBase.cs | 2 +- .../commands/EnableJobDefinition.cs | 2 +- .../commands/EnableJobTrigger.cs | 2 +- .../commands/GetJobDefinition.cs | 2 +- .../commands/GetJobTrigger.cs | 2 +- .../commands/GetScheduledJobOption.cs | 2 +- .../commands/NewJobTrigger.cs | 2 +- .../commands/NewScheduledJobOption.cs | 2 +- .../commands/RegisterJobDefinition.cs | 2 +- .../commands/RemoveJobTrigger.cs | 2 +- .../commands/SchedJobCmdletBase.cs | 2 +- .../commands/ScheduledJobOptionCmdletBase.cs | 2 +- .../commands/SetJobDefinition.cs | 2 +- .../commands/SetJobTrigger.cs | 2 +- .../commands/SetScheduledJobOption.cs | 2 +- .../commands/UnregisterJobDefinition.cs | 2 +- .../security/AclCommands.cs | 2 +- .../security/CatalogCommands.cs | 2 +- .../security/CertificateCommands.cs | 2 +- .../security/CertificateProvider.cs | 2 +- .../security/CmsCommands.cs | 2 +- .../security/CredentialCommands.cs | 2 +- .../security/ExecutionPolicyCommands.cs | 2 +- .../security/SecureStringCommands.cs | 2 +- .../security/SignatureCommands.cs | 2 +- .../security/Utils.cs | 2 +- .../security/certificateproviderexceptions.cs | 2 +- .../installer/MshSecurityMshSnapin.cs | 2 +- .../ConfigProvider.cs | 2 +- src/Microsoft.WSMan.Management/CredSSP.cs | 2 +- .../CurrentConfigurations.cs | 2 +- src/Microsoft.WSMan.Management/Interop.cs | 2 +- .../InvokeWSManAction.cs | 2 +- .../NewWSManSession.cs | 2 +- src/Microsoft.WSMan.Management/PingWSMan.cs | 2 +- .../Set-QuickConfig.cs | 2 +- .../WSManConnections.cs | 2 +- .../WSManInstance.cs | 2 +- src/Microsoft.WSMan.Management/WsManHelper.cs | 2 +- src/Microsoft.WSMan.Management/WsManSnapin.cs | 2 +- .../resources/WsManResources.txt | 6 +- .../WSManSessionOption.cs | 2 +- .../Microsoft.PowerShell.Host.psd1 | 2 +- src/Modules/Shared/PSReadLine/PSReadLine.psd1 | 2 +- .../Microsoft.PowerShell.Management.psd1 | 2 +- .../Microsoft.PowerShell.Security.psd1 | 2 +- .../Microsoft.PowerShell.Utility.psd1 | 2 +- .../CimCmdlets/CimCmdlets.psd1 | 2 +- .../Microsoft.PowerShell.Security.psd1 | 2 +- .../Microsoft.WSMan.Management.psd1 | 2 +- .../WSMan.format.ps1xml | 2 +- .../PSDiagnostics/PSDiagnostics.psd1 | 2 +- .../GetEvent.types.ps1xml | 2 +- .../Microsoft.PowerShell.Diagnostics.psd1 | 2 +- .../Microsoft.PowerShell.Management.psd1 | 2 +- .../Microsoft.PowerShell.Utility.psd1 | 2 +- .../GetEvent.types.ps1xml | 2 +- .../Microsoft.PowerShell.Diagnostics.psd1 | 2 +- .../Microsoft.PowerShell.LocalAccounts.psd1 | 2 +- .../Microsoft.PowerShell.Management.psd1 | 2 +- .../Microsoft.PowerShell.ODataUtils.psd1 | 2 +- .../Microsoft.PowerShell.Utility.psd1 | 2 +- .../PSScheduledJob/PSScheduledJob.psd1 | 6 +- .../PSScheduledJob.types.ps1xml | 2 +- .../CoreCLR/CorePsAssemblyLoadContext.cs | 2 +- .../CoreCLR/CorePsPlatform.cs | 4 +- .../CoreCLR/CorePsStub.cs | 2 +- .../cimSupport/cmdletization/EnumWriter.cs | 2 +- .../cmdletization/MethodInvocationInfo.cs | 2 +- .../cmdletization/MethodParameter.cs | 2 +- .../MethodParametersCollection.cs | 2 +- .../cmdletization/ObjectModelWrapper.cs | 2 +- .../cimSupport/cmdletization/QueryBuilder.cs | 2 +- .../cimSupport/cmdletization/ScriptWriter.cs | 2 +- .../cim/WildcardPatternToCimQueryParser.cs | 2 +- .../other/ciminstancetypeadapter.cs | 2 +- .../FormatAndOutput/common/BaseCommand.cs | 2 +- .../common/BaseFormattingCommand.cs | 2 +- .../common/BaseFormattingCommandParameters.cs | 2 +- .../common/BaseOutputtingCommand.cs | 2 +- .../common/ColumnWidthManager.cs | 2 +- .../FormatAndOutput/common/ComplexWriter.cs | 2 +- .../Certificate_format_ps1xml.cs | 2 +- .../Diagnostics_Format_ps1xml.cs | 2 +- .../DotNetTypes_format_ps1xml.cs | 2 +- .../DefaultFormatters/Event_Format_ps1xml.cs | 2 +- .../FileSystem_format_ps1xml.cs | 2 +- .../DefaultFormatters/HelpV3_format_ps1xml.cs | 2 +- .../DefaultFormatters/Help_format_ps1xml.cs | 2 +- .../PowerShellCore_format_ps1xml.cs | 2 +- .../PowerShellTrace_format_ps1xml.cs | 2 +- .../Registry_format_ps1xml.cs | 2 +- .../DefaultFormatters/WSMan_Format_ps1xml.cs | 2 +- .../common/DisplayDatabase/FormatTable.cs | 2 +- .../common/DisplayDatabase/XmlLoaderBase.cs | 2 +- .../common/DisplayDatabase/commands.cs | 2 +- .../DisplayDatabase/displayDescriptionData.cs | 2 +- .../displayDescriptionDataMethods.cs | 2 +- .../displayDescriptionData_Complex.cs | 2 +- .../displayDescriptionData_List.cs | 2 +- .../displayDescriptionData_Misc.cs | 2 +- .../displayDescriptionData_Table.cs | 2 +- .../displayDescriptionData_Wide.cs | 2 +- .../displayResourceManagerCache.cs | 2 +- .../common/DisplayDatabase/typeDataManager.cs | 2 +- .../common/DisplayDatabase/typeDataQuery.cs | 2 +- .../DisplayDatabase/typeDataXmlLoader.cs | 2 +- .../typeDataXmlLoader_Complex.cs | 2 +- .../DisplayDatabase/typeDataXmlLoader_List.cs | 2 +- .../typeDataXmlLoader_Table.cs | 2 +- .../typeDataXmlLoader_Views.cs | 2 +- .../DisplayDatabase/typeDataXmlLoader_Wide.cs | 2 +- .../common/FormatGroupManager.cs | 2 +- .../common/FormatMsgCtxManager.cs | 2 +- .../common/FormatViewGenerator.cs | 2 +- .../common/FormatViewGenerator_Complex.cs | 2 +- .../common/FormatViewGenerator_List.cs | 2 +- .../common/FormatViewGenerator_Table.cs | 2 +- .../common/FormatViewGenerator_Wide.cs | 2 +- .../common/FormatViewManager.cs | 2 +- .../FormatAndOutput/common/FormatXMLWriter.cs | 2 +- .../common/FormattingObjects.cs | 2 +- .../common/FormattingObjectsDeserializer.cs | 2 +- .../FormatAndOutput/common/ILineOutput.cs | 2 +- .../FormatAndOutput/common/ListWriter.cs | 2 +- .../FormatAndOutput/common/OutputManager.cs | 2 +- .../FormatAndOutput/common/OutputQueue.cs | 2 +- .../FormatAndOutput/common/TableWriter.cs | 2 +- .../common/Utilities/MshObjectUtil.cs | 2 +- .../common/Utilities/MshParameter.cs | 2 +- .../Utilities/MshParameterAssociation.cs | 2 +- .../common/Utilities/Mshexpression.cs | 2 +- .../format-default/format-default.cs | 2 +- .../out-console/ConsoleLineOutput.cs | 2 +- .../FormatAndOutput/out-console/OutConsole.cs | 2 +- .../out-textInterface/OutTextInterface.cs | 2 +- .../engine/AliasInfo.cs | 2 +- .../engine/ApplicationInfo.cs | 2 +- .../engine/ArgumentTypeConverterAttribute.cs | 2 +- .../engine/Attributes.cs | 2 +- .../engine/AutomationEngine.cs | 2 +- .../engine/AutomationNull.cs | 2 +- .../engine/COM/ComAdapter.cs | 2 +- .../engine/COM/ComDispatch.cs | 2 +- .../engine/COM/ComInvoker.cs | 2 +- .../engine/COM/ComMethod.cs | 2 +- .../engine/COM/ComProperty.cs | 2 +- .../engine/COM/ComTypeInfo.cs | 2 +- .../engine/COM/ComUtil.cs | 2 +- .../ChildrenCmdletProviderInterfaces.cs | 2 +- .../engine/CmdletFamilyProviderInterfaces.cs | 2 +- .../engine/CmdletInfo.cs | 2 +- .../engine/CmdletParameterBinderController.cs | 2 +- .../engine/CodeMethods.cs | 2 +- .../engine/ComInterop/ArgBuilder.cs | 2 +- .../engine/ComInterop/BoolArgBuilder.cs | 2 +- .../engine/ComInterop/BoundDispEvent.cs | 2 +- .../engine/ComInterop/CollectionExtensions.cs | 2 +- .../engine/ComInterop/ComBinder.cs | 2 +- .../engine/ComInterop/ComBinderHelpers.cs | 2 +- .../engine/ComInterop/ComClassMetaObject.cs | 2 +- .../engine/ComInterop/ComDispIds.cs | 2 +- .../engine/ComInterop/ComEventDesc.cs | 2 +- .../engine/ComInterop/ComEventSink.cs | 2 +- .../engine/ComInterop/ComEventSinkProxy.cs | 2 +- .../ComInterop/ComEventSinksContainer.cs | 2 +- .../ComInterop/ComFallbackMetaObject.cs | 2 +- .../engine/ComInterop/ComHresults.cs | 2 +- .../engine/ComInterop/ComInterop.cs | 2 +- .../engine/ComInterop/ComInvokeAction.cs | 2 +- .../engine/ComInterop/ComInvokeBinder.cs | 2 +- .../engine/ComInterop/ComMetaObject.cs | 2 +- .../engine/ComInterop/ComMethodDesc.cs | 2 +- .../engine/ComInterop/ComObject.cs | 2 +- .../engine/ComInterop/ComParamDesc.cs | 2 +- .../engine/ComInterop/ComRuntimeHelpers.cs | 2 +- .../engine/ComInterop/ComType.cs | 2 +- .../engine/ComInterop/ComTypeClassDesc.cs | 2 +- .../engine/ComInterop/ComTypeDesc.cs | 2 +- .../engine/ComInterop/ComTypeEnumDesc.cs | 2 +- .../engine/ComInterop/ComTypeLibDesc.cs | 2 +- .../engine/ComInterop/ComTypeLibInfo.cs | 2 +- .../engine/ComInterop/ComTypeLibMemberDesc.cs | 2 +- .../engine/ComInterop/ConversionArgBuilder.cs | 2 +- .../engine/ComInterop/ConvertArgBuilder.cs | 2 +- .../ComInterop/ConvertibleArgBuilder.cs | 2 +- .../engine/ComInterop/CurrencyArgBuilder.cs | 2 +- .../engine/ComInterop/DateTimeArgBuilder.cs | 2 +- .../engine/ComInterop/DispCallable.cs | 2 +- .../ComInterop/DispCallableMetaObject.cs | 2 +- .../engine/ComInterop/DispatchArgBuilder.cs | 2 +- .../engine/ComInterop/ErrorArgBuilder.cs | 2 +- .../engine/ComInterop/Errors.cs | 2 +- .../engine/ComInterop/ExcepInfo.cs | 2 +- .../engine/ComInterop/Helpers.cs | 2 +- .../engine/ComInterop/IDispatchComObject.cs | 2 +- .../engine/ComInterop/IDispatchMetaObject.cs | 2 +- .../engine/ComInterop/IPseudoComObject.cs | 2 +- .../engine/ComInterop/NullArgBuilder.cs | 2 +- .../engine/ComInterop/SimpleArgBuilder.cs | 2 +- .../engine/ComInterop/SplatCallSite.cs | 2 +- .../engine/ComInterop/StringArgBuilder.cs | 2 +- .../engine/ComInterop/TypeEnumMetaObject.cs | 2 +- .../ComInterop/TypeLibInfoMetaObject.cs | 2 +- .../engine/ComInterop/TypeLibMetaObject.cs | 2 +- .../engine/ComInterop/TypeUtils.cs | 2 +- .../engine/ComInterop/UnknownArgBuilder.cs | 2 +- .../engine/ComInterop/VarEnumSelector.cs | 2 +- .../engine/ComInterop/Variant.cs | 2 +- .../engine/ComInterop/VariantArgBuilder.cs | 2 +- .../engine/ComInterop/VariantArray.cs | 2 +- .../engine/ComInterop/VariantBuilder.cs | 2 +- .../engine/CommandBase.cs | 2 +- .../CommandCompletion/CommandCompletion.cs | 2 +- .../CommandCompletion/CompletionAnalysis.cs | 6 +- .../CommandCompletion/CompletionCompleters.cs | 2 +- .../CommandCompletion/CompletionResult.cs | 2 +- .../CommandCompletion/ExtensibleCompletion.cs | 2 +- .../PseudoParameterBinder.cs | 2 +- .../engine/CommandDiscovery.cs | 2 +- .../engine/CommandFactory.cs | 2 +- .../engine/CommandInfo.cs | 2 +- .../engine/CommandMetadata.cs | 2 +- .../engine/CommandParameter.cs | 2 +- .../engine/CommandPathSearch.cs | 2 +- .../engine/CommandProcessor.cs | 2 +- .../engine/CommandProcessorBase.cs | 2 +- .../engine/CommandSearcher.cs | 2 +- .../engine/CommonCommandParameters.cs | 2 +- .../engine/CompiledCommandParameter.cs | 2 +- .../engine/ConfigurationInfo.cs | 2 +- .../engine/ContentCmdletProviderInterfaces.cs | 2 +- .../engine/CoreAdapter.cs | 50 +- .../engine/Credential.cs | 2 +- .../engine/CultureVariable.cs | 2 +- .../engine/DataStoreAdapter.cs | 2 +- .../engine/DataStoreAdapterProvider.cs | 2 +- .../engine/DefaultCommandRuntime.cs | 2 +- .../engine/DriveInterfaces.cs | 2 +- .../engine/DriveNames.cs | 2 +- .../engine/DscResourceInfo.cs | 2 +- .../engine/DscResourceSearcher.cs | 2 +- .../engine/EngineIntrinsics.cs | 2 +- .../engine/EnumExpressionEvaluator.cs | 2 +- .../engine/EnumMinimumDisambiguation.cs | 2 +- .../engine/ErrorPackage.cs | 2 +- .../engine/EventManager.cs | 2 +- .../engine/ExecutionContext.cs | 6 +- .../engine/ExtendedTypeSystemException.cs | 2 +- .../engine/ExternalScriptInfo.cs | 2 +- .../engine/ExtraAdapter.cs | 2 +- .../engine/FilterInfo.cs | 2 +- .../engine/FunctionInfo.cs | 2 +- .../engine/GetCommandCommand.cs | 2 +- .../engine/ICommandRuntime.cs | 2 +- .../engine/InformationRecord.cs | 2 +- .../engine/InitialSessionState.cs | 2 +- .../engine/InternalCommands.cs | 22 +- .../engine/InvocationInfo.cs | 2 +- .../engine/ItemCmdletProviderInterfaces.cs | 2 +- .../engine/LanguagePrimitives.cs | 2 +- .../engine/ManagementObjectAdapter.cs | 2 +- .../engine/MergedCommandParameterMetadata.cs | 2 +- .../MinishellParameterBinderController.cs | 2 +- .../engine/Modules/AnalysisCache.cs | 2 +- .../Modules/ExportModuleMemberCommand.cs | 2 +- .../engine/Modules/GetModuleCommand.cs | 2 +- .../engine/Modules/ImportModuleCommand.cs | 6 +- .../engine/Modules/ModuleCmdletBase.cs | 2 +- .../engine/Modules/ModuleIntrinsics.cs | 2 +- .../engine/Modules/ModuleSpecification.cs | 2 +- .../engine/Modules/ModuleUtils.cs | 2 +- .../engine/Modules/NewModuleCommand.cs | 2 +- .../Modules/NewModuleManifestCommand.cs | 12 +- .../engine/Modules/PSModuleInfo.cs | 2 +- .../engine/Modules/RemoteDiscoveryHelper.cs | 2 +- .../engine/Modules/RemoveModuleCommand.cs | 2 +- .../engine/Modules/ScriptAnalysis.cs | 2 +- .../Modules/TestModuleManifestCommand.cs | 6 +- .../engine/MshCmdlet.cs | 2 +- .../engine/MshCommandRuntime.cs | 2 +- .../engine/MshMemberInfo.cs | 2 +- .../engine/MshObject.cs | 2 +- .../engine/MshObjectTypeDescriptor.cs | 2 +- .../engine/MshReference.cs | 2 +- .../engine/MshSecurityException.cs | 2 +- .../engine/MshSnapinQualifiedName.cs | 2 +- .../engine/NativeCommand.cs | 2 +- .../engine/NativeCommandParameterBinder.cs | 2 +- .../NativeCommandParameterBinderController.cs | 2 +- .../engine/NativeCommandProcessor.cs | 2 +- .../engine/NullString.cs | 2 +- .../engine/ObjectEventRegistrationBase.cs | 2 +- .../engine/PSClassInfo.cs | 2 +- .../engine/PSClassSearcher.cs | 2 +- .../engine/PSVersionInfo.cs | 2 +- .../engine/ParameterBinderBase.cs | 2 +- .../engine/ParameterBinderController.cs | 2 +- .../engine/ParameterInfo.cs | 2 +- .../engine/ParameterSetInfo.cs | 2 +- .../engine/ParameterSetPromptingData.cs | 2 +- .../engine/ParameterSetSpecificMetadata.cs | 2 +- .../engine/PathInterfaces.cs | 2 +- .../engine/Pipe.cs | 2 +- .../engine/PositionalCommandParameter.cs | 2 +- .../engine/ProgressRecord.cs | 2 +- .../PropertyCmdletProviderInterfaces.cs | 2 +- .../engine/ProviderInterfaces.cs | 2 +- .../engine/ProviderNames.cs | 2 +- .../engine/ProxyCommand.cs | 2 +- .../engine/PseudoParameterBinder.cs | 2 +- .../engine/PseudoParameters.cs | 2 +- .../engine/QuestionMarkVariable.cs | 2 +- .../engine/ReflectionParameterBinder.cs | 2 +- .../engine/RunspaceConfigurationEntry.cs | 4 +- .../engine/ScopedItemSearcher.cs | 2 +- .../engine/ScriptCommand.cs | 2 +- .../engine/ScriptCommandProcessor.cs | 2 +- .../engine/ScriptInfo.cs | 2 +- ...urityDescriptorCmdletProviderInterfaces.cs | 2 +- .../engine/SecurityManagerBase.cs | 2 +- .../engine/SerializationStrings.cs | 2 +- .../engine/SessionState.cs | 2 +- .../engine/SessionStateAliasAPIs.cs | 2 +- .../engine/SessionStateCmdletAPIs.cs | 2 +- .../engine/SessionStateContainer.cs | 2 +- .../engine/SessionStateContent.cs | 2 +- .../engine/SessionStateDriveAPIs.cs | 2 +- .../engine/SessionStateDynamicProperty.cs | 2 +- .../engine/SessionStateFunctionAPIs.cs | 2 +- .../engine/SessionStateItem.cs | 2 +- .../engine/SessionStateLocationAPIs.cs | 2 +- .../engine/SessionStateNavigation.cs | 2 +- .../engine/SessionStateProperty.cs | 2 +- .../engine/SessionStateProviderAPIs.cs | 2 +- .../engine/SessionStatePublic.cs | 2 +- .../engine/SessionStateScope.cs | 2 +- .../engine/SessionStateScopeAPIs.cs | 2 +- .../engine/SessionStateScopeEnumerator.cs | 2 +- ...SessionStateSecurityDescriptorInterface.cs | 2 +- .../engine/SessionStateStrings.cs | 2 +- .../engine/SessionStateUtils.cs | 2 +- .../engine/SessionStateVariableAPIs.cs | 2 +- .../engine/ShellVariable.cs | 2 +- .../engine/SpecialVariables.cs | 2 +- .../engine/ThirdPartyAdapter.cs | 2 +- .../engine/TransactedString.cs | 2 +- .../engine/TransactionManager.cs | 2 +- .../engine/TypeMetadata.cs | 2 +- .../engine/TypeTable.cs | 2 +- .../engine/UserFeedbackParameters.cs | 2 +- .../engine/Utils.cs | 2 +- .../engine/VariableAttributeCollection.cs | 2 +- .../engine/VariableInterfaces.cs | 2 +- .../engine/VariablePath.cs | 2 +- .../engine/WinRT/IInspectable.cs | 2 +- .../engine/WorkflowInfo.cs | 2 +- .../engine/cmdlet.cs | 2 +- .../engine/debugger/Breakpoint.cs | 2 +- .../engine/debugger/debugger.cs | 4 +- .../engine/hostifaces/AsyncResult.cs | 2 +- .../engine/hostifaces/ChoiceDescription.cs | 2 +- .../engine/hostifaces/Command.cs | 2 +- .../engine/hostifaces/Connection.cs | 2 +- .../engine/hostifaces/ConnectionBase.cs | 2 +- .../engine/hostifaces/ConnectionFactory.cs | 2 +- .../engine/hostifaces/DefaultHost.cs | 2 +- .../engine/hostifaces/FieldDescription.cs | 2 +- .../engine/hostifaces/History.cs | 2 +- .../engine/hostifaces/InformationalRecord.cs | 2 +- .../engine/hostifaces/InternalHost.cs | 2 +- .../InternalHostRawUserInterface.cs | 2 +- .../hostifaces/InternalHostUserInterface.cs | 2 +- .../engine/hostifaces/ListModifier.cs | 2 +- .../engine/hostifaces/LocalConnection.cs | 2 +- .../engine/hostifaces/LocalPipeline.cs | 2 +- .../engine/hostifaces/MshHost.cs | 2 +- .../hostifaces/MshHostRawUserInterface.cs | 2 +- .../engine/hostifaces/MshHostUserInterface.cs | 2 +- .../hostifaces/NativeCultureResolver.cs | 2 +- .../engine/hostifaces/PSCommand.cs | 2 +- .../engine/hostifaces/PSDataCollection.cs | 2 +- .../engine/hostifaces/Parameter.cs | 2 +- .../engine/hostifaces/Pipeline.cs | 2 +- .../engine/hostifaces/PowerShell.cs | 2 +- .../hostifaces/PowerShellProcessInstance.cs | 2 +- .../engine/hostifaces/RunspaceInit.cs | 2 +- .../engine/hostifaces/RunspaceInvoke.cs | 2 +- .../engine/hostifaces/RunspacePool.cs | 2 +- .../engine/hostifaces/RunspacePoolInternal.cs | 2 +- .../internalHostuserInterfacesecurity.cs | 2 +- .../engine/hostifaces/pipelinebase.cs | 2 +- .../engine/interpreter/Utilities.cs | 2 +- .../engine/lang/codegen.cs | 2 +- .../engine/lang/interface/PSParseError.cs | 2 +- .../engine/lang/interface/PSParser.cs | 2 +- .../engine/lang/interface/PSToken.cs | 2 +- .../engine/lang/parserutils.cs | 2 +- .../engine/lang/scriptblock.cs | 2 +- .../engine/parser/AstVisitor.cs | 2 +- .../engine/parser/CharTraits.cs | 2 +- .../engine/parser/Compiler.cs | 2 +- .../engine/parser/ConstantValues.cs | 2 +- .../engine/parser/FusionAssemblyIdentity.cs | 2 +- .../engine/parser/GlobalAssemblyCache.cs | 2 +- .../engine/parser/PSType.cs | 4 +- .../engine/parser/Parser.cs | 2 +- .../engine/parser/Position.cs | 2 +- .../engine/parser/PreOrderVisitor.cs | 2 +- .../engine/parser/SafeValues.cs | 2 +- .../engine/parser/SemanticChecks.cs | 2 +- .../engine/parser/SymbolResolver.cs | 2 +- .../engine/parser/TypeResolver.cs | 2 +- .../engine/parser/VariableAnalysis.cs | 2 +- .../engine/parser/ast.cs | 2 +- .../engine/parser/token.cs | 2 +- .../engine/parser/tokenizer.cs | 2 +- .../engine/pipeline.cs | 2 +- .../engine/regex.cs | 2 +- .../remoting/client/ClientMethodExecutor.cs | 2 +- .../remoting/client/ClientRemotePowerShell.cs | 2 +- .../engine/remoting/client/Job.cs | 2 +- .../engine/remoting/client/Job2.cs | 2 +- .../engine/remoting/client/JobManager.cs | 2 +- .../remoting/client/JobSourceAdapter.cs | 2 +- .../engine/remoting/client/PSProxyJob.cs | 2 +- .../remoting/client/PowerShellStreams.cs | 2 +- .../client/RemoteRunspacePoolInternal.cs | 2 +- .../remoting/client/RemotingErrorRecord.cs | 2 +- .../remoting/client/RemotingProtocol2.cs | 2 +- .../engine/remoting/client/RunspaceRef.cs | 2 +- .../engine/remoting/client/ThrottlingJob.cs | 2 +- .../remoting/client/clientremotesession.cs | 2 +- ...clientremotesessionprotocolstatemachine.cs | 2 +- .../engine/remoting/client/remotepipeline.cs | 2 +- .../engine/remoting/client/remoterunspace.cs | 2 +- .../remoting/client/remoterunspaceinfo.cs | 2 +- .../remoting/client/remotingprotocol.cs | 2 +- .../client/remotingprotocolimplementation.cs | 2 +- .../remoting/commands/ConnectPSSession.cs | 2 +- .../remoting/commands/CustomShellCommands.cs | 2 +- .../engine/remoting/commands/DebugJob.cs | 2 +- .../remoting/commands/DisconnectPSSession.cs | 2 +- .../commands/EnterPSHostProcessCommand.cs | 2 +- .../engine/remoting/commands/GetJob.cs | 2 +- .../remoting/commands/InvokeCommandCommand.cs | 2 +- .../engine/remoting/commands/JobRepository.cs | 2 +- .../NewPSSessionConfigurationOptionCommand.cs | 2 +- .../commands/NewPSSessionOptionCommand.cs | 140 ++--- .../remoting/commands/PSRemotingCmdlet.cs | 2 +- .../remoting/commands/PopRunspaceCommand.cs | 2 +- .../remoting/commands/PushRunspaceCommand.cs | 4 +- .../engine/remoting/commands/ReceiveJob.cs | 2 +- .../remoting/commands/ReceivePSSession.cs | 2 +- .../engine/remoting/commands/RemoveJob.cs | 2 +- .../engine/remoting/commands/ResumeJob.cs | 2 +- .../engine/remoting/commands/StartJob.cs | 2 +- .../engine/remoting/commands/StopJob.cs | 2 +- .../engine/remoting/commands/SuspendJob.cs | 2 +- .../TestPSSessionConfigurationFile.cs | 2 +- .../engine/remoting/commands/WaitJob.cs | 2 +- .../remoting/commands/getrunspacecommand.cs | 2 +- .../remoting/commands/newrunspacecommand.cs | 2 +- .../remoting/commands/remotingcommandutil.cs | 2 +- .../commands/removerunspacecommand.cs | 2 +- .../remoting/commands/runspacerepository.cs | 2 +- .../engine/remoting/common/AsyncObject.cs | 2 +- .../engine/remoting/common/DispatchTable.cs | 2 +- .../engine/remoting/common/Indexer.cs | 2 +- .../engine/remoting/common/ObjectRef.cs | 2 +- .../engine/remoting/common/PSETWTracer.cs | 2 +- .../PSSessionConfigurationTypeOption.cs | 2 +- .../common/RemoteSessionHyperVSocket.cs | 2 +- .../remoting/common/RemoteSessionNamedPipe.cs | 2 +- .../remoting/common/RunspaceConnectionInfo.cs | 162 ++--- .../remoting/common/RunspaceInitInfo.cs | 2 +- .../remoting/common/RunspacePoolStateInfo.cs | 2 +- .../common/WireDataFormat/EncodeAndDecode.cs | 2 +- .../common/WireDataFormat/RemoteHost.cs | 2 +- .../WireDataFormat/RemoteHostEncoder.cs | 2 +- .../WireDataFormat/RemoteSessionCapability.cs | 2 +- .../WireDataFormat/RemotingDataObject.cs | 2 +- .../engine/remoting/common/fragmentor.cs | 2 +- .../engine/remoting/common/misc.cs | 2 +- .../engine/remoting/common/psstreamobject.cs | 2 +- .../engine/remoting/common/remotesession.cs | 2 +- .../remoting/common/remotingexceptions.cs | 2 +- .../engine/remoting/common/throttlemanager.cs | 2 +- .../remoting/fanin/BaseTransportManager.cs | 2 +- .../fanin/InitialSessionStateProvider.cs | 2 +- .../fanin/OutOfProcTransportManager.cs | 6 +- .../engine/remoting/fanin/PSPrincipal.cs | 2 +- .../fanin/PSSessionConfigurationData.cs | 2 +- .../remoting/fanin/PriorityCollection.cs | 2 +- .../engine/remoting/fanin/WSManNativeAPI.cs | 2 +- .../engine/remoting/fanin/WSManPlugin.cs | 2 +- .../remoting/fanin/WSManPluginFacade.cs | 2 +- .../remoting/fanin/WSManPluginShellSession.cs | 2 +- .../fanin/WSManPluginTransportManager.cs | 2 +- .../remoting/fanin/WSManTransportManager.cs | 2 +- .../remoting/host/RemoteHostMethodInfo.cs | 2 +- .../server/OutOfProcServerMediator.cs | 2 +- .../remoting/server/ServerMethodExecutor.cs | 2 +- .../remoting/server/ServerPowerShellDriver.cs | 2 +- .../remoting/server/ServerRemoteHost.cs | 2 +- .../ServerRemoteHostRawUserInterface.cs | 2 +- .../server/ServerRemoteHostUserInterface.cs | 2 +- .../server/ServerRemotingProtocol2.cs | 2 +- .../server/ServerRunspacePoolDriver.cs | 2 +- .../server/ServerSteppablePipelineDriver.cs | 2 +- .../ServerSteppablePipelineSubscriber.cs | 2 +- .../remoting/server/WSManChannelEvents.cs | 2 +- .../remoting/server/serverremotesession.cs | 2 +- .../server/serverremotesessionstatemachine.cs | 2 +- .../remoting/server/serverremotingprotocol.cs | 2 +- .../serverremotingprotocolimplementation.cs | 2 +- .../engine/runtime/Binding/Binders.cs | 2 +- .../engine/runtime/CompiledScriptBlock.cs | 2 +- .../engine/runtime/Operations/ArrayOps.cs | 2 +- .../engine/runtime/Operations/ClassOps.cs | 2 +- .../engine/runtime/Operations/MiscOps.cs | 10 +- .../engine/runtime/Operations/NumericOps.cs | 2 +- .../engine/runtime/Operations/StringOps.cs | 2 +- .../engine/runtime/Operations/VariableOps.cs | 2 +- .../engine/runtime/ScriptBlockToPowerShell.cs | 2 +- .../engine/scriptparameterbinder.cs | 2 +- .../engine/scriptparameterbindercontroller.cs | 2 +- .../engine/serialization.cs | 2 +- .../help/AliasHelpInfo.cs | 2 +- .../help/AliasHelpProvider.cs | 2 +- .../help/BaseCommandHelpInfo.cs | 20 +- .../help/CabinetAPI.cs | 2 +- .../help/CabinetNativeApi.cs | 2 +- .../help/CommandHelpProvider.cs | 64 +- .../help/DefaultCommandHelpObjectBuilder.cs | 2 +- .../help/DefaultHelpProvider.cs | 2 +- .../help/DscResourceHelpProvider.cs | 2 +- .../help/HelpCategoryInvalidException.cs | 2 +- .../help/HelpCommands.cs | 2 +- .../help/HelpCommentsParser.cs | 2 +- .../help/HelpErrorTracer.cs | 2 +- .../help/HelpFileHelpInfo.cs | 2 +- .../help/HelpFileHelpProvider.cs | 2 +- .../help/HelpInfo.cs | 2 +- .../help/HelpNotFoundException.cs | 2 +- .../help/HelpProvider.cs | 2 +- .../help/HelpProviderWithCache.cs | 2 +- .../help/HelpProviderWithFullCache.cs | 2 +- .../help/HelpRequest.cs | 2 +- .../help/HelpSystem.cs | 2 +- .../help/MUIFileSearcher.cs | 2 +- .../help/MamlClassHelpInfo.cs | 2 +- .../help/MamlCommandHelpInfo.cs | 2 +- .../help/MamlNode.cs | 2 +- .../help/MamlUtil.cs | 2 +- .../help/PSClassHelpProvider.cs | 2 +- .../help/ProviderCommandHelpInfo.cs | 2 +- .../help/ProviderContext.cs | 2 +- .../help/ProviderHelpInfo.cs | 2 +- .../help/ProviderHelpProvider.cs | 2 +- .../help/RemoteHelpInfo.cs | 2 +- .../help/SaveHelpCommand.cs | 2 +- .../help/ScriptCommandHelpProvider.cs | 2 +- .../help/SyntaxHelpInfo.cs | 2 +- .../help/UpdatableHelpCommandBase.cs | 2 +- .../help/UpdatableHelpInfo.cs | 2 +- .../help/UpdatableHelpModuleInfo.cs | 2 +- .../help/UpdatableHelpSystem.cs | 2 +- .../help/UpdatableHelpUri.cs | 2 +- .../help/UpdateHelpCommand.cs | 2 +- .../logging/LogContext.cs | 2 +- .../logging/LogProvider.cs | 2 +- .../logging/MshLog.cs | 2 +- .../logging/eventlog/EventLogLogProvider.cs | 2 +- .../namespaces/AliasProvider.cs | 2 +- .../namespaces/ContainerProviderBase.cs | 2 +- .../namespaces/CoreCommandContext.cs | 2 +- .../namespaces/DriveProviderBase.cs | 2 +- .../namespaces/EnvironmentProvider.cs | 2 +- .../namespaces/FileSystemContentStream.cs | 2 +- .../namespaces/FileSystemProvider.cs | 2 +- .../namespaces/FileSystemSecurity.cs | 2 +- .../namespaces/FunctionProvider.cs | 2 +- .../namespaces/IContentProvider.cs | 2 +- .../namespaces/IContentReader.cs | 2 +- .../namespaces/IContentWriter.cs | 2 +- .../namespaces/IDynamicPropertyProvider.cs | 2 +- .../namespaces/IPermissionProvider.cs | 2 +- .../namespaces/IPropertiesProvider.cs | 2 +- .../namespaces/ItemProviderBase.cs | 2 +- .../namespaces/LocationGlobber.cs | 2 +- .../namespaces/NavigationProviderBase.cs | 2 +- .../namespaces/PathInfo.cs | 2 +- .../namespaces/ProviderBase.cs | 2 +- .../namespaces/ProviderBaseSecurity.cs | 2 +- .../ProviderDeclarationAttribute.cs | 2 +- .../namespaces/RegistryProvider.cs | 2 +- .../namespaces/RegistrySecurity.cs | 2 +- .../namespaces/RegistryWrapper.cs | 2 +- .../namespaces/SafeTransactionHandle.cs | 10 +- .../namespaces/SessionStateProviderBase.cs | 2 +- .../namespaces/StackInfo.cs | 2 +- .../namespaces/VariableProvider.cs | 2 +- .../security/Authenticode.cs | 2 +- .../security/CatalogHelper.cs | 2 +- .../security/CredentialParameter.cs | 2 +- .../security/MshSignature.cs | 2 +- .../security/SecureStringHelper.cs | 2 +- .../security/SecurityManager.cs | 2 +- .../security/SecuritySupport.cs | 10 +- .../security/nativeMethods.cs | 2 +- .../config/MshConsoleLoadException.cs | 2 +- .../singleshell/config/MshSnapinInfo.cs | 2 +- .../config/MshSnapinLoadException.cs | 2 +- .../utils/ArchitectureSensitiveAttribute.cs | 2 +- .../utils/BackgroundDispatcher.cs | 2 +- .../utils/ClrFacade.cs | 2 +- .../utils/CommandDiscoveryExceptions.cs | 2 +- .../utils/CommandProcessorExceptions.cs | 2 +- .../utils/CoreProviderCmdlets.cs | 2 +- .../utils/CryptoUtils.cs | 2 +- .../utils/EncodingUtils.cs | 2 +- .../utils/ExecutionExceptions.cs | 2 +- .../utils/ExtensionMethods.cs | 2 +- .../utils/FormatAndTypeDataHelper.cs | 2 +- .../utils/GraphicalHostReflectionWrapper.cs | 2 +- .../utils/HostInterfacesExceptions.cs | 2 +- .../utils/IObjectReader.cs | 2 +- .../utils/IObjectWriter.cs | 2 +- .../utils/MetadataExceptions.cs | 2 +- .../utils/MshArgumentException.cs | 2 +- .../utils/MshArgumentNullException.cs | 2 +- .../utils/MshArgumentOutOfRangeException.cs | 2 +- .../utils/MshInvalidOperationException.cs | 2 +- .../utils/MshNotImplementedException.cs | 2 +- .../utils/MshNotSupportedException.cs | 2 +- .../utils/MshObjectDisposedException.cs | 2 +- .../utils/MshTraceSource.cs | 2 +- .../utils/ObjectReader.cs | 2 +- .../utils/ObjectStream.cs | 2 +- .../utils/ObjectWriter.cs | 2 +- .../utils/PInvokeDllNames.cs | 2 +- .../utils/PSTelemetryMethods.cs | 2 +- .../utils/PSTelemetryWrapper.cs | 2 +- .../utils/ParameterBinderExceptions.cs | 2 +- .../utils/ParserException.cs | 2 +- .../utils/PathUtils.cs | 2 +- .../utils/PlatformInvokes.cs | 2 +- .../utils/PowerShellETWTracer.cs | 2 +- .../utils/PowerShellExecutionHelper.cs | 2 +- .../utils/PsUtils.cs | 2 +- .../utils/ResourceManagerCache.cs | 2 +- .../utils/RuntimeException.cs | 2 +- .../utils/SessionStateExceptions.cs | 2 +- .../utils/StringUtil.cs | 2 +- .../utils/StructuredTraceSource.cs | 2 +- .../utils/Verbs.cs | 2 +- .../utils/assert.cs | 2 +- .../perfCounters/CounterSetInstanceBase.cs | 2 +- .../perfCounters/CounterSetRegistrarBase.cs | 2 +- .../utils/perfCounters/PSPerfCountersMgr.cs | 2 +- .../utils/tracing/EtwActivity.cs | 2 +- .../utils/tracing/EtwActivityReverter.cs | 2 +- .../EtwActivityReverterMethodInvoker.cs | 2 +- .../utils/tracing/EtwEventCorrelator.cs | 2 +- .../utils/tracing/IMethodInvoker.cs | 2 +- .../utils/tracing/PSEtwLog.cs | 2 +- .../utils/tracing/PSEtwLogProvider.cs | 2 +- .../utils/tracing/Tracing.cs | 2 +- .../nativemsh/pwrshcommon/ClrHostWrapper.h | 40 +- .../nativemsh/pwrshcommon/ConfigFileReader.h | 4 +- .../pwrshcommon/IPwrshCommonOutput.h | 2 +- .../nativemsh/pwrshcommon/NativeMsh.h | 6 +- .../pwrshcommon/NativeMshConstants.h | 6 +- .../nativemsh/pwrshcommon/SystemCallFacade.h | 4 +- .../pwrshcommon/WinSystemCallFacade.cpp | 4 +- .../pwrshcommon/WinSystemCallFacade.h | 4 +- .../nativemsh/pwrshcommon/pwrshcommon.cpp | 38 +- .../nativemsh/pwrshexe/CssMainEntry.cpp | 6 +- .../nativemsh/pwrshexe/MainEntry.cpp | 138 ++--- .../nativemsh/pwrshexe/MshResources.rc | 8 +- .../nativemsh/pwrshexe/NativeMsh.mc | 4 +- .../nativemsh/pwrshexe/OutputWriter.h | 4 +- .../nativemsh/pwrshexe/version.rc | 2 +- .../nativemsh/pwrshplugin/entrypoints.cpp | 98 +-- .../nativemsh/pwrshplugin/entrypoints.h | 4 +- .../nativemsh/pwrshplugin/pwrshclrhost.cpp | 38 +- .../nativemsh/pwrshplugin/pwrshclrhost.h | 12 +- .../nativemsh/pwrshplugin/pwrshheaders.h | 4 +- .../nativemsh/pwrshplugin/pwrshplugin.h | 114 ++-- .../pwrshplugin/pwrshpluginResources.rc | 2 +- .../nativemsh/pwrshplugin/pwrshplugindefs.h | 6 +- .../pwrshplugin/pwrshpluginerrorcodes.mc | 2 +- .../nativemsh/pwrshplugin/version.rc | 2 +- src/powershell/Program.cs | 2 +- test/PSReadLine/AssemblyInfo.cs | 2 +- .../Scripting.Classes.BasicParsing.Tests.ps1 | 2 +- .../scripting.Classes.inheritance.tests.ps1 | 2 +- .../Classes/scripting.enums.tests.ps1 | 2 +- .../Debugging/DebuggerScriptTests.Tests.ps1 | 2 +- .../Debugging/DebuggingInHost.Tests.ps1 | 2 +- .../PSSessionConfiguration.Tests.ps1 | 2 +- ...ster.Commands.Cmdlets.GetCommand.Tests.ps1 | 34 +- ...Cmdlets.LocalAccounts.LocalGroup.Tests.ps1 | 2 +- ...s.LocalAccounts.LocalGroupMember.Tests.ps1 | 8 +- ....Cmdlets.LocalAccounts.LocalUser.Tests.ps1 | 2 +- .../Copy.Item.Tests.ps1 | 2 +- .../TimeZone.Tests.ps1 | 4 +- .../FileCatalog.Tests.ps1 | 2 +- .../UserConfigProv/UserConfigProv.psd1 | 2 +- .../FormatHex.Tests.ps1 | 2 +- .../NewTemporaryFile.Tests.ps1 | 2 +- .../Pester.Commands.Cmdlets.Json.Tests.ps1 | 6 +- .../WebCmdlets.Tests.ps1 | 18 +- .../Cdxml/assets/CimTest/CdxmlTest.psd1 | 2 +- .../Modules/HelpersCommon/HelpersCommon.psd1 | 2 +- .../Modules/HelpersHostCS/HelpersHostCS.psd1 | 2 +- .../HelpersLanguage/HelpersLanguage.psd1 | 2 +- .../HelpersRemoting/HelpersRemoting.psd1 | 2 +- .../Modules/HttpListener/HttpListener.psd1 | 2 +- test/tools/OpenCover/OpenCover.psd1 | 2 +- tools/packaging/packaging.psd1 | 2 +- tools/packaging/project/powershell.nuspec | 2 +- 1058 files changed, 1912 insertions(+), 1912 deletions(-) diff --git a/LICENSE.txt b/LICENSE.txt index 1df45821db0..f2618346d7b 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,25 +1,25 @@ PowerShell 6.0 -Copyright (c) Microsoft Corporation +Copyright (c) Microsoft Corporation. All rights reserved. -All rights reserved. +All rights reserved. MIT License -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the ""Software""), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the ""Software""), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/assets/AppImageThirdPartyNotices.txt b/assets/AppImageThirdPartyNotices.txt index 53e24978b4d..0eaf1e0cd58 100644 --- a/assets/AppImageThirdPartyNotices.txt +++ b/assets/AppImageThirdPartyNotices.txt @@ -5,7 +5,7 @@ -Copyright © 1991-2016 Unicode, Inc. All rights reserved. +Copyright (c) 1991-2016 Unicode, Inc. All rights reserved. Distributed under the Terms of Use in http://www.unicode.org/copyright.html Permission is hereby granted, free of charge, to any person obtaining diff --git a/assets/pwsh.1.ronn b/assets/pwsh.1.ronn index 8560f44e3b9..01e57148be0 100644 --- a/assets/pwsh.1.ronn +++ b/assets/pwsh.1.ronn @@ -119,5 +119,5 @@ These are automatically defined PowerShell-language variables. ## COPYRIGHT -Copyright (c) 2016 Microsoft Corporation. +Copyright (c) Microsoft Corporation. All rights reserved. diff --git a/demos/SSHRemoting/README.md b/demos/SSHRemoting/README.md index e4d8035c4ee..2d9f06e3f76 100644 --- a/demos/SSHRemoting/README.md +++ b/demos/SSHRemoting/README.md @@ -175,7 +175,7 @@ Microsoft Windows [Version 10.0.10586] # C:\Users\PSUser\Documents>pwsh.exe PowerShell -Copyright (C) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. PS C:\Users\PSUser\Documents> $session = New-PSSession -HostName WinVM2 -UserName PSRemoteUser The authenticity of host 'WinVM2 (10.13.37.3)' can't be established. diff --git a/demos/crontab/CronTab/CronTab.psd1 b/demos/crontab/CronTab/CronTab.psd1 index 4c8f772bf27..02374b1d791 100755 --- a/demos/crontab/CronTab/CronTab.psd1 +++ b/demos/crontab/CronTab/CronTab.psd1 @@ -19,7 +19,7 @@ Author = 'Microsoft' CompanyName = 'Unknown' # Copyright statement for this module -Copyright = '(c) 2016 Microsoft. All rights reserved.' +Copyright = 'Copyright (c) Microsoft Corporation. All rights reserved.' # Description of the functionality provided by this module Description = 'Sample module for managing CronTab' diff --git a/docker/README.md b/docker/README.md index ab6ada0c920..ebe45dbecda 100644 --- a/docker/README.md +++ b/docker/README.md @@ -46,7 +46,7 @@ adf6ad28fa0e: Pull complete Digest: sha256:92c79c5fcdaf3027626643aef556344b8b4cbdaccf8443f543303319949c7f3a Status: Downloaded newer image for microsoft/powershell:latest PowerShell -Copyright © 2016 Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. PS /> Write-Host "Hello, World!" Hello, World! diff --git a/docs/host-powershell/sample-dotnet1.1/Logic/UseRunspace.cs b/docs/host-powershell/sample-dotnet1.1/Logic/UseRunspace.cs index b13a08c244a..f9aa64abfdd 100644 --- a/docs/host-powershell/sample-dotnet1.1/Logic/UseRunspace.cs +++ b/docs/host-powershell/sample-dotnet1.1/Logic/UseRunspace.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; using System.Management.Automation; diff --git a/docs/host-powershell/sample-dotnet1.1/MyApp/Program.cs b/docs/host-powershell/sample-dotnet1.1/MyApp/Program.cs index f0fa6b5fedf..9391a589827 100644 --- a/docs/host-powershell/sample-dotnet1.1/MyApp/Program.cs +++ b/docs/host-powershell/sample-dotnet1.1/MyApp/Program.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation; @@ -7,7 +7,7 @@ namespace Application.Test { - public class Program + public class Program { /// /// Managed entry point shim, which starts the actual program @@ -15,10 +15,10 @@ public class Program public static int Main(string[] args) { // Application needs to use PowerShell AssemblyLoadContext if it needs to create powershell runspace - // PowerShell engine depends on PS ALC to provide the necessary assembly loading/searching support that is missing from .NET Core + // PowerShell engine depends on PS ALC to provide the necessary assembly loading/searching support that is missing from .NET Core string appBase = System.IO.Path.GetDirectoryName(typeof(Program).GetTypeInfo().Assembly.Location); System.Console.WriteLine("\nappBase: {0}", appBase); - + // Initialize the PS ALC and let it load 'Logic.dll' and start the execution return (int)PowerShellAssemblyLoadContextInitializer. InitializeAndCallEntryMethod( diff --git a/docs/host-powershell/sample-dotnet2.0-powershell.beta.1/Logic/UseRunspace.cs b/docs/host-powershell/sample-dotnet2.0-powershell.beta.1/Logic/UseRunspace.cs index b13a08c244a..f9aa64abfdd 100644 --- a/docs/host-powershell/sample-dotnet2.0-powershell.beta.1/Logic/UseRunspace.cs +++ b/docs/host-powershell/sample-dotnet2.0-powershell.beta.1/Logic/UseRunspace.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; using System.Management.Automation; diff --git a/docs/host-powershell/sample-dotnet2.0-powershell.beta.1/MyApp/Program.cs b/docs/host-powershell/sample-dotnet2.0-powershell.beta.1/MyApp/Program.cs index f0fa6b5fedf..9391a589827 100644 --- a/docs/host-powershell/sample-dotnet2.0-powershell.beta.1/MyApp/Program.cs +++ b/docs/host-powershell/sample-dotnet2.0-powershell.beta.1/MyApp/Program.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation; @@ -7,7 +7,7 @@ namespace Application.Test { - public class Program + public class Program { /// /// Managed entry point shim, which starts the actual program @@ -15,10 +15,10 @@ public class Program public static int Main(string[] args) { // Application needs to use PowerShell AssemblyLoadContext if it needs to create powershell runspace - // PowerShell engine depends on PS ALC to provide the necessary assembly loading/searching support that is missing from .NET Core + // PowerShell engine depends on PS ALC to provide the necessary assembly loading/searching support that is missing from .NET Core string appBase = System.IO.Path.GetDirectoryName(typeof(Program).GetTypeInfo().Assembly.Location); System.Console.WriteLine("\nappBase: {0}", appBase); - + // Initialize the PS ALC and let it load 'Logic.dll' and start the execution return (int)PowerShellAssemblyLoadContextInitializer. InitializeAndCallEntryMethod( diff --git a/docs/host-powershell/sample-dotnet2.0-powershell.beta.3/MyApp/Program.cs b/docs/host-powershell/sample-dotnet2.0-powershell.beta.3/MyApp/Program.cs index 207028a2d1a..92f03751969 100644 --- a/docs/host-powershell/sample-dotnet2.0-powershell.beta.3/MyApp/Program.cs +++ b/docs/host-powershell/sample-dotnet2.0-powershell.beta.3/MyApp/Program.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; @@ -7,7 +7,7 @@ namespace Application.Test { - public class Program + public class Program { /// /// Managed entry point shim, which starts the actual program diff --git a/license_thirdparty_proprietary.txt b/license_thirdparty_proprietary.txt index 86d445c8930..911a40b8dcd 100644 --- a/license_thirdparty_proprietary.txt +++ b/license_thirdparty_proprietary.txt @@ -1,69 +1,69 @@ PowerShell 6.0 -Copyright (c) Microsoft Corporation -All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. +All rights reserved. MIT License -Permission is hereby granted, free of charge, to any person obtaining a copy of this -software and associated documentation files (the "Software"), to deal in the Software -without restriction, including without limitation the rights to use, copy, modify, -merge, publish, distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to the following +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, +merge, publish, distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all copies +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, -INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -IMPORTANT NOTICE: THE SOFTWARE ALSO CONTAINS THIRD PARTY AND OTHER -PROPRIETARY SOFTWARE THAT ARE GOVERNED BY SEPARATE LICENSE TERMS. BY ACCEPTING -THE LICENSE TERMS ABOVE, YOU ALSO ACCEPT THE LICENSE TERMS GOVERNING THE +IMPORTANT NOTICE: THE SOFTWARE ALSO CONTAINS THIRD PARTY AND OTHER +PROPRIETARY SOFTWARE THAT ARE GOVERNED BY SEPARATE LICENSE TERMS. BY ACCEPTING +THE LICENSE TERMS ABOVE, YOU ALSO ACCEPT THE LICENSE TERMS GOVERNING THE THIRD PARTY AND OTHER SOFTWARE, WHICH ARE SET FORTH BELOW: -The following components listed are governed by the license terms that follow the -component(s) name: +The following components listed are governed by the license terms that follow the +component(s) name: ------------------------------------------------------ Libmi.so ------------------------------------------------------ -Copyright (c) Microsoft Corporation -All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. +All rights reserved. MIT License -Permission is hereby granted, free of charge, to any person obtaining a copy of this -software and associated documentation files (the "Software"), to deal in the Software -without restriction, including without limitation the rights to use, copy, modify, -merge, publish, distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to the following +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, +merge, publish, distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all copies +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, -INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -The following components are governed by the MIT license, a copy of which appears -below the list of components: +The following components are governed by the MIT license, a copy of which appears +below the list of components: ------------------------------------------------------ Newtonsoft.Json ------------------------------------------------------ Copyright (c) 2007 James Newton-King -All rights reserved. +All rights reserved. MIT License -Permission is hereby granted, free of charge, to any person obtaining a copy of this -software and associated documentation files (the "Software"), to deal in the Software -without restriction, including without limitation the rights to use, copy, modify, -merge, publish, distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to the following +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, +merge, publish, distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all copies +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, -INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- Libuv v.1.9.0 @@ -71,7 +71,7 @@ Libuv v.1.9.0 https://raw.githubusercontent.com/aspnet/libuv-package/dev/content/License.txt -This software is licensed to you by Microsoft Corporation under the original terms of +This software is licensed to you by Microsoft Corporation under the original terms of the copyright holder provided below: ========================================= @@ -111,7 +111,7 @@ The externally maintained libraries used by libuv are: - tree.h (from FreeBSD), copyright Niels Provos. Two clause BSD license. - inet_pton and inet_ntop implementations, contained in src/inet.c, are -copyright the Internet Systems Consortium, Inc., and licensed under the ISC +copyright the Internet Systems Consortium, Inc., and licensed under the ISC license. - stdint-msvc2008.h (from msinttypes), copyright Alexander Chemeris. Three @@ -120,7 +120,7 @@ license. - pthread-fixes.h, pthread-fixes.c, copyright Google Inc. and Sony Mobile Communications AB. Three clause BSD license. - - android-ifaddrs.h, android-ifaddrs.c, copyright Berkeley Software Design Inc, + - android-ifaddrs.h, android-ifaddrs.c, copyright Berkeley Software Design Inc, Kenneth MacKay and Emergya (Cloud4all, FP7/2007-2013, grant agreement n° 289016). Three clause BSD license. @@ -414,135 +414,135 @@ limitations under the License. • System.Xml.XPath.XmlDocument ------------------------------------------------------- -MICROSOFT SOFTWARE LICENSE TERMS -MICROSOFT .NET LIBRARY -These license terms are an agreement between Microsoft Corporation (or based on where you -live, one of its affiliates) and you. Please read them. They apply to the software named above, -which includes the media on which you received it, if any. The terms also apply to any Microsoft -• updates, -• supplements, -• Internet-based services, and -• support services -for this software, unless other terms accompany those items. If so, those terms apply. -BY USING THE SOFTWARE, YOU ACCEPT THESE TERMS. IF YOU DO NOT ACCEPT THEM, DO NOT -USE THE SOFTWARE. -IF YOU COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE PERPETUAL RIGHTS BELOW. -1. INSTALLATION AND USE RIGHTS. -a. Installation and Use. You may install and use any number of copies of the software to design, -develop and test your programs. -b. Third Party Programs. The software may include third party programs that Microsoft, not the -third party, licenses to you under this agreement. Notices, if any, for the third party program are -included for your information only. -2. DATA. The software may collect information about you and your use of the software, and send that -to Microsoft. Microsoft may use this information to improve our products and services. You can learn -more about data collection and use in the help documentation and the privacy statement -at https://go.microsoft.com/fwlink/?LinkId=528096 . Your use of the software operates as your -consent to these practices. -3. ADDITIONAL LICENSING REQUIREMENTS AND/OR USE RIGHTS. -a. DISTRIBUTABLE CODE. The software is comprised of Distributable Code. “Distributable -Code†is code that you are permitted to distribute in programs you develop if you comply with -the terms below. -i . Right to Use and Distribute. -• You may copy and distribute the object code form of the software. -• Third Party Distribution. You may permit distributors of your programs to copy and -distribute the Distributable Code as part of those programs. -ii. Distribution Requirements. For any Distributable Code you distribute, you must -• add significant primary functionality to it in your programs; -• require distributors and external end users to agree to terms that protect it at least as -much as this agreement; -• display your valid copyright notice on your programs; and -• indemnify, defend, and hold harmless Microsoft from any claims, including attorneys’ -fees, related to the distribution or use of your programs. -iii. Distribution Restrictions. You may not -• alter any copyright, trademark or patent notice in the Distributable Code; -• use Microsoft’s trademarks in your programs’ names or in a way that suggests your -programs come from or are endorsed by Microsoft; -• include Distributable Code in malicious, deceptive or unlawful programs; or -• modify or distribute the source code of any Distributable Code so that any part of it -becomes subject to an Excluded License. An Excluded License is one that requires, as a -condition of use, modification or distribution, that -• the code be disclosed or distributed in source code form; or -• others have the right to modify it. -4. SCOPE OF LICENSE. The software is licensed, not sold. This agreement only gives you some rights to -use the software. Microsoft reserves all other rights. Unless applicable law gives you more rights despite -this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you -must comply with any technical limitations in the software that only allow you to use it in certain ways. -You may not -• work around any technical limitations in the software; -• reverse engineer, decompile or disassemble the software, except and only to the extent that -applicable law expressly permits, despite this limitation; -• publish the software for others to copy; -• rent, lease or lend the software; -• transfer the software or this agreement to any third party; or -• use the software for commercial software hosting services. -5. BACKUP COPY. You may make one backup copy of the software. You may use it only to reinstall the -software. -6. DOCUMENTATION. Any person that has valid access to your computer or internal network may copy -and use the documentation for your internal, reference purposes. -7. EXPORT RESTRICTIONS. The software is subject to United States export laws and regulations. You -must comply with all domestic and international export laws and regulations that apply to the software. -These laws include restrictions on destinations, end users and end use. For additional information, -see www.microsoft.com/exporting. -8. SUPPORT SERVICES. Because this software is “as is,†we may not provide support services for it. -9. ENTIRE AGREEMENT. This agreement, and the terms for supplements, updates, Internet-based -services and support services that you use, are the entire agreement for the software and support -services. -10. APPLICABLE LAW. -a. United States. If you acquired the software in the United States, Washington state law governs the -interpretation of this agreement and applies to claims for breach of it, regardless of conflict of laws -principles. The laws of the state where you live govern all other claims, including claims under state -consumer protection laws, unfair competition laws, and in tort. -b. Outside the United States. If you acquired the software in any other country, the laws of -that country apply. -11. LEGAL EFFECT. This agreement describes certain legal rights. You may have other rights under the -laws of your country. You may also have rights with respect to the party from whom you acquired the -software. This agreement does not change your rights under the laws of your country if the laws of your -country do not permit it to do so. -12. DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED “AS-IS.†YOU BEAR THE RISK OF -USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. -YOU MAY HAVE ADDITIONAL CONSUMER RIGHTS OR STATUTORY GUARANTEES UNDER YOUR -LOCAL LAWS WHICH THIS AGREEMENT CANNOT CHANGE. TO THE EXTENT PERMITTED -UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. -FOR AUSTRALIA – YOU HAVE STATUTORY GUARANTEES UNDER THE AUSTRALIAN CONSUMER -LAW AND NOTHING IN THESE TERMS IS INTENDED TO AFFECT THOSE RIGHTS. -13. LIMITATION ON AND EXCLUSION OF REMEDIES AND DAMAGES. YOU CAN RECOVER FROM -MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $5.00. YOU CANNOT -RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL, -INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to -• anything related to the software, services, content (including code) on third party Internet sites, or -third party programs; and -• claims for breach of contract, breach of warranty, guarantee or condition, strict liability, negligence, -or other tort to the extent permitted by applicable law. -It also applies even if Microsoft knew or should have known about the possibility of the damages. The above -limitation or exclusion may not apply to you because your country may not allow the exclusion or limitation of -incidental, consequential or other damages. -Please note: As this software is distributed in Quebec, Canada, some of the clauses in this agreement are -provided below in French. -Remarque : Ce logiciel étant distribué au Québec, Canada, certaines des clauses dans ce contrat sont fournies -ci-dessous en français. -EXONÉRATION DE GARANTIE. Le logiciel visé par une licence est offert « tel quel ». Toute utilisation de ce -logiciel est à votre seule risque et péril. Microsoft n’accorde aucune autre garantie expresse. Vous pouvez -bénéficier de droits additionnels en vertu du droit local sur la protection des consommateurs, que ce contrat ne -peut modifier. La ou elles sont permises par le droit locale, les garanties implicites de qualité marchande, -d’adéquation à un usage particulier et d’absence de contrefaçon sont exclues. -LIMITATION DES DOMMAGES-INTÉRÊTS ET EXCLUSION DE RESPONSABILITÉ POUR LES -DOMMAGES. Vous pouvez obtenir de Microsoft et de ses fournisseurs une indemnisation en cas de -dommages directs uniquement à hauteur de 5,00 $ US. Vous ne pouvez prétendre à aucune indemnisation -pour les autres dommages, y compris les dommages spéciaux, indirects ou accessoires et pertes de bénéfices. -Cette limitationconcerne: -• tout ce qui est relié au logiciel, aux services ou au contenu (y compris le code) figurant sur des -sites Internet tiers ou dans des programmes tiers ; et -• les réclamations au titre de violation de contrat ou de garantie, ou au titre de responsabilité -stricte, de négligence ou d’une autre faute dans la limite autorisée par la loi en vigueur. -Elle s’applique également, même si Microsoft connaissait ou devrait connaître l’éventualité d’un tel dommage. -Si votre pays n’autorise pas l’exclusion ou la limitation de responsabilité pour les dommages indirects, -accessoires ou de quelque nature que ce soit, il se peut que la limitation ou l’exclusion ci-dessus ne -s’appliquera pas à votre égard. -EFFET JURIDIQUE. Le présent contrat décrit certains droits juridiques. Vous pourriez avoir d’autres droits -prévus par les lois de votre pays. Le présent contrat ne modifie pas les droits que vous confèrent les lois de -votre pays si celles-ci ne le permettent pas. +MICROSOFT SOFTWARE LICENSE TERMS +MICROSOFT .NET LIBRARY +These license terms are an agreement between Microsoft Corporation (or based on where you +live, one of its affiliates) and you. Please read them. They apply to the software named above, +which includes the media on which you received it, if any. The terms also apply to any Microsoft +• updates, +• supplements, +• Internet-based services, and +• support services +for this software, unless other terms accompany those items. If so, those terms apply. +BY USING THE SOFTWARE, YOU ACCEPT THESE TERMS. IF YOU DO NOT ACCEPT THEM, DO NOT +USE THE SOFTWARE. +IF YOU COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE PERPETUAL RIGHTS BELOW. +1. INSTALLATION AND USE RIGHTS. +a. Installation and Use. You may install and use any number of copies of the software to design, +develop and test your programs. +b. Third Party Programs. The software may include third party programs that Microsoft, not the +third party, licenses to you under this agreement. Notices, if any, for the third party program are +included for your information only. +2. DATA. The software may collect information about you and your use of the software, and send that +to Microsoft. Microsoft may use this information to improve our products and services. You can learn +more about data collection and use in the help documentation and the privacy statement +at https://go.microsoft.com/fwlink/?LinkId=528096 . Your use of the software operates as your +consent to these practices. +3. ADDITIONAL LICENSING REQUIREMENTS AND/OR USE RIGHTS. +a. DISTRIBUTABLE CODE. The software is comprised of Distributable Code. “Distributable +Code†is code that you are permitted to distribute in programs you develop if you comply with +the terms below. +i . Right to Use and Distribute. +• You may copy and distribute the object code form of the software. +• Third Party Distribution. You may permit distributors of your programs to copy and +distribute the Distributable Code as part of those programs. +ii. Distribution Requirements. For any Distributable Code you distribute, you must +• add significant primary functionality to it in your programs; +• require distributors and external end users to agree to terms that protect it at least as +much as this agreement; +• display your valid copyright notice on your programs; and +• indemnify, defend, and hold harmless Microsoft from any claims, including attorneys’ +fees, related to the distribution or use of your programs. +iii. Distribution Restrictions. You may not +• alter any copyright, trademark or patent notice in the Distributable Code; +• use Microsoft’s trademarks in your programs’ names or in a way that suggests your +programs come from or are endorsed by Microsoft; +• include Distributable Code in malicious, deceptive or unlawful programs; or +• modify or distribute the source code of any Distributable Code so that any part of it +becomes subject to an Excluded License. An Excluded License is one that requires, as a +condition of use, modification or distribution, that +• the code be disclosed or distributed in source code form; or +• others have the right to modify it. +4. SCOPE OF LICENSE. The software is licensed, not sold. This agreement only gives you some rights to +use the software. Microsoft reserves all other rights. Unless applicable law gives you more rights despite +this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you +must comply with any technical limitations in the software that only allow you to use it in certain ways. +You may not +• work around any technical limitations in the software; +• reverse engineer, decompile or disassemble the software, except and only to the extent that +applicable law expressly permits, despite this limitation; +• publish the software for others to copy; +• rent, lease or lend the software; +• transfer the software or this agreement to any third party; or +• use the software for commercial software hosting services. +5. BACKUP COPY. You may make one backup copy of the software. You may use it only to reinstall the +software. +6. DOCUMENTATION. Any person that has valid access to your computer or internal network may copy +and use the documentation for your internal, reference purposes. +7. EXPORT RESTRICTIONS. The software is subject to United States export laws and regulations. You +must comply with all domestic and international export laws and regulations that apply to the software. +These laws include restrictions on destinations, end users and end use. For additional information, +see www.microsoft.com/exporting. +8. SUPPORT SERVICES. Because this software is “as is,†we may not provide support services for it. +9. ENTIRE AGREEMENT. This agreement, and the terms for supplements, updates, Internet-based +services and support services that you use, are the entire agreement for the software and support +services. +10. APPLICABLE LAW. +a. United States. If you acquired the software in the United States, Washington state law governs the +interpretation of this agreement and applies to claims for breach of it, regardless of conflict of laws +principles. The laws of the state where you live govern all other claims, including claims under state +consumer protection laws, unfair competition laws, and in tort. +b. Outside the United States. If you acquired the software in any other country, the laws of +that country apply. +11. LEGAL EFFECT. This agreement describes certain legal rights. You may have other rights under the +laws of your country. You may also have rights with respect to the party from whom you acquired the +software. This agreement does not change your rights under the laws of your country if the laws of your +country do not permit it to do so. +12. DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED “AS-IS.†YOU BEAR THE RISK OF +USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. +YOU MAY HAVE ADDITIONAL CONSUMER RIGHTS OR STATUTORY GUARANTEES UNDER YOUR +LOCAL LAWS WHICH THIS AGREEMENT CANNOT CHANGE. TO THE EXTENT PERMITTED +UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. +FOR AUSTRALIA – YOU HAVE STATUTORY GUARANTEES UNDER THE AUSTRALIAN CONSUMER +LAW AND NOTHING IN THESE TERMS IS INTENDED TO AFFECT THOSE RIGHTS. +13. LIMITATION ON AND EXCLUSION OF REMEDIES AND DAMAGES. YOU CAN RECOVER FROM +MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $5.00. YOU CANNOT +RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL, +INDIRECT OR INCIDENTAL DAMAGES. +This limitation applies to +• anything related to the software, services, content (including code) on third party Internet sites, or +third party programs; and +• claims for breach of contract, breach of warranty, guarantee or condition, strict liability, negligence, +or other tort to the extent permitted by applicable law. +It also applies even if Microsoft knew or should have known about the possibility of the damages. The above +limitation or exclusion may not apply to you because your country may not allow the exclusion or limitation of +incidental, consequential or other damages. +Please note: As this software is distributed in Quebec, Canada, some of the clauses in this agreement are +provided below in French. +Remarque : Ce logiciel étant distribué au Québec, Canada, certaines des clauses dans ce contrat sont fournies +ci-dessous en français. +EXONÉRATION DE GARANTIE. Le logiciel visé par une licence est offert « tel quel ». Toute utilisation de ce +logiciel est à votre seule risque et péril. Microsoft n’accorde aucune autre garantie expresse. Vous pouvez +bénéficier de droits additionnels en vertu du droit local sur la protection des consommateurs, que ce contrat ne +peut modifier. La ou elles sont permises par le droit locale, les garanties implicites de qualité marchande, +d’adéquation à un usage particulier et d’absence de contrefaçon sont exclues. +LIMITATION DES DOMMAGES-INTÉRÊTS ET EXCLUSION DE RESPONSABILITÉ POUR LES +DOMMAGES. Vous pouvez obtenir de Microsoft et de ses fournisseurs une indemnisation en cas de +dommages directs uniquement à hauteur de 5,00 $ US. Vous ne pouvez prétendre à aucune indemnisation +pour les autres dommages, y compris les dommages spéciaux, indirects ou accessoires et pertes de bénéfices. +Cette limitationconcerne: +• tout ce qui est relié au logiciel, aux services ou au contenu (y compris le code) figurant sur des +sites Internet tiers ou dans des programmes tiers ; et +• les réclamations au titre de violation de contrat ou de garantie, ou au titre de responsabilité +stricte, de négligence ou d’une autre faute dans la limite autorisée par la loi en vigueur. +Elle s’applique également, même si Microsoft connaissait ou devrait connaître l’éventualité d’un tel dommage. +Si votre pays n’autorise pas l’exclusion ou la limitation de responsabilité pour les dommages indirects, +accessoires ou de quelque nature que ce soit, il se peut que la limitation ou l’exclusion ci-dessus ne +s’appliquera pas à votre égard. +EFFET JURIDIQUE. Le présent contrat décrit certains droits juridiques. Vous pourriez avoir d’autres droits +prévus par les lois de votre pays. Le présent contrat ne modifie pas les droits que vous confèrent les lois de +votre pays si celles-ci ne le permettent pas. -------------------------------------------------------- @@ -582,165 +582,165 @@ specific language governing permissions and limitations under the License. • Microsoft.Management.Infrastructure.Unmanaged.dll ---------------------------------------------------------- MICROSOFT SOFTWARE LICENSE TERMS -MANAGEMENT.INFRASTRUCTURE.DLL -MANAGEMENT.INFRASTRUCTURE.NATIVE.DLL +MANAGEMENT.INFRASTRUCTURE.DLL +MANAGEMENT.INFRASTRUCTURE.NATIVE.DLL MANAGEMENT.INFRASTRUCTURE.UNMANAGED.DLL - -These license terms are an agreement between you and Microsoft Corporation (or one of its affiliates). They -apply to the software named above and any Microsoft services or software updates (except to the extent such -services or updates are accompanied by new or additional terms, in which case those different terms apply -prospectively and do not alter your or Microsoft’s rights relating to pre-updated software or services). IF YOU -COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE RIGHTS BELOW. BY USING THE SOFTWARE, YOU + +These license terms are an agreement between you and Microsoft Corporation (or one of its affiliates). They +apply to the software named above and any Microsoft services or software updates (except to the extent such +services or updates are accompanied by new or additional terms, in which case those different terms apply +prospectively and do not alter your or Microsoft’s rights relating to pre-updated software or services). IF YOU +COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE RIGHTS BELOW. BY USING THE SOFTWARE, YOU ACCEPT THESE TERMS. 1. INSTALLATION AND USE RIGHTS a) General. You may install and use any number of copies of the software on your devices. -b) Included Microsoft Applications. The software may include other Microsoft applications. These -license terms apply to those included applications, if any, unless other license terms are provided with +b) Included Microsoft Applications. The software may include other Microsoft applications. These +license terms apply to those included applications, if any, unless other license terms are provided with the other Microsoft applications. -c) Third Party Software. The software may include third party applications that are licensed to you -under this agreement or under their own terms. License terms, notices, and acknowledgements, if any, -for the third party applications may be accessible online at http://aka.ms/thirdpartynotices or in an -accompanying notices file. Even if such applications are governed by other agreements, the disclaimer, +c) Third Party Software. The software may include third party applications that are licensed to you +under this agreement or under their own terms. License terms, notices, and acknowledgements, if any, +for the third party applications may be accessible online at http://aka.ms/thirdpartynotices or in an +accompanying notices file. Even if such applications are governed by other agreements, the disclaimer, limitations on, and exclusions of damages below also apply to the extent allowed by applicable law. 2. TIME-SENSITIVE SOFTWARE a) Period. The software is time-sensitive and may stop running on a date that is defined in the software. b) Notice. You may receive periodic reminder notices of this date through the software. c) Access to data. You may not be able to access data used in the software when it stops running. -3. PRE-RELEASE SOFTWARE. The software is a pre-release version. It may not operate correctly. It may be +3. PRE-RELEASE SOFTWARE. The software is a pre-release version. It may not operate correctly. It may be different from the commercially released version. -4. FEEDBACK. If you give feedback about the software to Microsoft, you give to Microsoft, without charge, -the right to use, share and commercialize your feedback in any way and for any purpose. You will not give -feedback that is subject to a license that requires Microsoft to license its software or documentation to +4. FEEDBACK. If you give feedback about the software to Microsoft, you give to Microsoft, without charge, +the right to use, share and commercialize your feedback in any way and for any purpose. You will not give +feedback that is subject to a license that requires Microsoft to license its software or documentation to third parties because Microsoft includes your feedback in them. These rights survive this agreement. -5. DATA COLLECTION. The software may collect information about you and your use of the software and -send that to Microsoft. Microsoft may use this information to provide services and improve Microsoft’s -products and services. Your opt-out rights, if any, are described in the product documentation. Some -features in the software may enable collection of data from users of your applications that access or use the -software. If you use these features to enable data collection in your applications, you must comply with -applicable law, including getting any required user consent, and maintain a prominent privacy policy that -accurately informs users about how you use, collect, and share their data. You can learn more about -Microsoft’s data collection and use in the product documentation and the Microsoft Privacy Statement at -https://go.microsoft.com/fwlink/?LinkId=521839. You agree to comply with all applicable provisions of the +5. DATA COLLECTION. The software may collect information about you and your use of the software and +send that to Microsoft. Microsoft may use this information to provide services and improve Microsoft’s +products and services. Your opt-out rights, if any, are described in the product documentation. Some +features in the software may enable collection of data from users of your applications that access or use the +software. If you use these features to enable data collection in your applications, you must comply with +applicable law, including getting any required user consent, and maintain a prominent privacy policy that +accurately informs users about how you use, collect, and share their data. You can learn more about +Microsoft’s data collection and use in the product documentation and the Microsoft Privacy Statement at +https://go.microsoft.com/fwlink/?LinkId=521839. You agree to comply with all applicable provisions of the Microsoft Privacy Statement. -6. FONTS. While the software is running, you may use its fonts to display and print content. You may only (i) -embed fonts in content as permitted by the embedding restrictions in the fonts; and (ii) temporarily +6. FONTS. While the software is running, you may use its fonts to display and print content. You may only (i) +embed fonts in content as permitted by the embedding restrictions in the fonts; and (ii) temporarily download them to a printer or other output device to help print content. -7. SCOPE OF LICENSE. The software is licensed, not sold. Microsoft reserves all other rights. Unless applicable +7. SCOPE OF LICENSE. The software is licensed, not sold. Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you will not (and have no right to): a) work around any technical limitations in the software that only allow you to use it in certain ways; b) reverse engineer, decompile or disassemble the software; c) remove, minimize, block, or modify any notices of Microsoft or its suppliers in the software; d) use the software in any way that is against the law or to create or propagate malware; or -e) share, publish, distribute, or lend the software, provide the software as a stand-alone hosted solution +e) share, publish, distribute, or lend the software, provide the software as a stand-alone hosted solution for others to use, or transfer the software or this agreement to any third party. -8. EXPORT RESTRICTIONS. You must comply with all domestic and international export laws and regulations -that apply to the software, which include restrictions on destinations, end users, and end use. For further +8. EXPORT RESTRICTIONS. You must comply with all domestic and international export laws and regulations +that apply to the software, which include restrictions on destinations, end users, and end use. For further information on export restrictions, visit http://aka.ms/exporting. -9. SUPPORT SERVICES. Microsoft is not obligated under this agreement to provide any support services for +9. SUPPORT SERVICES. Microsoft is not obligated under this agreement to provide any support services for the software. Any support provided is “as isâ€, “with all faultsâ€, and without warranty of any kind. -10. UPDATES. The software may periodically check for updates, and download and install them for you. You -may obtain updates only from Microsoft or authorized sources. Microsoft may need to update your system -to provide you with updates. You agree to receive these automatic updates without any additional notice. +10. UPDATES. The software may periodically check for updates, and download and install them for you. You +may obtain updates only from Microsoft or authorized sources. Microsoft may need to update your system +to provide you with updates. You agree to receive these automatic updates without any additional notice. Updates may not include or support all existing software features, services, or peripheral devices. -11. ENTIRE AGREEMENT. This agreement, and any other terms Microsoft may provide for supplements, +11. ENTIRE AGREEMENT. This agreement, and any other terms Microsoft may provide for supplements, updates, or third-party applications, is the entire agreement for the software. -12. APPLICABLE LAW AND PLACE TO RESOLVE DISPUTES. If you acquired the software in the United States -or Canada, the laws of the state or province where you live (or, if a business, where your principal place of -business is located) govern the interpretation of this agreement, claims for its breach, and all other claims -(including consumer protection, unfair competition, and tort claims), regardless of conflict of laws -principles. If you acquired the software in any other country, its laws apply. If U.S. federal jurisdiction exists, -you and Microsoft consent to exclusive jurisdiction and venue in the federal court in King County, -Washington for all disputes heard in court. If not, you and Microsoft consent to exclusive jurisdiction and +12. APPLICABLE LAW AND PLACE TO RESOLVE DISPUTES. If you acquired the software in the United States +or Canada, the laws of the state or province where you live (or, if a business, where your principal place of +business is located) govern the interpretation of this agreement, claims for its breach, and all other claims +(including consumer protection, unfair competition, and tort claims), regardless of conflict of laws +principles. If you acquired the software in any other country, its laws apply. If U.S. federal jurisdiction exists, +you and Microsoft consent to exclusive jurisdiction and venue in the federal court in King County, +Washington for all disputes heard in court. If not, you and Microsoft consent to exclusive jurisdiction and venue in the Superior Court of King County, Washington for all disputes heard in court. -13. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You may -have other rights, including consumer rights, under the laws of your state, province, or country. Separate -and apart from your relationship with Microsoft, you may also have rights with respect to the party from -which you acquired the software. This agreement does not change those other rights if the laws of your -state, province, or country do not permit it to do so. For example, if you acquired the software in one of the +13. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You may +have other rights, including consumer rights, under the laws of your state, province, or country. Separate +and apart from your relationship with Microsoft, you may also have rights with respect to the party from +which you acquired the software. This agreement does not change those other rights if the laws of your +state, province, or country do not permit it to do so. For example, if you acquired the software in one of the below regions, or mandatory country law applies, then the following provisions apply to you: -a) Australia. You have statutory guarantees under the Australian Consumer Law and nothing in this +a) Australia. You have statutory guarantees under the Australian Consumer Law and nothing in this agreement is intended to affect those rights. -b) Canada. If you acquired this software in Canada, you may stop receiving updates by turning off the -automatic update feature, disconnecting your device from the Internet (if and when you re-connect to -the Internet, however, the software will resume checking for and installing updates), or uninstalling the -software. The product documentation, if any, may also specify how to turn off updates for your specific +b) Canada. If you acquired this software in Canada, you may stop receiving updates by turning off the +automatic update feature, disconnecting your device from the Internet (if and when you re-connect to +the Internet, however, the software will resume checking for and installing updates), or uninstalling the +software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. c) Germany and Austria. -i. Warranty. The properly licensed software will perform substantially as described in -any Microsoft materials that accompany the software. However, Microsoft gives no +i. Warranty. The properly licensed software will perform substantially as described in +any Microsoft materials that accompany the software. However, Microsoft gives no contractual guarantee in relation to the licensed software. -ii. Limitation of Liability. In case of intentional conduct, gross negligence, claims based -on the Product Liability Act, as well as, in case of death or personal or physical injury, +ii. Limitation of Liability. In case of intentional conduct, gross negligence, claims based +on the Product Liability Act, as well as, in case of death or personal or physical injury, Microsoft is liable according to the statutory law. -Subject to the foregoing clause ii., Microsoft will only be liable for slight negligence if Microsoft is in -breach of such material contractual obligations, the fulfillment of which facilitate the due performance -of this agreement, the breach of which would endanger the purpose of this agreement and the -compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases +Subject to the foregoing clause ii., Microsoft will only be liable for slight negligence if Microsoft is in +breach of such material contractual obligations, the fulfillment of which facilitate the due performance +of this agreement, the breach of which would endanger the purpose of this agreement and the +compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence. -14. DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED “AS IS.†YOU BEAR THE RISK OF USING -IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES, OR CONDITIONS. TO THE EXTENT -PERMITTED UNDER APPLICABLE LAWS, MICROSOFT EXCLUDES ALL IMPLIED WARRANTIES, +14. DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED “AS IS.†YOU BEAR THE RISK OF USING +IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES, OR CONDITIONS. TO THE EXTENT +PERMITTED UNDER APPLICABLE LAWS, MICROSOFT EXCLUDES ALL IMPLIED WARRANTIES, INCLUDING MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. -15. LIMITATION ON AND EXCLUSION OF DAMAGES. IF YOU HAVE ANY BASIS FOR RECOVERING -DAMAGES DESPITE THE PRECEDING DISCLAIMER OF WARRANTY, YOU CAN RECOVER FROM -MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $5.00. YOU CANNOT RECOVER -ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL, INDIRECT OR +15. LIMITATION ON AND EXCLUSION OF DAMAGES. IF YOU HAVE ANY BASIS FOR RECOVERING +DAMAGES DESPITE THE PRECEDING DISCLAIMER OF WARRANTY, YOU CAN RECOVER FROM +MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $5.00. YOU CANNOT RECOVER +ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) anything related to the software, services, content (including code) on -third party Internet sites, or third party applications; and (b) claims for breach of contract, warranty, -guarantee, or condition; strict liability, negligence, or other tort; or any other claim; in each case to +This limitation applies to (a) anything related to the software, services, content (including code) on +third party Internet sites, or third party applications; and (b) claims for breach of contract, warranty, +guarantee, or condition; strict liability, negligence, or other tort; or any other claim; in each case to the extent permitted by applicable law. -It also applies even if Microsoft knew or should have known about the possibility of the damages. -The above limitation or exclusion may not apply to you because your state, province, or country +It also applies even if Microsoft knew or should have known about the possibility of the damages. +The above limitation or exclusion may not apply to you because your state, province, or country may not allow the exclusion or limitation of incidental, consequential, or other damages. -Please note: As this software is distributed in Canada, some of the clauses in this agreement are +Please note: As this software is distributed in Canada, some of the clauses in this agreement are provided below in French. Remarque: Ce logiciel étant distribué au Canada, certaines des clauses dans ce contrat sont fournies ci- dessous en français. -EXONÉRATION DE GARANTIE. Le logiciel visé par une licence est offert « tel quel ». Toute utilisation de -ce logiciel est à votre seule risque et péril. Microsoft n’accorde aucune autre garantie expresse. Vous -pouvez bénéficier de droits additionnels en vertu du droit local sur la protection des consommateurs, -que ce contrat ne peut modifier. La ou elles sont permises par le droit locale, les garanties implicites de +EXONÉRATION DE GARANTIE. Le logiciel visé par une licence est offert « tel quel ». Toute utilisation de +ce logiciel est à votre seule risque et péril. Microsoft n’accorde aucune autre garantie expresse. Vous +pouvez bénéficier de droits additionnels en vertu du droit local sur la protection des consommateurs, +que ce contrat ne peut modifier. La ou elles sont permises par le droit locale, les garanties implicites de qualité marchande, d’adéquation à un usage particulier et d’absence de contrefaçon sont exclues. -LIMITATION DES DOMMAGES-INTÉRÊTS ET EXCLUSION DE RESPONSABILITÉ POUR LES DOMMAGES. -Vous pouvez obtenir de Microsoft et de ses fournisseurs une indemnisation en cas de dommages directs -uniquement à hauteur de 5,00 $ US. Vous ne pouvez prétendre à aucune indemnisation pour les autres +LIMITATION DES DOMMAGES-INTÉRÊTS ET EXCLUSION DE RESPONSABILITÉ POUR LES DOMMAGES. +Vous pouvez obtenir de Microsoft et de ses fournisseurs une indemnisation en cas de dommages directs +uniquement à hauteur de 5,00 $ US. Vous ne pouvez prétendre à aucune indemnisation pour les autres dommages, y compris les dommages spéciaux, indirects ou accessoires et pertes de bénéfices. Cette limitation concerne: -• tout ce qui est relié au logiciel, aux services ou au contenu (y compris le code) figurant sur des sites +• tout ce qui est relié au logiciel, aux services ou au contenu (y compris le code) figurant sur des sites Internet tiers ou dans des programmes tiers; et -• les réclamations au titre de violation de contrat ou de garantie, ou au titre de responsabilité stricte, +• les réclamations au titre de violation de contrat ou de garantie, ou au titre de responsabilité stricte, de négligence ou d’une autre faute dans la limite autorisée par la loi en vigueur. -Elle s’applique également, même si Microsoft connaissait ou devrait connaître l’éventualité d’un tel -dommage. Si votre pays n’autorise pas l’exclusion ou la limitation de responsabilité pour les dommages +Elle s’applique également, même si Microsoft connaissait ou devrait connaître l’éventualité d’un tel +dommage. Si votre pays n’autorise pas l’exclusion ou la limitation de responsabilité pour les dommages indirects, accessoires ou de quelque nature que ce soit, il se peut que la limitation ou l’exclusion ci- dessus ne s’appliquera pas à votre égard. -EFFET JURIDIQUE. Le présent contrat décrit certains droits juridiques. Vous pourriez avoir d’autres droits -prévus par les lois de votre pays. Le présent contrat ne modifie pas les droits que vous confèrent les lois +EFFET JURIDIQUE. Le présent contrat décrit certains droits juridiques. Vous pourriez avoir d’autres droits +prévus par les lois de votre pays. Le présent contrat ne modifie pas les droits que vous confèrent les lois de votre pays si celles-ci ne le permettent pas. -The following components are governed by the MIT license, a copy of which appears -below the list of components: +The following components are governed by the MIT license, a copy of which appears +below the list of components: ------------------------------------------------------ tools/appimage.sh ------------------------------------------------------ Copyright (c) 2016 Simon Peter -All rights reserved. +All rights reserved. MIT License -Permission is hereby granted, free of charge, to any person obtaining a copy of this -software and associated documentation files (the "Software"), to deal in the Software -without restriction, including without limitation the rights to use, copy, modify, -merge, publish, distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to the following +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, +merge, publish, distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all copies +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, -INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- DotNet/CoreFX diff --git a/src/Microsoft.Management.Infrastructure.CimCmdlets/AssemblyInfo.cs b/src/Microsoft.Management.Infrastructure.CimCmdlets/AssemblyInfo.cs index 92e660ae73c..7a2005fee6c 100644 --- a/src/Microsoft.Management.Infrastructure.CimCmdlets/AssemblyInfo.cs +++ b/src/Microsoft.Management.Infrastructure.CimCmdlets/AssemblyInfo.cs @@ -1,5 +1,5 @@ /*============================================================================ - * Copyright (C) Microsoft Corporation, All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. *============================================================================ */ diff --git a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimAsyncOperation.cs b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimAsyncOperation.cs index 4cb2c7ab200..bbf97b2fb50 100644 --- a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimAsyncOperation.cs +++ b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimAsyncOperation.cs @@ -1,5 +1,5 @@ /*============================================================================ - * Copyright (C) Microsoft Corporation, All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. *============================================================================ */ diff --git a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimBaseAction.cs b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimBaseAction.cs index 829152def7b..773f81ad6d2 100644 --- a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimBaseAction.cs +++ b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimBaseAction.cs @@ -1,5 +1,5 @@ /*============================================================================ - * Copyright (C) Microsoft Corporation, All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. *============================================================================ */ diff --git a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimCmdletModuleInitialize.cs b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimCmdletModuleInitialize.cs index b8138e87682..b9f9962710d 100644 --- a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimCmdletModuleInitialize.cs +++ b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimCmdletModuleInitialize.cs @@ -1,5 +1,5 @@ /*============================================================================ - * Copyright (C) Microsoft Corporation, All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. *============================================================================ */ diff --git a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimCommandBase.cs b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimCommandBase.cs index 2f545311bc2..2f5dd0ac2ab 100644 --- a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimCommandBase.cs +++ b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimCommandBase.cs @@ -1,5 +1,5 @@ /*============================================================================ - * Copyright (C) Microsoft Corporation, All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. *============================================================================ */ diff --git a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimGetAssociatedInstance.cs b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimGetAssociatedInstance.cs index b21e8304ace..47a0df29796 100644 --- a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimGetAssociatedInstance.cs +++ b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimGetAssociatedInstance.cs @@ -1,5 +1,5 @@ /*============================================================================ - * Copyright (C) Microsoft Corporation, All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. *============================================================================ */ diff --git a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimGetCimClass.cs b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimGetCimClass.cs index 2fec594ad3a..e660b8ad4a9 100644 --- a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimGetCimClass.cs +++ b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimGetCimClass.cs @@ -1,5 +1,5 @@ /*============================================================================ - * Copyright (C) Microsoft Corporation, All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. *============================================================================ */ diff --git a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimGetInstance.cs b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimGetInstance.cs index 562bce3b626..ad23b933c3e 100644 --- a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimGetInstance.cs +++ b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimGetInstance.cs @@ -1,5 +1,5 @@ /*============================================================================ - * Copyright (C) Microsoft Corporation, All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. *============================================================================ */ diff --git a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimIndicationWatcher.cs b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimIndicationWatcher.cs index 2d33fc3cfd4..34a6319f08a 100644 --- a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimIndicationWatcher.cs +++ b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimIndicationWatcher.cs @@ -1,5 +1,5 @@ /*============================================================================ - * Copyright (C) Microsoft Corporation, All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. *============================================================================ */ diff --git a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimInvokeCimMethod.cs b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimInvokeCimMethod.cs index 63c8bafbe01..79f91a1d868 100644 --- a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimInvokeCimMethod.cs +++ b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimInvokeCimMethod.cs @@ -1,5 +1,5 @@ /*============================================================================ - * Copyright (C) Microsoft Corporation, All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. *============================================================================ */ diff --git a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimNewCimInstance.cs b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimNewCimInstance.cs index c56e604d903..84b0883feb1 100644 --- a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimNewCimInstance.cs +++ b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimNewCimInstance.cs @@ -1,5 +1,5 @@ /*============================================================================ - * Copyright (C) Microsoft Corporation, All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. *============================================================================ */ diff --git a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimPromptUser.cs b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimPromptUser.cs index 709e0690a11..785e0f20002 100644 --- a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimPromptUser.cs +++ b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimPromptUser.cs @@ -1,5 +1,5 @@ /*============================================================================ - * Copyright (C) Microsoft Corporation, All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. *============================================================================ */ diff --git a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimRegisterCimIndication.cs b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimRegisterCimIndication.cs index 81e3cf2adb0..91005d8ecf0 100644 --- a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimRegisterCimIndication.cs +++ b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimRegisterCimIndication.cs @@ -1,5 +1,5 @@ /*============================================================================ - * Copyright (C) Microsoft Corporation, All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. *============================================================================ */ diff --git a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimRemoveCimInstance.cs b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimRemoveCimInstance.cs index 726136fa334..e5fed39d402 100644 --- a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimRemoveCimInstance.cs +++ b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimRemoveCimInstance.cs @@ -1,5 +1,5 @@ /*============================================================================ - * Copyright (C) Microsoft Corporation, All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. *============================================================================ */ diff --git a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimResultObserver.cs b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimResultObserver.cs index 0ea01b2a64a..f8758d98a69 100644 --- a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimResultObserver.cs +++ b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimResultObserver.cs @@ -1,5 +1,5 @@ /*============================================================================ - * Copyright (C) Microsoft Corporation, All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. *============================================================================ */ diff --git a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimSessionOperations.cs b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimSessionOperations.cs index bbf90949882..d1cf303cb50 100644 --- a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimSessionOperations.cs +++ b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimSessionOperations.cs @@ -1,5 +1,5 @@ /*============================================================================ - * Copyright (C) Microsoft Corporation, All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. *============================================================================ */ diff --git a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimSessionProxy.cs b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimSessionProxy.cs index ba2cd51372f..2dd000d96d2 100644 --- a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimSessionProxy.cs +++ b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimSessionProxy.cs @@ -1,5 +1,5 @@ /*============================================================================ - * Copyright (C) Microsoft Corporation, All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. *============================================================================ */ diff --git a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimSetCimInstance.cs b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimSetCimInstance.cs index 57ddb857cc2..eadc0bc8e68 100644 --- a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimSetCimInstance.cs +++ b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimSetCimInstance.cs @@ -1,5 +1,5 @@ /*============================================================================ - * Copyright (C) Microsoft Corporation, All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. *============================================================================ */ diff --git a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimWriteError.cs b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimWriteError.cs index 97c45cd77ce..9b2396c7d29 100644 --- a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimWriteError.cs +++ b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimWriteError.cs @@ -1,5 +1,5 @@ /*============================================================================ - * Copyright (C) Microsoft Corporation, All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. *============================================================================ */ diff --git a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimWriteMessage.cs b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimWriteMessage.cs index b224364bfcc..f0259d744b2 100644 --- a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimWriteMessage.cs +++ b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimWriteMessage.cs @@ -1,5 +1,5 @@ /*============================================================================ - * Copyright (C) Microsoft Corporation, All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. *============================================================================ */ diff --git a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimWriteProgress.cs b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimWriteProgress.cs index 08eb6acc877..23b34f60a0d 100644 --- a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimWriteProgress.cs +++ b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimWriteProgress.cs @@ -1,5 +1,5 @@ /*============================================================================ - * Copyright (C) Microsoft Corporation, All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. *============================================================================ */ diff --git a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimWriteResultObject.cs b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimWriteResultObject.cs index b060a728c01..1a87b451af3 100644 --- a/src/Microsoft.Management.Infrastructure.CimCmdlets/CimWriteResultObject.cs +++ b/src/Microsoft.Management.Infrastructure.CimCmdlets/CimWriteResultObject.cs @@ -1,5 +1,5 @@ /*============================================================================ - * Copyright (C) Microsoft Corporation, All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. *============================================================================ */ diff --git a/src/Microsoft.Management.Infrastructure.CimCmdlets/CmdletOperation.cs b/src/Microsoft.Management.Infrastructure.CimCmdlets/CmdletOperation.cs index 9d770ee22da..f5d84647cdd 100644 --- a/src/Microsoft.Management.Infrastructure.CimCmdlets/CmdletOperation.cs +++ b/src/Microsoft.Management.Infrastructure.CimCmdlets/CmdletOperation.cs @@ -1,5 +1,5 @@ /*============================================================================ - * Copyright (C) Microsoft Corporation, All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. *============================================================================ */ diff --git a/src/Microsoft.Management.Infrastructure.CimCmdlets/GetCimAssociatedInstanceCommand.cs b/src/Microsoft.Management.Infrastructure.CimCmdlets/GetCimAssociatedInstanceCommand.cs index 7afe7325230..87f5466f121 100644 --- a/src/Microsoft.Management.Infrastructure.CimCmdlets/GetCimAssociatedInstanceCommand.cs +++ b/src/Microsoft.Management.Infrastructure.CimCmdlets/GetCimAssociatedInstanceCommand.cs @@ -1,5 +1,5 @@ /*============================================================================ - * Copyright (C) Microsoft Corporation, All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. *============================================================================ */ diff --git a/src/Microsoft.Management.Infrastructure.CimCmdlets/GetCimClassCommand.cs b/src/Microsoft.Management.Infrastructure.CimCmdlets/GetCimClassCommand.cs index 7dabb35d2af..58a8538e077 100644 --- a/src/Microsoft.Management.Infrastructure.CimCmdlets/GetCimClassCommand.cs +++ b/src/Microsoft.Management.Infrastructure.CimCmdlets/GetCimClassCommand.cs @@ -1,5 +1,5 @@ /*============================================================================ - * Copyright (C) Microsoft Corporation, All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. *============================================================================ */ diff --git a/src/Microsoft.Management.Infrastructure.CimCmdlets/GetCimInstanceCommand.cs b/src/Microsoft.Management.Infrastructure.CimCmdlets/GetCimInstanceCommand.cs index 248e716c51f..a59208be6a8 100644 --- a/src/Microsoft.Management.Infrastructure.CimCmdlets/GetCimInstanceCommand.cs +++ b/src/Microsoft.Management.Infrastructure.CimCmdlets/GetCimInstanceCommand.cs @@ -1,5 +1,5 @@ /*============================================================================ - * Copyright (C) Microsoft Corporation, All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. *============================================================================ */ diff --git a/src/Microsoft.Management.Infrastructure.CimCmdlets/GetCimSessionCommand.cs b/src/Microsoft.Management.Infrastructure.CimCmdlets/GetCimSessionCommand.cs index 86b26890b7f..57e610ddcc6 100644 --- a/src/Microsoft.Management.Infrastructure.CimCmdlets/GetCimSessionCommand.cs +++ b/src/Microsoft.Management.Infrastructure.CimCmdlets/GetCimSessionCommand.cs @@ -1,5 +1,5 @@ /*============================================================================ - * Copyright (C) Microsoft Corporation, All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. *============================================================================ */ diff --git a/src/Microsoft.Management.Infrastructure.CimCmdlets/InvokeCimMethodCommand.cs b/src/Microsoft.Management.Infrastructure.CimCmdlets/InvokeCimMethodCommand.cs index eb434f16b66..f67ee6cb5ba 100644 --- a/src/Microsoft.Management.Infrastructure.CimCmdlets/InvokeCimMethodCommand.cs +++ b/src/Microsoft.Management.Infrastructure.CimCmdlets/InvokeCimMethodCommand.cs @@ -1,5 +1,5 @@ /*============================================================================ - * Copyright (C) Microsoft Corporation, All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. *============================================================================ */ diff --git a/src/Microsoft.Management.Infrastructure.CimCmdlets/NewCimInstanceCommand.cs b/src/Microsoft.Management.Infrastructure.CimCmdlets/NewCimInstanceCommand.cs index b1a5986a0f5..c843acdb045 100644 --- a/src/Microsoft.Management.Infrastructure.CimCmdlets/NewCimInstanceCommand.cs +++ b/src/Microsoft.Management.Infrastructure.CimCmdlets/NewCimInstanceCommand.cs @@ -1,5 +1,5 @@ /*============================================================================ - * Copyright (C) Microsoft Corporation, All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. *============================================================================ */ diff --git a/src/Microsoft.Management.Infrastructure.CimCmdlets/NewCimSessionCommand.cs b/src/Microsoft.Management.Infrastructure.CimCmdlets/NewCimSessionCommand.cs index f1083747e80..8e601f60e92 100644 --- a/src/Microsoft.Management.Infrastructure.CimCmdlets/NewCimSessionCommand.cs +++ b/src/Microsoft.Management.Infrastructure.CimCmdlets/NewCimSessionCommand.cs @@ -1,5 +1,5 @@ /*============================================================================ - * Copyright (C) Microsoft Corporation, All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. *============================================================================ */ diff --git a/src/Microsoft.Management.Infrastructure.CimCmdlets/NewCimSessionOptionCommand.cs b/src/Microsoft.Management.Infrastructure.CimCmdlets/NewCimSessionOptionCommand.cs index 9e12e007f3a..c03352af012 100644 --- a/src/Microsoft.Management.Infrastructure.CimCmdlets/NewCimSessionOptionCommand.cs +++ b/src/Microsoft.Management.Infrastructure.CimCmdlets/NewCimSessionOptionCommand.cs @@ -1,5 +1,5 @@ /*============================================================================ - * Copyright (C) Microsoft Corporation, All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. *============================================================================ */ diff --git a/src/Microsoft.Management.Infrastructure.CimCmdlets/RegisterCimIndicationCommand.cs b/src/Microsoft.Management.Infrastructure.CimCmdlets/RegisterCimIndicationCommand.cs index 66213850619..39ce6cfcd62 100644 --- a/src/Microsoft.Management.Infrastructure.CimCmdlets/RegisterCimIndicationCommand.cs +++ b/src/Microsoft.Management.Infrastructure.CimCmdlets/RegisterCimIndicationCommand.cs @@ -1,5 +1,5 @@ /*============================================================================ - * Copyright (C) Microsoft Corporation, All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. *============================================================================ */ diff --git a/src/Microsoft.Management.Infrastructure.CimCmdlets/RemoveCimInstanceCommand.cs b/src/Microsoft.Management.Infrastructure.CimCmdlets/RemoveCimInstanceCommand.cs index 3e6e4166a4f..6544f9d4427 100644 --- a/src/Microsoft.Management.Infrastructure.CimCmdlets/RemoveCimInstanceCommand.cs +++ b/src/Microsoft.Management.Infrastructure.CimCmdlets/RemoveCimInstanceCommand.cs @@ -1,5 +1,5 @@ /*============================================================================ - * Copyright (C) Microsoft Corporation, All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. *============================================================================ */ diff --git a/src/Microsoft.Management.Infrastructure.CimCmdlets/RemoveCimSessionCommand.cs b/src/Microsoft.Management.Infrastructure.CimCmdlets/RemoveCimSessionCommand.cs index f02f1598593..97194b95247 100644 --- a/src/Microsoft.Management.Infrastructure.CimCmdlets/RemoveCimSessionCommand.cs +++ b/src/Microsoft.Management.Infrastructure.CimCmdlets/RemoveCimSessionCommand.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // #region Using directives diff --git a/src/Microsoft.Management.Infrastructure.CimCmdlets/SetCimInstanceCommand.cs b/src/Microsoft.Management.Infrastructure.CimCmdlets/SetCimInstanceCommand.cs index 717d3f805bd..3ff061400c5 100644 --- a/src/Microsoft.Management.Infrastructure.CimCmdlets/SetCimInstanceCommand.cs +++ b/src/Microsoft.Management.Infrastructure.CimCmdlets/SetCimInstanceCommand.cs @@ -1,5 +1,5 @@ /*============================================================================ - * Copyright (C) Microsoft Corporation, All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. *============================================================================ */ diff --git a/src/Microsoft.Management.Infrastructure.CimCmdlets/Utils.cs b/src/Microsoft.Management.Infrastructure.CimCmdlets/Utils.cs index c5389942069..66828f9b611 100644 --- a/src/Microsoft.Management.Infrastructure.CimCmdlets/Utils.cs +++ b/src/Microsoft.Management.Infrastructure.CimCmdlets/Utils.cs @@ -1,5 +1,5 @@ /*============================================================================ - * Copyright (C) Microsoft Corporation, All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. *============================================================================ */ diff --git a/src/Microsoft.PowerShell.Commands.Diagnostics/CounterFileInfo.cs b/src/Microsoft.PowerShell.Commands.Diagnostics/CounterFileInfo.cs index 54c0dd83ea3..858f5f0b6ff 100644 --- a/src/Microsoft.PowerShell.Commands.Diagnostics/CounterFileInfo.cs +++ b/src/Microsoft.PowerShell.Commands.Diagnostics/CounterFileInfo.cs @@ -1,5 +1,5 @@ // -// Copyright (c) 2008 Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System; diff --git a/src/Microsoft.PowerShell.Commands.Diagnostics/CounterSample.cs b/src/Microsoft.PowerShell.Commands.Diagnostics/CounterSample.cs index ac376f7e00f..4ba65b3c8ea 100644 --- a/src/Microsoft.PowerShell.Commands.Diagnostics/CounterSample.cs +++ b/src/Microsoft.PowerShell.Commands.Diagnostics/CounterSample.cs @@ -1,5 +1,5 @@ // -// Copyright (c) 2008 Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // diff --git a/src/Microsoft.PowerShell.Commands.Diagnostics/CounterSet.cs b/src/Microsoft.PowerShell.Commands.Diagnostics/CounterSet.cs index a7160d2ca92..fb7edd1ac92 100644 --- a/src/Microsoft.PowerShell.Commands.Diagnostics/CounterSet.cs +++ b/src/Microsoft.PowerShell.Commands.Diagnostics/CounterSet.cs @@ -1,5 +1,5 @@ // -// Copyright (c) 2008 Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System; diff --git a/src/Microsoft.PowerShell.Commands.Diagnostics/ExportCounterCommand.cs b/src/Microsoft.PowerShell.Commands.Diagnostics/ExportCounterCommand.cs index 8ef8fa3d49a..9a7e138b521 100644 --- a/src/Microsoft.PowerShell.Commands.Diagnostics/ExportCounterCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Diagnostics/ExportCounterCommand.cs @@ -1,5 +1,5 @@ // -// Copyright (c) 2008 Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // diff --git a/src/Microsoft.PowerShell.Commands.Diagnostics/GetCounterCommand.cs b/src/Microsoft.PowerShell.Commands.Diagnostics/GetCounterCommand.cs index 9331855ad1c..29da31a48bd 100644 --- a/src/Microsoft.PowerShell.Commands.Diagnostics/GetCounterCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Diagnostics/GetCounterCommand.cs @@ -1,5 +1,5 @@ // -// Copyright (c) 2008 Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // diff --git a/src/Microsoft.PowerShell.Commands.Diagnostics/GetEventCommand.cs b/src/Microsoft.PowerShell.Commands.Diagnostics/GetEventCommand.cs index c44e17d1772..f23a6da9ad0 100644 --- a/src/Microsoft.PowerShell.Commands.Diagnostics/GetEventCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Diagnostics/GetEventCommand.cs @@ -1,5 +1,5 @@ // -// Copyright (c) 2007 Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System; diff --git a/src/Microsoft.PowerShell.Commands.Diagnostics/GetEventSnapin.cs b/src/Microsoft.PowerShell.Commands.Diagnostics/GetEventSnapin.cs index da6a77d4dd8..6aa23f2eca7 100644 --- a/src/Microsoft.PowerShell.Commands.Diagnostics/GetEventSnapin.cs +++ b/src/Microsoft.PowerShell.Commands.Diagnostics/GetEventSnapin.cs @@ -1,5 +1,5 @@ // -// Copyright (c) 2007 Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // diff --git a/src/Microsoft.PowerShell.Commands.Diagnostics/ImportCounterCommand.cs b/src/Microsoft.PowerShell.Commands.Diagnostics/ImportCounterCommand.cs index b95103d8a38..d8635b38b5d 100644 --- a/src/Microsoft.PowerShell.Commands.Diagnostics/ImportCounterCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Diagnostics/ImportCounterCommand.cs @@ -1,5 +1,5 @@ // -// Copyright (c) 2008 Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // diff --git a/src/Microsoft.PowerShell.Commands.Diagnostics/NewWinEventCommand.cs b/src/Microsoft.PowerShell.Commands.Diagnostics/NewWinEventCommand.cs index 16529125f3d..ec064f0d8be 100644 --- a/src/Microsoft.PowerShell.Commands.Diagnostics/NewWinEventCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Diagnostics/NewWinEventCommand.cs @@ -1,5 +1,5 @@ // -// Copyright (c) 2007 Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System; diff --git a/src/Microsoft.PowerShell.Commands.Diagnostics/PdhHelper.cs b/src/Microsoft.PowerShell.Commands.Diagnostics/PdhHelper.cs index a61b91cb766..ce1eea08e91 100644 --- a/src/Microsoft.PowerShell.Commands.Diagnostics/PdhHelper.cs +++ b/src/Microsoft.PowerShell.Commands.Diagnostics/PdhHelper.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System; diff --git a/src/Microsoft.PowerShell.Commands.Diagnostics/PdhSafeHandle.cs b/src/Microsoft.PowerShell.Commands.Diagnostics/PdhSafeHandle.cs index eaa6a401b3f..b2adb011268 100644 --- a/src/Microsoft.PowerShell.Commands.Diagnostics/PdhSafeHandle.cs +++ b/src/Microsoft.PowerShell.Commands.Diagnostics/PdhSafeHandle.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System; diff --git a/src/Microsoft.PowerShell.Commands.Diagnostics/resources/GetEventResources.txt b/src/Microsoft.PowerShell.Commands.Diagnostics/resources/GetEventResources.txt index 751578835cd..6e004d457d8 100644 --- a/src/Microsoft.PowerShell.Commands.Diagnostics/resources/GetEventResources.txt +++ b/src/Microsoft.PowerShell.Commands.Diagnostics/resources/GetEventResources.txt @@ -1,4 +1,4 @@ -#Copyright (c) 2008 Microsoft Corporation +#Copyright (c) Microsoft Corporation. All rights reserved. Vendor=Microsoft Description=This Windows PowerShell snap-in contains Windows Eventing and Performance Counter cmdlets. diff --git a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/SessionBasedWrapper.cs b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/SessionBasedWrapper.cs index 56cbb10edc2..793bb0e6ba8 100644 --- a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/SessionBasedWrapper.cs +++ b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/SessionBasedWrapper.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/CimJobException.cs b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/CimJobException.cs index 53c531b79f7..0854414a440 100644 --- a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/CimJobException.cs +++ b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/CimJobException.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/CreateInstanceJob.cs b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/CreateInstanceJob.cs index 9710f3044a9..93bb4f7932b 100644 --- a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/CreateInstanceJob.cs +++ b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/CreateInstanceJob.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/DeleteInstanceJob.cs b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/DeleteInstanceJob.cs index 075be25cccc..58b981c0ce5 100644 --- a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/DeleteInstanceJob.cs +++ b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/DeleteInstanceJob.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/EnumerateAssociatedInstancesJob.cs b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/EnumerateAssociatedInstancesJob.cs index 9ea248ff767..2ed6c186d06 100644 --- a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/EnumerateAssociatedInstancesJob.cs +++ b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/EnumerateAssociatedInstancesJob.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/ExtrinsicMethodInvocationJob.cs b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/ExtrinsicMethodInvocationJob.cs index 023a1fda977..366f31a76ae 100644 --- a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/ExtrinsicMethodInvocationJob.cs +++ b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/ExtrinsicMethodInvocationJob.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/InstanceMethodInvocationJob.cs b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/InstanceMethodInvocationJob.cs index d9d7db6a2ab..86adf0750e6 100644 --- a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/InstanceMethodInvocationJob.cs +++ b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/InstanceMethodInvocationJob.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/MethodInvocationJobBase.cs b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/MethodInvocationJobBase.cs index 273b25cc619..db81ea37936 100644 --- a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/MethodInvocationJobBase.cs +++ b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/MethodInvocationJobBase.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/ModifyInstanceJob.cs b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/ModifyInstanceJob.cs index 4efc7d12b66..49a227dadcc 100644 --- a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/ModifyInstanceJob.cs +++ b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/ModifyInstanceJob.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/PropertySettingJob.cs b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/PropertySettingJob.cs index c92ad7e548f..c51085292a2 100644 --- a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/PropertySettingJob.cs +++ b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/PropertySettingJob.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using Microsoft.Management.Infrastructure; diff --git a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/QueryJob.cs b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/QueryJob.cs index 8a3d45715c7..734f87e7e1b 100644 --- a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/QueryJob.cs +++ b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/QueryJob.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/QueryJobBase.cs b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/QueryJobBase.cs index 3f04a81ecdc..662d890b69c 100644 --- a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/QueryJobBase.cs +++ b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/QueryJobBase.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation; diff --git a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/StaticMethodInvocationJob.cs b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/StaticMethodInvocationJob.cs index 5b47d46c6fc..f19fadc6678 100644 --- a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/StaticMethodInvocationJob.cs +++ b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/StaticMethodInvocationJob.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/TerminatingErrorTracker.cs b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/TerminatingErrorTracker.cs index b00184f0381..67035a15e2d 100644 --- a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/TerminatingErrorTracker.cs +++ b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/TerminatingErrorTracker.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/cimChildJobBase.cs b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/cimChildJobBase.cs index 30fec5de0b4..cf2a78ca39e 100644 --- a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/cimChildJobBase.cs +++ b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/cimChildJobBase.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/cimCmdletDefinitionContext.cs b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/cimCmdletDefinitionContext.cs index f08b4e69b6d..50b4d486975 100644 --- a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/cimCmdletDefinitionContext.cs +++ b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/cimCmdletDefinitionContext.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/cimCmdletInvocationContext.cs b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/cimCmdletInvocationContext.cs index b89f7c4de3e..75866b49e36 100644 --- a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/cimCmdletInvocationContext.cs +++ b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/cimCmdletInvocationContext.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/cimConverter.cs b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/cimConverter.cs index 02b74033585..9c6679697c1 100644 --- a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/cimConverter.cs +++ b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/cimConverter.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/cimJobContext.cs b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/cimJobContext.cs index a3caada5792..2cee2f22a88 100644 --- a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/cimJobContext.cs +++ b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/cimJobContext.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/cimOperationOptionsHelper.cs b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/cimOperationOptionsHelper.cs index ededc6cd10e..528dac6cdab 100644 --- a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/cimOperationOptionsHelper.cs +++ b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/cimOperationOptionsHelper.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/cimQuery.cs b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/cimQuery.cs index 236585fd2a9..4878cf51bf7 100644 --- a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/cimQuery.cs +++ b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/cimQuery.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/cimWrapper.cs b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/cimWrapper.cs index 54773a8b886..8a7bfa882a5 100644 --- a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/cimWrapper.cs +++ b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/cimWrapper.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/clientSideQuery.cs b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/clientSideQuery.cs index 67ef3cb12a7..683384b5a8d 100644 --- a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/clientSideQuery.cs +++ b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/clientSideQuery.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/AddContentCommand.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/AddContentCommand.cs index d6a1c7f067f..f9784f9f5e0 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/AddContentCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/AddContentCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/ClearContentCommand.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/ClearContentCommand.cs index 13ec9dc416f..f0e57fc3e44 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/ClearContentCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/ClearContentCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/ClearPropertyCommand.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/ClearPropertyCommand.cs index 6e74d62b502..b752936ac11 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/ClearPropertyCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/ClearPropertyCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.ObjectModel; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/CombinePathCommand.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/CombinePathCommand.cs index e6293091539..a1fd4a9ee47 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/CombinePathCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/CombinePathCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/CommitTransactionCommand.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/CommitTransactionCommand.cs index 2058bdd833a..a23aa040ed9 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/CommitTransactionCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/CommitTransactionCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/Computer.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/Computer.cs index 150298befb1..87da21820d6 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/Computer.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/Computer.cs @@ -1,7 +1,7 @@ #if !UNIX /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; using System.Collections; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/ContentCommandBase.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/ContentCommandBase.cs index b53c46731f3..87a32563161 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/ContentCommandBase.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/ContentCommandBase.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/ControlPanelItemCommand.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/ControlPanelItemCommand.cs index 54c95b9c16e..5950e80b0f4 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/ControlPanelItemCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/ControlPanelItemCommand.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System.Collections.ObjectModel; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/ConvertPathCommand.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/ConvertPathCommand.cs index dd3d3d90502..ef093e91071 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/ConvertPathCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/ConvertPathCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.ObjectModel; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/CopyPropertyCommand.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/CopyPropertyCommand.cs index b2b90c63b19..a5392a7cafe 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/CopyPropertyCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/CopyPropertyCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/Eventlog.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/Eventlog.cs index 2d5ff805e75..86194f41fe5 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/Eventlog.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/Eventlog.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/GetChildrenCommand.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/GetChildrenCommand.cs index 566ec8929f7..125d0a93010 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/GetChildrenCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/GetChildrenCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/GetComputerInfoCommand.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/GetComputerInfoCommand.cs index 5d014dbea57..a4a0e4ff122 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/GetComputerInfoCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/GetComputerInfoCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !UNIX diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/GetContentCommand.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/GetContentCommand.cs index f4b5ce1b39a..dee0e3835f5 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/GetContentCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/GetContentCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/GetPropertyCommand.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/GetPropertyCommand.cs index ea812badce1..7cf2b94cd7d 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/GetPropertyCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/GetPropertyCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.ObjectModel; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/GetTransactionCommand.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/GetTransactionCommand.cs index 81d9c1f9010..f7182e46d75 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/GetTransactionCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/GetTransactionCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/GetWMIObjectCommand.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/GetWMIObjectCommand.cs index 4d2ee3550be..e6b85ded55e 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/GetWMIObjectCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/GetWMIObjectCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/Hotfix.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/Hotfix.cs index 6bdbedbb966..8f10d92d370 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/Hotfix.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/Hotfix.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/InvokeWMIMethodCommand.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/InvokeWMIMethodCommand.cs index 2e37ca088e6..fa275c3303a 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/InvokeWMIMethodCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/InvokeWMIMethodCommand.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/MovePropertyCommand.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/MovePropertyCommand.cs index 9396471b74a..d51f40b7cae 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/MovePropertyCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/MovePropertyCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/Navigation.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/Navigation.cs index e16d512b1f1..513a55ae74f 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/Navigation.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/Navigation.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/NewPropertyCommand.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/NewPropertyCommand.cs index e89d9db2284..9d36ec244ed 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/NewPropertyCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/NewPropertyCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/ParsePathCommand.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/ParsePathCommand.cs index a1f29117de4..1b096166a7b 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/ParsePathCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/ParsePathCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/PassThroughContentCommandBase.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/PassThroughContentCommandBase.cs index 20ea5a5c394..cb70655f8bc 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/PassThroughContentCommandBase.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/PassThroughContentCommandBase.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/PassThroughPropertyCommandBase.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/PassThroughPropertyCommandBase.cs index 8b25bf179f8..5028632301b 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/PassThroughPropertyCommandBase.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/PassThroughPropertyCommandBase.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/PingPathCommand.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/PingPathCommand.cs index ea69de6c381..66bbe573a17 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/PingPathCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/PingPathCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/Process.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/Process.cs index c5f3e46cf69..30ef0e096ac 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/Process.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/Process.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/PropertyCommandBase.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/PropertyCommandBase.cs index bd707d4cc2e..f64d33e18f7 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/PropertyCommandBase.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/PropertyCommandBase.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/RegisterWMIEventCommand.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/RegisterWMIEventCommand.cs index 0319b0e8130..091e1903a45 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/RegisterWMIEventCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/RegisterWMIEventCommand.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/RemovePropertyCommand.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/RemovePropertyCommand.cs index 67f035b1f27..b6c1b4b3e7d 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/RemovePropertyCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/RemovePropertyCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/RemoveWMIObjectCommand.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/RemoveWMIObjectCommand.cs index ac10af1dc98..711cd7ea074 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/RemoveWMIObjectCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/RemoveWMIObjectCommand.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/RenamePropertyCommand.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/RenamePropertyCommand.cs index c5077bfda79..5e3000ceb57 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/RenamePropertyCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/RenamePropertyCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/ResolvePathCommand.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/ResolvePathCommand.cs index 5930dbab51e..d1222aa6596 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/ResolvePathCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/ResolvePathCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/RollbackTransactionCommand.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/RollbackTransactionCommand.cs index 79b48c496b6..4f48e18b8e0 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/RollbackTransactionCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/RollbackTransactionCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/Service.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/Service.cs index 24d574b0edd..0e4229762a7 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/Service.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/Service.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !UNIX // Not built on Unix diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/SetContentCommand.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/SetContentCommand.cs index e8bde3599c2..10206047b09 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/SetContentCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/SetContentCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/SetPropertyCommand.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/SetPropertyCommand.cs index fa9cbb78d0d..f64bfaf3217 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/SetPropertyCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/SetPropertyCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/SetWMIInstanceCommand.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/SetWMIInstanceCommand.cs index b507faae72e..acdbea27d00 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/SetWMIInstanceCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/SetWMIInstanceCommand.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/StartTransactionCommand.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/StartTransactionCommand.cs index e758380ce5e..4d91c4d5461 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/StartTransactionCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/StartTransactionCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/UseTransactionCommand.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/UseTransactionCommand.cs index b65f46412c7..a36f997a144 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/UseTransactionCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/UseTransactionCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/WMIHelper.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/WMIHelper.cs index bef805293b0..8cf7df9d61d 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/WMIHelper.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/WMIHelper.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/WebServiceProxy.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/WebServiceProxy.cs index 30837a5c4a1..e1ee08b2fbb 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/WebServiceProxy.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/WebServiceProxy.cs @@ -1,5 +1,5 @@ /********************************************************************-- -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/WriteContentCommandBase.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/WriteContentCommandBase.cs index 20fdab66dcf..ec5d50ab3bf 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/WriteContentCommandBase.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/WriteContentCommandBase.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Management/singleshell/installer/MshManagementMshSnapin.cs b/src/Microsoft.PowerShell.Commands.Management/singleshell/installer/MshManagementMshSnapin.cs index 0796cb0bf9c..742ccf2f2a0 100644 --- a/src/Microsoft.PowerShell.Commands.Management/singleshell/installer/MshManagementMshSnapin.cs +++ b/src/Microsoft.PowerShell.Commands.Management/singleshell/installer/MshManagementMshSnapin.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.ComponentModel; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/AddMember.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/AddMember.cs index e645fe871f4..9c19d68183b 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/AddMember.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/AddMember.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/AddType.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/AddType.cs index a71101f269e..4e0e545fcc9 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/AddType.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/AddType.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #region Using directives diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/CSVCommands.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/CSVCommands.cs index 5e3e247a376..e1fe1bcf071 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/CSVCommands.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/CSVCommands.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ConsoleColorCmdlet.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ConsoleColorCmdlet.cs index ca8ef06ed16..ffbc04e3cb9 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ConsoleColorCmdlet.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ConsoleColorCmdlet.cs @@ -1,6 +1,6 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ConvertFrom-StringData.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ConvertFrom-StringData.cs index a632dc8610b..3d9a63b6329 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ConvertFrom-StringData.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ConvertFrom-StringData.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Csv.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Csv.cs index f2bc20b75f1..48d42ea9b07 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Csv.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Csv.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.ObjectModel; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/CustomSerialization.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/CustomSerialization.cs index 87fd82b2bf4..c2ea7725843 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/CustomSerialization.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/CustomSerialization.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // namespace System.Management.Automation diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/CustomSerializationStrings.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/CustomSerializationStrings.cs index a98974cfd6d..109880780cd 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/CustomSerializationStrings.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/CustomSerializationStrings.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // namespace System.Management.Automation diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/DebugRunspaceCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/DebugRunspaceCommand.cs index 22cb72cec8d..0c3ef0080c7 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/DebugRunspaceCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/DebugRunspaceCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Disable-PSBreakpoint.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Disable-PSBreakpoint.cs index 4e8a4758f1b..770eae7490c 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Disable-PSBreakpoint.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Disable-PSBreakpoint.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System.Management.Automation; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Enable-PSBreakpoint.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Enable-PSBreakpoint.cs index ffec562fa2b..37736ca2f33 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Enable-PSBreakpoint.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Enable-PSBreakpoint.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/EnableDisableRunspaceDebugCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/EnableDisableRunspaceDebugCommand.cs index a5f7092f2ce..acfd146caa6 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/EnableDisableRunspaceDebugCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/EnableDisableRunspaceDebugCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ExportAliasCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ExportAliasCommand.cs index 26e75084930..c83b2272c2c 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ExportAliasCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ExportAliasCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/ColumnInfo.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/ColumnInfo.cs index 595859f70c6..ad398a7e766 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/ColumnInfo.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/ColumnInfo.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // namespace Microsoft.PowerShell.Commands diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/ExpressionColumnInfo.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/ExpressionColumnInfo.cs index 2ae6b5585c2..d0a4221fd81 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/ExpressionColumnInfo.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/ExpressionColumnInfo.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // namespace Microsoft.PowerShell.Commands diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/HeaderInfo.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/HeaderInfo.cs index 3e487439528..0def6c0b648 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/HeaderInfo.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/HeaderInfo.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // namespace Microsoft.PowerShell.Commands diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/OriginalColumnInfo.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/OriginalColumnInfo.cs index f1737bbaf4f..7329ed8117e 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/OriginalColumnInfo.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/OriginalColumnInfo.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // namespace Microsoft.PowerShell.Commands diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/OutGridViewCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/OutGridViewCommand.cs index a1496eb3ca3..e3f013dd78a 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/OutGridViewCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/OutGridViewCommand.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // namespace Microsoft.PowerShell.Commands diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/OutWindowProxy.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/OutWindowProxy.cs index 19b4fc2423d..f6e929c5a4d 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/OutWindowProxy.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/OutWindowProxy.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // namespace Microsoft.PowerShell.Commands diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/ScalarTypeColumnInfo.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/ScalarTypeColumnInfo.cs index 872a362c1d1..62195903f2d 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/ScalarTypeColumnInfo.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/ScalarTypeColumnInfo.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // namespace Microsoft.PowerShell.Commands diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/TableView.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/TableView.cs index 548dd36acaa..062d5571903 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/TableView.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/TableView.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // namespace Microsoft.PowerShell.Commands diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/common/GetFormatDataCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/common/GetFormatDataCommand.cs index f5923481ccc..e8c9142b91d 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/common/GetFormatDataCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/common/GetFormatDataCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/common/WriteFormatDataCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/common/WriteFormatDataCommand.cs index 78967899beb..609253074fd 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/common/WriteFormatDataCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/common/WriteFormatDataCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/format-list/Format-List.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/format-list/Format-List.cs index 3a137cc1527..3cd9ed9d607 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/format-list/Format-List.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/format-list/Format-List.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/format-object/format-object.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/format-object/format-object.cs index c1030e57d64..266a5d65b68 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/format-object/format-object.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/format-object/format-object.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/format-table/Format-Table.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/format-table/Format-Table.cs index 63212a63da1..06dce665064 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/format-table/Format-Table.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/format-table/Format-Table.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/format-wide/Format-Wide.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/format-wide/Format-Wide.cs index 97576c7c7da..6a68001373b 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/format-wide/Format-Wide.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/format-wide/Format-Wide.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/out-file/Out-File.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/out-file/Out-File.cs index d7c0d43c58c..95e0abfb69a 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/out-file/Out-File.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/out-file/Out-File.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/out-printer/PrinterLineOutput.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/out-printer/PrinterLineOutput.cs index b84d8038726..910e8906dcd 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/out-printer/PrinterLineOutput.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/out-printer/PrinterLineOutput.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/out-printer/out-printer.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/out-printer/out-printer.cs index 45a9c643cb1..b1c0944133f 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/out-printer/out-printer.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/out-printer/out-printer.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/out-string/out-string.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/out-string/out-string.cs index d12354a7f52..37fa2afe8e6 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/out-string/out-string.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/out-string/out-string.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Get-PSBreakpoint.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Get-PSBreakpoint.cs index 2b2bc3b320a..3701640e241 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Get-PSBreakpoint.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Get-PSBreakpoint.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Get-PSCallStack.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Get-PSCallStack.cs index 95ebf019ab8..54a12b175bc 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Get-PSCallStack.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Get-PSCallStack.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetAliasCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetAliasCommand.cs index 71881daa8a9..a9e35503eec 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetAliasCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetAliasCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetCultureCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetCultureCommand.cs index a7cf6d671d7..a370026e515 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetCultureCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetCultureCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetDateCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetDateCommand.cs index 9aae07cf70b..9f9da1ed28a 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetDateCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetDateCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetEventCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetEventCommand.cs index 0989e91f919..cac484db50e 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetEventCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetEventCommand.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetEventSubscriberCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetEventSubscriberCommand.cs index 7c013c30a3d..3e00f79679d 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetEventSubscriberCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetEventSubscriberCommand.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetHostCmdlet.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetHostCmdlet.cs index 448ef283f4f..c4906048279 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetHostCmdlet.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetHostCmdlet.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetMember.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetMember.cs index 980154f7771..bee70b23fa6 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetMember.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetMember.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetRandomCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetRandomCommand.cs index 83232ea3b99..35bba80c9df 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetRandomCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetRandomCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetRunspaceCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetRunspaceCommand.cs index f138b9dd89d..65fc5cb7be9 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetRunspaceCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetRunspaceCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetUICultureCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetUICultureCommand.cs index 9e6a983a30c..6f8693e4b35 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetUICultureCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetUICultureCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetUnique.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetUnique.cs index a17f2c0ec45..4b9e68af770 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetUnique.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetUnique.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetUptime.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetUptime.cs index f7389e606af..609df1d6558 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetUptime.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetUptime.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ImplicitRemotingCommands.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ImplicitRemotingCommands.cs index 7cd0138844e..e2217f688e7 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ImplicitRemotingCommands.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ImplicitRemotingCommands.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Import-LocalizedData.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Import-LocalizedData.cs index fdcbb57a166..ea6fb4dc21e 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Import-LocalizedData.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Import-LocalizedData.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ImportAliasCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ImportAliasCommand.cs index 07372404d70..332742d08d7 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ImportAliasCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ImportAliasCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/InvokeCommandCmdlet.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/InvokeCommandCmdlet.cs index 4392ec00a84..e415dc7de24 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/InvokeCommandCmdlet.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/InvokeCommandCmdlet.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/MatchString.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/MatchString.cs index e6bcadf02bf..17adfd80f85 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/MatchString.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/MatchString.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Measure-Object.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Measure-Object.cs index 977fd640670..06b77334d7a 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Measure-Object.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Measure-Object.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/NewAliasCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/NewAliasCommand.cs index d53cd1d2823..64f3d2934fc 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/NewAliasCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/NewAliasCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/NewGuidCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/NewGuidCommand.cs index 38beda8c638..b4a80fd63fc 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/NewGuidCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/NewGuidCommand.cs @@ -1,6 +1,6 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/NewTimeSpanCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/NewTimeSpanCommand.cs index 36a15cdeb97..71504e063b4 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/NewTimeSpanCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/NewTimeSpanCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ObjectCommandComparer.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ObjectCommandComparer.cs index d3dc8bc5cc9..77df4fa926a 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ObjectCommandComparer.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ObjectCommandComparer.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #region Using directives diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/OrderObjectBase.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/OrderObjectBase.cs index 9d34c4b75ec..6b726c1deac 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/OrderObjectBase.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/OrderObjectBase.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ReadConsoleCmdlet.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ReadConsoleCmdlet.cs index 94da63d9d09..f37c274aadf 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ReadConsoleCmdlet.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ReadConsoleCmdlet.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/RegisterObjectEventCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/RegisterObjectEventCommand.cs index 1b4386200e1..01bc5af4424 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/RegisterObjectEventCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/RegisterObjectEventCommand.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/RegisterPSEventCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/RegisterPSEventCommand.cs index bcc24c49a54..48a3fe8a09c 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/RegisterPSEventCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/RegisterPSEventCommand.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Remove-PSBreakpoint.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Remove-PSBreakpoint.cs index bd55d3fddd0..286c79437a2 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Remove-PSBreakpoint.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Remove-PSBreakpoint.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System.Management.Automation; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/RemoveEventCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/RemoveEventCommand.cs index 381ebde3fa4..e50431aaf63 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/RemoveEventCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/RemoveEventCommand.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Send-MailMessage.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Send-MailMessage.cs index 58328c56b35..df2014d9fc2 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Send-MailMessage.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Send-MailMessage.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Set-PSBreakpoint.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Set-PSBreakpoint.cs index 50095080cec..1371eec048a 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Set-PSBreakpoint.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Set-PSBreakpoint.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/SetAliasCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/SetAliasCommand.cs index 0d3c5ae95f4..ce54fa27ce0 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/SetAliasCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/SetAliasCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/SetDateCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/SetDateCommand.cs index f5a744c1a7e..11e6b12d4ed 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/SetDateCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/SetDateCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #pragma warning disable 1634, 1691 diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommand.cs index 1f7b0c68519..e048249152e 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommand.cs @@ -1,6 +1,6 @@ //----------------------------------------------------------------------- // -// Copyright © Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------- diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandCommandInfo.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandCommandInfo.cs index ea38c132998..c6e6ae0457a 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandCommandInfo.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandCommandInfo.cs @@ -1,6 +1,6 @@ //----------------------------------------------------------------------- // -// Copyright © Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------- diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandModuleInfo.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandModuleInfo.cs index 909c395cf19..384c4c8bc6f 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandModuleInfo.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandModuleInfo.cs @@ -1,6 +1,6 @@ //----------------------------------------------------------------------- // -// Copyright © Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------- @@ -17,7 +17,7 @@ public class ShowCommandModuleInfo /// /// Creates an instance of the ShowCommandModuleInfo class based on a CommandInfo object /// - /// + /// /// /// The object to wrap. /// @@ -34,7 +34,7 @@ public ShowCommandModuleInfo(PSModuleInfo other) /// /// Creates an instance of the ShowCommandModuleInfo class based on a PSObject object /// - /// + /// /// /// The object to wrap. /// diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandParameterInfo.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandParameterInfo.cs index 00b311c069e..95ce809a7e0 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandParameterInfo.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandParameterInfo.cs @@ -1,6 +1,6 @@ //----------------------------------------------------------------------- // -// Copyright © Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------- @@ -20,7 +20,7 @@ public class ShowCommandParameterInfo /// /// Creates an instance of the ShowCommandParameterInfo class based on a CommandParameterInfo object /// - /// + /// /// /// The object to wrap. /// @@ -48,7 +48,7 @@ public ShowCommandParameterInfo(CommandParameterInfo other) /// /// Creates an instance of the ShowCommandParameterInfo class based on a PSObject object /// - /// + /// /// /// The object to wrap. /// diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandParameterSetInfo.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandParameterSetInfo.cs index b57f7953d72..0a1933e4427 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandParameterSetInfo.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandParameterSetInfo.cs @@ -1,6 +1,6 @@ //----------------------------------------------------------------------- // -// Copyright © Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------- diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandParameterType.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandParameterType.cs index 85398443d72..9760a704688 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandParameterType.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandParameterType.cs @@ -1,6 +1,6 @@ //----------------------------------------------------------------------- // -// Copyright © Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------- diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandProxy.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandProxy.cs index 1d3b8b62bfd..fcda24ca44f 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandProxy.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandProxy.cs @@ -1,6 +1,6 @@ //----------------------------------------------------------------------- // -// Copyright © Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------- diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/StartSleepCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/StartSleepCommand.cs index 8006470e231..fa12ccaa598 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/StartSleepCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/StartSleepCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/TimeExpressionCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/TimeExpressionCommand.cs index 80ea05f4851..7cbab7653be 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/TimeExpressionCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/TimeExpressionCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #region Using directives diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/UnblockFile.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/UnblockFile.cs index 95d91473183..05305d819bb 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/UnblockFile.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/UnblockFile.cs @@ -1,6 +1,6 @@ #if !UNIX /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #region Using directives diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/UnregisterEventCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/UnregisterEventCommand.cs index 428c7a5843f..8ab72b1cd40 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/UnregisterEventCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/UnregisterEventCommand.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Update-Data.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Update-Data.cs index 3db55e855b7..36a90b93c83 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Update-Data.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Update-Data.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Update-TypeData.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Update-TypeData.cs index 53ec744bceb..b81a6501ded 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Update-TypeData.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Update-TypeData.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/UtilityCommon.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/UtilityCommon.cs index fcd6f07cb91..c5988b3a450 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/UtilityCommon.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/UtilityCommon.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Var.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Var.cs index ae911ae063c..e596e0cb64a 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Var.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Var.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WaitEventCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WaitEventCommand.cs index 6538a0bd716..a66bda09d81 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WaitEventCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WaitEventCommand.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/BasicHtmlWebResponseObject.Common.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/BasicHtmlWebResponseObject.Common.cs index ae91ff0012c..1dcb9f8575f 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/BasicHtmlWebResponseObject.Common.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/BasicHtmlWebResponseObject.Common.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/ContentHelper.Common.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/ContentHelper.Common.cs index dc3a673ef46..b7d9d0afc7a 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/ContentHelper.Common.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/ContentHelper.Common.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/HtmlWebResponseObject.Common.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/HtmlWebResponseObject.Common.cs index be101d482fe..66d9b771130 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/HtmlWebResponseObject.Common.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/HtmlWebResponseObject.Common.cs @@ -1,7 +1,7 @@ #if !CORECLR /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/InvokeRestMethodCommand.Common.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/InvokeRestMethodCommand.Common.cs index e9a73b46970..4b6039cf198 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/InvokeRestMethodCommand.Common.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/InvokeRestMethodCommand.Common.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/WebRequestPSCmdlet.Common.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/WebRequestPSCmdlet.Common.cs index 5c026381392..00828fec4b9 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/WebRequestPSCmdlet.Common.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/WebRequestPSCmdlet.Common.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; @@ -95,7 +95,7 @@ public abstract partial class WebRequestPSCmdlet : PSCmdlet public virtual SwitchParameter AllowUnencryptedAuthentication { get; set; } /// - /// Gets or sets the Authentication property used to determin the Authentication method for the web session. + /// Gets or sets the Authentication property used to determin the Authentication method for the web session. /// Authentication does not work with UseDefaultCredentials. /// Authentication over unencrypted sessions requires AllowUnencryptedAuthentication. /// Basic: Requires Credential @@ -103,7 +103,7 @@ public abstract partial class WebRequestPSCmdlet : PSCmdlet /// [Parameter] public virtual WebAuthenticationType Authentication { get; set; } = WebAuthenticationType.None; - + /// /// gets or sets the Credential property /// @@ -745,7 +745,7 @@ private bool IsStandardMethodSet() { return (ParameterSetName == "StandardMethod"); } - + private bool IsCustomMethodSet() { return (ParameterSetName == "CustomMethod"); diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/WebResponseObject.Common.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/WebResponseObject.Common.cs index d01d2bc08e7..3b9d1b211e1 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/WebResponseObject.Common.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/WebResponseObject.Common.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/ConvertFromJsonCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/ConvertFromJsonCommand.cs index ebf9ada8a21..3718b0937c2 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/ConvertFromJsonCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/ConvertFromJsonCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/ConvertToJsonCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/ConvertToJsonCommand.cs index 5c1e1f14211..ea40f39c332 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/ConvertToJsonCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/ConvertToJsonCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/BasicHtmlWebResponseObject.CoreClr.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/BasicHtmlWebResponseObject.CoreClr.cs index f4b060430f5..e3f7480d558 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/BasicHtmlWebResponseObject.CoreClr.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/BasicHtmlWebResponseObject.CoreClr.cs @@ -1,7 +1,7 @@ #if CORECLR /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Net.Http; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/ContentHelper.CoreClr.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/ContentHelper.CoreClr.cs index 4268bc63a98..f0198cd3f48 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/ContentHelper.CoreClr.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/ContentHelper.CoreClr.cs @@ -1,7 +1,7 @@ #if CORECLR /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Text; @@ -38,10 +38,10 @@ internal static StringBuilder GetRawContentHeader(HttpResponseMessage response) raw.AppendFormat("{0} {1} {2}", protocol, statusCode, statusDescription); raw.AppendLine(); } - - HttpHeaders[] headerCollections = + + HttpHeaders[] headerCollections = { - response.Headers, + response.Headers, response.Content == null ? null : response.Content.Headers }; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/HtmlWebResponseObject.CoreClr.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/HtmlWebResponseObject.CoreClr.cs index c87d24a0d45..02dad113b8b 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/HtmlWebResponseObject.CoreClr.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/HtmlWebResponseObject.CoreClr.cs @@ -1,7 +1,7 @@ #if CORECLR /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/HttpKnownHeaderNames.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/HttpKnownHeaderNames.cs index 975e89a19c5..324f2d2f088 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/HttpKnownHeaderNames.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/HttpKnownHeaderNames.cs @@ -1,7 +1,7 @@ #if CORECLR /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/InvokeRestMethodCommand.CoreClr.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/InvokeRestMethodCommand.CoreClr.cs index 1001b173022..c12ff664532 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/InvokeRestMethodCommand.CoreClr.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/InvokeRestMethodCommand.CoreClr.cs @@ -1,7 +1,7 @@ #if CORECLR /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/InvokeWebRequestCommand.CoreClr.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/InvokeWebRequestCommand.CoreClr.cs index ebd8a659c3d..64295984a15 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/InvokeWebRequestCommand.CoreClr.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/InvokeWebRequestCommand.CoreClr.cs @@ -1,7 +1,7 @@ #if CORECLR /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebProxy.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebProxy.cs index 2ceb4dc3b33..796b1de13c9 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebProxy.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebProxy.cs @@ -1,7 +1,7 @@ #if CORECLR /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebRequestPSCmdlet.CoreClr.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebRequestPSCmdlet.CoreClr.cs index a730b464ee1..7dbe3146166 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebRequestPSCmdlet.CoreClr.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebRequestPSCmdlet.CoreClr.cs @@ -1,7 +1,7 @@ #if CORECLR /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; @@ -287,9 +287,9 @@ internal virtual HttpRequestMessage GetRequest(Uri uri, bool stripAuthorization) } else { - request.Headers.Add(HttpKnownHeaderNames.UserAgent, WebSession.UserAgent); + request.Headers.Add(HttpKnownHeaderNames.UserAgent, WebSession.UserAgent); } - + } // Set 'Keep-Alive' to false. This means set the Connection to 'Close'. diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseHelper.CoreClr.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseHelper.CoreClr.cs index fbcbdd80181..09ae113f11e 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseHelper.CoreClr.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseHelper.CoreClr.cs @@ -1,7 +1,7 @@ #if CORECLR /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; @@ -18,7 +18,7 @@ internal static string GetCharacterSet(HttpResponseMessage response) string characterSet = response.Content.Headers.ContentType.CharSet; return characterSet; } - + internal static Dictionary> GetHeadersDictionary(HttpResponseMessage response) { var headers = new Dictionary>(StringComparer.OrdinalIgnoreCase); @@ -26,7 +26,7 @@ internal static Dictionary> GetHeadersDictionary(Htt { headers[entry.Key] = entry.Value; } - // In CoreFX, HttpResponseMessage separates content related headers, such as Content-Type to + // In CoreFX, HttpResponseMessage separates content related headers, such as Content-Type to // HttpResponseMessage.Content.Headers. The remaining headers are in HttpResponseMessage.Headers. // The keys in both should be unique with no duplicates between them. // Added for backwards compatibility with PowerShell 5.1 and earlier. diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseObject.CoreClr.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseObject.CoreClr.cs index d683a833b4b..6623dfacb21 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseObject.CoreClr.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseObject.CoreClr.cs @@ -1,7 +1,7 @@ #if CORECLR /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; @@ -41,7 +41,7 @@ public Dictionary> Headers } private Dictionary> _headers = null; - + /// /// gets the RelationLink property /// diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseObjectFactory.CoreClr.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseObjectFactory.CoreClr.cs index f706ae5a142..aba063892a9 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseObjectFactory.CoreClr.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseObjectFactory.CoreClr.cs @@ -1,7 +1,7 @@ #if CORECLR /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Net.Http; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FormObject.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FormObject.cs index 1ae2083a5d0..fcb17ce1753 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FormObject.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FormObject.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FormObjectCollection.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FormObjectCollection.cs index 3fdfa1c6f55..23e9129caf2 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FormObjectCollection.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FormObjectCollection.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/BasicHtmlWebResponseObject.FullClr.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/BasicHtmlWebResponseObject.FullClr.cs index 80ee6bb1d22..fa0f8683cf8 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/BasicHtmlWebResponseObject.FullClr.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/BasicHtmlWebResponseObject.FullClr.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Net; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/ContentHelper.FullClr.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/ContentHelper.FullClr.cs index 12d7d14d946..02f09248862 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/ContentHelper.FullClr.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/ContentHelper.FullClr.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/HtmlWebResponseObject.FullClr.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/HtmlWebResponseObject.FullClr.cs index 807811ef75d..0f9025991cd 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/HtmlWebResponseObject.FullClr.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/HtmlWebResponseObject.FullClr.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/InvokeRestMethodCommand.FullClr.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/InvokeRestMethodCommand.FullClr.cs index c07f151ab61..003a19a3bd5 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/InvokeRestMethodCommand.FullClr.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/InvokeRestMethodCommand.FullClr.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/InvokeWebRequestCommand.FullClr.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/InvokeWebRequestCommand.FullClr.cs index cb5a5710783..f05516f4a26 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/InvokeWebRequestCommand.FullClr.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/InvokeWebRequestCommand.FullClr.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/JsonObjectTypeResolver.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/JsonObjectTypeResolver.cs index 142b64c1d73..14464b00f66 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/JsonObjectTypeResolver.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/JsonObjectTypeResolver.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/WebRequestPSCmdlet.FullClr.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/WebRequestPSCmdlet.FullClr.cs index c1b65ba3ee3..5c44604adc0 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/WebRequestPSCmdlet.FullClr.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/WebRequestPSCmdlet.FullClr.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/WebResponseHelper.FullClr.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/WebResponseHelper.FullClr.cs index 8e654276015..942967407f9 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/WebResponseHelper.FullClr.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/WebResponseHelper.FullClr.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/WebResponseObject.FullClr.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/WebResponseObject.FullClr.cs index ee9087c4623..c1872ac6cd0 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/WebResponseObject.FullClr.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/WebResponseObject.FullClr.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/WebResponseObjectFactory.FullClr.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/WebResponseObjectFactory.FullClr.cs index 1d42838eedb..b280bc5906b 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/WebResponseObjectFactory.FullClr.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/WebResponseObjectFactory.FullClr.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/JsonObject.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/JsonObject.cs index 68fc2a4f57a..f06514ab4af 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/JsonObject.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/JsonObject.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/PSUserAgent.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/PSUserAgent.cs index 4408beae622..3b2b5792390 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/PSUserAgent.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/PSUserAgent.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/StreamHelper.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/StreamHelper.cs index f4486c8771c..aa19b99143d 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/StreamHelper.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/StreamHelper.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/WebCmdletElementCollection.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/WebCmdletElementCollection.cs index 146a0707f05..83044fabc9c 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/WebCmdletElementCollection.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/WebCmdletElementCollection.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.ObjectModel; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/WebRequestMethod.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/WebRequestMethod.cs index 8dfe117b17d..11afdf24b19 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/WebRequestMethod.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/WebRequestMethod.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ namespace Microsoft.PowerShell.Commands diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/WebRequestSession.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/WebRequestSession.cs index 1f7a318ce48..9d5d89a27b6 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/WebRequestSession.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/WebRequestSession.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Write-Object.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Write-Object.cs index 3400fdd9cd9..2ac76d2c63a 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Write-Object.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Write-Object.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WriteAliasCommandBase.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WriteAliasCommandBase.cs index 7320cda732c..9e195d3e30f 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WriteAliasCommandBase.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WriteAliasCommandBase.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WriteConsoleCmdlet.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WriteConsoleCmdlet.cs index d83ef795fbd..c53dc13623d 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WriteConsoleCmdlet.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WriteConsoleCmdlet.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WriteProgressCmdlet.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WriteProgressCmdlet.cs index 8901b36e10f..d9936e14229 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WriteProgressCmdlet.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WriteProgressCmdlet.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/XmlCommands.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/XmlCommands.cs index 4f87989f169..33845a3f23e 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/XmlCommands.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/XmlCommands.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/compare-object.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/compare-object.cs index 6b6fc0f3a32..0dd2e5b2c96 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/compare-object.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/compare-object.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/convert-HTML.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/convert-HTML.cs index 03219da4bcf..89e61edbf98 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/convert-HTML.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/convert-HTML.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/group-object.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/group-object.cs index 1dd466add3b..60d316aecb0 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/group-object.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/group-object.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/new-object.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/new-object.cs index c92d77af85d..89f7bccf977 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/new-object.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/new-object.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #region Using directives diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/neweventcommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/neweventcommand.cs index 4584ffb9977..29ac9dfa987 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/neweventcommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/neweventcommand.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/select-object.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/select-object.cs index dcc86a8e887..b5c4f0a3581 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/select-object.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/select-object.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/sort-object.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/sort-object.cs index 1ccbbe0483b..b3288396a30 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/sort-object.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/sort-object.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/tee-object.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/tee-object.cs index 3892848769f..b5520bbad74 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/tee-object.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/tee-object.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/trace/GetTracerCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/trace/GetTracerCommand.cs index 12465f07988..8b9103f2923 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/trace/GetTracerCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/trace/GetTracerCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Linq; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/trace/MshHostTraceListener.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/trace/MshHostTraceListener.cs index f366c518b63..ae0af27e05b 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/trace/MshHostTraceListener.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/trace/MshHostTraceListener.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/trace/SetTracerCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/trace/SetTracerCommand.cs index 405857aa651..49c4c51ffa3 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/trace/SetTracerCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/trace/SetTracerCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.ObjectModel; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/trace/TraceCommandBase.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/trace/TraceCommandBase.cs index 621c44be5a2..292a69db892 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/trace/TraceCommandBase.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/trace/TraceCommandBase.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/trace/TraceExpressionCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/trace/TraceExpressionCommand.cs index 15ca35a3b4b..bffa86fcc93 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/trace/TraceExpressionCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/trace/TraceExpressionCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/trace/TraceListenerCommandBase.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/trace/TraceListenerCommandBase.cs index 7c3435d502f..34ddcc2e007 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/trace/TraceListenerCommandBase.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/trace/TraceListenerCommandBase.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/update-list.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/update-list.cs index 55e4c855232..afff8f3b8d5 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/update-list.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/update-list.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/write.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/write.cs index 99d4c8b2403..f1b1bcd51a7 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/write.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/write.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Commands.Utility/singleshell/installer/MshUtilityMshSnapin.cs b/src/Microsoft.PowerShell.Commands.Utility/singleshell/installer/MshUtilityMshSnapin.cs index af3788219dd..b26ef9a062a 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/singleshell/installer/MshUtilityMshSnapin.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/singleshell/installer/MshUtilityMshSnapin.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.ComponentModel; diff --git a/src/Microsoft.PowerShell.ConsoleHost/host/msh/CommandLineParameterParser.cs b/src/Microsoft.PowerShell.ConsoleHost/host/msh/CommandLineParameterParser.cs index 02fb43d913d..cbce5c675dc 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/host/msh/CommandLineParameterParser.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/host/msh/CommandLineParameterParser.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ diff --git a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleControl.cs b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleControl.cs index d0a03d2aa3e..84ae968d209 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleControl.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleControl.cs @@ -1,6 +1,6 @@ #if !UNIX /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ diff --git a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHost.cs b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHost.cs index 2064dee6b37..036dbf06ddc 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHost.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHost.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #pragma warning disable 1634, 1691 diff --git a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostRawUserInterface.cs b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostRawUserInterface.cs index 9dc337d0f64..2da4484062e 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostRawUserInterface.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostRawUserInterface.cs @@ -1,6 +1,6 @@ #if !UNIX /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ diff --git a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostTranscript.cs b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostTranscript.cs index d331ef66a39..b9143e878ea 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostTranscript.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostTranscript.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ diff --git a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostUserInterface.cs b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostUserInterface.cs index 691c8925337..d31420bf2c7 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostUserInterface.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostUserInterface.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostUserInterfaceProgress.cs b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostUserInterfaceProgress.cs index d070a4ed14f..6c9350802cc 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostUserInterfaceProgress.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostUserInterfaceProgress.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ diff --git a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostUserInterfacePrompt.cs b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostUserInterfacePrompt.cs index 71d178ac76f..660cd741436 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostUserInterfacePrompt.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostUserInterfacePrompt.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ diff --git a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostUserInterfacePromptForChoice.cs b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostUserInterfacePromptForChoice.cs index 7e76e37fff1..369a9385443 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostUserInterfacePromptForChoice.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostUserInterfacePromptForChoice.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ diff --git a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostUserInterfaceSecurity.cs b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostUserInterfaceSecurity.cs index fdd66e1af05..b945d24dc21 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostUserInterfaceSecurity.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostUserInterfaceSecurity.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleShell.cs b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleShell.cs index 064ff33d7a3..89703712e50 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleShell.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleShell.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation; diff --git a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleTextWriter.cs b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleTextWriter.cs index bb60e390be8..7e14ca9d8cd 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleTextWriter.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleTextWriter.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ diff --git a/src/Microsoft.PowerShell.ConsoleHost/host/msh/Executor.cs b/src/Microsoft.PowerShell.ConsoleHost/host/msh/Executor.cs index d071663ce43..b3ba10f1ec3 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/host/msh/Executor.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/host/msh/Executor.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ManagedEntrance.cs b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ManagedEntrance.cs index 4e78975644d..c8e233c20fb 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ManagedEntrance.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ManagedEntrance.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.ConsoleHost/host/msh/PendingProgress.cs b/src/Microsoft.PowerShell.ConsoleHost/host/msh/PendingProgress.cs index d383743757c..c2be475e02c 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/host/msh/PendingProgress.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/host/msh/PendingProgress.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ diff --git a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ProgressNode.cs b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ProgressNode.cs index d11e78431da..159a1d5c78a 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ProgressNode.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ProgressNode.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ diff --git a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ProgressPane.cs b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ProgressPane.cs index e9b0ed1d692..b1d20c83140 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ProgressPane.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ProgressPane.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ diff --git a/src/Microsoft.PowerShell.ConsoleHost/host/msh/Serialization.cs b/src/Microsoft.PowerShell.ConsoleHost/host/msh/Serialization.cs index f73c26107f0..9eefb0e3b97 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/host/msh/Serialization.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/host/msh/Serialization.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.ConsoleHost/host/msh/StartTranscriptCmdlet.cs b/src/Microsoft.PowerShell.ConsoleHost/host/msh/StartTranscriptCmdlet.cs index 7a99f62091e..6739e770736 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/host/msh/StartTranscriptCmdlet.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/host/msh/StartTranscriptCmdlet.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ diff --git a/src/Microsoft.PowerShell.ConsoleHost/host/msh/StopTranscriptCmdlet.cs b/src/Microsoft.PowerShell.ConsoleHost/host/msh/StopTranscriptCmdlet.cs index a856759b607..8c058a5e787 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/host/msh/StopTranscriptCmdlet.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/host/msh/StopTranscriptCmdlet.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ diff --git a/src/Microsoft.PowerShell.ConsoleHost/resources/ManagedEntranceStrings.resx b/src/Microsoft.PowerShell.ConsoleHost/resources/ManagedEntranceStrings.resx index b5d445ce434..ac73867b960 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/resources/ManagedEntranceStrings.resx +++ b/src/Microsoft.PowerShell.ConsoleHost/resources/ManagedEntranceStrings.resx @@ -119,7 +119,7 @@ PowerShell {0} -Copyright (C) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. Usage: pwsh[.exe] [[-File] <filePath> [args]] diff --git a/src/Microsoft.PowerShell.ConsoleHost/singleshell/installer/EngineInstaller.cs b/src/Microsoft.PowerShell.ConsoleHost/singleshell/installer/EngineInstaller.cs index 2df6f9e1103..d768faabd92 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/singleshell/installer/EngineInstaller.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/singleshell/installer/EngineInstaller.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.ConsoleHost/singleshell/installer/MshHostMshSnapin.cs b/src/Microsoft.PowerShell.ConsoleHost/singleshell/installer/MshHostMshSnapin.cs index 7eeed217bd6..62d6c4c25b1 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/singleshell/installer/MshHostMshSnapin.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/singleshell/installer/MshHostMshSnapin.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.ComponentModel; diff --git a/src/Microsoft.PowerShell.CoreCLR.Eventing/DotNetCode/Eventing/EventDescriptor.cs b/src/Microsoft.PowerShell.CoreCLR.Eventing/DotNetCode/Eventing/EventDescriptor.cs index 65f77f22543..36244513e78 100644 --- a/src/Microsoft.PowerShell.CoreCLR.Eventing/DotNetCode/Eventing/EventDescriptor.cs +++ b/src/Microsoft.PowerShell.CoreCLR.Eventing/DotNetCode/Eventing/EventDescriptor.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // //------------------------------------------------------------------------------ diff --git a/src/Microsoft.PowerShell.CoreCLR.Eventing/DotNetCode/Eventing/EventProvider.cs b/src/Microsoft.PowerShell.CoreCLR.Eventing/DotNetCode/Eventing/EventProvider.cs index 8d78ad9c84c..b628b885f10 100644 --- a/src/Microsoft.PowerShell.CoreCLR.Eventing/DotNetCode/Eventing/EventProvider.cs +++ b/src/Microsoft.PowerShell.CoreCLR.Eventing/DotNetCode/Eventing/EventProvider.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // //------------------------------------------------------------------------------ diff --git a/src/Microsoft.PowerShell.CoreCLR.Eventing/DotNetCode/Eventing/EventProviderTraceListener.cs b/src/Microsoft.PowerShell.CoreCLR.Eventing/DotNetCode/Eventing/EventProviderTraceListener.cs index d699a76ec7c..f692701cbc9 100644 --- a/src/Microsoft.PowerShell.CoreCLR.Eventing/DotNetCode/Eventing/EventProviderTraceListener.cs +++ b/src/Microsoft.PowerShell.CoreCLR.Eventing/DotNetCode/Eventing/EventProviderTraceListener.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // //------------------------------------------------------------------------------ diff --git a/src/Microsoft.PowerShell.LocalAccounts/LocalAccounts/PInvokeDllNames.cs b/src/Microsoft.PowerShell.LocalAccounts/LocalAccounts/PInvokeDllNames.cs index cdc55996036..6a4688584f1 100644 --- a/src/Microsoft.PowerShell.LocalAccounts/LocalAccounts/PInvokeDllNames.cs +++ b/src/Microsoft.PowerShell.LocalAccounts/LocalAccounts/PInvokeDllNames.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // namespace System.Management.Automation diff --git a/src/Microsoft.PowerShell.PSReadLine/AssemblyInfo.cs b/src/Microsoft.PowerShell.PSReadLine/AssemblyInfo.cs index be77dec90f8..f77c6653060 100644 --- a/src/Microsoft.PowerShell.PSReadLine/AssemblyInfo.cs +++ b/src/Microsoft.PowerShell.PSReadLine/AssemblyInfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Reflection; diff --git a/src/Microsoft.PowerShell.PSReadLine/BasicEditing.cs b/src/Microsoft.PowerShell.PSReadLine/BasicEditing.cs index 8737a88c0bf..377aa154cd1 100644 --- a/src/Microsoft.PowerShell.PSReadLine/BasicEditing.cs +++ b/src/Microsoft.PowerShell.PSReadLine/BasicEditing.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.PSReadLine/Cmdlets.cs b/src/Microsoft.PowerShell.PSReadLine/Cmdlets.cs index 21a3ed15dcd..7146e28a0b9 100644 --- a/src/Microsoft.PowerShell.PSReadLine/Cmdlets.cs +++ b/src/Microsoft.PowerShell.PSReadLine/Cmdlets.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.PSReadLine/Completion.cs b/src/Microsoft.PowerShell.PSReadLine/Completion.cs index 932397ec385..aadee01d815 100644 --- a/src/Microsoft.PowerShell.PSReadLine/Completion.cs +++ b/src/Microsoft.PowerShell.PSReadLine/Completion.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.PSReadLine/Completion.vi.cs b/src/Microsoft.PowerShell.PSReadLine/Completion.vi.cs index 97deef45174..2e5eb7458de 100644 --- a/src/Microsoft.PowerShell.PSReadLine/Completion.vi.cs +++ b/src/Microsoft.PowerShell.PSReadLine/Completion.vi.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.PSReadLine/ConsoleBufferBuilder.cs b/src/Microsoft.PowerShell.PSReadLine/ConsoleBufferBuilder.cs index fad206fcc7c..df5244c4f81 100644 --- a/src/Microsoft.PowerShell.PSReadLine/ConsoleBufferBuilder.cs +++ b/src/Microsoft.PowerShell.PSReadLine/ConsoleBufferBuilder.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.PSReadLine/ConsoleKeyChordConverter.cs b/src/Microsoft.PowerShell.PSReadLine/ConsoleKeyChordConverter.cs index bb34f27f92b..1af6c7aecf4 100644 --- a/src/Microsoft.PowerShell.PSReadLine/ConsoleKeyChordConverter.cs +++ b/src/Microsoft.PowerShell.PSReadLine/ConsoleKeyChordConverter.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.PSReadLine/ConsoleLib.cs b/src/Microsoft.PowerShell.PSReadLine/ConsoleLib.cs index 462207bbad8..177f0779fa7 100644 --- a/src/Microsoft.PowerShell.PSReadLine/ConsoleLib.cs +++ b/src/Microsoft.PowerShell.PSReadLine/ConsoleLib.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.PSReadLine/History.cs b/src/Microsoft.PowerShell.PSReadLine/History.cs index 417c24d4cfb..0b77feb70f5 100644 --- a/src/Microsoft.PowerShell.PSReadLine/History.cs +++ b/src/Microsoft.PowerShell.PSReadLine/History.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.PSReadLine/HistoryQueue.cs b/src/Microsoft.PowerShell.PSReadLine/HistoryQueue.cs index 1034d94db17..ea6e86d485b 100644 --- a/src/Microsoft.PowerShell.PSReadLine/HistoryQueue.cs +++ b/src/Microsoft.PowerShell.PSReadLine/HistoryQueue.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.PSReadLine/KeyBindings.cs b/src/Microsoft.PowerShell.PSReadLine/KeyBindings.cs index 7ec4e4f41e6..05f55382095 100644 --- a/src/Microsoft.PowerShell.PSReadLine/KeyBindings.cs +++ b/src/Microsoft.PowerShell.PSReadLine/KeyBindings.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.PSReadLine/KeyBindings.vi.cs b/src/Microsoft.PowerShell.PSReadLine/KeyBindings.vi.cs index eb6f76da620..dd9f09b633a 100644 --- a/src/Microsoft.PowerShell.PSReadLine/KeyBindings.vi.cs +++ b/src/Microsoft.PowerShell.PSReadLine/KeyBindings.vi.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.PSReadLine/Keys.cs b/src/Microsoft.PowerShell.PSReadLine/Keys.cs index 3119be8dd9e..df66e6baae5 100644 --- a/src/Microsoft.PowerShell.PSReadLine/Keys.cs +++ b/src/Microsoft.PowerShell.PSReadLine/Keys.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.PSReadLine/KillYank.cs b/src/Microsoft.PowerShell.PSReadLine/KillYank.cs index dac5b9e02d4..b06be4cc928 100644 --- a/src/Microsoft.PowerShell.PSReadLine/KillYank.cs +++ b/src/Microsoft.PowerShell.PSReadLine/KillYank.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.PSReadLine/Movement.cs b/src/Microsoft.PowerShell.PSReadLine/Movement.cs index 8469a04c14e..b309b3245b5 100644 --- a/src/Microsoft.PowerShell.PSReadLine/Movement.cs +++ b/src/Microsoft.PowerShell.PSReadLine/Movement.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.PSReadLine/Movement.vi.cs b/src/Microsoft.PowerShell.PSReadLine/Movement.vi.cs index 43ddaf60fe9..7c1c8a7bf21 100644 --- a/src/Microsoft.PowerShell.PSReadLine/Movement.vi.cs +++ b/src/Microsoft.PowerShell.PSReadLine/Movement.vi.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.PSReadLine/Options.cs b/src/Microsoft.PowerShell.PSReadLine/Options.cs index 0a385cf0882..63b440f145a 100644 --- a/src/Microsoft.PowerShell.PSReadLine/Options.cs +++ b/src/Microsoft.PowerShell.PSReadLine/Options.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.PSReadLine/PSReadLine.psd1 b/src/Microsoft.PowerShell.PSReadLine/PSReadLine.psd1 index 41e6b0cc5fe..a634495d19d 100644 --- a/src/Microsoft.PowerShell.PSReadLine/PSReadLine.psd1 +++ b/src/Microsoft.PowerShell.PSReadLine/PSReadLine.psd1 @@ -5,7 +5,7 @@ ModuleVersion = '1.2' GUID = '5714753b-2afd-4492-a5fd-01d9e2cff8b5' Author = 'Microsoft Corporation' CompanyName = 'Microsoft Corporation' -Copyright = '(c) Microsoft Corporation. All rights reserved.' +Copyright = 'Copyright (c) Microsoft Corporation. All rights reserved.' Description = 'Great command line editing in the PowerShell console host' PowerShellVersion = '3.0' DotNetFrameworkVersion = '4.0' diff --git a/src/Microsoft.PowerShell.PSReadLine/PublicAPI.cs b/src/Microsoft.PowerShell.PSReadLine/PublicAPI.cs index 3f0163a781d..2db274ec43b 100644 --- a/src/Microsoft.PowerShell.PSReadLine/PublicAPI.cs +++ b/src/Microsoft.PowerShell.PSReadLine/PublicAPI.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.PSReadLine/ReadLine.cs b/src/Microsoft.PowerShell.PSReadLine/ReadLine.cs index 0282d77841f..0aede96f921 100644 --- a/src/Microsoft.PowerShell.PSReadLine/ReadLine.cs +++ b/src/Microsoft.PowerShell.PSReadLine/ReadLine.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.PSReadLine/ReadLine.vi.cs b/src/Microsoft.PowerShell.PSReadLine/ReadLine.vi.cs index 9c7b79289da..304663f06a4 100644 --- a/src/Microsoft.PowerShell.PSReadLine/ReadLine.vi.cs +++ b/src/Microsoft.PowerShell.PSReadLine/ReadLine.vi.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.PSReadLine/Render.cs b/src/Microsoft.PowerShell.PSReadLine/Render.cs index e0aec994daf..632fdeb9cc3 100644 --- a/src/Microsoft.PowerShell.PSReadLine/Render.cs +++ b/src/Microsoft.PowerShell.PSReadLine/Render.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.PSReadLine/Replace.vi.cs b/src/Microsoft.PowerShell.PSReadLine/Replace.vi.cs index cf8c39e750c..c4960e5b703 100644 --- a/src/Microsoft.PowerShell.PSReadLine/Replace.vi.cs +++ b/src/Microsoft.PowerShell.PSReadLine/Replace.vi.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.PSReadLine/ScreenCapture.cs b/src/Microsoft.PowerShell.PSReadLine/ScreenCapture.cs index e35d83a5c57..4404c4866b4 100644 --- a/src/Microsoft.PowerShell.PSReadLine/ScreenCapture.cs +++ b/src/Microsoft.PowerShell.PSReadLine/ScreenCapture.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !UNIX diff --git a/src/Microsoft.PowerShell.PSReadLine/UndoRedo.cs b/src/Microsoft.PowerShell.PSReadLine/UndoRedo.cs index b451231e1a6..e25aa8ad85f 100644 --- a/src/Microsoft.PowerShell.PSReadLine/UndoRedo.cs +++ b/src/Microsoft.PowerShell.PSReadLine/UndoRedo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.PSReadLine/UndoRedo.vi.cs b/src/Microsoft.PowerShell.PSReadLine/UndoRedo.vi.cs index 11e5f452d32..ed0d127f028 100644 --- a/src/Microsoft.PowerShell.PSReadLine/UndoRedo.vi.cs +++ b/src/Microsoft.PowerShell.PSReadLine/UndoRedo.vi.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.PSReadLine/VisualEditing.vi.cs b/src/Microsoft.PowerShell.PSReadLine/VisualEditing.vi.cs index 59a14053eab..b93a6f36b4a 100644 --- a/src/Microsoft.PowerShell.PSReadLine/VisualEditing.vi.cs +++ b/src/Microsoft.PowerShell.PSReadLine/VisualEditing.vi.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.PSReadLine/Words.cs b/src/Microsoft.PowerShell.PSReadLine/Words.cs index 5aa0eca46a9..fe8f3c8ecc9 100644 --- a/src/Microsoft.PowerShell.PSReadLine/Words.cs +++ b/src/Microsoft.PowerShell.PSReadLine/Words.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/Microsoft.PowerShell.PSReadLine/Words.vi.cs b/src/Microsoft.PowerShell.PSReadLine/Words.vi.cs index eab0df2f4f8..219499737c0 100644 --- a/src/Microsoft.PowerShell.PSReadLine/Words.vi.cs +++ b/src/Microsoft.PowerShell.PSReadLine/Words.vi.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/Microsoft.PowerShell.PSReadLine/YankPaste.vi.cs b/src/Microsoft.PowerShell.PSReadLine/YankPaste.vi.cs index 93e383cb08f..1f894a72fea 100644 --- a/src/Microsoft.PowerShell.PSReadLine/YankPaste.vi.cs +++ b/src/Microsoft.PowerShell.PSReadLine/YankPaste.vi.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.ScheduledJob/ScheduledJob.cs b/src/Microsoft.PowerShell.ScheduledJob/ScheduledJob.cs index c9835bde440..bf61ff71491 100644 --- a/src/Microsoft.PowerShell.ScheduledJob/ScheduledJob.cs +++ b/src/Microsoft.PowerShell.ScheduledJob/ScheduledJob.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; using System.Collections.Generic; diff --git a/src/Microsoft.PowerShell.ScheduledJob/ScheduledJobDefinition.cs b/src/Microsoft.PowerShell.ScheduledJob/ScheduledJobDefinition.cs index bde0a85e273..826b4cfdc75 100644 --- a/src/Microsoft.PowerShell.ScheduledJob/ScheduledJobDefinition.cs +++ b/src/Microsoft.PowerShell.ScheduledJob/ScheduledJobDefinition.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; using System.Collections.ObjectModel; diff --git a/src/Microsoft.PowerShell.ScheduledJob/ScheduledJobOptions.cs b/src/Microsoft.PowerShell.ScheduledJob/ScheduledJobOptions.cs index 2fa6bd0505c..25ad74822b1 100644 --- a/src/Microsoft.PowerShell.ScheduledJob/ScheduledJobOptions.cs +++ b/src/Microsoft.PowerShell.ScheduledJob/ScheduledJobOptions.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; using System.Collections.Generic; diff --git a/src/Microsoft.PowerShell.ScheduledJob/ScheduledJobSourceAdapter.cs b/src/Microsoft.PowerShell.ScheduledJob/ScheduledJobSourceAdapter.cs index 328625d49fc..37d3eab4b23 100644 --- a/src/Microsoft.PowerShell.ScheduledJob/ScheduledJobSourceAdapter.cs +++ b/src/Microsoft.PowerShell.ScheduledJob/ScheduledJobSourceAdapter.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; using System.Collections.Generic; diff --git a/src/Microsoft.PowerShell.ScheduledJob/ScheduledJobStore.cs b/src/Microsoft.PowerShell.ScheduledJob/ScheduledJobStore.cs index 68bc4f14022..b73dbc7432b 100644 --- a/src/Microsoft.PowerShell.ScheduledJob/ScheduledJobStore.cs +++ b/src/Microsoft.PowerShell.ScheduledJob/ScheduledJobStore.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; using System.Collections.Generic; diff --git a/src/Microsoft.PowerShell.ScheduledJob/ScheduledJobTrigger.cs b/src/Microsoft.PowerShell.ScheduledJob/ScheduledJobTrigger.cs index 9e0dbfd47c4..1ac15ed476d 100644 --- a/src/Microsoft.PowerShell.ScheduledJob/ScheduledJobTrigger.cs +++ b/src/Microsoft.PowerShell.ScheduledJob/ScheduledJobTrigger.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; using System.Collections.Generic; diff --git a/src/Microsoft.PowerShell.ScheduledJob/ScheduledJobWTS.cs b/src/Microsoft.PowerShell.ScheduledJob/ScheduledJobWTS.cs index 3aec4228383..e89df8051fe 100644 --- a/src/Microsoft.PowerShell.ScheduledJob/ScheduledJobWTS.cs +++ b/src/Microsoft.PowerShell.ScheduledJob/ScheduledJobWTS.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; using System.Collections.Generic; diff --git a/src/Microsoft.PowerShell.ScheduledJob/commands/AddJobTrigger.cs b/src/Microsoft.PowerShell.ScheduledJob/commands/AddJobTrigger.cs index dee94eeb212..0bfb6d8ae5b 100644 --- a/src/Microsoft.PowerShell.ScheduledJob/commands/AddJobTrigger.cs +++ b/src/Microsoft.PowerShell.ScheduledJob/commands/AddJobTrigger.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.ScheduledJob/commands/DisableJobDefinition.cs b/src/Microsoft.PowerShell.ScheduledJob/commands/DisableJobDefinition.cs index 0c8f97fe19c..a84de3eacea 100644 --- a/src/Microsoft.PowerShell.ScheduledJob/commands/DisableJobDefinition.cs +++ b/src/Microsoft.PowerShell.ScheduledJob/commands/DisableJobDefinition.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.ScheduledJob/commands/DisableJobDefinitionBase.cs b/src/Microsoft.PowerShell.ScheduledJob/commands/DisableJobDefinitionBase.cs index 0fb83a2a642..73553266f6b 100644 --- a/src/Microsoft.PowerShell.ScheduledJob/commands/DisableJobDefinitionBase.cs +++ b/src/Microsoft.PowerShell.ScheduledJob/commands/DisableJobDefinitionBase.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.ScheduledJob/commands/DisableJobTrigger.cs b/src/Microsoft.PowerShell.ScheduledJob/commands/DisableJobTrigger.cs index 2c80beb7cdb..e8d73e93f73 100644 --- a/src/Microsoft.PowerShell.ScheduledJob/commands/DisableJobTrigger.cs +++ b/src/Microsoft.PowerShell.ScheduledJob/commands/DisableJobTrigger.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.ScheduledJob/commands/EnableDisableCmdletBase.cs b/src/Microsoft.PowerShell.ScheduledJob/commands/EnableDisableCmdletBase.cs index 2d4f6a51a61..fc1e2ef5530 100644 --- a/src/Microsoft.PowerShell.ScheduledJob/commands/EnableDisableCmdletBase.cs +++ b/src/Microsoft.PowerShell.ScheduledJob/commands/EnableDisableCmdletBase.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.ScheduledJob/commands/EnableJobDefinition.cs b/src/Microsoft.PowerShell.ScheduledJob/commands/EnableJobDefinition.cs index 4bcd6eedb7c..3344785d844 100644 --- a/src/Microsoft.PowerShell.ScheduledJob/commands/EnableJobDefinition.cs +++ b/src/Microsoft.PowerShell.ScheduledJob/commands/EnableJobDefinition.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.ScheduledJob/commands/EnableJobTrigger.cs b/src/Microsoft.PowerShell.ScheduledJob/commands/EnableJobTrigger.cs index 023591ad4f1..54b8790aa17 100644 --- a/src/Microsoft.PowerShell.ScheduledJob/commands/EnableJobTrigger.cs +++ b/src/Microsoft.PowerShell.ScheduledJob/commands/EnableJobTrigger.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.ScheduledJob/commands/GetJobDefinition.cs b/src/Microsoft.PowerShell.ScheduledJob/commands/GetJobDefinition.cs index e138a570475..a59869d902c 100644 --- a/src/Microsoft.PowerShell.ScheduledJob/commands/GetJobDefinition.cs +++ b/src/Microsoft.PowerShell.ScheduledJob/commands/GetJobDefinition.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.ScheduledJob/commands/GetJobTrigger.cs b/src/Microsoft.PowerShell.ScheduledJob/commands/GetJobTrigger.cs index ab1b05e9494..469176d0f42 100644 --- a/src/Microsoft.PowerShell.ScheduledJob/commands/GetJobTrigger.cs +++ b/src/Microsoft.PowerShell.ScheduledJob/commands/GetJobTrigger.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.ScheduledJob/commands/GetScheduledJobOption.cs b/src/Microsoft.PowerShell.ScheduledJob/commands/GetScheduledJobOption.cs index f8eb680db93..be12fb0e3e9 100644 --- a/src/Microsoft.PowerShell.ScheduledJob/commands/GetScheduledJobOption.cs +++ b/src/Microsoft.PowerShell.ScheduledJob/commands/GetScheduledJobOption.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.ScheduledJob/commands/NewJobTrigger.cs b/src/Microsoft.PowerShell.ScheduledJob/commands/NewJobTrigger.cs index 27ffc5a8006..cabb4e3b66b 100644 --- a/src/Microsoft.PowerShell.ScheduledJob/commands/NewJobTrigger.cs +++ b/src/Microsoft.PowerShell.ScheduledJob/commands/NewJobTrigger.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.ScheduledJob/commands/NewScheduledJobOption.cs b/src/Microsoft.PowerShell.ScheduledJob/commands/NewScheduledJobOption.cs index d6ec042cd73..224c11a8b5d 100644 --- a/src/Microsoft.PowerShell.ScheduledJob/commands/NewScheduledJobOption.cs +++ b/src/Microsoft.PowerShell.ScheduledJob/commands/NewScheduledJobOption.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.ScheduledJob/commands/RegisterJobDefinition.cs b/src/Microsoft.PowerShell.ScheduledJob/commands/RegisterJobDefinition.cs index d49b4c071fd..b451a9fc168 100644 --- a/src/Microsoft.PowerShell.ScheduledJob/commands/RegisterJobDefinition.cs +++ b/src/Microsoft.PowerShell.ScheduledJob/commands/RegisterJobDefinition.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.ScheduledJob/commands/RemoveJobTrigger.cs b/src/Microsoft.PowerShell.ScheduledJob/commands/RemoveJobTrigger.cs index b3a487bd367..757e52f39b9 100644 --- a/src/Microsoft.PowerShell.ScheduledJob/commands/RemoveJobTrigger.cs +++ b/src/Microsoft.PowerShell.ScheduledJob/commands/RemoveJobTrigger.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.ScheduledJob/commands/SchedJobCmdletBase.cs b/src/Microsoft.PowerShell.ScheduledJob/commands/SchedJobCmdletBase.cs index 17568de908d..25509d8cc5e 100644 --- a/src/Microsoft.PowerShell.ScheduledJob/commands/SchedJobCmdletBase.cs +++ b/src/Microsoft.PowerShell.ScheduledJob/commands/SchedJobCmdletBase.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.ScheduledJob/commands/ScheduledJobOptionCmdletBase.cs b/src/Microsoft.PowerShell.ScheduledJob/commands/ScheduledJobOptionCmdletBase.cs index dc506b92491..135bcc9cb37 100644 --- a/src/Microsoft.PowerShell.ScheduledJob/commands/ScheduledJobOptionCmdletBase.cs +++ b/src/Microsoft.PowerShell.ScheduledJob/commands/ScheduledJobOptionCmdletBase.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.ScheduledJob/commands/SetJobDefinition.cs b/src/Microsoft.PowerShell.ScheduledJob/commands/SetJobDefinition.cs index eb044874995..ca3f42809ba 100644 --- a/src/Microsoft.PowerShell.ScheduledJob/commands/SetJobDefinition.cs +++ b/src/Microsoft.PowerShell.ScheduledJob/commands/SetJobDefinition.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.ScheduledJob/commands/SetJobTrigger.cs b/src/Microsoft.PowerShell.ScheduledJob/commands/SetJobTrigger.cs index cea8cf487ce..bfe72b9e073 100644 --- a/src/Microsoft.PowerShell.ScheduledJob/commands/SetJobTrigger.cs +++ b/src/Microsoft.PowerShell.ScheduledJob/commands/SetJobTrigger.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.ScheduledJob/commands/SetScheduledJobOption.cs b/src/Microsoft.PowerShell.ScheduledJob/commands/SetScheduledJobOption.cs index 917d6c187f4..ef329895bd2 100644 --- a/src/Microsoft.PowerShell.ScheduledJob/commands/SetScheduledJobOption.cs +++ b/src/Microsoft.PowerShell.ScheduledJob/commands/SetScheduledJobOption.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.ScheduledJob/commands/UnregisterJobDefinition.cs b/src/Microsoft.PowerShell.ScheduledJob/commands/UnregisterJobDefinition.cs index 2f85e7d3eb9..8eea6a6b00a 100644 --- a/src/Microsoft.PowerShell.ScheduledJob/commands/UnregisterJobDefinition.cs +++ b/src/Microsoft.PowerShell.ScheduledJob/commands/UnregisterJobDefinition.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Security/security/AclCommands.cs b/src/Microsoft.PowerShell.Security/security/AclCommands.cs index 3d1a73f6358..e4a8d0421d3 100644 --- a/src/Microsoft.PowerShell.Security/security/AclCommands.cs +++ b/src/Microsoft.PowerShell.Security/security/AclCommands.cs @@ -1,7 +1,7 @@ #pragma warning disable 1634, 1691 /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #pragma warning disable 1634, 1691 diff --git a/src/Microsoft.PowerShell.Security/security/CatalogCommands.cs b/src/Microsoft.PowerShell.Security/security/CatalogCommands.cs index aa6c222fdf6..07f2dc9015c 100644 --- a/src/Microsoft.PowerShell.Security/security/CatalogCommands.cs +++ b/src/Microsoft.PowerShell.Security/security/CatalogCommands.cs @@ -1,7 +1,7 @@ #if !UNIX /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Security/security/CertificateCommands.cs b/src/Microsoft.PowerShell.Security/security/CertificateCommands.cs index bc753548268..94d032e48a7 100644 --- a/src/Microsoft.PowerShell.Security/security/CertificateCommands.cs +++ b/src/Microsoft.PowerShell.Security/security/CertificateCommands.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ diff --git a/src/Microsoft.PowerShell.Security/security/CertificateProvider.cs b/src/Microsoft.PowerShell.Security/security/CertificateProvider.cs index b282a3510f1..533cb60767b 100644 --- a/src/Microsoft.PowerShell.Security/security/CertificateProvider.cs +++ b/src/Microsoft.PowerShell.Security/security/CertificateProvider.cs @@ -1,6 +1,6 @@ #if !UNIX /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Security/security/CmsCommands.cs b/src/Microsoft.PowerShell.Security/security/CmsCommands.cs index 40ca423458e..b93a55f5e08 100644 --- a/src/Microsoft.PowerShell.Security/security/CmsCommands.cs +++ b/src/Microsoft.PowerShell.Security/security/CmsCommands.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Security/security/CredentialCommands.cs b/src/Microsoft.PowerShell.Security/security/CredentialCommands.cs index cc5a871fbb1..1bc1d186d67 100644 --- a/src/Microsoft.PowerShell.Security/security/CredentialCommands.cs +++ b/src/Microsoft.PowerShell.Security/security/CredentialCommands.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Security/security/ExecutionPolicyCommands.cs b/src/Microsoft.PowerShell.Security/security/ExecutionPolicyCommands.cs index 47a998f15d1..6720d3d9c89 100644 --- a/src/Microsoft.PowerShell.Security/security/ExecutionPolicyCommands.cs +++ b/src/Microsoft.PowerShell.Security/security/ExecutionPolicyCommands.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #region Using directives diff --git a/src/Microsoft.PowerShell.Security/security/SecureStringCommands.cs b/src/Microsoft.PowerShell.Security/security/SecureStringCommands.cs index 9dd8e96fb8e..c426e0d8ce4 100644 --- a/src/Microsoft.PowerShell.Security/security/SecureStringCommands.cs +++ b/src/Microsoft.PowerShell.Security/security/SecureStringCommands.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Security/security/SignatureCommands.cs b/src/Microsoft.PowerShell.Security/security/SignatureCommands.cs index 1e6a3ae6a04..94f8a8a6913 100644 --- a/src/Microsoft.PowerShell.Security/security/SignatureCommands.cs +++ b/src/Microsoft.PowerShell.Security/security/SignatureCommands.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ diff --git a/src/Microsoft.PowerShell.Security/security/Utils.cs b/src/Microsoft.PowerShell.Security/security/Utils.cs index f9e9c1842ff..1e2c758f1d3 100644 --- a/src/Microsoft.PowerShell.Security/security/Utils.cs +++ b/src/Microsoft.PowerShell.Security/security/Utils.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Security/security/certificateproviderexceptions.cs b/src/Microsoft.PowerShell.Security/security/certificateproviderexceptions.cs index ba21f0c351d..222cdc33472 100644 --- a/src/Microsoft.PowerShell.Security/security/certificateproviderexceptions.cs +++ b/src/Microsoft.PowerShell.Security/security/certificateproviderexceptions.cs @@ -1,6 +1,6 @@ #if !UNIX /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.PowerShell.Security/singleshell/installer/MshSecurityMshSnapin.cs b/src/Microsoft.PowerShell.Security/singleshell/installer/MshSecurityMshSnapin.cs index dbaa0e32c8e..7f884b13f96 100644 --- a/src/Microsoft.PowerShell.Security/singleshell/installer/MshSecurityMshSnapin.cs +++ b/src/Microsoft.PowerShell.Security/singleshell/installer/MshSecurityMshSnapin.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/Microsoft.WSMan.Management/ConfigProvider.cs b/src/Microsoft.WSMan.Management/ConfigProvider.cs index a300e55085b..891c01d9f55 100644 --- a/src/Microsoft.WSMan.Management/ConfigProvider.cs +++ b/src/Microsoft.WSMan.Management/ConfigProvider.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; using System.Collections.Generic; diff --git a/src/Microsoft.WSMan.Management/CredSSP.cs b/src/Microsoft.WSMan.Management/CredSSP.cs index 29b71c14f3c..cfe47a63a51 100644 --- a/src/Microsoft.WSMan.Management/CredSSP.cs +++ b/src/Microsoft.WSMan.Management/CredSSP.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; using System.IO; diff --git a/src/Microsoft.WSMan.Management/CurrentConfigurations.cs b/src/Microsoft.WSMan.Management/CurrentConfigurations.cs index 242fd613330..02b2038fdb6 100644 --- a/src/Microsoft.WSMan.Management/CurrentConfigurations.cs +++ b/src/Microsoft.WSMan.Management/CurrentConfigurations.cs @@ -1,6 +1,6 @@ //------------------------------------------------------------------ // -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // // // diff --git a/src/Microsoft.WSMan.Management/Interop.cs b/src/Microsoft.WSMan.Management/Interop.cs index 7a15b30cc96..5d8a6802db4 100644 --- a/src/Microsoft.WSMan.Management/Interop.cs +++ b/src/Microsoft.WSMan.Management/Interop.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; using System.IO; diff --git a/src/Microsoft.WSMan.Management/InvokeWSManAction.cs b/src/Microsoft.WSMan.Management/InvokeWSManAction.cs index 24e15016f1b..6d9aba72967 100644 --- a/src/Microsoft.WSMan.Management/InvokeWSManAction.cs +++ b/src/Microsoft.WSMan.Management/InvokeWSManAction.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; using System.IO; diff --git a/src/Microsoft.WSMan.Management/NewWSManSession.cs b/src/Microsoft.WSMan.Management/NewWSManSession.cs index 5d44cf29361..ab730bcdd26 100644 --- a/src/Microsoft.WSMan.Management/NewWSManSession.cs +++ b/src/Microsoft.WSMan.Management/NewWSManSession.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System; using System.IO; diff --git a/src/Microsoft.WSMan.Management/PingWSMan.cs b/src/Microsoft.WSMan.Management/PingWSMan.cs index 60ed743868f..21e9bd95695 100644 --- a/src/Microsoft.WSMan.Management/PingWSMan.cs +++ b/src/Microsoft.WSMan.Management/PingWSMan.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System; using System.IO; diff --git a/src/Microsoft.WSMan.Management/Set-QuickConfig.cs b/src/Microsoft.WSMan.Management/Set-QuickConfig.cs index 240a25765b7..6edb2b0d0ed 100644 --- a/src/Microsoft.WSMan.Management/Set-QuickConfig.cs +++ b/src/Microsoft.WSMan.Management/Set-QuickConfig.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System; using System.IO; diff --git a/src/Microsoft.WSMan.Management/WSManConnections.cs b/src/Microsoft.WSMan.Management/WSManConnections.cs index 642b6a0c09d..dd8b14e20cf 100644 --- a/src/Microsoft.WSMan.Management/WSManConnections.cs +++ b/src/Microsoft.WSMan.Management/WSManConnections.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System; using System.IO; diff --git a/src/Microsoft.WSMan.Management/WSManInstance.cs b/src/Microsoft.WSMan.Management/WSManInstance.cs index 99bc67cdf6f..96dfa8e8434 100644 --- a/src/Microsoft.WSMan.Management/WSManInstance.cs +++ b/src/Microsoft.WSMan.Management/WSManInstance.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System; using System.IO; diff --git a/src/Microsoft.WSMan.Management/WsManHelper.cs b/src/Microsoft.WSMan.Management/WsManHelper.cs index d33423ddf00..8e233d1416f 100644 --- a/src/Microsoft.WSMan.Management/WsManHelper.cs +++ b/src/Microsoft.WSMan.Management/WsManHelper.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System; using System.Collections.Generic; diff --git a/src/Microsoft.WSMan.Management/WsManSnapin.cs b/src/Microsoft.WSMan.Management/WsManSnapin.cs index b9741220403..b47e57f424f 100644 --- a/src/Microsoft.WSMan.Management/WsManSnapin.cs +++ b/src/Microsoft.WSMan.Management/WsManSnapin.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; using System.Diagnostics; diff --git a/src/Microsoft.WSMan.Management/resources/WsManResources.txt b/src/Microsoft.WSMan.Management/resources/WsManResources.txt index 7599a12ece2..fd0bd37eb74 100644 --- a/src/Microsoft.WSMan.Management/resources/WsManResources.txt +++ b/src/Microsoft.WSMan.Management/resources/WsManResources.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2008 Microsoft Corporation +# Copyright (c) Microsoft Corporation. All rights reserved. # {0} = Delegate @@ -11,8 +11,8 @@ NoResourceMatch=This command cannot be used because the parameter does not match MultipleResourceMatch=This command cannot be used because the parameter matches multiple properties on the ResourceURI.Check the input parameters and run your command. NoAttributeMatch=This command cannot be used because the parameter matches a non-text property on the ResourceURI.Check the input parameters and run your command. WinrmNotConfigured=This command cannot be used because the configuration is corrupted. Run WinRM invoke Restore WinRM/config to restore the default configuration -DelegateFreshCred=The machine is configured to allow delegating fresh credentials to the following target(s): -NoDelegateFreshCred=The machine is not configured to allow delegating fresh credentials. +DelegateFreshCred=The machine is configured to allow delegating fresh credentials to the following target(s): +NoDelegateFreshCred=The machine is not configured to allow delegating fresh credentials. LocalHost=This command cannot be used to remove the computer 'localhost' because it will always be connected. Give some other connected computer and run your command. ConnectFailure=This command cannot be used from the current path. Move to root path of the provider using cd\\ and run your command again. DisconnectFailure=This command cannot be used from the current path. Move to root path of the provider using cd\\ and run your command again. diff --git a/src/Microsoft.WSMan.Runtime/WSManSessionOption.cs b/src/Microsoft.WSMan.Runtime/WSManSessionOption.cs index 9c187e9bc10..0a5a9c2268d 100644 --- a/src/Microsoft.WSMan.Runtime/WSManSessionOption.cs +++ b/src/Microsoft.WSMan.Runtime/WSManSessionOption.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System; using System.IO; diff --git a/src/Modules/Shared/Microsoft.PowerShell.Host/Microsoft.PowerShell.Host.psd1 b/src/Modules/Shared/Microsoft.PowerShell.Host/Microsoft.PowerShell.Host.psd1 index f16263ffb5f..88a0034539f 100644 --- a/src/Modules/Shared/Microsoft.PowerShell.Host/Microsoft.PowerShell.Host.psd1 +++ b/src/Modules/Shared/Microsoft.PowerShell.Host/Microsoft.PowerShell.Host.psd1 @@ -2,7 +2,7 @@ GUID="56D66100-99A0-4FFC-A12D-EEE9A6718AEF" Author="Microsoft Corporation" CompanyName="Microsoft Corporation" -Copyright="(c) Microsoft Corporation. All rights reserved." +Copyright="Copyright (c) Microsoft Corporation. All rights reserved." ModuleVersion="3.0.0.0" PowerShellVersion="3.0" CLRVersion="4.0" diff --git a/src/Modules/Shared/PSReadLine/PSReadLine.psd1 b/src/Modules/Shared/PSReadLine/PSReadLine.psd1 index 41e6b0cc5fe..a634495d19d 100644 --- a/src/Modules/Shared/PSReadLine/PSReadLine.psd1 +++ b/src/Modules/Shared/PSReadLine/PSReadLine.psd1 @@ -5,7 +5,7 @@ ModuleVersion = '1.2' GUID = '5714753b-2afd-4492-a5fd-01d9e2cff8b5' Author = 'Microsoft Corporation' CompanyName = 'Microsoft Corporation' -Copyright = '(c) Microsoft Corporation. All rights reserved.' +Copyright = 'Copyright (c) Microsoft Corporation. All rights reserved.' Description = 'Great command line editing in the PowerShell console host' PowerShellVersion = '3.0' DotNetFrameworkVersion = '4.0' diff --git a/src/Modules/Unix/Microsoft.PowerShell.Management/Microsoft.PowerShell.Management.psd1 b/src/Modules/Unix/Microsoft.PowerShell.Management/Microsoft.PowerShell.Management.psd1 index 239ef66ecd2..c270ed53848 100644 --- a/src/Modules/Unix/Microsoft.PowerShell.Management/Microsoft.PowerShell.Management.psd1 +++ b/src/Modules/Unix/Microsoft.PowerShell.Management/Microsoft.PowerShell.Management.psd1 @@ -2,7 +2,7 @@ GUID="EEFCB906-B326-4E99-9F54-8B4BB6EF3C6D" Author="Microsoft Corporation" CompanyName="Microsoft Corporation" -Copyright="(c) Microsoft Corporation. All rights reserved." +Copyright="Copyright (c) Microsoft Corporation. All rights reserved." ModuleVersion="3.1.0.0" PowerShellVersion="3.0" NestedModules="Microsoft.PowerShell.Commands.Management.dll" diff --git a/src/Modules/Unix/Microsoft.PowerShell.Security/Microsoft.PowerShell.Security.psd1 b/src/Modules/Unix/Microsoft.PowerShell.Security/Microsoft.PowerShell.Security.psd1 index 8ff7cc1a76a..20df5b5ea26 100644 --- a/src/Modules/Unix/Microsoft.PowerShell.Security/Microsoft.PowerShell.Security.psd1 +++ b/src/Modules/Unix/Microsoft.PowerShell.Security/Microsoft.PowerShell.Security.psd1 @@ -2,7 +2,7 @@ GUID="A94C8C7E-9810-47C0-B8AF-65089C13A35A" Author="Microsoft Corporation" CompanyName="Microsoft Corporation" -Copyright="(c) Microsoft Corporation. All rights reserved." +Copyright="Copyright (c) Microsoft Corporation. All rights reserved." ModuleVersion="3.0.0.0" PowerShellVersion="3.0" AliasesToExport = @() diff --git a/src/Modules/Unix/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 b/src/Modules/Unix/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 index aa30232544e..9e94151edd7 100644 --- a/src/Modules/Unix/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 +++ b/src/Modules/Unix/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 @@ -2,7 +2,7 @@ GUID="1DA87E53-152B-403E-98DC-74D7B4D63D59" Author="Microsoft Corporation" CompanyName="Microsoft Corporation" -Copyright="© Microsoft Corporation. All rights reserved." +Copyright="Copyright (c) Microsoft Corporation. All rights reserved." ModuleVersion="3.1.0.0" PowerShellVersion="3.0" CmdletsToExport= "Format-List", "Format-Custom", "Format-Table", "Format-Wide", diff --git a/src/Modules/Windows-Core+Full/CimCmdlets/CimCmdlets.psd1 b/src/Modules/Windows-Core+Full/CimCmdlets/CimCmdlets.psd1 index 611244f824c..049f89c7d10 100644 --- a/src/Modules/Windows-Core+Full/CimCmdlets/CimCmdlets.psd1 +++ b/src/Modules/Windows-Core+Full/CimCmdlets/CimCmdlets.psd1 @@ -2,7 +2,7 @@ GUID="{Fb6cc51d-c096-4b38-b78d-0fed6277096a}" Author="Microsoft Corporation" CompanyName="Microsoft Corporation" -Copyright="© Microsoft Corporation. All rights reserved." +Copyright="Copyright (c) Microsoft Corporation. All rights reserved." ModuleVersion="1.0.0.0" PowerShellVersion="3.0" CLRVersion="4.0" diff --git a/src/Modules/Windows-Core+Full/Microsoft.PowerShell.Security/Microsoft.PowerShell.Security.psd1 b/src/Modules/Windows-Core+Full/Microsoft.PowerShell.Security/Microsoft.PowerShell.Security.psd1 index f87b04f8c36..34343b00634 100644 --- a/src/Modules/Windows-Core+Full/Microsoft.PowerShell.Security/Microsoft.PowerShell.Security.psd1 +++ b/src/Modules/Windows-Core+Full/Microsoft.PowerShell.Security/Microsoft.PowerShell.Security.psd1 @@ -2,7 +2,7 @@ GUID="A94C8C7E-9810-47C0-B8AF-65089C13A35A" Author="Microsoft Corporation" CompanyName="Microsoft Corporation" -Copyright="(c) Microsoft Corporation. All rights reserved." +Copyright="Copyright (c) Microsoft Corporation. All rights reserved." ModuleVersion="3.0.0.0" PowerShellVersion="3.0" CLRVersion="4.0" diff --git a/src/Modules/Windows-Core+Full/Microsoft.WSMan.Management/Microsoft.WSMan.Management.psd1 b/src/Modules/Windows-Core+Full/Microsoft.WSMan.Management/Microsoft.WSMan.Management.psd1 index 8de5dcd0c60..52c5e2ab83a 100644 --- a/src/Modules/Windows-Core+Full/Microsoft.WSMan.Management/Microsoft.WSMan.Management.psd1 +++ b/src/Modules/Windows-Core+Full/Microsoft.WSMan.Management/Microsoft.WSMan.Management.psd1 @@ -2,7 +2,7 @@ GUID="766204A6-330E-4263-A7AB-46C87AFC366C" Author="Microsoft Corporation" CompanyName="Microsoft Corporation" -Copyright="(c) Microsoft Corporation. All rights reserved." +Copyright="Copyright (c) Microsoft Corporation. All rights reserved." ModuleVersion="3.0.0.0" PowerShellVersion="3.0" CLRVersion="4.0" diff --git a/src/Modules/Windows-Core+Full/Microsoft.WSMan.Management/WSMan.format.ps1xml b/src/Modules/Windows-Core+Full/Microsoft.WSMan.Management/WSMan.format.ps1xml index c770f0e9769..246a7a307dc 100644 --- a/src/Modules/Windows-Core+Full/Microsoft.WSMan.Management/WSMan.format.ps1xml +++ b/src/Modules/Windows-Core+Full/Microsoft.WSMan.Management/WSMan.format.ps1xml @@ -5,7 +5,7 @@ PowerShell engine. Do not edit or change the contents of this file directly. Please see the Windows PowerShell documentation or type Get-Help Update-FormatData for more information. -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. THIS SAMPLE CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO diff --git a/src/Modules/Windows-Core+Full/PSDiagnostics/PSDiagnostics.psd1 b/src/Modules/Windows-Core+Full/PSDiagnostics/PSDiagnostics.psd1 index 44b9e292940..a84bd87f3c6 100644 --- a/src/Modules/Windows-Core+Full/PSDiagnostics/PSDiagnostics.psd1 +++ b/src/Modules/Windows-Core+Full/PSDiagnostics/PSDiagnostics.psd1 @@ -2,7 +2,7 @@ GUID="c61d6278-02a3-4618-ae37-a524d40a7f44 " Author="Microsoft Corporation" CompanyName="Microsoft Corporation" - Copyright="© Microsoft Corporation. All rights reserved." + Copyright="Copyright (c) Microsoft Corporation. All rights reserved." ModuleVersion="1.0.0.0" PowerShellVersion="2.0" CLRVersion="2.0.50727" diff --git a/src/Modules/Windows-Core/Microsoft.PowerShell.Diagnostics/GetEvent.types.ps1xml b/src/Modules/Windows-Core/Microsoft.PowerShell.Diagnostics/GetEvent.types.ps1xml index 29a42edfab1..150f184c164 100644 --- a/src/Modules/Windows-Core/Microsoft.PowerShell.Diagnostics/GetEvent.types.ps1xml +++ b/src/Modules/Windows-Core/Microsoft.PowerShell.Diagnostics/GetEvent.types.ps1xml @@ -5,7 +5,7 @@ PowerShell engine. Do not edit or change the contents of this file directly. Please see the Windows PowerShell documentation or type Get-Help Update-TypeData for more information. -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. THIS SAMPLE CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO diff --git a/src/Modules/Windows-Core/Microsoft.PowerShell.Diagnostics/Microsoft.PowerShell.Diagnostics.psd1 b/src/Modules/Windows-Core/Microsoft.PowerShell.Diagnostics/Microsoft.PowerShell.Diagnostics.psd1 index 11096b37bd1..af936717b68 100644 --- a/src/Modules/Windows-Core/Microsoft.PowerShell.Diagnostics/Microsoft.PowerShell.Diagnostics.psd1 +++ b/src/Modules/Windows-Core/Microsoft.PowerShell.Diagnostics/Microsoft.PowerShell.Diagnostics.psd1 @@ -2,7 +2,7 @@ GUID="CA046F10-CA64-4740-8FF9-2565DBA61A4F" Author="Microsoft Corporation" CompanyName="Microsoft Corporation" -Copyright="© Microsoft Corporation. All rights reserved." +Copyright="Copyright (c) Microsoft Corporation. All rights reserved." ModuleVersion="3.0.0.0" PowerShellVersion="3.0" CmdletsToExport="Get-WinEvent", "New-WinEvent" # Counter CmdLets Disabled #4272: "Get-Counter", "Import-Counter", "Export-Counter" diff --git a/src/Modules/Windows-Core/Microsoft.PowerShell.Management/Microsoft.PowerShell.Management.psd1 b/src/Modules/Windows-Core/Microsoft.PowerShell.Management/Microsoft.PowerShell.Management.psd1 index b4695877696..3c74eb69c06 100644 --- a/src/Modules/Windows-Core/Microsoft.PowerShell.Management/Microsoft.PowerShell.Management.psd1 +++ b/src/Modules/Windows-Core/Microsoft.PowerShell.Management/Microsoft.PowerShell.Management.psd1 @@ -2,7 +2,7 @@ GUID="EEFCB906-B326-4E99-9F54-8B4BB6EF3C6D" Author="Microsoft Corporation" CompanyName="Microsoft Corporation" -Copyright="(c) Microsoft Corporation. All rights reserved." +Copyright="Copyright (c) Microsoft Corporation. All rights reserved." ModuleVersion="3.1.0.0" PowerShellVersion="3.0" NestedModules="Microsoft.PowerShell.Commands.Management.dll" diff --git a/src/Modules/Windows-Core/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 b/src/Modules/Windows-Core/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 index 5309d98293b..a47f81755ab 100644 --- a/src/Modules/Windows-Core/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 +++ b/src/Modules/Windows-Core/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 @@ -2,7 +2,7 @@ GUID="1DA87E53-152B-403E-98DC-74D7B4D63D59" Author="Microsoft Corporation" CompanyName="Microsoft Corporation" -Copyright="© Microsoft Corporation. All rights reserved." +Copyright="Copyright (c) Microsoft Corporation. All rights reserved." ModuleVersion="3.1.0.0" PowerShellVersion="3.0" CmdletsToExport= "Format-List", "Format-Custom", "Format-Table", "Format-Wide", diff --git a/src/Modules/Windows-Full/Microsoft.PowerShell.Diagnostics/GetEvent.types.ps1xml b/src/Modules/Windows-Full/Microsoft.PowerShell.Diagnostics/GetEvent.types.ps1xml index d9dcc2034bb..c52b8e6c2c2 100644 --- a/src/Modules/Windows-Full/Microsoft.PowerShell.Diagnostics/GetEvent.types.ps1xml +++ b/src/Modules/Windows-Full/Microsoft.PowerShell.Diagnostics/GetEvent.types.ps1xml @@ -5,7 +5,7 @@ PowerShell engine. Do not edit or change the contents of this file directly. Please see the Windows PowerShell documentation or type Get-Help Update-TypeData for more information. -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. THIS SAMPLE CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO diff --git a/src/Modules/Windows-Full/Microsoft.PowerShell.Diagnostics/Microsoft.PowerShell.Diagnostics.psd1 b/src/Modules/Windows-Full/Microsoft.PowerShell.Diagnostics/Microsoft.PowerShell.Diagnostics.psd1 index 2b5035e6e3d..5d95cfb3a7d 100644 --- a/src/Modules/Windows-Full/Microsoft.PowerShell.Diagnostics/Microsoft.PowerShell.Diagnostics.psd1 +++ b/src/Modules/Windows-Full/Microsoft.PowerShell.Diagnostics/Microsoft.PowerShell.Diagnostics.psd1 @@ -2,7 +2,7 @@ GUID="CA046F10-CA64-4740-8FF9-2565DBA61A4F" Author="Microsoft Corporation" CompanyName="Microsoft Corporation" -Copyright="(c) Microsoft Corporation. All rights reserved." +Copyright="Copyright (c) Microsoft Corporation. All rights reserved." ModuleVersion="3.0.0.0" PowerShellVersion="3.0" CLRVersion="4.0" diff --git a/src/Modules/Windows-Full/Microsoft.PowerShell.LocalAccounts/Microsoft.PowerShell.LocalAccounts.psd1 b/src/Modules/Windows-Full/Microsoft.PowerShell.LocalAccounts/Microsoft.PowerShell.LocalAccounts.psd1 index ee3091ecc55..8f682e53675 100644 --- a/src/Modules/Windows-Full/Microsoft.PowerShell.LocalAccounts/Microsoft.PowerShell.LocalAccounts.psd1 +++ b/src/Modules/Windows-Full/Microsoft.PowerShell.LocalAccounts/Microsoft.PowerShell.LocalAccounts.psd1 @@ -4,7 +4,7 @@ ModuleVersion = '1.0.0.0' GUID = '8e362604-2c0b-448f-a414-a6a690a644e2' Author = 'Microsoft Corporation' CompanyName = 'Microsoft Corporation' -Copyright = '© Microsoft Corporation. All rights reserved.' +Copyright = 'Copyright (c) Microsoft Corporation. All rights reserved.' Description = 'Provides cmdlets to work with local users and local groups' PowerShellVersion = '3.0' CLRVersion = '4.0' diff --git a/src/Modules/Windows-Full/Microsoft.PowerShell.Management/Microsoft.PowerShell.Management.psd1 b/src/Modules/Windows-Full/Microsoft.PowerShell.Management/Microsoft.PowerShell.Management.psd1 index 18c67d3033a..1f68c7822b5 100644 --- a/src/Modules/Windows-Full/Microsoft.PowerShell.Management/Microsoft.PowerShell.Management.psd1 +++ b/src/Modules/Windows-Full/Microsoft.PowerShell.Management/Microsoft.PowerShell.Management.psd1 @@ -2,7 +2,7 @@ GUID="EEFCB906-B326-4E99-9F54-8B4BB6EF3C6D" Author="Microsoft Corporation" CompanyName="Microsoft Corporation" -Copyright="(c) Microsoft Corporation. All rights reserved." +Copyright="Copyright (c) Microsoft Corporation. All rights reserved." ModuleVersion="3.1.0.0" PowerShellVersion="3.0" CLRVersion="4.0" diff --git a/src/Modules/Windows-Full/Microsoft.PowerShell.ODataUtils/Microsoft.PowerShell.ODataUtils.psd1 b/src/Modules/Windows-Full/Microsoft.PowerShell.ODataUtils/Microsoft.PowerShell.ODataUtils.psd1 index 515040f7941..4f1b1e47012 100644 --- a/src/Modules/Windows-Full/Microsoft.PowerShell.ODataUtils/Microsoft.PowerShell.ODataUtils.psd1 +++ b/src/Modules/Windows-Full/Microsoft.PowerShell.ODataUtils/Microsoft.PowerShell.ODataUtils.psd1 @@ -22,7 +22,7 @@ Author = 'Microsoft Corporation' CompanyName = 'Microsoft Corporation' # Copyright statement for this module -Copyright = '(c) 2014 Microsoft. All rights reserved.' +Copyright = 'Copyright (c) Microsoft Corporation. All rights reserved.' # Description of the functionality provided by this module # Description = '' diff --git a/src/Modules/Windows-Full/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 b/src/Modules/Windows-Full/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 index afaafa5aed1..4a48f4ec1e7 100644 --- a/src/Modules/Windows-Full/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 +++ b/src/Modules/Windows-Full/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 @@ -2,7 +2,7 @@ GUID="1DA87E53-152B-403E-98DC-74D7B4D63D59" Author="Microsoft Corporation" CompanyName="Microsoft Corporation" -Copyright="© Microsoft Corporation. All rights reserved." +Copyright="Copyright (c) Microsoft Corporation. All rights reserved." ModuleVersion="3.1.0.0" PowerShellVersion="3.0" CLRVersion="4.0" diff --git a/src/Modules/Windows-Full/PSScheduledJob/PSScheduledJob.psd1 b/src/Modules/Windows-Full/PSScheduledJob/PSScheduledJob.psd1 index 3b7d84099de..a8ed0ab830d 100644 --- a/src/Modules/Windows-Full/PSScheduledJob/PSScheduledJob.psd1 +++ b/src/Modules/Windows-Full/PSScheduledJob/PSScheduledJob.psd1 @@ -10,7 +10,7 @@ Author = 'Microsoft Corporation' CompanyName = 'Microsoft Corporation' -Copyright = '(c) Microsoft Corporation. All rights reserved.' +Copyright = 'Copyright (c) Microsoft Corporation. All rights reserved.' PowerShellVersion = '3.0' @@ -20,8 +20,8 @@ TypesToProcess = 'PSScheduledJob.types.ps1xml' FormatsToProcess="PSScheduledJob.Format.ps1xml" -CmdletsToExport = 'New-JobTrigger', 'Add-JobTrigger', 'Remove-JobTrigger', - 'Get-JobTrigger', 'Set-JobTrigger', 'Enable-JobTrigger', +CmdletsToExport = 'New-JobTrigger', 'Add-JobTrigger', 'Remove-JobTrigger', + 'Get-JobTrigger', 'Set-JobTrigger', 'Enable-JobTrigger', 'Disable-JobTrigger', 'New-ScheduledJobOption', 'Get-ScheduledJobOption', 'Set-ScheduledJobOption', 'Register-ScheduledJob', 'Get-ScheduledJob', 'Set-ScheduledJob', 'Unregister-ScheduledJob', 'Enable-ScheduledJob', diff --git a/src/Modules/Windows-Full/PSScheduledJob/PSScheduledJob.types.ps1xml b/src/Modules/Windows-Full/PSScheduledJob/PSScheduledJob.types.ps1xml index 699af0c99d3..f8822f2c9d6 100644 --- a/src/Modules/Windows-Full/PSScheduledJob/PSScheduledJob.types.ps1xml +++ b/src/Modules/Windows-Full/PSScheduledJob/PSScheduledJob.types.ps1xml @@ -5,7 +5,7 @@ PowerShell engine. Do not edit or change the contents of this file directly. Please see the Windows PowerShell documentation or type Get-Help Update-TypeData for more information. -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. THIS SAMPLE CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO diff --git a/src/System.Management.Automation/CoreCLR/CorePsAssemblyLoadContext.cs b/src/System.Management.Automation/CoreCLR/CorePsAssemblyLoadContext.cs index f5ecd6dda8f..bbc4f565c28 100644 --- a/src/System.Management.Automation/CoreCLR/CorePsAssemblyLoadContext.cs +++ b/src/System.Management.Automation/CoreCLR/CorePsAssemblyLoadContext.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if CORECLR diff --git a/src/System.Management.Automation/CoreCLR/CorePsPlatform.cs b/src/System.Management.Automation/CoreCLR/CorePsPlatform.cs index b52996b7abe..4a21405f653 100644 --- a/src/System.Management.Automation/CoreCLR/CorePsPlatform.cs +++ b/src/System.Management.Automation/CoreCLR/CorePsPlatform.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; @@ -159,7 +159,7 @@ public static bool IsWindowsDesktop return false; #else if (_isWindowsDesktop.HasValue) { return _isWindowsDesktop.Value; } - + _isWindowsDesktop = !IsNanoServer && !IsIoT; return _isWindowsDesktop.Value; #endif diff --git a/src/System.Management.Automation/CoreCLR/CorePsStub.cs b/src/System.Management.Automation/CoreCLR/CorePsStub.cs index 0763a456fd7..f58d8d49eed 100644 --- a/src/System.Management.Automation/CoreCLR/CorePsStub.cs +++ b/src/System.Management.Automation/CoreCLR/CorePsStub.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/cimSupport/cmdletization/EnumWriter.cs b/src/System.Management.Automation/cimSupport/cmdletization/EnumWriter.cs index 571c3790ab1..9247b13fff5 100644 --- a/src/System.Management.Automation/cimSupport/cmdletization/EnumWriter.cs +++ b/src/System.Management.Automation/cimSupport/cmdletization/EnumWriter.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/cimSupport/cmdletization/MethodInvocationInfo.cs b/src/System.Management.Automation/cimSupport/cmdletization/MethodInvocationInfo.cs index 07aff7f1514..110d3a53ce4 100644 --- a/src/System.Management.Automation/cimSupport/cmdletization/MethodInvocationInfo.cs +++ b/src/System.Management.Automation/cimSupport/cmdletization/MethodInvocationInfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/cimSupport/cmdletization/MethodParameter.cs b/src/System.Management.Automation/cimSupport/cmdletization/MethodParameter.cs index 1ef45c8e530..b5599516327 100644 --- a/src/System.Management.Automation/cimSupport/cmdletization/MethodParameter.cs +++ b/src/System.Management.Automation/cimSupport/cmdletization/MethodParameter.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/cimSupport/cmdletization/MethodParametersCollection.cs b/src/System.Management.Automation/cimSupport/cmdletization/MethodParametersCollection.cs index e1f4edf84dc..fa7d0ce519d 100644 --- a/src/System.Management.Automation/cimSupport/cmdletization/MethodParametersCollection.cs +++ b/src/System.Management.Automation/cimSupport/cmdletization/MethodParametersCollection.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ namespace Microsoft.PowerShell.Cmdletization diff --git a/src/System.Management.Automation/cimSupport/cmdletization/ObjectModelWrapper.cs b/src/System.Management.Automation/cimSupport/cmdletization/ObjectModelWrapper.cs index 8a6742acde4..2dc843d567f 100644 --- a/src/System.Management.Automation/cimSupport/cmdletization/ObjectModelWrapper.cs +++ b/src/System.Management.Automation/cimSupport/cmdletization/ObjectModelWrapper.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/cimSupport/cmdletization/QueryBuilder.cs b/src/System.Management.Automation/cimSupport/cmdletization/QueryBuilder.cs index e484359f9e7..5f796332538 100644 --- a/src/System.Management.Automation/cimSupport/cmdletization/QueryBuilder.cs +++ b/src/System.Management.Automation/cimSupport/cmdletization/QueryBuilder.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/cimSupport/cmdletization/ScriptWriter.cs b/src/System.Management.Automation/cimSupport/cmdletization/ScriptWriter.cs index 2c188a7580e..a244064ebc5 100644 --- a/src/System.Management.Automation/cimSupport/cmdletization/ScriptWriter.cs +++ b/src/System.Management.Automation/cimSupport/cmdletization/ScriptWriter.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/cimSupport/cmdletization/cim/WildcardPatternToCimQueryParser.cs b/src/System.Management.Automation/cimSupport/cmdletization/cim/WildcardPatternToCimQueryParser.cs index ec4d542df2e..c5a9695e258 100644 --- a/src/System.Management.Automation/cimSupport/cmdletization/cim/WildcardPatternToCimQueryParser.cs +++ b/src/System.Management.Automation/cimSupport/cmdletization/cim/WildcardPatternToCimQueryParser.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ // TODO/FIXME: move this to Microsoft.PowerShell.Cim namespace (and move in source depot folder as well) diff --git a/src/System.Management.Automation/cimSupport/other/ciminstancetypeadapter.cs b/src/System.Management.Automation/cimSupport/other/ciminstancetypeadapter.cs index 349e734f3ec..9623adb1af3 100644 --- a/src/System.Management.Automation/cimSupport/other/ciminstancetypeadapter.cs +++ b/src/System.Management.Automation/cimSupport/other/ciminstancetypeadapter.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/BaseCommand.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/BaseCommand.cs index 9acf3a0dd20..70e9c13c0da 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/BaseCommand.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/BaseCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/BaseFormattingCommand.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/BaseFormattingCommand.cs index 4e183c2e5e0..14ca8b34fdf 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/BaseFormattingCommand.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/BaseFormattingCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/BaseFormattingCommandParameters.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/BaseFormattingCommandParameters.cs index 1d6d5289ab2..74ad087336f 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/BaseFormattingCommandParameters.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/BaseFormattingCommandParameters.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/BaseOutputtingCommand.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/BaseOutputtingCommand.cs index b9f32c91efc..48cd07c9e03 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/BaseOutputtingCommand.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/BaseOutputtingCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/ColumnWidthManager.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/ColumnWidthManager.cs index ab50d79b9f2..56687b2ae7c 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/ColumnWidthManager.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/ColumnWidthManager.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ namespace Microsoft.PowerShell.Commands.Internal.Format diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/ComplexWriter.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/ComplexWriter.cs index 027f04834fb..210754dbe2b 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/ComplexWriter.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/ComplexWriter.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/Certificate_format_ps1xml.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/Certificate_format_ps1xml.cs index f5d62ae161b..7b0a917c11a 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/Certificate_format_ps1xml.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/Certificate_format_ps1xml.cs @@ -1,6 +1,6 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/Diagnostics_Format_ps1xml.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/Diagnostics_Format_ps1xml.cs index 4b4f045816f..6a733afd4d8 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/Diagnostics_Format_ps1xml.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/Diagnostics_Format_ps1xml.cs @@ -1,6 +1,6 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/DotNetTypes_format_ps1xml.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/DotNetTypes_format_ps1xml.cs index 214c6a79359..c1be08d425e 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/DotNetTypes_format_ps1xml.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/DotNetTypes_format_ps1xml.cs @@ -1,6 +1,6 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/Event_Format_ps1xml.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/Event_Format_ps1xml.cs index ba002b20882..317cd605172 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/Event_Format_ps1xml.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/Event_Format_ps1xml.cs @@ -1,6 +1,6 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/FileSystem_format_ps1xml.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/FileSystem_format_ps1xml.cs index 8fde536a948..f2db072630b 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/FileSystem_format_ps1xml.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/FileSystem_format_ps1xml.cs @@ -1,6 +1,6 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/HelpV3_format_ps1xml.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/HelpV3_format_ps1xml.cs index 0c6456d1299..b92f990b9c4 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/HelpV3_format_ps1xml.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/HelpV3_format_ps1xml.cs @@ -1,6 +1,6 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/Help_format_ps1xml.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/Help_format_ps1xml.cs index 3240ef5d169..3e1fb82f9df 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/Help_format_ps1xml.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/Help_format_ps1xml.cs @@ -1,6 +1,6 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/PowerShellCore_format_ps1xml.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/PowerShellCore_format_ps1xml.cs index 67a6197549d..61c72950236 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/PowerShellCore_format_ps1xml.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/PowerShellCore_format_ps1xml.cs @@ -1,6 +1,6 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/PowerShellTrace_format_ps1xml.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/PowerShellTrace_format_ps1xml.cs index e9d5a975d5e..03dd42b3eb2 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/PowerShellTrace_format_ps1xml.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/PowerShellTrace_format_ps1xml.cs @@ -1,6 +1,6 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/Registry_format_ps1xml.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/Registry_format_ps1xml.cs index 08b64d6a8ca..05f07cb6c55 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/Registry_format_ps1xml.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/Registry_format_ps1xml.cs @@ -1,6 +1,6 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/WSMan_Format_ps1xml.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/WSMan_Format_ps1xml.cs index 656679fdc05..cec51adf5d1 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/WSMan_Format_ps1xml.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/WSMan_Format_ps1xml.cs @@ -1,6 +1,6 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/FormatTable.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/FormatTable.cs index 0638e5cbe6b..2cca282bf39 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/FormatTable.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/FormatTable.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Concurrent; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/XmlLoaderBase.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/XmlLoaderBase.cs index 682b09c23ab..a48c9bac7f3 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/XmlLoaderBase.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/XmlLoaderBase.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/commands.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/commands.cs index 6fd6a83d96d..bb3e60a368a 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/commands.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/commands.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionData.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionData.cs index a098b08f15f..db4b84f55dd 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionData.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionData.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ // this file contains the data structures for the in memory database diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionDataMethods.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionDataMethods.cs index 2553ddeb160..fc6e3f71720 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionDataMethods.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionDataMethods.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ namespace Microsoft.PowerShell.Commands.Internal.Format diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_Complex.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_Complex.cs index 4b6a4f94be7..642b1d5b899 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_Complex.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_Complex.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ // this file contains the data structures for the in memory database diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_List.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_List.cs index e62c649aa8d..acad22df755 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_List.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_List.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ // this file contains the data structures for the in memory database diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_Misc.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_Misc.cs index b5a2075e63e..7bebf09eda4 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_Misc.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_Misc.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ // this file contains the data structures for the in memory database diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_Table.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_Table.cs index 04a5253fda6..6a74c5b9b30 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_Table.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_Table.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ // this file contains the data structures for the in memory database diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_Wide.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_Wide.cs index 4e25bb280a1..c5560edf1f8 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_Wide.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_Wide.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ // this file contains the data structures for the in memory database diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayResourceManagerCache.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayResourceManagerCache.cs index 6d258a6d1b7..c4f4e237fdc 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayResourceManagerCache.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayResourceManagerCache.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataManager.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataManager.cs index ba4cfb49103..838ed276f19 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataManager.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataManager.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataQuery.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataQuery.cs index 020564f57ab..3467716071a 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataQuery.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataQuery.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader.cs index 09db2409f22..1e2b3edb761 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_Complex.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_Complex.cs index 87ca7024d3c..cb1fe4b71b5 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_Complex.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_Complex.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_List.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_List.cs index fdd873d6810..6c2bdf898c6 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_List.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_List.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_Table.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_Table.cs index f4bf1456e14..de895ffd890 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_Table.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_Table.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_Views.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_Views.cs index 7cb5b9341f0..4e1052281cb 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_Views.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_Views.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_Wide.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_Wide.cs index 7ee26d98dc6..38e1706b3a6 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_Wide.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_Wide.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatGroupManager.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatGroupManager.cs index e5a30101493..23081707058 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatGroupManager.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatGroupManager.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatMsgCtxManager.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatMsgCtxManager.cs index f0d96358253..24f9badc412 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatMsgCtxManager.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatMsgCtxManager.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatViewGenerator.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatViewGenerator.cs index cac517e0797..18841851b48 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatViewGenerator.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatViewGenerator.cs @@ -1,6 +1,6 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatViewGenerator_Complex.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatViewGenerator_Complex.cs index 6dda9096503..e657ea86099 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatViewGenerator_Complex.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatViewGenerator_Complex.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatViewGenerator_List.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatViewGenerator_List.cs index 890ad799f1d..f90d04d1dc2 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatViewGenerator_List.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatViewGenerator_List.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatViewGenerator_Table.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatViewGenerator_Table.cs index 86d9688f390..23450e53734 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatViewGenerator_Table.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatViewGenerator_Table.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatViewGenerator_Wide.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatViewGenerator_Wide.cs index 3cbcebe464f..b7b2d7df749 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatViewGenerator_Wide.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatViewGenerator_Wide.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatViewManager.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatViewManager.cs index f384a98e531..adca8c0bc42 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatViewManager.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatViewManager.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatXMLWriter.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatXMLWriter.cs index 117024cfd2b..b679bb9ddfa 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatXMLWriter.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatXMLWriter.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormattingObjects.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormattingObjects.cs index 73d3711efb7..7660eb45f48 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormattingObjects.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormattingObjects.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ // This file contains the definitions for the objects // used in the communication protocol between formatting diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormattingObjectsDeserializer.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormattingObjectsDeserializer.cs index 92bc60a97ac..869f1e919c9 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormattingObjectsDeserializer.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormattingObjectsDeserializer.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/ILineOutput.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/ILineOutput.cs index ec09e32266f..0919fa17a20 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/ILineOutput.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/ILineOutput.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.IO; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/ListWriter.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/ListWriter.cs index b8789a496c4..83fa285d323 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/ListWriter.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/ListWriter.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Specialized; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/OutputManager.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/OutputManager.cs index 5df77045e13..cd4adf2c332 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/OutputManager.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/OutputManager.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/OutputQueue.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/OutputQueue.cs index 47e61bd4f93..46c15e02e59 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/OutputQueue.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/OutputQueue.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/TableWriter.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/TableWriter.cs index d8c9b74fbb1..d373b121cd6 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/TableWriter.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/TableWriter.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Specialized; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/Utilities/MshObjectUtil.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/Utilities/MshObjectUtil.cs index 52d853ed4d7..37b42baf771 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/Utilities/MshObjectUtil.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/Utilities/MshObjectUtil.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/Utilities/MshParameter.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/Utilities/MshParameter.cs index fe8d2677cf4..956892e4592 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/Utilities/MshParameter.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/Utilities/MshParameter.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/Utilities/MshParameterAssociation.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/Utilities/MshParameterAssociation.cs index 1ab20dc5e77..e571c5a00a4 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/Utilities/MshParameterAssociation.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/Utilities/MshParameterAssociation.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/Utilities/Mshexpression.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/Utilities/Mshexpression.cs index d12cfe4f0ba..6def0a76b3b 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/Utilities/Mshexpression.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/Utilities/Mshexpression.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/format-default/format-default.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/format-default/format-default.cs index 656245b66d2..5d4c05dd51f 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/format-default/format-default.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/format-default/format-default.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation; diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/out-console/ConsoleLineOutput.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/out-console/ConsoleLineOutput.cs index 0513cf0bdd3..48081074267 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/out-console/ConsoleLineOutput.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/out-console/ConsoleLineOutput.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ // NOTE: define this if you want to test the output on US machine and ASCII diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/out-console/OutConsole.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/out-console/OutConsole.cs index 433176ca86c..823c5b5ea61 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/out-console/OutConsole.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/out-console/OutConsole.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ namespace Microsoft.PowerShell.Commands diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/out-textInterface/OutTextInterface.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/out-textInterface/OutTextInterface.cs index 7c3d7f88fe9..a72e34844ab 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/out-textInterface/OutTextInterface.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/out-textInterface/OutTextInterface.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/engine/AliasInfo.cs b/src/System.Management.Automation/engine/AliasInfo.cs index 54b5e4872ea..2095b707248 100644 --- a/src/System.Management.Automation/engine/AliasInfo.cs +++ b/src/System.Management.Automation/engine/AliasInfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/ApplicationInfo.cs b/src/System.Management.Automation/engine/ApplicationInfo.cs index fe918201d89..c5f0a0e8fe1 100644 --- a/src/System.Management.Automation/engine/ApplicationInfo.cs +++ b/src/System.Management.Automation/engine/ApplicationInfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Diagnostics; diff --git a/src/System.Management.Automation/engine/ArgumentTypeConverterAttribute.cs b/src/System.Management.Automation/engine/ArgumentTypeConverterAttribute.cs index b8f8393a898..95dd97d768c 100644 --- a/src/System.Management.Automation/engine/ArgumentTypeConverterAttribute.cs +++ b/src/System.Management.Automation/engine/ArgumentTypeConverterAttribute.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Globalization; diff --git a/src/System.Management.Automation/engine/Attributes.cs b/src/System.Management.Automation/engine/Attributes.cs index 730d945305c..f0022448c0c 100644 --- a/src/System.Management.Automation/engine/Attributes.cs +++ b/src/System.Management.Automation/engine/Attributes.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/AutomationEngine.cs b/src/System.Management.Automation/engine/AutomationEngine.cs index a088121d037..0b8d6770194 100644 --- a/src/System.Management.Automation/engine/AutomationEngine.cs +++ b/src/System.Management.Automation/engine/AutomationEngine.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Linq; diff --git a/src/System.Management.Automation/engine/AutomationNull.cs b/src/System.Management.Automation/engine/AutomationNull.cs index 4918c75e47d..95e1571927e 100644 --- a/src/System.Management.Automation/engine/AutomationNull.cs +++ b/src/System.Management.Automation/engine/AutomationNull.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ namespace System.Management.Automation.Internal diff --git a/src/System.Management.Automation/engine/COM/ComAdapter.cs b/src/System.Management.Automation/engine/COM/ComAdapter.cs index bdf45e61c81..afe2e2c585e 100644 --- a/src/System.Management.Automation/engine/COM/ComAdapter.cs +++ b/src/System.Management.Automation/engine/COM/ComAdapter.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/COM/ComDispatch.cs b/src/System.Management.Automation/engine/COM/ComDispatch.cs index 489e491efb2..9432d52e75d 100644 --- a/src/System.Management.Automation/engine/COM/ComDispatch.cs +++ b/src/System.Management.Automation/engine/COM/ComDispatch.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Runtime.InteropServices; diff --git a/src/System.Management.Automation/engine/COM/ComInvoker.cs b/src/System.Management.Automation/engine/COM/ComInvoker.cs index 9aa2a6c8e9c..9aaafb00f3c 100644 --- a/src/System.Management.Automation/engine/COM/ComInvoker.cs +++ b/src/System.Management.Automation/engine/COM/ComInvoker.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Linq; diff --git a/src/System.Management.Automation/engine/COM/ComMethod.cs b/src/System.Management.Automation/engine/COM/ComMethod.cs index ec09a0e83ba..bc8919fe783 100644 --- a/src/System.Management.Automation/engine/COM/ComMethod.cs +++ b/src/System.Management.Automation/engine/COM/ComMethod.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Runtime.InteropServices; diff --git a/src/System.Management.Automation/engine/COM/ComProperty.cs b/src/System.Management.Automation/engine/COM/ComProperty.cs index 70f1a828159..033afc0819c 100644 --- a/src/System.Management.Automation/engine/COM/ComProperty.cs +++ b/src/System.Management.Automation/engine/COM/ComProperty.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Runtime.InteropServices; diff --git a/src/System.Management.Automation/engine/COM/ComTypeInfo.cs b/src/System.Management.Automation/engine/COM/ComTypeInfo.cs index 971d83f89a7..58462333a9e 100644 --- a/src/System.Management.Automation/engine/COM/ComTypeInfo.cs +++ b/src/System.Management.Automation/engine/COM/ComTypeInfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Diagnostics.CodeAnalysis; diff --git a/src/System.Management.Automation/engine/COM/ComUtil.cs b/src/System.Management.Automation/engine/COM/ComUtil.cs index d77752abcc2..c493adccbd9 100644 --- a/src/System.Management.Automation/engine/COM/ComUtil.cs +++ b/src/System.Management.Automation/engine/COM/ComUtil.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Runtime.InteropServices; diff --git a/src/System.Management.Automation/engine/ChildrenCmdletProviderInterfaces.cs b/src/System.Management.Automation/engine/ChildrenCmdletProviderInterfaces.cs index a175317de47..fc7a0072569 100644 --- a/src/System.Management.Automation/engine/ChildrenCmdletProviderInterfaces.cs +++ b/src/System.Management.Automation/engine/ChildrenCmdletProviderInterfaces.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.ObjectModel; diff --git a/src/System.Management.Automation/engine/CmdletFamilyProviderInterfaces.cs b/src/System.Management.Automation/engine/CmdletFamilyProviderInterfaces.cs index e03ae8f5643..a72f220d9d3 100644 --- a/src/System.Management.Automation/engine/CmdletFamilyProviderInterfaces.cs +++ b/src/System.Management.Automation/engine/CmdletFamilyProviderInterfaces.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using Dbg = System.Management.Automation; diff --git a/src/System.Management.Automation/engine/CmdletInfo.cs b/src/System.Management.Automation/engine/CmdletInfo.cs index c7e1324f9b4..e0585b020d1 100644 --- a/src/System.Management.Automation/engine/CmdletInfo.cs +++ b/src/System.Management.Automation/engine/CmdletInfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.ObjectModel; diff --git a/src/System.Management.Automation/engine/CmdletParameterBinderController.cs b/src/System.Management.Automation/engine/CmdletParameterBinderController.cs index acf3766a3ee..b6ce8447185 100644 --- a/src/System.Management.Automation/engine/CmdletParameterBinderController.cs +++ b/src/System.Management.Automation/engine/CmdletParameterBinderController.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/CodeMethods.cs b/src/System.Management.Automation/engine/CodeMethods.cs index 89efed1638e..41207e6560e 100644 --- a/src/System.Management.Automation/engine/CodeMethods.cs +++ b/src/System.Management.Automation/engine/CodeMethods.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/engine/ComInterop/ArgBuilder.cs b/src/System.Management.Automation/engine/ComInterop/ArgBuilder.cs index aa74b1f503c..1dc962894fa 100644 --- a/src/System.Management.Automation/engine/ComInterop/ArgBuilder.cs +++ b/src/System.Management.Automation/engine/ComInterop/ArgBuilder.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT diff --git a/src/System.Management.Automation/engine/ComInterop/BoolArgBuilder.cs b/src/System.Management.Automation/engine/ComInterop/BoolArgBuilder.cs index 3884e5142d8..63862c32dd8 100644 --- a/src/System.Management.Automation/engine/ComInterop/BoolArgBuilder.cs +++ b/src/System.Management.Automation/engine/ComInterop/BoolArgBuilder.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT // ComObject diff --git a/src/System.Management.Automation/engine/ComInterop/BoundDispEvent.cs b/src/System.Management.Automation/engine/ComInterop/BoundDispEvent.cs index 63152c42e7f..8f02f894d5e 100644 --- a/src/System.Management.Automation/engine/ComInterop/BoundDispEvent.cs +++ b/src/System.Management.Automation/engine/ComInterop/BoundDispEvent.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT // ComObject diff --git a/src/System.Management.Automation/engine/ComInterop/CollectionExtensions.cs b/src/System.Management.Automation/engine/ComInterop/CollectionExtensions.cs index b3c7d7e0f06..fe585885a79 100644 --- a/src/System.Management.Automation/engine/ComInterop/CollectionExtensions.cs +++ b/src/System.Management.Automation/engine/ComInterop/CollectionExtensions.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/ComInterop/ComBinder.cs b/src/System.Management.Automation/engine/ComInterop/ComBinder.cs index cb3f103c765..f29a0ed5919 100644 --- a/src/System.Management.Automation/engine/ComInterop/ComBinder.cs +++ b/src/System.Management.Automation/engine/ComInterop/ComBinder.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT diff --git a/src/System.Management.Automation/engine/ComInterop/ComBinderHelpers.cs b/src/System.Management.Automation/engine/ComInterop/ComBinderHelpers.cs index b59fb4acd3d..dcd0bddc553 100644 --- a/src/System.Management.Automation/engine/ComInterop/ComBinderHelpers.cs +++ b/src/System.Management.Automation/engine/ComInterop/ComBinderHelpers.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT diff --git a/src/System.Management.Automation/engine/ComInterop/ComClassMetaObject.cs b/src/System.Management.Automation/engine/ComInterop/ComClassMetaObject.cs index 32029435f40..d3a05741b5f 100644 --- a/src/System.Management.Automation/engine/ComInterop/ComClassMetaObject.cs +++ b/src/System.Management.Automation/engine/ComInterop/ComClassMetaObject.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT // ComObject diff --git a/src/System.Management.Automation/engine/ComInterop/ComDispIds.cs b/src/System.Management.Automation/engine/ComInterop/ComDispIds.cs index 6092d81d42b..5bc812c2368 100644 --- a/src/System.Management.Automation/engine/ComInterop/ComDispIds.cs +++ b/src/System.Management.Automation/engine/ComInterop/ComDispIds.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT // ComObject diff --git a/src/System.Management.Automation/engine/ComInterop/ComEventDesc.cs b/src/System.Management.Automation/engine/ComInterop/ComEventDesc.cs index 3c77c81bba4..2c89c19df11 100644 --- a/src/System.Management.Automation/engine/ComInterop/ComEventDesc.cs +++ b/src/System.Management.Automation/engine/ComInterop/ComEventDesc.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT // ComObject diff --git a/src/System.Management.Automation/engine/ComInterop/ComEventSink.cs b/src/System.Management.Automation/engine/ComInterop/ComEventSink.cs index cd9ba2be792..0c07aa382b2 100644 --- a/src/System.Management.Automation/engine/ComInterop/ComEventSink.cs +++ b/src/System.Management.Automation/engine/ComInterop/ComEventSink.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT // ComObject diff --git a/src/System.Management.Automation/engine/ComInterop/ComEventSinkProxy.cs b/src/System.Management.Automation/engine/ComInterop/ComEventSinkProxy.cs index 568b271ff1f..34201592240 100644 --- a/src/System.Management.Automation/engine/ComInterop/ComEventSinkProxy.cs +++ b/src/System.Management.Automation/engine/ComInterop/ComEventSinkProxy.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT // ComObject diff --git a/src/System.Management.Automation/engine/ComInterop/ComEventSinksContainer.cs b/src/System.Management.Automation/engine/ComInterop/ComEventSinksContainer.cs index e2e0afa7e1b..f406ac042ff 100644 --- a/src/System.Management.Automation/engine/ComInterop/ComEventSinksContainer.cs +++ b/src/System.Management.Automation/engine/ComInterop/ComEventSinksContainer.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT // ComObject diff --git a/src/System.Management.Automation/engine/ComInterop/ComFallbackMetaObject.cs b/src/System.Management.Automation/engine/ComInterop/ComFallbackMetaObject.cs index 44fec0fdc4b..bb4275a9b4d 100644 --- a/src/System.Management.Automation/engine/ComInterop/ComFallbackMetaObject.cs +++ b/src/System.Management.Automation/engine/ComInterop/ComFallbackMetaObject.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT diff --git a/src/System.Management.Automation/engine/ComInterop/ComHresults.cs b/src/System.Management.Automation/engine/ComInterop/ComHresults.cs index c90954cc54f..32ef9ffae18 100644 --- a/src/System.Management.Automation/engine/ComInterop/ComHresults.cs +++ b/src/System.Management.Automation/engine/ComInterop/ComHresults.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT // ComObject diff --git a/src/System.Management.Automation/engine/ComInterop/ComInterop.cs b/src/System.Management.Automation/engine/ComInterop/ComInterop.cs index aa551258156..3f4b5f9b66c 100644 --- a/src/System.Management.Automation/engine/ComInterop/ComInterop.cs +++ b/src/System.Management.Automation/engine/ComInterop/ComInterop.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT // ComObject diff --git a/src/System.Management.Automation/engine/ComInterop/ComInvokeAction.cs b/src/System.Management.Automation/engine/ComInterop/ComInvokeAction.cs index 2fe87df0c1a..d46b69393e4 100644 --- a/src/System.Management.Automation/engine/ComInterop/ComInvokeAction.cs +++ b/src/System.Management.Automation/engine/ComInterop/ComInvokeAction.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT diff --git a/src/System.Management.Automation/engine/ComInterop/ComInvokeBinder.cs b/src/System.Management.Automation/engine/ComInterop/ComInvokeBinder.cs index 4559b9702da..2d2e2ba6f09 100644 --- a/src/System.Management.Automation/engine/ComInterop/ComInvokeBinder.cs +++ b/src/System.Management.Automation/engine/ComInterop/ComInvokeBinder.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT diff --git a/src/System.Management.Automation/engine/ComInterop/ComMetaObject.cs b/src/System.Management.Automation/engine/ComInterop/ComMetaObject.cs index 79c7a55bbd7..a4a59237110 100644 --- a/src/System.Management.Automation/engine/ComInterop/ComMetaObject.cs +++ b/src/System.Management.Automation/engine/ComInterop/ComMetaObject.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT diff --git a/src/System.Management.Automation/engine/ComInterop/ComMethodDesc.cs b/src/System.Management.Automation/engine/ComInterop/ComMethodDesc.cs index 1b1716d13f5..e2c068c1574 100644 --- a/src/System.Management.Automation/engine/ComInterop/ComMethodDesc.cs +++ b/src/System.Management.Automation/engine/ComInterop/ComMethodDesc.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT // ComObject diff --git a/src/System.Management.Automation/engine/ComInterop/ComObject.cs b/src/System.Management.Automation/engine/ComInterop/ComObject.cs index 701e504c12c..56dee24f82a 100644 --- a/src/System.Management.Automation/engine/ComInterop/ComObject.cs +++ b/src/System.Management.Automation/engine/ComInterop/ComObject.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT // ComObject diff --git a/src/System.Management.Automation/engine/ComInterop/ComParamDesc.cs b/src/System.Management.Automation/engine/ComInterop/ComParamDesc.cs index 04b0a9794a5..6a77be6c0e0 100644 --- a/src/System.Management.Automation/engine/ComInterop/ComParamDesc.cs +++ b/src/System.Management.Automation/engine/ComInterop/ComParamDesc.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT // ComObject diff --git a/src/System.Management.Automation/engine/ComInterop/ComRuntimeHelpers.cs b/src/System.Management.Automation/engine/ComInterop/ComRuntimeHelpers.cs index 8933c4759b1..1a25ca4b101 100644 --- a/src/System.Management.Automation/engine/ComInterop/ComRuntimeHelpers.cs +++ b/src/System.Management.Automation/engine/ComInterop/ComRuntimeHelpers.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT // ComObject diff --git a/src/System.Management.Automation/engine/ComInterop/ComType.cs b/src/System.Management.Automation/engine/ComInterop/ComType.cs index 97ab2736567..dcb78c02444 100644 --- a/src/System.Management.Automation/engine/ComInterop/ComType.cs +++ b/src/System.Management.Automation/engine/ComInterop/ComType.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT // ComObject diff --git a/src/System.Management.Automation/engine/ComInterop/ComTypeClassDesc.cs b/src/System.Management.Automation/engine/ComInterop/ComTypeClassDesc.cs index 36c8c01323f..c9a9f256f86 100644 --- a/src/System.Management.Automation/engine/ComInterop/ComTypeClassDesc.cs +++ b/src/System.Management.Automation/engine/ComInterop/ComTypeClassDesc.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT // ComObject diff --git a/src/System.Management.Automation/engine/ComInterop/ComTypeDesc.cs b/src/System.Management.Automation/engine/ComInterop/ComTypeDesc.cs index cc3b9e77bfb..36de3e94ef8 100644 --- a/src/System.Management.Automation/engine/ComInterop/ComTypeDesc.cs +++ b/src/System.Management.Automation/engine/ComInterop/ComTypeDesc.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT // ComObject diff --git a/src/System.Management.Automation/engine/ComInterop/ComTypeEnumDesc.cs b/src/System.Management.Automation/engine/ComInterop/ComTypeEnumDesc.cs index 79a518ef139..1b8e08a9333 100644 --- a/src/System.Management.Automation/engine/ComInterop/ComTypeEnumDesc.cs +++ b/src/System.Management.Automation/engine/ComInterop/ComTypeEnumDesc.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT // ComObject diff --git a/src/System.Management.Automation/engine/ComInterop/ComTypeLibDesc.cs b/src/System.Management.Automation/engine/ComInterop/ComTypeLibDesc.cs index dd4d094f161..c6c958aa039 100644 --- a/src/System.Management.Automation/engine/ComInterop/ComTypeLibDesc.cs +++ b/src/System.Management.Automation/engine/ComInterop/ComTypeLibDesc.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT // ComObject diff --git a/src/System.Management.Automation/engine/ComInterop/ComTypeLibInfo.cs b/src/System.Management.Automation/engine/ComInterop/ComTypeLibInfo.cs index 8a3f793ecc1..6b55866bbab 100644 --- a/src/System.Management.Automation/engine/ComInterop/ComTypeLibInfo.cs +++ b/src/System.Management.Automation/engine/ComInterop/ComTypeLibInfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT // ComObject diff --git a/src/System.Management.Automation/engine/ComInterop/ComTypeLibMemberDesc.cs b/src/System.Management.Automation/engine/ComInterop/ComTypeLibMemberDesc.cs index 3ce59e59130..c211328d808 100644 --- a/src/System.Management.Automation/engine/ComInterop/ComTypeLibMemberDesc.cs +++ b/src/System.Management.Automation/engine/ComInterop/ComTypeLibMemberDesc.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT // ComObject diff --git a/src/System.Management.Automation/engine/ComInterop/ConversionArgBuilder.cs b/src/System.Management.Automation/engine/ComInterop/ConversionArgBuilder.cs index 1ac97d3dfbf..13f2240719b 100644 --- a/src/System.Management.Automation/engine/ComInterop/ConversionArgBuilder.cs +++ b/src/System.Management.Automation/engine/ComInterop/ConversionArgBuilder.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT diff --git a/src/System.Management.Automation/engine/ComInterop/ConvertArgBuilder.cs b/src/System.Management.Automation/engine/ComInterop/ConvertArgBuilder.cs index ba80b0abcc9..2d685a3dfe4 100644 --- a/src/System.Management.Automation/engine/ComInterop/ConvertArgBuilder.cs +++ b/src/System.Management.Automation/engine/ComInterop/ConvertArgBuilder.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT diff --git a/src/System.Management.Automation/engine/ComInterop/ConvertibleArgBuilder.cs b/src/System.Management.Automation/engine/ComInterop/ConvertibleArgBuilder.cs index 5a74242f944..c58b3ddb0ea 100644 --- a/src/System.Management.Automation/engine/ComInterop/ConvertibleArgBuilder.cs +++ b/src/System.Management.Automation/engine/ComInterop/ConvertibleArgBuilder.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT diff --git a/src/System.Management.Automation/engine/ComInterop/CurrencyArgBuilder.cs b/src/System.Management.Automation/engine/ComInterop/CurrencyArgBuilder.cs index 7706046fb29..a37ea0effcf 100644 --- a/src/System.Management.Automation/engine/ComInterop/CurrencyArgBuilder.cs +++ b/src/System.Management.Automation/engine/ComInterop/CurrencyArgBuilder.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT // ComObject diff --git a/src/System.Management.Automation/engine/ComInterop/DateTimeArgBuilder.cs b/src/System.Management.Automation/engine/ComInterop/DateTimeArgBuilder.cs index d9b6ba4638c..1613f8640da 100644 --- a/src/System.Management.Automation/engine/ComInterop/DateTimeArgBuilder.cs +++ b/src/System.Management.Automation/engine/ComInterop/DateTimeArgBuilder.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT // ComObject diff --git a/src/System.Management.Automation/engine/ComInterop/DispCallable.cs b/src/System.Management.Automation/engine/ComInterop/DispCallable.cs index 3299286bfc8..fcbce35eca7 100644 --- a/src/System.Management.Automation/engine/ComInterop/DispCallable.cs +++ b/src/System.Management.Automation/engine/ComInterop/DispCallable.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT // ComObject diff --git a/src/System.Management.Automation/engine/ComInterop/DispCallableMetaObject.cs b/src/System.Management.Automation/engine/ComInterop/DispCallableMetaObject.cs index 9942a224c73..54fdc53a8e8 100644 --- a/src/System.Management.Automation/engine/ComInterop/DispCallableMetaObject.cs +++ b/src/System.Management.Automation/engine/ComInterop/DispCallableMetaObject.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT diff --git a/src/System.Management.Automation/engine/ComInterop/DispatchArgBuilder.cs b/src/System.Management.Automation/engine/ComInterop/DispatchArgBuilder.cs index 69e304def08..08b95e3da36 100644 --- a/src/System.Management.Automation/engine/ComInterop/DispatchArgBuilder.cs +++ b/src/System.Management.Automation/engine/ComInterop/DispatchArgBuilder.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT // ComObject diff --git a/src/System.Management.Automation/engine/ComInterop/ErrorArgBuilder.cs b/src/System.Management.Automation/engine/ComInterop/ErrorArgBuilder.cs index d50c1f624ce..b25996031c2 100644 --- a/src/System.Management.Automation/engine/ComInterop/ErrorArgBuilder.cs +++ b/src/System.Management.Automation/engine/ComInterop/ErrorArgBuilder.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT // ComObject diff --git a/src/System.Management.Automation/engine/ComInterop/Errors.cs b/src/System.Management.Automation/engine/ComInterop/Errors.cs index 6e774e384cb..3b1024fc5d3 100644 --- a/src/System.Management.Automation/engine/ComInterop/Errors.cs +++ b/src/System.Management.Automation/engine/ComInterop/Errors.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ namespace System.Management.Automation.ComInterop diff --git a/src/System.Management.Automation/engine/ComInterop/ExcepInfo.cs b/src/System.Management.Automation/engine/ComInterop/ExcepInfo.cs index e529935a3b7..048eb869a41 100644 --- a/src/System.Management.Automation/engine/ComInterop/ExcepInfo.cs +++ b/src/System.Management.Automation/engine/ComInterop/ExcepInfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT // ComObject diff --git a/src/System.Management.Automation/engine/ComInterop/Helpers.cs b/src/System.Management.Automation/engine/ComInterop/Helpers.cs index 36467c914f0..ba3af47c0ef 100644 --- a/src/System.Management.Automation/engine/ComInterop/Helpers.cs +++ b/src/System.Management.Automation/engine/ComInterop/Helpers.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !CLR2 diff --git a/src/System.Management.Automation/engine/ComInterop/IDispatchComObject.cs b/src/System.Management.Automation/engine/ComInterop/IDispatchComObject.cs index fa4537a6c36..747abea2152 100644 --- a/src/System.Management.Automation/engine/ComInterop/IDispatchComObject.cs +++ b/src/System.Management.Automation/engine/ComInterop/IDispatchComObject.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT // ComObject diff --git a/src/System.Management.Automation/engine/ComInterop/IDispatchMetaObject.cs b/src/System.Management.Automation/engine/ComInterop/IDispatchMetaObject.cs index 59b3259bb8b..74f5e383441 100644 --- a/src/System.Management.Automation/engine/ComInterop/IDispatchMetaObject.cs +++ b/src/System.Management.Automation/engine/ComInterop/IDispatchMetaObject.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT // ComObject diff --git a/src/System.Management.Automation/engine/ComInterop/IPseudoComObject.cs b/src/System.Management.Automation/engine/ComInterop/IPseudoComObject.cs index 9fdfb252bbc..f41af694c08 100644 --- a/src/System.Management.Automation/engine/ComInterop/IPseudoComObject.cs +++ b/src/System.Management.Automation/engine/ComInterop/IPseudoComObject.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !CLR2 diff --git a/src/System.Management.Automation/engine/ComInterop/NullArgBuilder.cs b/src/System.Management.Automation/engine/ComInterop/NullArgBuilder.cs index fe75783a99f..f4a7e2aac0e 100644 --- a/src/System.Management.Automation/engine/ComInterop/NullArgBuilder.cs +++ b/src/System.Management.Automation/engine/ComInterop/NullArgBuilder.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT diff --git a/src/System.Management.Automation/engine/ComInterop/SimpleArgBuilder.cs b/src/System.Management.Automation/engine/ComInterop/SimpleArgBuilder.cs index 247f04ef022..3f1539ed638 100644 --- a/src/System.Management.Automation/engine/ComInterop/SimpleArgBuilder.cs +++ b/src/System.Management.Automation/engine/ComInterop/SimpleArgBuilder.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT diff --git a/src/System.Management.Automation/engine/ComInterop/SplatCallSite.cs b/src/System.Management.Automation/engine/ComInterop/SplatCallSite.cs index 8490828489a..26aa920051f 100644 --- a/src/System.Management.Automation/engine/ComInterop/SplatCallSite.cs +++ b/src/System.Management.Automation/engine/ComInterop/SplatCallSite.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !CLR2 diff --git a/src/System.Management.Automation/engine/ComInterop/StringArgBuilder.cs b/src/System.Management.Automation/engine/ComInterop/StringArgBuilder.cs index 5fd84860164..e47a08cb0e7 100644 --- a/src/System.Management.Automation/engine/ComInterop/StringArgBuilder.cs +++ b/src/System.Management.Automation/engine/ComInterop/StringArgBuilder.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT // ComObject diff --git a/src/System.Management.Automation/engine/ComInterop/TypeEnumMetaObject.cs b/src/System.Management.Automation/engine/ComInterop/TypeEnumMetaObject.cs index cc22f40b303..91998b05083 100644 --- a/src/System.Management.Automation/engine/ComInterop/TypeEnumMetaObject.cs +++ b/src/System.Management.Automation/engine/ComInterop/TypeEnumMetaObject.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT diff --git a/src/System.Management.Automation/engine/ComInterop/TypeLibInfoMetaObject.cs b/src/System.Management.Automation/engine/ComInterop/TypeLibInfoMetaObject.cs index 8f0a111418b..412aa96c2cb 100644 --- a/src/System.Management.Automation/engine/ComInterop/TypeLibInfoMetaObject.cs +++ b/src/System.Management.Automation/engine/ComInterop/TypeLibInfoMetaObject.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT diff --git a/src/System.Management.Automation/engine/ComInterop/TypeLibMetaObject.cs b/src/System.Management.Automation/engine/ComInterop/TypeLibMetaObject.cs index bc02ba463ee..1312e875a55 100644 --- a/src/System.Management.Automation/engine/ComInterop/TypeLibMetaObject.cs +++ b/src/System.Management.Automation/engine/ComInterop/TypeLibMetaObject.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT diff --git a/src/System.Management.Automation/engine/ComInterop/TypeUtils.cs b/src/System.Management.Automation/engine/ComInterop/TypeUtils.cs index 2d4dc08871c..a8ccd09ee62 100644 --- a/src/System.Management.Automation/engine/ComInterop/TypeUtils.cs +++ b/src/System.Management.Automation/engine/ComInterop/TypeUtils.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !CLR2 diff --git a/src/System.Management.Automation/engine/ComInterop/UnknownArgBuilder.cs b/src/System.Management.Automation/engine/ComInterop/UnknownArgBuilder.cs index a603e932833..b2ee61a17ad 100644 --- a/src/System.Management.Automation/engine/ComInterop/UnknownArgBuilder.cs +++ b/src/System.Management.Automation/engine/ComInterop/UnknownArgBuilder.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT // ComObject diff --git a/src/System.Management.Automation/engine/ComInterop/VarEnumSelector.cs b/src/System.Management.Automation/engine/ComInterop/VarEnumSelector.cs index 878d538bec8..f95cace3ba3 100644 --- a/src/System.Management.Automation/engine/ComInterop/VarEnumSelector.cs +++ b/src/System.Management.Automation/engine/ComInterop/VarEnumSelector.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT // ComObject diff --git a/src/System.Management.Automation/engine/ComInterop/Variant.cs b/src/System.Management.Automation/engine/ComInterop/Variant.cs index f6c897ea8d3..b0ddecb82f9 100644 --- a/src/System.Management.Automation/engine/ComInterop/Variant.cs +++ b/src/System.Management.Automation/engine/ComInterop/Variant.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT // ComObject diff --git a/src/System.Management.Automation/engine/ComInterop/VariantArgBuilder.cs b/src/System.Management.Automation/engine/ComInterop/VariantArgBuilder.cs index f8aaccc42ea..caf9a0c5c65 100644 --- a/src/System.Management.Automation/engine/ComInterop/VariantArgBuilder.cs +++ b/src/System.Management.Automation/engine/ComInterop/VariantArgBuilder.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT // ComObject diff --git a/src/System.Management.Automation/engine/ComInterop/VariantArray.cs b/src/System.Management.Automation/engine/ComInterop/VariantArray.cs index 742b9bb847c..b2af22aa9ba 100644 --- a/src/System.Management.Automation/engine/ComInterop/VariantArray.cs +++ b/src/System.Management.Automation/engine/ComInterop/VariantArray.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT // ComObject diff --git a/src/System.Management.Automation/engine/ComInterop/VariantBuilder.cs b/src/System.Management.Automation/engine/ComInterop/VariantBuilder.cs index 17c8d823de3..f8177844c3f 100644 --- a/src/System.Management.Automation/engine/ComInterop/VariantBuilder.cs +++ b/src/System.Management.Automation/engine/ComInterop/VariantBuilder.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #if !SILVERLIGHT // ComObject diff --git a/src/System.Management.Automation/engine/CommandBase.cs b/src/System.Management.Automation/engine/CommandBase.cs index d23656a9a10..6732409b6e2 100644 --- a/src/System.Management.Automation/engine/CommandBase.cs +++ b/src/System.Management.Automation/engine/CommandBase.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.ObjectModel; diff --git a/src/System.Management.Automation/engine/CommandCompletion/CommandCompletion.cs b/src/System.Management.Automation/engine/CommandCompletion/CommandCompletion.cs index ead3ac08bb8..ee1c55290dc 100644 --- a/src/System.Management.Automation/engine/CommandCompletion/CommandCompletion.cs +++ b/src/System.Management.Automation/engine/CommandCompletion/CommandCompletion.cs @@ -1,6 +1,6 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.ObjectModel; diff --git a/src/System.Management.Automation/engine/CommandCompletion/CompletionAnalysis.cs b/src/System.Management.Automation/engine/CommandCompletion/CompletionAnalysis.cs index e63f3a3c5d1..7dbee431f2e 100644 --- a/src/System.Management.Automation/engine/CommandCompletion/CompletionAnalysis.cs +++ b/src/System.Management.Automation/engine/CommandCompletion/CompletionAnalysis.cs @@ -1,6 +1,6 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; @@ -471,11 +471,11 @@ internal List GetResultHelper(CompletionContext completionCont } break; case TokenKind.AtCurly: - // Handle scenarios such as 'Sort-Object @{' and 'gci | Format-Table @{' + // Handle scenarios such as 'Sort-Object @{' and 'gci | Format-Table @{' result = GetResultForHashtable(completionContext); replacementIndex += 2; replacementLength = 0; - break; + break; case TokenKind.Number: // Handle scenarios such as Get-Process -Id 5 || Get-Process -Id 5210, 3 || Get-Process -Id: 5210, 3 diff --git a/src/System.Management.Automation/engine/CommandCompletion/CompletionCompleters.cs b/src/System.Management.Automation/engine/CommandCompletion/CompletionCompleters.cs index 4ce76a9a88d..39a9860df95 100644 --- a/src/System.Management.Automation/engine/CommandCompletion/CompletionCompleters.cs +++ b/src/System.Management.Automation/engine/CommandCompletion/CompletionCompleters.cs @@ -1,6 +1,6 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/CommandCompletion/CompletionResult.cs b/src/System.Management.Automation/engine/CommandCompletion/CompletionResult.cs index 78225e80f50..fd9cf08a69f 100644 --- a/src/System.Management.Automation/engine/CommandCompletion/CompletionResult.cs +++ b/src/System.Management.Automation/engine/CommandCompletion/CompletionResult.cs @@ -1,6 +1,6 @@ //----------------------------------------------------------------------- // -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // // // Implements CompletionResult. diff --git a/src/System.Management.Automation/engine/CommandCompletion/ExtensibleCompletion.cs b/src/System.Management.Automation/engine/CommandCompletion/ExtensibleCompletion.cs index 18dce545a42..337a2dde206 100644 --- a/src/System.Management.Automation/engine/CommandCompletion/ExtensibleCompletion.cs +++ b/src/System.Management.Automation/engine/CommandCompletion/ExtensibleCompletion.cs @@ -1,6 +1,6 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/CommandCompletion/PseudoParameterBinder.cs b/src/System.Management.Automation/engine/CommandCompletion/PseudoParameterBinder.cs index 811136ed31f..4cc7f1a09bc 100644 --- a/src/System.Management.Automation/engine/CommandCompletion/PseudoParameterBinder.cs +++ b/src/System.Management.Automation/engine/CommandCompletion/PseudoParameterBinder.cs @@ -1,6 +1,6 @@  /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Globalization; diff --git a/src/System.Management.Automation/engine/CommandDiscovery.cs b/src/System.Management.Automation/engine/CommandDiscovery.cs index d8d4a1c8fd4..2586900c8ac 100644 --- a/src/System.Management.Automation/engine/CommandDiscovery.cs +++ b/src/System.Management.Automation/engine/CommandDiscovery.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/CommandFactory.cs b/src/System.Management.Automation/engine/CommandFactory.cs index 9615ac9107c..1cf2e3de671 100644 --- a/src/System.Management.Automation/engine/CommandFactory.cs +++ b/src/System.Management.Automation/engine/CommandFactory.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ namespace System.Management.Automation diff --git a/src/System.Management.Automation/engine/CommandInfo.cs b/src/System.Management.Automation/engine/CommandInfo.cs index 278e3e5a196..5f3f60db556 100644 --- a/src/System.Management.Automation/engine/CommandInfo.cs +++ b/src/System.Management.Automation/engine/CommandInfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/CommandMetadata.cs b/src/System.Management.Automation/engine/CommandMetadata.cs index 9eec48450d5..d9ddfb3cf2e 100644 --- a/src/System.Management.Automation/engine/CommandMetadata.cs +++ b/src/System.Management.Automation/engine/CommandMetadata.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/CommandParameter.cs b/src/System.Management.Automation/engine/CommandParameter.cs index ec4801a59e3..f753bbc42bf 100644 --- a/src/System.Management.Automation/engine/CommandParameter.cs +++ b/src/System.Management.Automation/engine/CommandParameter.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Diagnostics; diff --git a/src/System.Management.Automation/engine/CommandPathSearch.cs b/src/System.Management.Automation/engine/CommandPathSearch.cs index 75a27f03b20..b53a665fdbb 100644 --- a/src/System.Management.Automation/engine/CommandPathSearch.cs +++ b/src/System.Management.Automation/engine/CommandPathSearch.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/CommandProcessor.cs b/src/System.Management.Automation/engine/CommandProcessor.cs index bb283162b5d..9fec56133d5 100644 --- a/src/System.Management.Automation/engine/CommandProcessor.cs +++ b/src/System.Management.Automation/engine/CommandProcessor.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/CommandProcessorBase.cs b/src/System.Management.Automation/engine/CommandProcessorBase.cs index a9e77b6c9b1..924d1e858b2 100644 --- a/src/System.Management.Automation/engine/CommandProcessorBase.cs +++ b/src/System.Management.Automation/engine/CommandProcessorBase.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/CommandSearcher.cs b/src/System.Management.Automation/engine/CommandSearcher.cs index 05fcb272554..5c0dc3418d2 100644 --- a/src/System.Management.Automation/engine/CommandSearcher.cs +++ b/src/System.Management.Automation/engine/CommandSearcher.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/CommonCommandParameters.cs b/src/System.Management.Automation/engine/CommonCommandParameters.cs index b084a1a9235..b1af3628221 100644 --- a/src/System.Management.Automation/engine/CommonCommandParameters.cs +++ b/src/System.Management.Automation/engine/CommonCommandParameters.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/CompiledCommandParameter.cs b/src/System.Management.Automation/engine/CompiledCommandParameter.cs index a813cf817b6..a8a4eb097d1 100644 --- a/src/System.Management.Automation/engine/CompiledCommandParameter.cs +++ b/src/System.Management.Automation/engine/CompiledCommandParameter.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/ConfigurationInfo.cs b/src/System.Management.Automation/engine/ConfigurationInfo.cs index a7633f3283d..4b02416c208 100644 --- a/src/System.Management.Automation/engine/ConfigurationInfo.cs +++ b/src/System.Management.Automation/engine/ConfigurationInfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ namespace System.Management.Automation diff --git a/src/System.Management.Automation/engine/ContentCmdletProviderInterfaces.cs b/src/System.Management.Automation/engine/ContentCmdletProviderInterfaces.cs index 51e0640cb6e..e115e69cedb 100644 --- a/src/System.Management.Automation/engine/ContentCmdletProviderInterfaces.cs +++ b/src/System.Management.Automation/engine/ContentCmdletProviderInterfaces.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.ObjectModel; diff --git a/src/System.Management.Automation/engine/CoreAdapter.cs b/src/System.Management.Automation/engine/CoreAdapter.cs index 8de45b9c69e..f4f942076ce 100644 --- a/src/System.Management.Automation/engine/CoreAdapter.cs +++ b/src/System.Management.Automation/engine/CoreAdapter.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Concurrent; @@ -31,7 +31,7 @@ namespace System.Management.Automation { /// /// Base class for all Adapters - /// This is the place to look every time you create a new Adapter. Consider if you + /// This is the place to look every time you create a new Adapter. Consider if you /// should implement each of the virtual methods here. /// The base class deals with errors and performs additional operations before and after /// calling the derived virtual methods. @@ -96,7 +96,7 @@ protected virtual ConsolidatedString GetInternedTypeNameHierarchy(object obj) /// in the first call to GetMember and GetMembers so that subsequent /// calls can use the cache. /// In the case of the .NET adapter that would be a cache from the .NET type to - /// the public properties and fields available in that type. + /// the public properties and fields available in that type. /// In the case of the DirectoryEntry adapter, this could be a cache of the objectClass /// to the properties available in it. /// @@ -319,7 +319,7 @@ protected virtual string ParameterizedPropertyToString(PSParameterizedProperty p throw PSTraceSource.NewNotSupportedException(); } - #endregion parameterized property + #endregion parameterized property #endregion virtual @@ -1116,7 +1116,7 @@ private static bool IsInvocationTargetConstraintSatisfied(MethodInformation meth } // Dual-purpose of ([type]).method() syntax makes this code a little bit tricky to understand. - // First purpose of this syntax is cast. + // First purpose of this syntax is cast. // Second is a non-virtual super-class method call. // // Consider this code: @@ -1126,12 +1126,12 @@ private static bool IsInvocationTargetConstraintSatisfied(MethodInformation meth // [string]foo() {return 'B.foo'} // [string]foo($a) {return 'B.foo'} // } - // + // // class Q : B { // [string]$Name // Q([string]$name) {$this.name = $name} // } - // + // // ([Q]'t').foo() // ``` // @@ -1139,7 +1139,7 @@ private static bool IsInvocationTargetConstraintSatisfied(MethodInformation meth // So methodDeclaringType is [B] and targetType is [Q] // // Now consider another code - // + // // ``` // ([object]"abc").ToString() // ``` @@ -1565,7 +1565,7 @@ internal static MethodInformation GetBestMethodAndArguments( /// /// Called in GetBestMethodAndArguments after a call to FindBestMethod to perform the /// type conversion, copying(varArg) and optional value setting of the final arguments. - /// + /// internal static object[] GetMethodArgumentsBase(string methodName, ParameterInformation[] parameters, object[] arguments, bool expandParamsOnBest) @@ -1751,7 +1751,7 @@ internal static object PropertySetAndMethodArgumentConvertTo(object valueToConve if (resultType == typeof(object)) { PSObject.memberResolution.WriteLine("Parameter was an PSObject and will be converted to System.Object."); - // we use PSObject.Base so we don't return + // we use PSObject.Base so we don't return // PSCustomObject return PSObject.Base(mshObj); } @@ -2815,8 +2815,8 @@ private static void PopulateMethodReflectionTable(Type type, CacheTable typeMeth { var typeInfo = type.GetTypeInfo(); Type typeToGetMethod = type; -#if CORECLR - // Assemblies in CoreCLR might not allow reflection execution on their internal types. In such case, we walk up +#if CORECLR + // Assemblies in CoreCLR might not allow reflection execution on their internal types. In such case, we walk up // the derivation chain to find the first public parent, and use reflection methods on the public parent. if (!TypeResolver.IsPublic(typeInfo) && DisallowPrivateReflection(typeInfo)) { @@ -2911,8 +2911,8 @@ private static void PopulateMethodReflectionTable(Type type, CacheTable typeMeth /// bindingFlags to use private static void PopulateEventReflectionTable(Type type, Dictionary typeEvents, BindingFlags bindingFlags) { -#if CORECLR - // Assemblies in CoreCLR might not allow reflection execution on their internal types. In such case, we walk up +#if CORECLR + // Assemblies in CoreCLR might not allow reflection execution on their internal types. In such case, we walk up // the derivation chain to find the first public parent, and use reflection events on the public parent. TypeInfo typeInfo = type.GetTypeInfo(); if (!TypeResolver.IsPublic(typeInfo) && DisallowPrivateReflection(typeInfo)) @@ -2954,7 +2954,7 @@ private static void PopulateEventReflectionTable(Type type, Dictionary private static bool PropertyAlreadyPresent(List previousProperties, PropertyInfo property) { - // The loop below + // The loop below bool returnValue = false; ParameterInfo[] propertyParameters = property.GetIndexParameters(); int propertyIndexLength = propertyParameters.Length; @@ -2998,7 +2998,7 @@ private static void PopulatePropertyReflectionTable(Type type, CacheTable typePr { var tempTable = new Dictionary>(StringComparer.OrdinalIgnoreCase); Type typeToGetPropertyAndField = type; -#if CORECLR +#if CORECLR // Assemblies in CoreCLR might not allow reflection execution on their internal types. In such case, we walk up the // derivation chain to find the first public parent, and use reflection properties/fileds on the public parent. TypeInfo typeInfo = type.GetTypeInfo(); @@ -3563,7 +3563,7 @@ protected override T GetMember(object obj, string memberName) /// in the first call to GetMember and GetMembers so that subsequent /// calls can use the cache. /// In the case of the .NET adapter that would be a cache from the .NET type to - /// the public properties and fields available in that type. + /// the public properties and fields available in that type. /// In the case of the DirectoryEntry adapter, this could be a cache of the objectClass /// to the properties available in it. /// @@ -3832,7 +3832,7 @@ internal static object AuxiliaryMethodInvoke(object target, object[] arguments, methodInformation.method.Name, arguments.Length, inner.Message); } // - // Note that FlowControlException, ScriptCallDepthException and ParameterBindingException will be wrapped in + // Note that FlowControlException, ScriptCallDepthException and ParameterBindingException will be wrapped in // a TargetInvocationException only when the invocation uses reflection so we need to bubble them up here as well. // catch (ParameterBindingException) { throw; } @@ -3942,7 +3942,7 @@ private static object InvokeResolvedConstructor(MethodInformation bestMethod, ob /// /// this is a flavor of MethodInvokeDotNet to deal with a peculiarity of property setters: - /// Tthe setValue is always the last parameter. This enables a parameter after a varargs or optional + /// Tthe setValue is always the last parameter. This enables a parameter after a varargs or optional /// parameters and GetBestMethodAndArguments is not prepared for that. /// This method disregards the last parameter in its call to GetBestMethodAndArguments used in this case /// more for its "Arguments" side than for its "BestMethod" side, since there is only one method. @@ -4223,7 +4223,7 @@ protected override string ParameterizedPropertyToString(PSParameterizedProperty internal class BaseDotNetAdapterForAdaptedObjects : DotNetAdapter { /// - /// Return a collection representing the object's + /// Return a collection representing the object's /// members as returned by CLR reflection. /// /// @@ -4470,7 +4470,7 @@ protected override T GetMember(object obj, string memberName) /// in the first call to GetMember and GetMembers so that subsequent /// calls can use the cache. /// In the case of the .NET adapter that would be a cache from the .NET type to - /// the public properties and fields available in that type. + /// the public properties and fields available in that type. /// In the case of the DirectoryEntry adapter, this could be a cache of the objectClass /// to the properties available in it. /// @@ -4528,7 +4528,7 @@ protected override T GetMember(object obj, string memberName) /// in the first call to GetMember and GetMembers so that subsequent /// calls can use the cache. /// In the case of the .NET adapter that would be a cache from the .NET type to - /// the public properties and fields available in that type. + /// the public properties and fields available in that type. /// In the case of the DirectoryEntry adapter, this could be a cache of the objectClass /// to the properties available in it. /// @@ -4551,7 +4551,7 @@ protected override PSMemberInfoInternalCollection GetMembers(object obj) #endregion virtual } /// - /// Base class for all adapters that adapt only properties and retain + /// Base class for all adapters that adapt only properties and retain /// .NET methods /// internal abstract class PropertyOnlyAdapter : DotNetAdapter @@ -4627,7 +4627,7 @@ protected override T GetMember(object obj, string memberName) /// in the first call to GetMember and GetMembers so that subsequent /// calls can use the cache. /// In the case of the .NET adapter that would be a cache from the .NET type to - /// the public properties and fields available in that type. + /// the public properties and fields available in that type. /// In the case of the DirectoryEntry adapter, this could be a cache of the objectClass /// to the properties available in it. /// @@ -5264,7 +5264,7 @@ private static MethodInfo Infer(MethodInfo genericMethod, Type[] typesOfMethodAr MethodInfo inferredMethod = Infer(genericMethod, typeParameters, typesOfMethodParameters, typesOfMethodArguments); - // normal inference failed, perhaps instead of inferring for + // normal inference failed, perhaps instead of inferring for // M(T1, T2, ..., params T3 []) // we can try to infer for this signature instead // M)(T1, T2, ..., T3, T3, T3, T3) diff --git a/src/System.Management.Automation/engine/Credential.cs b/src/System.Management.Automation/engine/Credential.cs index 6056173d396..0e01281c72e 100644 --- a/src/System.Management.Automation/engine/Credential.cs +++ b/src/System.Management.Automation/engine/Credential.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #pragma warning disable 1634, 1691 diff --git a/src/System.Management.Automation/engine/CultureVariable.cs b/src/System.Management.Automation/engine/CultureVariable.cs index 2fdc79465b1..ee64ec9211d 100644 --- a/src/System.Management.Automation/engine/CultureVariable.cs +++ b/src/System.Management.Automation/engine/CultureVariable.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ namespace System.Management.Automation diff --git a/src/System.Management.Automation/engine/DataStoreAdapter.cs b/src/System.Management.Automation/engine/DataStoreAdapter.cs index 6ababeb0c57..c6c60e832b0 100644 --- a/src/System.Management.Automation/engine/DataStoreAdapter.cs +++ b/src/System.Management.Automation/engine/DataStoreAdapter.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #pragma warning disable 1634, 1691 diff --git a/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs b/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs index a8286ec146d..6e842a6ed9b 100644 --- a/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs +++ b/src/System.Management.Automation/engine/DataStoreAdapterProvider.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.ObjectModel; diff --git a/src/System.Management.Automation/engine/DefaultCommandRuntime.cs b/src/System.Management.Automation/engine/DefaultCommandRuntime.cs index 877995cf8ea..4e63b0f96b7 100644 --- a/src/System.Management.Automation/engine/DefaultCommandRuntime.cs +++ b/src/System.Management.Automation/engine/DefaultCommandRuntime.cs @@ -1,7 +1,7 @@ #pragma warning disable 1634, 1691 /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/DriveInterfaces.cs b/src/System.Management.Automation/engine/DriveInterfaces.cs index 41203021cb2..ed40ef004a6 100644 --- a/src/System.Management.Automation/engine/DriveInterfaces.cs +++ b/src/System.Management.Automation/engine/DriveInterfaces.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.ObjectModel; diff --git a/src/System.Management.Automation/engine/DriveNames.cs b/src/System.Management.Automation/engine/DriveNames.cs index 4ff78c68c1f..4c0ec5e6eaf 100644 --- a/src/System.Management.Automation/engine/DriveNames.cs +++ b/src/System.Management.Automation/engine/DriveNames.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ namespace System.Management.Automation diff --git a/src/System.Management.Automation/engine/DscResourceInfo.cs b/src/System.Management.Automation/engine/DscResourceInfo.cs index a2474f3eca8..79ca58f1db2 100644 --- a/src/System.Management.Automation/engine/DscResourceInfo.cs +++ b/src/System.Management.Automation/engine/DscResourceInfo.cs @@ -1,6 +1,6 @@ //----------------------------------------------------------------------- // -// Copyright (C) 2013 Microsoft Corporation +// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------- diff --git a/src/System.Management.Automation/engine/DscResourceSearcher.cs b/src/System.Management.Automation/engine/DscResourceSearcher.cs index 9318424fbb2..87e5106e3ae 100644 --- a/src/System.Management.Automation/engine/DscResourceSearcher.cs +++ b/src/System.Management.Automation/engine/DscResourceSearcher.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/EngineIntrinsics.cs b/src/System.Management.Automation/engine/EngineIntrinsics.cs index 24bd886d506..1b4d2738cbc 100644 --- a/src/System.Management.Automation/engine/EngineIntrinsics.cs +++ b/src/System.Management.Automation/engine/EngineIntrinsics.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation.Host; diff --git a/src/System.Management.Automation/engine/EnumExpressionEvaluator.cs b/src/System.Management.Automation/engine/EnumExpressionEvaluator.cs index ae32a5128a8..0a5e5e9f288 100644 --- a/src/System.Management.Automation/engine/EnumExpressionEvaluator.cs +++ b/src/System.Management.Automation/engine/EnumExpressionEvaluator.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/EnumMinimumDisambiguation.cs b/src/System.Management.Automation/engine/EnumMinimumDisambiguation.cs index d0ecd33f9bc..3f9d88fc87e 100644 --- a/src/System.Management.Automation/engine/EnumMinimumDisambiguation.cs +++ b/src/System.Management.Automation/engine/EnumMinimumDisambiguation.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/ErrorPackage.cs b/src/System.Management.Automation/engine/ErrorPackage.cs index 1927a4746f2..1086e842668 100644 --- a/src/System.Management.Automation/engine/ErrorPackage.cs +++ b/src/System.Management.Automation/engine/ErrorPackage.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #pragma warning disable 1634, 1691 diff --git a/src/System.Management.Automation/engine/EventManager.cs b/src/System.Management.Automation/engine/EventManager.cs index 6c242f6d83a..b46a8f430cd 100644 --- a/src/System.Management.Automation/engine/EventManager.cs +++ b/src/System.Management.Automation/engine/EventManager.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // #pragma warning disable 1634, 1691 diff --git a/src/System.Management.Automation/engine/ExecutionContext.cs b/src/System.Management.Automation/engine/ExecutionContext.cs index f39fdbb7ee5..73aabb1c919 100644 --- a/src/System.Management.Automation/engine/ExecutionContext.cs +++ b/src/System.Management.Automation/engine/ExecutionContext.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; @@ -1061,7 +1061,7 @@ internal ConfirmImpact ConfirmPreferenceVariable internal void RunspaceClosingNotification() { EngineSessionState.RunspaceClosingNotification(); - + if (_debugger != null) { _debugger.Dispose(); @@ -1139,7 +1139,7 @@ internal TypeInfoDataBaseManager FormatDBManager } return _formatDBManager; } - + set { _formatDBManager = value; diff --git a/src/System.Management.Automation/engine/ExtendedTypeSystemException.cs b/src/System.Management.Automation/engine/ExtendedTypeSystemException.cs index 61b2195d799..e9271edffb4 100644 --- a/src/System.Management.Automation/engine/ExtendedTypeSystemException.cs +++ b/src/System.Management.Automation/engine/ExtendedTypeSystemException.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Runtime.Serialization; diff --git a/src/System.Management.Automation/engine/ExternalScriptInfo.cs b/src/System.Management.Automation/engine/ExternalScriptInfo.cs index 0a2897ed506..399ec441a4a 100644 --- a/src/System.Management.Automation/engine/ExternalScriptInfo.cs +++ b/src/System.Management.Automation/engine/ExternalScriptInfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.IO; diff --git a/src/System.Management.Automation/engine/ExtraAdapter.cs b/src/System.Management.Automation/engine/ExtraAdapter.cs index bf57b9c55b1..6df54ba872d 100644 --- a/src/System.Management.Automation/engine/ExtraAdapter.cs +++ b/src/System.Management.Automation/engine/ExtraAdapter.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/FilterInfo.cs b/src/System.Management.Automation/engine/FilterInfo.cs index 6eeedf81172..7492b320ff8 100644 --- a/src/System.Management.Automation/engine/FilterInfo.cs +++ b/src/System.Management.Automation/engine/FilterInfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ namespace System.Management.Automation diff --git a/src/System.Management.Automation/engine/FunctionInfo.cs b/src/System.Management.Automation/engine/FunctionInfo.cs index 06542a0c070..7786655552f 100644 --- a/src/System.Management.Automation/engine/FunctionInfo.cs +++ b/src/System.Management.Automation/engine/FunctionInfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Text; diff --git a/src/System.Management.Automation/engine/GetCommandCommand.cs b/src/System.Management.Automation/engine/GetCommandCommand.cs index 4378830ea19..369fc9deed2 100644 --- a/src/System.Management.Automation/engine/GetCommandCommand.cs +++ b/src/System.Management.Automation/engine/GetCommandCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/engine/ICommandRuntime.cs b/src/System.Management.Automation/engine/ICommandRuntime.cs index b899a9a5228..ef6bdc2cff8 100644 --- a/src/System.Management.Automation/engine/ICommandRuntime.cs +++ b/src/System.Management.Automation/engine/ICommandRuntime.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation.Host; diff --git a/src/System.Management.Automation/engine/InformationRecord.cs b/src/System.Management.Automation/engine/InformationRecord.cs index e17e3ed05ad..e6bee00af5c 100644 --- a/src/System.Management.Automation/engine/InformationRecord.cs +++ b/src/System.Management.Automation/engine/InformationRecord.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Runtime.Serialization; diff --git a/src/System.Management.Automation/engine/InitialSessionState.cs b/src/System.Management.Automation/engine/InitialSessionState.cs index a050c4d6806..73bf7659a5b 100644 --- a/src/System.Management.Automation/engine/InitialSessionState.cs +++ b/src/System.Management.Automation/engine/InitialSessionState.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/InternalCommands.cs b/src/System.Management.Automation/engine/InternalCommands.cs index 31b3a22f365..40a1804f4a6 100644 --- a/src/System.Management.Automation/engine/InternalCommands.cs +++ b/src/System.Management.Automation/engine/InternalCommands.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; @@ -29,7 +29,7 @@ namespace Microsoft.PowerShell.Commands public sealed class ForEachObjectCommand : PSCmdlet { /// - /// This parameter specifies the current pipeline object + /// This parameter specifies the current pipeline object /// [Parameter(ValueFromPipeline = true, ParameterSetName = "ScriptBlockSet")] [Parameter(ValueFromPipeline = true, ParameterSetName = "PropertyAndMethodSet")] @@ -295,12 +295,12 @@ protected override void ProcessRecord() else { // we write null out because: - // PS C:\> “$null | ForEach-object {$_.aa} | ForEach-Object {$_ + 3}” + // PS C:\> $null | ForEach-object {$_.aa} | ForEach-Object {$_ + 3} // 3 // so we also want - // PS C:\> “$null | ForEach-object aa | ForEach-Object {$_ + 3}” + // PS C:\> $null | ForEach-object aa | ForEach-Object {$_ + 3} // 3 - // But if we don’t write anything to the pipeline when _inputObject is null, + // But if we don't write anything to the pipeline when _inputObject is null, // the result 3 will not be generated. WriteObject(null); } @@ -473,7 +473,7 @@ protected override void ProcessRecord() // so we also want // PS C:\> "string" | ForEach-Object aa | ForEach-Object {$_ + 3} // 3 - // But if we don’t write anything to the pipeline when no member is found, + // But if we don't write anything to the pipeline when no member is found, // the result 3 will not be generated. WriteObject(null); } @@ -579,7 +579,7 @@ private static string GetStringRepresentation(object obj) } /// - /// Get the value by taking _propertyOrMethodName as the key, if the + /// Get the value by taking _propertyOrMethodName as the key, if the /// input object is a IDictionary. /// /// @@ -611,7 +611,7 @@ private bool GetValueFromIDictionaryInput() } /// - /// Unroll the object to be output. If it's of type IEnumerator, unroll and output it + /// Unroll the object to be output. If it's of type IEnumerator, unroll and output it /// by calling WriteOutIEnumerator. If it's not, unroll and output it by calling WriteObject(obj, true) /// /// @@ -649,7 +649,7 @@ private void WriteOutIEnumerator(IEnumerator list) } /// - /// Check if the language mode is the restrictedLanguageMode before invoking a method. + /// Check if the language mode is the restrictedLanguageMode before invoking a method. /// Write out error message and return true if we are in restrictedLanguageMode. /// /// @@ -756,7 +756,7 @@ protected override void EndProcessing() public sealed class WhereObjectCommand : PSCmdlet { /// - /// This parameter specifies the current pipeline object + /// This parameter specifies the current pipeline object /// [Parameter(ValueFromPipeline = true)] public PSObject InputObject @@ -1733,7 +1733,7 @@ protected override void BeginProcessing() /// /// Note: /// - /// Unlike Set-PSDebug -strict, Set-StrictMode is not engine-wide, and only + /// Unlike Set-PSDebug -strict, Set-StrictMode is not engine-wide, and only /// affects the scope it was defined in. /// [Cmdlet(VerbsCommon.Set, "StrictMode", DefaultParameterSetName = "Version", HelpUri = "https://go.microsoft.com/fwlink/?LinkID=113450")] diff --git a/src/System.Management.Automation/engine/InvocationInfo.cs b/src/System.Management.Automation/engine/InvocationInfo.cs index 69c3da2faa8..2852eb5886e 100644 --- a/src/System.Management.Automation/engine/InvocationInfo.cs +++ b/src/System.Management.Automation/engine/InvocationInfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.IO; diff --git a/src/System.Management.Automation/engine/ItemCmdletProviderInterfaces.cs b/src/System.Management.Automation/engine/ItemCmdletProviderInterfaces.cs index 282990f0aad..3c14e8ee58b 100644 --- a/src/System.Management.Automation/engine/ItemCmdletProviderInterfaces.cs +++ b/src/System.Management.Automation/engine/ItemCmdletProviderInterfaces.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.ObjectModel; diff --git a/src/System.Management.Automation/engine/LanguagePrimitives.cs b/src/System.Management.Automation/engine/LanguagePrimitives.cs index 7db18d424d3..b67622c770b 100644 --- a/src/System.Management.Automation/engine/LanguagePrimitives.cs +++ b/src/System.Management.Automation/engine/LanguagePrimitives.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/ManagementObjectAdapter.cs b/src/System.Management.Automation/engine/ManagementObjectAdapter.cs index 78b48a28324..c7fa0334a7b 100644 --- a/src/System.Management.Automation/engine/ManagementObjectAdapter.cs +++ b/src/System.Management.Automation/engine/ManagementObjectAdapter.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/MergedCommandParameterMetadata.cs b/src/System.Management.Automation/engine/MergedCommandParameterMetadata.cs index 967d018b61f..abd35ea65e6 100644 --- a/src/System.Management.Automation/engine/MergedCommandParameterMetadata.cs +++ b/src/System.Management.Automation/engine/MergedCommandParameterMetadata.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/MinishellParameterBinderController.cs b/src/System.Management.Automation/engine/MinishellParameterBinderController.cs index 6e0bd28c11d..ca06e2c6d07 100644 --- a/src/System.Management.Automation/engine/MinishellParameterBinderController.cs +++ b/src/System.Management.Automation/engine/MinishellParameterBinderController.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/Modules/AnalysisCache.cs b/src/System.Management.Automation/engine/Modules/AnalysisCache.cs index eb03fea3832..bdc9ac78683 100644 --- a/src/System.Management.Automation/engine/Modules/AnalysisCache.cs +++ b/src/System.Management.Automation/engine/Modules/AnalysisCache.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/Modules/ExportModuleMemberCommand.cs b/src/System.Management.Automation/engine/Modules/ExportModuleMemberCommand.cs index ec1fb38639b..ab54f34d08e 100644 --- a/src/System.Management.Automation/engine/Modules/ExportModuleMemberCommand.cs +++ b/src/System.Management.Automation/engine/Modules/ExportModuleMemberCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/engine/Modules/GetModuleCommand.cs b/src/System.Management.Automation/engine/Modules/GetModuleCommand.cs index 5f41d8d2bdd..5b3a7f8219a 100644 --- a/src/System.Management.Automation/engine/Modules/GetModuleCommand.cs +++ b/src/System.Management.Automation/engine/Modules/GetModuleCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/engine/Modules/ImportModuleCommand.cs b/src/System.Management.Automation/engine/Modules/ImportModuleCommand.cs index c4fdf96de92..90d8308e2c7 100644 --- a/src/System.Management.Automation/engine/Modules/ImportModuleCommand.cs +++ b/src/System.Management.Automation/engine/Modules/ImportModuleCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; @@ -993,9 +993,9 @@ private PSModuleInfo ImportModule_RemotelyViaPsrpSession_SinglePreimportedModule { this.ArgumentList = new object[] { psSession }; - // The correct module version has already been imported from the remote session and created locally. + // The correct module version has already been imported from the remote session and created locally. // The locally created module always has a version of 1.0 regardless of the actual module version - // imported from the remote session, and version checking is no longer needed and will not work while + // imported from the remote session, and version checking is no longer needed and will not work while // importing this created local module. BaseMinimumVersion = null; BaseMaximumVersion = null; diff --git a/src/System.Management.Automation/engine/Modules/ModuleCmdletBase.cs b/src/System.Management.Automation/engine/Modules/ModuleCmdletBase.cs index cbce9e2c3f3..57eee77c40b 100644 --- a/src/System.Management.Automation/engine/Modules/ModuleCmdletBase.cs +++ b/src/System.Management.Automation/engine/Modules/ModuleCmdletBase.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/engine/Modules/ModuleIntrinsics.cs b/src/System.Management.Automation/engine/Modules/ModuleIntrinsics.cs index 88b716b655b..0d1909dcfbe 100644 --- a/src/System.Management.Automation/engine/Modules/ModuleIntrinsics.cs +++ b/src/System.Management.Automation/engine/Modules/ModuleIntrinsics.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/Modules/ModuleSpecification.cs b/src/System.Management.Automation/engine/Modules/ModuleSpecification.cs index cdd5ac21008..0b7fb6f99ff 100644 --- a/src/System.Management.Automation/engine/Modules/ModuleSpecification.cs +++ b/src/System.Management.Automation/engine/Modules/ModuleSpecification.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/engine/Modules/ModuleUtils.cs b/src/System.Management.Automation/engine/Modules/ModuleUtils.cs index 9226431be3e..c295f3af366 100644 --- a/src/System.Management.Automation/engine/Modules/ModuleUtils.cs +++ b/src/System.Management.Automation/engine/Modules/ModuleUtils.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/Modules/NewModuleCommand.cs b/src/System.Management.Automation/engine/Modules/NewModuleCommand.cs index 6630635645a..68aff2813ba 100644 --- a/src/System.Management.Automation/engine/Modules/NewModuleCommand.cs +++ b/src/System.Management.Automation/engine/Modules/NewModuleCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/engine/Modules/NewModuleManifestCommand.cs b/src/System.Management.Automation/engine/Modules/NewModuleManifestCommand.cs index 37bd1fa34bd..30520c0c5bf 100644 --- a/src/System.Management.Automation/engine/Modules/NewModuleManifestCommand.cs +++ b/src/System.Management.Automation/engine/Modules/NewModuleManifestCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; @@ -288,7 +288,7 @@ public string[] FileList private string[] _miscFiles; /// - /// List of other modules included with this module. + /// List of other modules included with this module. /// Like the RequiredModules key, this list can be a simple list of module names or a complex list of module hashtables. /// [Parameter] @@ -462,7 +462,7 @@ public SwitchParameter PassThru private bool _passThru; /// - /// Specify the Default Command Prefix + /// Specify the Default Command Prefix /// [Parameter] [AllowNull] @@ -855,7 +855,7 @@ private string ManifestComment(string insert, StreamWriter streamWriter) protected override void EndProcessing() { // Win8: 264471 - Error message for New-ModuleManifest -ProcessorArchitecture is obsolete. - // If an undefined value is passed for the ProcessorArchitecture parameter, the error message from parameter binder includes all the values from the enum. + // If an undefined value is passed for the ProcessorArchitecture parameter, the error message from parameter binder includes all the values from the enum. // The value 'IA64' for ProcessorArchitecture is not supported. But since we do not own the enum System.Reflection.ProcessorArchitecture, we cannot control the values in it. // So, we add a separate check in our code to give an error if user specifies IA64 if (ProcessorArchitecture == ProcessorArchitecture.IA64) @@ -1086,9 +1086,9 @@ private void BuildModuleManifest(StringBuilder result, string key, string keyDes // # ReleaseNotes of this module // ReleaseNotes = '' // }# end of PSData hashtable - // + // // # User's private data keys - // + // // }# end of PrivateData hashtable // #> private void BuildPrivateDataInModuleManifest(StringBuilder result, StreamWriter streamWriter) diff --git a/src/System.Management.Automation/engine/Modules/PSModuleInfo.cs b/src/System.Management.Automation/engine/Modules/PSModuleInfo.cs index 0f55de878cb..77780ca7ef4 100644 --- a/src/System.Management.Automation/engine/Modules/PSModuleInfo.cs +++ b/src/System.Management.Automation/engine/Modules/PSModuleInfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/Modules/RemoteDiscoveryHelper.cs b/src/System.Management.Automation/engine/Modules/RemoteDiscoveryHelper.cs index 48f253ef6a6..30862775561 100644 --- a/src/System.Management.Automation/engine/Modules/RemoteDiscoveryHelper.cs +++ b/src/System.Management.Automation/engine/Modules/RemoteDiscoveryHelper.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/Modules/RemoveModuleCommand.cs b/src/System.Management.Automation/engine/Modules/RemoveModuleCommand.cs index 3d9a725e089..f2d871005cd 100644 --- a/src/System.Management.Automation/engine/Modules/RemoveModuleCommand.cs +++ b/src/System.Management.Automation/engine/Modules/RemoveModuleCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/engine/Modules/ScriptAnalysis.cs b/src/System.Management.Automation/engine/Modules/ScriptAnalysis.cs index 8fb272b488b..00eaba100d4 100644 --- a/src/System.Management.Automation/engine/Modules/ScriptAnalysis.cs +++ b/src/System.Management.Automation/engine/Modules/ScriptAnalysis.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/Modules/TestModuleManifestCommand.cs b/src/System.Management.Automation/engine/Modules/TestModuleManifestCommand.cs index 69188c44976..a884a447ead 100644 --- a/src/System.Management.Automation/engine/Modules/TestModuleManifestCommand.cs +++ b/src/System.Management.Automation/engine/Modules/TestModuleManifestCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; @@ -145,7 +145,7 @@ protected override void ProcessRecord() string errorMsg = StringUtil.Format(Modules.InvalidModuleManifest, module.RootModule, filePath); var errorRecord = new ErrorRecord(new ArgumentException(errorMsg), "Modules_InvalidRootModuleInModuleManifest", ErrorCategory.InvalidArgument, _path); - WriteError(errorRecord); + WriteError(errorRecord); } } @@ -310,7 +310,7 @@ private bool IsValidFilePath(string path, PSModuleInfo module, bool verifyPathSc string message = StringUtil.Format(Modules.InvalidModuleManifestPath, path); InvalidOperationException ioe = new InvalidOperationException(message); ErrorRecord er = new ErrorRecord(ioe, "Modules_InvalidModuleManifestPath", ErrorCategory.InvalidArgument, path); - ThrowTerminatingError(er); + ThrowTerminatingError(er); } path = pathInfos[0].Path; diff --git a/src/System.Management.Automation/engine/MshCmdlet.cs b/src/System.Management.Automation/engine/MshCmdlet.cs index e9ee4ec2f61..6a9085eb75d 100644 --- a/src/System.Management.Automation/engine/MshCmdlet.cs +++ b/src/System.Management.Automation/engine/MshCmdlet.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.IO; diff --git a/src/System.Management.Automation/engine/MshCommandRuntime.cs b/src/System.Management.Automation/engine/MshCommandRuntime.cs index a948940ed7a..43672e3116e 100644 --- a/src/System.Management.Automation/engine/MshCommandRuntime.cs +++ b/src/System.Management.Automation/engine/MshCommandRuntime.cs @@ -1,7 +1,7 @@ #pragma warning disable 1634, 1691 /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/MshMemberInfo.cs b/src/System.Management.Automation/engine/MshMemberInfo.cs index 1891ce405f9..eb32b76fbe5 100644 --- a/src/System.Management.Automation/engine/MshMemberInfo.cs +++ b/src/System.Management.Automation/engine/MshMemberInfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Linq; diff --git a/src/System.Management.Automation/engine/MshObject.cs b/src/System.Management.Automation/engine/MshObject.cs index 822a26aaa85..c4651c8a1ef 100644 --- a/src/System.Management.Automation/engine/MshObject.cs +++ b/src/System.Management.Automation/engine/MshObject.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/engine/MshObjectTypeDescriptor.cs b/src/System.Management.Automation/engine/MshObjectTypeDescriptor.cs index 9b1519af72f..6a7af45f14f 100644 --- a/src/System.Management.Automation/engine/MshObjectTypeDescriptor.cs +++ b/src/System.Management.Automation/engine/MshObjectTypeDescriptor.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.ComponentModel; diff --git a/src/System.Management.Automation/engine/MshReference.cs b/src/System.Management.Automation/engine/MshReference.cs index 7ab4f1df0dd..c22377905a2 100644 --- a/src/System.Management.Automation/engine/MshReference.cs +++ b/src/System.Management.Automation/engine/MshReference.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Dynamic; diff --git a/src/System.Management.Automation/engine/MshSecurityException.cs b/src/System.Management.Automation/engine/MshSecurityException.cs index 482bd865a5a..6b48bfdc322 100644 --- a/src/System.Management.Automation/engine/MshSecurityException.cs +++ b/src/System.Management.Automation/engine/MshSecurityException.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Runtime.Serialization; diff --git a/src/System.Management.Automation/engine/MshSnapinQualifiedName.cs b/src/System.Management.Automation/engine/MshSnapinQualifiedName.cs index cc0d7d96e51..336c2f59326 100644 --- a/src/System.Management.Automation/engine/MshSnapinQualifiedName.cs +++ b/src/System.Management.Automation/engine/MshSnapinQualifiedName.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using Dbg = System.Management.Automation.Diagnostics; diff --git a/src/System.Management.Automation/engine/NativeCommand.cs b/src/System.Management.Automation/engine/NativeCommand.cs index e1824561953..63bea73314f 100644 --- a/src/System.Management.Automation/engine/NativeCommand.cs +++ b/src/System.Management.Automation/engine/NativeCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation.Internal; diff --git a/src/System.Management.Automation/engine/NativeCommandParameterBinder.cs b/src/System.Management.Automation/engine/NativeCommandParameterBinder.cs index 44c298c776e..8df70f33b3e 100644 --- a/src/System.Management.Automation/engine/NativeCommandParameterBinder.cs +++ b/src/System.Management.Automation/engine/NativeCommandParameterBinder.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/NativeCommandParameterBinderController.cs b/src/System.Management.Automation/engine/NativeCommandParameterBinderController.cs index b02857c05c1..f8beed2b91d 100644 --- a/src/System.Management.Automation/engine/NativeCommandParameterBinderController.cs +++ b/src/System.Management.Automation/engine/NativeCommandParameterBinderController.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.ObjectModel; diff --git a/src/System.Management.Automation/engine/NativeCommandProcessor.cs b/src/System.Management.Automation/engine/NativeCommandProcessor.cs index af785632519..cee3678d77d 100644 --- a/src/System.Management.Automation/engine/NativeCommandProcessor.cs +++ b/src/System.Management.Automation/engine/NativeCommandProcessor.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #pragma warning disable 1634, 1691 diff --git a/src/System.Management.Automation/engine/NullString.cs b/src/System.Management.Automation/engine/NullString.cs index 400288ccee6..ef7ccc84b5b 100644 --- a/src/System.Management.Automation/engine/NullString.cs +++ b/src/System.Management.Automation/engine/NullString.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ namespace System.Management.Automation.Language diff --git a/src/System.Management.Automation/engine/ObjectEventRegistrationBase.cs b/src/System.Management.Automation/engine/ObjectEventRegistrationBase.cs index 71eef7d67a5..dd6450f3969 100644 --- a/src/System.Management.Automation/engine/ObjectEventRegistrationBase.cs +++ b/src/System.Management.Automation/engine/ObjectEventRegistrationBase.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System; diff --git a/src/System.Management.Automation/engine/PSClassInfo.cs b/src/System.Management.Automation/engine/PSClassInfo.cs index 7f44a72d850..fbfd436bcec 100644 --- a/src/System.Management.Automation/engine/PSClassInfo.cs +++ b/src/System.Management.Automation/engine/PSClassInfo.cs @@ -1,6 +1,6 @@ //----------------------------------------------------------------------- // -// Copyright (C) 2013 Microsoft Corporation +// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------- diff --git a/src/System.Management.Automation/engine/PSClassSearcher.cs b/src/System.Management.Automation/engine/PSClassSearcher.cs index d06af7be489..90f28ee7223 100644 --- a/src/System.Management.Automation/engine/PSClassSearcher.cs +++ b/src/System.Management.Automation/engine/PSClassSearcher.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/PSVersionInfo.cs b/src/System.Management.Automation/engine/PSVersionInfo.cs index 07af6f347b9..7b420f15870 100644 --- a/src/System.Management.Automation/engine/PSVersionInfo.cs +++ b/src/System.Management.Automation/engine/PSVersionInfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Diagnostics; diff --git a/src/System.Management.Automation/engine/ParameterBinderBase.cs b/src/System.Management.Automation/engine/ParameterBinderBase.cs index d809ef0bda8..4f3dc90e81e 100644 --- a/src/System.Management.Automation/engine/ParameterBinderBase.cs +++ b/src/System.Management.Automation/engine/ParameterBinderBase.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/ParameterBinderController.cs b/src/System.Management.Automation/engine/ParameterBinderController.cs index 188b2abbe4e..47f24bd389b 100644 --- a/src/System.Management.Automation/engine/ParameterBinderController.cs +++ b/src/System.Management.Automation/engine/ParameterBinderController.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/ParameterInfo.cs b/src/System.Management.Automation/engine/ParameterInfo.cs index ecee699ccfa..e6505370027 100644 --- a/src/System.Management.Automation/engine/ParameterInfo.cs +++ b/src/System.Management.Automation/engine/ParameterInfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/ParameterSetInfo.cs b/src/System.Management.Automation/engine/ParameterSetInfo.cs index 0b17703a39b..f34c269f90f 100644 --- a/src/System.Management.Automation/engine/ParameterSetInfo.cs +++ b/src/System.Management.Automation/engine/ParameterSetInfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/ParameterSetPromptingData.cs b/src/System.Management.Automation/engine/ParameterSetPromptingData.cs index a04ba129300..1df11b5e591 100644 --- a/src/System.Management.Automation/engine/ParameterSetPromptingData.cs +++ b/src/System.Management.Automation/engine/ParameterSetPromptingData.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/ParameterSetSpecificMetadata.cs b/src/System.Management.Automation/engine/ParameterSetSpecificMetadata.cs index 0a10758ecca..2dde7499cd0 100644 --- a/src/System.Management.Automation/engine/ParameterSetSpecificMetadata.cs +++ b/src/System.Management.Automation/engine/ParameterSetSpecificMetadata.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ namespace System.Management.Automation diff --git a/src/System.Management.Automation/engine/PathInterfaces.cs b/src/System.Management.Automation/engine/PathInterfaces.cs index 023c08b5d97..c116ac3ea59 100644 --- a/src/System.Management.Automation/engine/PathInterfaces.cs +++ b/src/System.Management.Automation/engine/PathInterfaces.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.ObjectModel; diff --git a/src/System.Management.Automation/engine/Pipe.cs b/src/System.Management.Automation/engine/Pipe.cs index 4fcb21ca44c..340adb41bad 100644 --- a/src/System.Management.Automation/engine/Pipe.cs +++ b/src/System.Management.Automation/engine/Pipe.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/PositionalCommandParameter.cs b/src/System.Management.Automation/engine/PositionalCommandParameter.cs index d594af1a66d..0d8261e24dc 100644 --- a/src/System.Management.Automation/engine/PositionalCommandParameter.cs +++ b/src/System.Management.Automation/engine/PositionalCommandParameter.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.ObjectModel; diff --git a/src/System.Management.Automation/engine/ProgressRecord.cs b/src/System.Management.Automation/engine/ProgressRecord.cs index 7dcd8f33fd4..f63ba0392aa 100644 --- a/src/System.Management.Automation/engine/ProgressRecord.cs +++ b/src/System.Management.Automation/engine/ProgressRecord.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Runtime.Serialization; diff --git a/src/System.Management.Automation/engine/PropertyCmdletProviderInterfaces.cs b/src/System.Management.Automation/engine/PropertyCmdletProviderInterfaces.cs index d079a5c25d2..5efb3046105 100644 --- a/src/System.Management.Automation/engine/PropertyCmdletProviderInterfaces.cs +++ b/src/System.Management.Automation/engine/PropertyCmdletProviderInterfaces.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.ObjectModel; diff --git a/src/System.Management.Automation/engine/ProviderInterfaces.cs b/src/System.Management.Automation/engine/ProviderInterfaces.cs index e336ec47472..46e288cbb38 100644 --- a/src/System.Management.Automation/engine/ProviderInterfaces.cs +++ b/src/System.Management.Automation/engine/ProviderInterfaces.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/ProviderNames.cs b/src/System.Management.Automation/engine/ProviderNames.cs index 56bf1d65fde..59199cd9a63 100644 --- a/src/System.Management.Automation/engine/ProviderNames.cs +++ b/src/System.Management.Automation/engine/ProviderNames.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ namespace System.Management.Automation diff --git a/src/System.Management.Automation/engine/ProxyCommand.cs b/src/System.Management.Automation/engine/ProxyCommand.cs index 5970026628e..362dc23b00f 100644 --- a/src/System.Management.Automation/engine/ProxyCommand.cs +++ b/src/System.Management.Automation/engine/ProxyCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Diagnostics.CodeAnalysis; diff --git a/src/System.Management.Automation/engine/PseudoParameterBinder.cs b/src/System.Management.Automation/engine/PseudoParameterBinder.cs index d7275a68e7a..344818f0ffc 100644 --- a/src/System.Management.Automation/engine/PseudoParameterBinder.cs +++ b/src/System.Management.Automation/engine/PseudoParameterBinder.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation.Internal; diff --git a/src/System.Management.Automation/engine/PseudoParameters.cs b/src/System.Management.Automation/engine/PseudoParameters.cs index 80c8572665d..b7a40740e4b 100644 --- a/src/System.Management.Automation/engine/PseudoParameters.cs +++ b/src/System.Management.Automation/engine/PseudoParameters.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/QuestionMarkVariable.cs b/src/System.Management.Automation/engine/QuestionMarkVariable.cs index 500dc846f23..ab9f25b0f66 100644 --- a/src/System.Management.Automation/engine/QuestionMarkVariable.cs +++ b/src/System.Management.Automation/engine/QuestionMarkVariable.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ diff --git a/src/System.Management.Automation/engine/ReflectionParameterBinder.cs b/src/System.Management.Automation/engine/ReflectionParameterBinder.cs index aff84cdcbe8..9b0991deaa2 100644 --- a/src/System.Management.Automation/engine/ReflectionParameterBinder.cs +++ b/src/System.Management.Automation/engine/ReflectionParameterBinder.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Concurrent; diff --git a/src/System.Management.Automation/engine/RunspaceConfigurationEntry.cs b/src/System.Management.Automation/engine/RunspaceConfigurationEntry.cs index 97932f2465a..c90388e0e2b 100644 --- a/src/System.Management.Automation/engine/RunspaceConfigurationEntry.cs +++ b/src/System.Management.Automation/engine/RunspaceConfigurationEntry.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #pragma warning disable 1634, 1691 @@ -47,7 +47,7 @@ internal enum RunspaceConfigurationCategory /// Formats, } - + /// /// Define class for runspace configuration entry. /// diff --git a/src/System.Management.Automation/engine/ScopedItemSearcher.cs b/src/System.Management.Automation/engine/ScopedItemSearcher.cs index 8e9e9e07083..b7e951450ce 100644 --- a/src/System.Management.Automation/engine/ScopedItemSearcher.cs +++ b/src/System.Management.Automation/engine/ScopedItemSearcher.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/ScriptCommand.cs b/src/System.Management.Automation/engine/ScriptCommand.cs index e5c1982dcfb..6c4e3f4d1a9 100644 --- a/src/System.Management.Automation/engine/ScriptCommand.cs +++ b/src/System.Management.Automation/engine/ScriptCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation.Internal; diff --git a/src/System.Management.Automation/engine/ScriptCommandProcessor.cs b/src/System.Management.Automation/engine/ScriptCommandProcessor.cs index 18f1e41b567..9f1151f4197 100644 --- a/src/System.Management.Automation/engine/ScriptCommandProcessor.cs +++ b/src/System.Management.Automation/engine/ScriptCommandProcessor.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/ScriptInfo.cs b/src/System.Management.Automation/engine/ScriptInfo.cs index a6b5d42ed8d..95e756826ff 100644 --- a/src/System.Management.Automation/engine/ScriptInfo.cs +++ b/src/System.Management.Automation/engine/ScriptInfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation.Runspaces; diff --git a/src/System.Management.Automation/engine/SecurityDescriptorCmdletProviderInterfaces.cs b/src/System.Management.Automation/engine/SecurityDescriptorCmdletProviderInterfaces.cs index fe9a66cd07e..6a8fb2fe828 100644 --- a/src/System.Management.Automation/engine/SecurityDescriptorCmdletProviderInterfaces.cs +++ b/src/System.Management.Automation/engine/SecurityDescriptorCmdletProviderInterfaces.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.ObjectModel; diff --git a/src/System.Management.Automation/engine/SecurityManagerBase.cs b/src/System.Management.Automation/engine/SecurityManagerBase.cs index 07a5851aea1..4cea5e16922 100644 --- a/src/System.Management.Automation/engine/SecurityManagerBase.cs +++ b/src/System.Management.Automation/engine/SecurityManagerBase.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using Dbg = System.Management.Automation; diff --git a/src/System.Management.Automation/engine/SerializationStrings.cs b/src/System.Management.Automation/engine/SerializationStrings.cs index 94bfa19b250..9cc1ecd970d 100644 --- a/src/System.Management.Automation/engine/SerializationStrings.cs +++ b/src/System.Management.Automation/engine/SerializationStrings.cs @@ -1,6 +1,6 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ namespace System.Management.Automation diff --git a/src/System.Management.Automation/engine/SessionState.cs b/src/System.Management.Automation/engine/SessionState.cs index 4745143511c..51a631afe38 100644 --- a/src/System.Management.Automation/engine/SessionState.cs +++ b/src/System.Management.Automation/engine/SessionState.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation.Language; diff --git a/src/System.Management.Automation/engine/SessionStateAliasAPIs.cs b/src/System.Management.Automation/engine/SessionStateAliasAPIs.cs index cbf3982a0e5..57e79c33bfa 100644 --- a/src/System.Management.Automation/engine/SessionStateAliasAPIs.cs +++ b/src/System.Management.Automation/engine/SessionStateAliasAPIs.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/SessionStateCmdletAPIs.cs b/src/System.Management.Automation/engine/SessionStateCmdletAPIs.cs index 333a52c3e16..320a23a20e8 100644 --- a/src/System.Management.Automation/engine/SessionStateCmdletAPIs.cs +++ b/src/System.Management.Automation/engine/SessionStateCmdletAPIs.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/SessionStateContainer.cs b/src/System.Management.Automation/engine/SessionStateContainer.cs index efcc2feedc3..3541a1d9bf3 100644 --- a/src/System.Management.Automation/engine/SessionStateContainer.cs +++ b/src/System.Management.Automation/engine/SessionStateContainer.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/SessionStateContent.cs b/src/System.Management.Automation/engine/SessionStateContent.cs index ec4b9a42507..fc62fce44fd 100644 --- a/src/System.Management.Automation/engine/SessionStateContent.cs +++ b/src/System.Management.Automation/engine/SessionStateContent.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.ObjectModel; diff --git a/src/System.Management.Automation/engine/SessionStateDriveAPIs.cs b/src/System.Management.Automation/engine/SessionStateDriveAPIs.cs index df49937de8c..1350d57700a 100644 --- a/src/System.Management.Automation/engine/SessionStateDriveAPIs.cs +++ b/src/System.Management.Automation/engine/SessionStateDriveAPIs.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/SessionStateDynamicProperty.cs b/src/System.Management.Automation/engine/SessionStateDynamicProperty.cs index 7d6673c9de0..4c15dfc2fed 100644 --- a/src/System.Management.Automation/engine/SessionStateDynamicProperty.cs +++ b/src/System.Management.Automation/engine/SessionStateDynamicProperty.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.ObjectModel; diff --git a/src/System.Management.Automation/engine/SessionStateFunctionAPIs.cs b/src/System.Management.Automation/engine/SessionStateFunctionAPIs.cs index 870d6208c72..1387543d285 100644 --- a/src/System.Management.Automation/engine/SessionStateFunctionAPIs.cs +++ b/src/System.Management.Automation/engine/SessionStateFunctionAPIs.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/SessionStateItem.cs b/src/System.Management.Automation/engine/SessionStateItem.cs index 9c9073aa3c6..2869d702c44 100644 --- a/src/System.Management.Automation/engine/SessionStateItem.cs +++ b/src/System.Management.Automation/engine/SessionStateItem.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.ObjectModel; diff --git a/src/System.Management.Automation/engine/SessionStateLocationAPIs.cs b/src/System.Management.Automation/engine/SessionStateLocationAPIs.cs index e2d30578378..9c512b40b92 100644 --- a/src/System.Management.Automation/engine/SessionStateLocationAPIs.cs +++ b/src/System.Management.Automation/engine/SessionStateLocationAPIs.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #pragma warning disable 1634, 1691 diff --git a/src/System.Management.Automation/engine/SessionStateNavigation.cs b/src/System.Management.Automation/engine/SessionStateNavigation.cs index d76d673968b..42a934ffd55 100644 --- a/src/System.Management.Automation/engine/SessionStateNavigation.cs +++ b/src/System.Management.Automation/engine/SessionStateNavigation.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.ObjectModel; diff --git a/src/System.Management.Automation/engine/SessionStateProperty.cs b/src/System.Management.Automation/engine/SessionStateProperty.cs index 3c3825a48f0..385385018bb 100644 --- a/src/System.Management.Automation/engine/SessionStateProperty.cs +++ b/src/System.Management.Automation/engine/SessionStateProperty.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.ObjectModel; diff --git a/src/System.Management.Automation/engine/SessionStateProviderAPIs.cs b/src/System.Management.Automation/engine/SessionStateProviderAPIs.cs index 54721d48771..62012a4db0e 100644 --- a/src/System.Management.Automation/engine/SessionStateProviderAPIs.cs +++ b/src/System.Management.Automation/engine/SessionStateProviderAPIs.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/SessionStatePublic.cs b/src/System.Management.Automation/engine/SessionStatePublic.cs index e1bf6cbd26c..2d361581f01 100644 --- a/src/System.Management.Automation/engine/SessionStatePublic.cs +++ b/src/System.Management.Automation/engine/SessionStatePublic.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/SessionStateScope.cs b/src/System.Management.Automation/engine/SessionStateScope.cs index 6b5e4b39724..7e24039a168 100644 --- a/src/System.Management.Automation/engine/SessionStateScope.cs +++ b/src/System.Management.Automation/engine/SessionStateScope.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/SessionStateScopeAPIs.cs b/src/System.Management.Automation/engine/SessionStateScopeAPIs.cs index ee48e19bfc3..b6be9c55175 100644 --- a/src/System.Management.Automation/engine/SessionStateScopeAPIs.cs +++ b/src/System.Management.Automation/engine/SessionStateScopeAPIs.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using Dbg = System.Management.Automation; diff --git a/src/System.Management.Automation/engine/SessionStateScopeEnumerator.cs b/src/System.Management.Automation/engine/SessionStateScopeEnumerator.cs index e88352c533c..b81e26ae486 100644 --- a/src/System.Management.Automation/engine/SessionStateScopeEnumerator.cs +++ b/src/System.Management.Automation/engine/SessionStateScopeEnumerator.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/SessionStateSecurityDescriptorInterface.cs b/src/System.Management.Automation/engine/SessionStateSecurityDescriptorInterface.cs index de4220b2ea5..2df21f9b154 100644 --- a/src/System.Management.Automation/engine/SessionStateSecurityDescriptorInterface.cs +++ b/src/System.Management.Automation/engine/SessionStateSecurityDescriptorInterface.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.ObjectModel; diff --git a/src/System.Management.Automation/engine/SessionStateStrings.cs b/src/System.Management.Automation/engine/SessionStateStrings.cs index 6ee16046379..73108816663 100644 --- a/src/System.Management.Automation/engine/SessionStateStrings.cs +++ b/src/System.Management.Automation/engine/SessionStateStrings.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ namespace System.Management.Automation diff --git a/src/System.Management.Automation/engine/SessionStateUtils.cs b/src/System.Management.Automation/engine/SessionStateUtils.cs index 246a833c752..5f555c5ebe0 100644 --- a/src/System.Management.Automation/engine/SessionStateUtils.cs +++ b/src/System.Management.Automation/engine/SessionStateUtils.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/SessionStateVariableAPIs.cs b/src/System.Management.Automation/engine/SessionStateVariableAPIs.cs index 4f966aa37bd..333e2dd132e 100644 --- a/src/System.Management.Automation/engine/SessionStateVariableAPIs.cs +++ b/src/System.Management.Automation/engine/SessionStateVariableAPIs.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/ShellVariable.cs b/src/System.Management.Automation/engine/ShellVariable.cs index 823c1bfd655..974bdb49d35 100644 --- a/src/System.Management.Automation/engine/ShellVariable.cs +++ b/src/System.Management.Automation/engine/ShellVariable.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation.Language; diff --git a/src/System.Management.Automation/engine/SpecialVariables.cs b/src/System.Management.Automation/engine/SpecialVariables.cs index 5c837976f7c..fb9fbd9a526 100644 --- a/src/System.Management.Automation/engine/SpecialVariables.cs +++ b/src/System.Management.Automation/engine/SpecialVariables.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/ThirdPartyAdapter.cs b/src/System.Management.Automation/engine/ThirdPartyAdapter.cs index 61eb7fa57e0..73326087939 100644 --- a/src/System.Management.Automation/engine/ThirdPartyAdapter.cs +++ b/src/System.Management.Automation/engine/ThirdPartyAdapter.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/TransactedString.cs b/src/System.Management.Automation/engine/TransactedString.cs index 0e3a24d688f..73f67018219 100644 --- a/src/System.Management.Automation/engine/TransactedString.cs +++ b/src/System.Management.Automation/engine/TransactedString.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/engine/TransactionManager.cs b/src/System.Management.Automation/engine/TransactionManager.cs index 1a5ffca26f6..3abeb718c57 100644 --- a/src/System.Management.Automation/engine/TransactionManager.cs +++ b/src/System.Management.Automation/engine/TransactionManager.cs @@ -1,7 +1,7 @@ #pragma warning disable 1634, 1691 /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/TypeMetadata.cs b/src/System.Management.Automation/engine/TypeMetadata.cs index dbf6e66e9e9..ad6df66cadc 100644 --- a/src/System.Management.Automation/engine/TypeMetadata.cs +++ b/src/System.Management.Automation/engine/TypeMetadata.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/TypeTable.cs b/src/System.Management.Automation/engine/TypeTable.cs index 1b2fba40da3..3b9f958bf92 100644 --- a/src/System.Management.Automation/engine/TypeTable.cs +++ b/src/System.Management.Automation/engine/TypeTable.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Concurrent; diff --git a/src/System.Management.Automation/engine/UserFeedbackParameters.cs b/src/System.Management.Automation/engine/UserFeedbackParameters.cs index d7119fc4f3a..657d0b4fede 100644 --- a/src/System.Management.Automation/engine/UserFeedbackParameters.cs +++ b/src/System.Management.Automation/engine/UserFeedbackParameters.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Globalization; diff --git a/src/System.Management.Automation/engine/Utils.cs b/src/System.Management.Automation/engine/Utils.cs index f6b6449c9d8..a408a7377fa 100644 --- a/src/System.Management.Automation/engine/Utils.cs +++ b/src/System.Management.Automation/engine/Utils.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Security; diff --git a/src/System.Management.Automation/engine/VariableAttributeCollection.cs b/src/System.Management.Automation/engine/VariableAttributeCollection.cs index c7f850821b3..86dfa5396df 100644 --- a/src/System.Management.Automation/engine/VariableAttributeCollection.cs +++ b/src/System.Management.Automation/engine/VariableAttributeCollection.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using Dbg = System.Management.Automation; diff --git a/src/System.Management.Automation/engine/VariableInterfaces.cs b/src/System.Management.Automation/engine/VariableInterfaces.cs index 0f2f135f505..a3fbe14cd32 100644 --- a/src/System.Management.Automation/engine/VariableInterfaces.cs +++ b/src/System.Management.Automation/engine/VariableInterfaces.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using Dbg = System.Management.Automation; diff --git a/src/System.Management.Automation/engine/VariablePath.cs b/src/System.Management.Automation/engine/VariablePath.cs index 84150f2e050..d5675a8de36 100644 --- a/src/System.Management.Automation/engine/VariablePath.cs +++ b/src/System.Management.Automation/engine/VariablePath.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Diagnostics; diff --git a/src/System.Management.Automation/engine/WinRT/IInspectable.cs b/src/System.Management.Automation/engine/WinRT/IInspectable.cs index d0bdae5744c..c218472b6a3 100644 --- a/src/System.Management.Automation/engine/WinRT/IInspectable.cs +++ b/src/System.Management.Automation/engine/WinRT/IInspectable.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System.Runtime.InteropServices; diff --git a/src/System.Management.Automation/engine/WorkflowInfo.cs b/src/System.Management.Automation/engine/WorkflowInfo.cs index f6339b54620..3966c2c06f9 100644 --- a/src/System.Management.Automation/engine/WorkflowInfo.cs +++ b/src/System.Management.Automation/engine/WorkflowInfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.ObjectModel; diff --git a/src/System.Management.Automation/engine/cmdlet.cs b/src/System.Management.Automation/engine/cmdlet.cs index 9f54718e953..ba66798d5e7 100644 --- a/src/System.Management.Automation/engine/cmdlet.cs +++ b/src/System.Management.Automation/engine/cmdlet.cs @@ -1,7 +1,7 @@ #pragma warning disable 1634, 1691 /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/debugger/Breakpoint.cs b/src/System.Management.Automation/engine/debugger/Breakpoint.cs index 51bcad3245c..5c3da3d7d61 100644 --- a/src/System.Management.Automation/engine/debugger/Breakpoint.cs +++ b/src/System.Management.Automation/engine/debugger/Breakpoint.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/debugger/debugger.cs b/src/System.Management.Automation/engine/debugger/debugger.cs index 2101e47e882..46339db730a 100644 --- a/src/System.Management.Automation/engine/debugger/debugger.cs +++ b/src/System.Management.Automation/engine/debugger/debugger.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; @@ -411,7 +411,7 @@ public abstract class Debugger public event EventHandler RunspaceDebugProcessingCompleted; /// - /// Event raised to indicate that the debugging session is over and runspace debuggers queued for + /// Event raised to indicate that the debugging session is over and runspace debuggers queued for /// processing should be released. /// public event EventHandler CancelRunspaceDebugProcessing; diff --git a/src/System.Management.Automation/engine/hostifaces/AsyncResult.cs b/src/System.Management.Automation/engine/hostifaces/AsyncResult.cs index c7181032f26..3b33c4458d2 100644 --- a/src/System.Management.Automation/engine/hostifaces/AsyncResult.cs +++ b/src/System.Management.Automation/engine/hostifaces/AsyncResult.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Threading; diff --git a/src/System.Management.Automation/engine/hostifaces/ChoiceDescription.cs b/src/System.Management.Automation/engine/hostifaces/ChoiceDescription.cs index 0ff1dcae46d..48a7af34071 100644 --- a/src/System.Management.Automation/engine/hostifaces/ChoiceDescription.cs +++ b/src/System.Management.Automation/engine/hostifaces/ChoiceDescription.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ diff --git a/src/System.Management.Automation/engine/hostifaces/Command.cs b/src/System.Management.Automation/engine/hostifaces/Command.cs index bed8852ff18..11cedec7b24 100644 --- a/src/System.Management.Automation/engine/hostifaces/Command.cs +++ b/src/System.Management.Automation/engine/hostifaces/Command.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/hostifaces/Connection.cs b/src/System.Management.Automation/engine/hostifaces/Connection.cs index 8828d3d5477..398a728831c 100644 --- a/src/System.Management.Automation/engine/hostifaces/Connection.cs +++ b/src/System.Management.Automation/engine/hostifaces/Connection.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Diagnostics.CodeAnalysis; diff --git a/src/System.Management.Automation/engine/hostifaces/ConnectionBase.cs b/src/System.Management.Automation/engine/hostifaces/ConnectionBase.cs index 152075ff89c..094d0189d04 100644 --- a/src/System.Management.Automation/engine/hostifaces/ConnectionBase.cs +++ b/src/System.Management.Automation/engine/hostifaces/ConnectionBase.cs @@ -1,5 +1,5 @@ /********************************************************************++ - * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. * --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/hostifaces/ConnectionFactory.cs b/src/System.Management.Automation/engine/hostifaces/ConnectionFactory.cs index 5a1630cec68..6a95c8865a3 100644 --- a/src/System.Management.Automation/engine/hostifaces/ConnectionFactory.cs +++ b/src/System.Management.Automation/engine/hostifaces/ConnectionFactory.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Globalization; diff --git a/src/System.Management.Automation/engine/hostifaces/DefaultHost.cs b/src/System.Management.Automation/engine/hostifaces/DefaultHost.cs index a395f79aa71..3c8634e1d00 100644 --- a/src/System.Management.Automation/engine/hostifaces/DefaultHost.cs +++ b/src/System.Management.Automation/engine/hostifaces/DefaultHost.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/engine/hostifaces/FieldDescription.cs b/src/System.Management.Automation/engine/hostifaces/FieldDescription.cs index b34758c60c3..7825ab28919 100644 --- a/src/System.Management.Automation/engine/hostifaces/FieldDescription.cs +++ b/src/System.Management.Automation/engine/hostifaces/FieldDescription.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ diff --git a/src/System.Management.Automation/engine/hostifaces/History.cs b/src/System.Management.Automation/engine/hostifaces/History.cs index c1b6f151f97..7fa640a1f0e 100644 --- a/src/System.Management.Automation/engine/hostifaces/History.cs +++ b/src/System.Management.Automation/engine/hostifaces/History.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/engine/hostifaces/InformationalRecord.cs b/src/System.Management.Automation/engine/hostifaces/InformationalRecord.cs index c9fbf7a467f..9ed6e675e53 100644 --- a/src/System.Management.Automation/engine/hostifaces/InformationalRecord.cs +++ b/src/System.Management.Automation/engine/hostifaces/InformationalRecord.cs @@ -1,5 +1,5 @@ /********************************************************************++ - * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. * --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/hostifaces/InternalHost.cs b/src/System.Management.Automation/engine/hostifaces/InternalHost.cs index fee449c796f..26253e07d38 100644 --- a/src/System.Management.Automation/engine/hostifaces/InternalHost.cs +++ b/src/System.Management.Automation/engine/hostifaces/InternalHost.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Globalization; diff --git a/src/System.Management.Automation/engine/hostifaces/InternalHostRawUserInterface.cs b/src/System.Management.Automation/engine/hostifaces/InternalHostRawUserInterface.cs index a39965b2f8b..652693cbb7a 100644 --- a/src/System.Management.Automation/engine/hostifaces/InternalHostRawUserInterface.cs +++ b/src/System.Management.Automation/engine/hostifaces/InternalHostRawUserInterface.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ diff --git a/src/System.Management.Automation/engine/hostifaces/InternalHostUserInterface.cs b/src/System.Management.Automation/engine/hostifaces/InternalHostUserInterface.cs index 0cad91cb1d3..9be358ee6c3 100644 --- a/src/System.Management.Automation/engine/hostifaces/InternalHostUserInterface.cs +++ b/src/System.Management.Automation/engine/hostifaces/InternalHostUserInterface.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ diff --git a/src/System.Management.Automation/engine/hostifaces/ListModifier.cs b/src/System.Management.Automation/engine/hostifaces/ListModifier.cs index 6fe0c2eb3a7..237fa4ec0c7 100644 --- a/src/System.Management.Automation/engine/hostifaces/ListModifier.cs +++ b/src/System.Management.Automation/engine/hostifaces/ListModifier.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ namespace System.Management.Automation diff --git a/src/System.Management.Automation/engine/hostifaces/LocalConnection.cs b/src/System.Management.Automation/engine/hostifaces/LocalConnection.cs index d58876ac92d..bf625202bff 100644 --- a/src/System.Management.Automation/engine/hostifaces/LocalConnection.cs +++ b/src/System.Management.Automation/engine/hostifaces/LocalConnection.cs @@ -1,5 +1,5 @@ /********************************************************************++ - * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. * --********************************************************************/ using System.IO; diff --git a/src/System.Management.Automation/engine/hostifaces/LocalPipeline.cs b/src/System.Management.Automation/engine/hostifaces/LocalPipeline.cs index 07050165e3b..03c4e922fbb 100644 --- a/src/System.Management.Automation/engine/hostifaces/LocalPipeline.cs +++ b/src/System.Management.Automation/engine/hostifaces/LocalPipeline.cs @@ -1,5 +1,5 @@ /********************************************************************++ - * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. * --********************************************************************/ using System.Diagnostics; diff --git a/src/System.Management.Automation/engine/hostifaces/MshHost.cs b/src/System.Management.Automation/engine/hostifaces/MshHost.cs index 2256df9c36b..1ad99b0313d 100644 --- a/src/System.Management.Automation/engine/hostifaces/MshHost.cs +++ b/src/System.Management.Automation/engine/hostifaces/MshHost.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation.Runspaces; diff --git a/src/System.Management.Automation/engine/hostifaces/MshHostRawUserInterface.cs b/src/System.Management.Automation/engine/hostifaces/MshHostRawUserInterface.cs index f48683e4b3d..a57f1907978 100644 --- a/src/System.Management.Automation/engine/hostifaces/MshHostRawUserInterface.cs +++ b/src/System.Management.Automation/engine/hostifaces/MshHostRawUserInterface.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ diff --git a/src/System.Management.Automation/engine/hostifaces/MshHostUserInterface.cs b/src/System.Management.Automation/engine/hostifaces/MshHostUserInterface.cs index 6d64065a5bd..3caa17609b3 100644 --- a/src/System.Management.Automation/engine/hostifaces/MshHostUserInterface.cs +++ b/src/System.Management.Automation/engine/hostifaces/MshHostUserInterface.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.IO; diff --git a/src/System.Management.Automation/engine/hostifaces/NativeCultureResolver.cs b/src/System.Management.Automation/engine/hostifaces/NativeCultureResolver.cs index 921db56dab0..fc5650b3398 100644 --- a/src/System.Management.Automation/engine/hostifaces/NativeCultureResolver.cs +++ b/src/System.Management.Automation/engine/hostifaces/NativeCultureResolver.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. Description: diff --git a/src/System.Management.Automation/engine/hostifaces/PSCommand.cs b/src/System.Management.Automation/engine/hostifaces/PSCommand.cs index 686bf4afc3b..3b0266586c9 100644 --- a/src/System.Management.Automation/engine/hostifaces/PSCommand.cs +++ b/src/System.Management.Automation/engine/hostifaces/PSCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation.Runspaces; diff --git a/src/System.Management.Automation/engine/hostifaces/PSDataCollection.cs b/src/System.Management.Automation/engine/hostifaces/PSDataCollection.cs index 982b19c426c..f2b4fe0ca48 100644 --- a/src/System.Management.Automation/engine/hostifaces/PSDataCollection.cs +++ b/src/System.Management.Automation/engine/hostifaces/PSDataCollection.cs @@ -1,5 +1,5 @@ /********************************************************************++ - * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. * --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/hostifaces/Parameter.cs b/src/System.Management.Automation/engine/hostifaces/Parameter.cs index 5f7c237546e..49ab6cd7919 100644 --- a/src/System.Management.Automation/engine/hostifaces/Parameter.cs +++ b/src/System.Management.Automation/engine/hostifaces/Parameter.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation.Language; diff --git a/src/System.Management.Automation/engine/hostifaces/Pipeline.cs b/src/System.Management.Automation/engine/hostifaces/Pipeline.cs index 88e83f4d2ee..fd7e2e4cd49 100644 --- a/src/System.Management.Automation/engine/hostifaces/Pipeline.cs +++ b/src/System.Management.Automation/engine/hostifaces/Pipeline.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/hostifaces/PowerShell.cs b/src/System.Management.Automation/engine/hostifaces/PowerShell.cs index 5db5e5171df..39d8ba249b1 100644 --- a/src/System.Management.Automation/engine/hostifaces/PowerShell.cs +++ b/src/System.Management.Automation/engine/hostifaces/PowerShell.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/hostifaces/PowerShellProcessInstance.cs b/src/System.Management.Automation/engine/hostifaces/PowerShellProcessInstance.cs index 77b1e706cf7..a13c97a8a2e 100644 --- a/src/System.Management.Automation/engine/hostifaces/PowerShellProcessInstance.cs +++ b/src/System.Management.Automation/engine/hostifaces/PowerShellProcessInstance.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.ComponentModel; diff --git a/src/System.Management.Automation/engine/hostifaces/RunspaceInit.cs b/src/System.Management.Automation/engine/hostifaces/RunspaceInit.cs index fab00557327..17001670df0 100644 --- a/src/System.Management.Automation/engine/hostifaces/RunspaceInit.cs +++ b/src/System.Management.Automation/engine/hostifaces/RunspaceInit.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using Dbg = System.Management.Automation.Diagnostics; diff --git a/src/System.Management.Automation/engine/hostifaces/RunspaceInvoke.cs b/src/System.Management.Automation/engine/hostifaces/RunspaceInvoke.cs index e364b62514d..3ee11cfd8ad 100644 --- a/src/System.Management.Automation/engine/hostifaces/RunspaceInvoke.cs +++ b/src/System.Management.Automation/engine/hostifaces/RunspaceInvoke.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ namespace System.Management.Automation diff --git a/src/System.Management.Automation/engine/hostifaces/RunspacePool.cs b/src/System.Management.Automation/engine/hostifaces/RunspacePool.cs index 7d938b51722..33966d90579 100644 --- a/src/System.Management.Automation/engine/hostifaces/RunspacePool.cs +++ b/src/System.Management.Automation/engine/hostifaces/RunspacePool.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Threading; diff --git a/src/System.Management.Automation/engine/hostifaces/RunspacePoolInternal.cs b/src/System.Management.Automation/engine/hostifaces/RunspacePoolInternal.cs index 9aa7442b27d..35608783ae8 100644 --- a/src/System.Management.Automation/engine/hostifaces/RunspacePoolInternal.cs +++ b/src/System.Management.Automation/engine/hostifaces/RunspacePoolInternal.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/hostifaces/internalHostuserInterfacesecurity.cs b/src/System.Management.Automation/engine/hostifaces/internalHostuserInterfacesecurity.cs index 898434aefc0..17d17cb90f4 100644 --- a/src/System.Management.Automation/engine/hostifaces/internalHostuserInterfacesecurity.cs +++ b/src/System.Management.Automation/engine/hostifaces/internalHostuserInterfacesecurity.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ diff --git a/src/System.Management.Automation/engine/hostifaces/pipelinebase.cs b/src/System.Management.Automation/engine/hostifaces/pipelinebase.cs index d7ef5a74b7b..90a6b90c17f 100644 --- a/src/System.Management.Automation/engine/hostifaces/pipelinebase.cs +++ b/src/System.Management.Automation/engine/hostifaces/pipelinebase.cs @@ -1,5 +1,5 @@ /********************************************************************++ - * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. * --********************************************************************/ namespace System.Management.Automation.Runspaces diff --git a/src/System.Management.Automation/engine/interpreter/Utilities.cs b/src/System.Management.Automation/engine/interpreter/Utilities.cs index 7cf048364fd..1100ce9e3c4 100644 --- a/src/System.Management.Automation/engine/interpreter/Utilities.cs +++ b/src/System.Management.Automation/engine/interpreter/Utilities.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/lang/codegen.cs b/src/System.Management.Automation/engine/lang/codegen.cs index e8877c253ca..6e20600406e 100644 --- a/src/System.Management.Automation/engine/lang/codegen.cs +++ b/src/System.Management.Automation/engine/lang/codegen.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Text; diff --git a/src/System.Management.Automation/engine/lang/interface/PSParseError.cs b/src/System.Management.Automation/engine/lang/interface/PSParseError.cs index 6a1961deac5..c29e49856ef 100644 --- a/src/System.Management.Automation/engine/lang/interface/PSParseError.cs +++ b/src/System.Management.Automation/engine/lang/interface/PSParseError.cs @@ -1,5 +1,5 @@ /********************************************************************++ - Copyright (C) Microsoft Corporation, 2003 + Copyright (c) Microsoft Corporation. All rights reserved. Project: PowerShell diff --git a/src/System.Management.Automation/engine/lang/interface/PSParser.cs b/src/System.Management.Automation/engine/lang/interface/PSParser.cs index 51ad659617a..1ea3b176ef9 100644 --- a/src/System.Management.Automation/engine/lang/interface/PSParser.cs +++ b/src/System.Management.Automation/engine/lang/interface/PSParser.cs @@ -1,5 +1,5 @@ /********************************************************************++ - Copyright (C) Microsoft Corporation, 2003 + Copyright (c) Microsoft Corporation. All rights reserved. Project: PowerShell diff --git a/src/System.Management.Automation/engine/lang/interface/PSToken.cs b/src/System.Management.Automation/engine/lang/interface/PSToken.cs index 1c3a81a6d1a..ee9c4566b5f 100644 --- a/src/System.Management.Automation/engine/lang/interface/PSToken.cs +++ b/src/System.Management.Automation/engine/lang/interface/PSToken.cs @@ -1,5 +1,5 @@ /********************************************************************++ - Copyright (C) Microsoft Corporation, 2003 + Copyright (c) Microsoft Corporation. All rights reserved. Project: PowerShell diff --git a/src/System.Management.Automation/engine/lang/parserutils.cs b/src/System.Management.Automation/engine/lang/parserutils.cs index 1052044e3a8..1be5c02a347 100644 --- a/src/System.Management.Automation/engine/lang/parserutils.cs +++ b/src/System.Management.Automation/engine/lang/parserutils.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/lang/scriptblock.cs b/src/System.Management.Automation/engine/lang/scriptblock.cs index 448042eb0d8..5c4a5fef5cf 100644 --- a/src/System.Management.Automation/engine/lang/scriptblock.cs +++ b/src/System.Management.Automation/engine/lang/scriptblock.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/parser/AstVisitor.cs b/src/System.Management.Automation/engine/parser/AstVisitor.cs index d0e0a9982b5..de4255de363 100644 --- a/src/System.Management.Automation/engine/parser/AstVisitor.cs +++ b/src/System.Management.Automation/engine/parser/AstVisitor.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/parser/CharTraits.cs b/src/System.Management.Automation/engine/parser/CharTraits.cs index accbc81e7ab..be5b90d0778 100644 --- a/src/System.Management.Automation/engine/parser/CharTraits.cs +++ b/src/System.Management.Automation/engine/parser/CharTraits.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ namespace System.Management.Automation.Language diff --git a/src/System.Management.Automation/engine/parser/Compiler.cs b/src/System.Management.Automation/engine/parser/Compiler.cs index bddddf1c734..9a01f0de215 100644 --- a/src/System.Management.Automation/engine/parser/Compiler.cs +++ b/src/System.Management.Automation/engine/parser/Compiler.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/parser/ConstantValues.cs b/src/System.Management.Automation/engine/parser/ConstantValues.cs index ee3effd8675..8f6f0df41db 100644 --- a/src/System.Management.Automation/engine/parser/ConstantValues.cs +++ b/src/System.Management.Automation/engine/parser/ConstantValues.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/parser/FusionAssemblyIdentity.cs b/src/System.Management.Automation/engine/parser/FusionAssemblyIdentity.cs index 5a0de0c3a46..2179b73595a 100644 --- a/src/System.Management.Automation/engine/parser/FusionAssemblyIdentity.cs +++ b/src/System.Management.Automation/engine/parser/FusionAssemblyIdentity.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/parser/GlobalAssemblyCache.cs b/src/System.Management.Automation/engine/parser/GlobalAssemblyCache.cs index 254d37b7cc2..27345674487 100644 --- a/src/System.Management.Automation/engine/parser/GlobalAssemblyCache.cs +++ b/src/System.Management.Automation/engine/parser/GlobalAssemblyCache.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/parser/PSType.cs b/src/System.Management.Automation/engine/parser/PSType.cs index 5c47c8e6aa9..1a5a15fc772 100644 --- a/src/System.Management.Automation/engine/parser/PSType.cs +++ b/src/System.Management.Automation/engine/parser/PSType.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; @@ -1172,7 +1172,7 @@ internal static Assembly DefineTypes(Parser parser, Ast rootAst, TypeDefinitionA SessionStateKeeper sessionStateKeeper = new SessionStateKeeper(); helperType.GetField(s_sessionStateKeeperFieldName, BindingFlags.NonPublic | BindingFlags.Static).SetValue(null, sessionStateKeeper); - + if (helper._fieldsToInitForMemberFunctions != null) { foreach (var tuple in helper._fieldsToInitForMemberFunctions) diff --git a/src/System.Management.Automation/engine/parser/Parser.cs b/src/System.Management.Automation/engine/parser/Parser.cs index 98d6533d201..b347cbd3e03 100644 --- a/src/System.Management.Automation/engine/parser/Parser.cs +++ b/src/System.Management.Automation/engine/parser/Parser.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/parser/Position.cs b/src/System.Management.Automation/engine/parser/Position.cs index 0b2bcdb4b0d..c5aa366b7e0 100644 --- a/src/System.Management.Automation/engine/parser/Position.cs +++ b/src/System.Management.Automation/engine/parser/Position.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Diagnostics.CodeAnalysis; diff --git a/src/System.Management.Automation/engine/parser/PreOrderVisitor.cs b/src/System.Management.Automation/engine/parser/PreOrderVisitor.cs index 68263ea57b8..62defcc9a58 100644 --- a/src/System.Management.Automation/engine/parser/PreOrderVisitor.cs +++ b/src/System.Management.Automation/engine/parser/PreOrderVisitor.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Diagnostics.CodeAnalysis; diff --git a/src/System.Management.Automation/engine/parser/SafeValues.cs b/src/System.Management.Automation/engine/parser/SafeValues.cs index 9835d52c77e..ed1924382de 100644 --- a/src/System.Management.Automation/engine/parser/SafeValues.cs +++ b/src/System.Management.Automation/engine/parser/SafeValues.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/parser/SemanticChecks.cs b/src/System.Management.Automation/engine/parser/SemanticChecks.cs index 873b74a5b65..86394e5ba06 100644 --- a/src/System.Management.Automation/engine/parser/SemanticChecks.cs +++ b/src/System.Management.Automation/engine/parser/SemanticChecks.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/parser/SymbolResolver.cs b/src/System.Management.Automation/engine/parser/SymbolResolver.cs index fae20a066f3..cc8dc8f92ee 100644 --- a/src/System.Management.Automation/engine/parser/SymbolResolver.cs +++ b/src/System.Management.Automation/engine/parser/SymbolResolver.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Globalization; diff --git a/src/System.Management.Automation/engine/parser/TypeResolver.cs b/src/System.Management.Automation/engine/parser/TypeResolver.cs index 006dbf084e5..1728c2f812e 100644 --- a/src/System.Management.Automation/engine/parser/TypeResolver.cs +++ b/src/System.Management.Automation/engine/parser/TypeResolver.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ // for fxcop diff --git a/src/System.Management.Automation/engine/parser/VariableAnalysis.cs b/src/System.Management.Automation/engine/parser/VariableAnalysis.cs index d268d1beb91..f89c3b83575 100644 --- a/src/System.Management.Automation/engine/parser/VariableAnalysis.cs +++ b/src/System.Management.Automation/engine/parser/VariableAnalysis.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/parser/ast.cs b/src/System.Management.Automation/engine/parser/ast.cs index ff9dc636e75..63dca76ca86 100644 --- a/src/System.Management.Automation/engine/parser/ast.cs +++ b/src/System.Management.Automation/engine/parser/ast.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ // diff --git a/src/System.Management.Automation/engine/parser/token.cs b/src/System.Management.Automation/engine/parser/token.cs index 9d87896ab1c..4d4940cc302 100644 --- a/src/System.Management.Automation/engine/parser/token.cs +++ b/src/System.Management.Automation/engine/parser/token.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/parser/tokenizer.cs b/src/System.Management.Automation/engine/parser/tokenizer.cs index fe9ea2250d3..c951d1f996a 100644 --- a/src/System.Management.Automation/engine/parser/tokenizer.cs +++ b/src/System.Management.Automation/engine/parser/tokenizer.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using Microsoft.PowerShell.Commands; diff --git a/src/System.Management.Automation/engine/pipeline.cs b/src/System.Management.Automation/engine/pipeline.cs index 661ef5e7c0c..1d009797821 100644 --- a/src/System.Management.Automation/engine/pipeline.cs +++ b/src/System.Management.Automation/engine/pipeline.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/regex.cs b/src/System.Management.Automation/engine/regex.cs index fbe58907a44..31ee5d8dfb4 100644 --- a/src/System.Management.Automation/engine/regex.cs +++ b/src/System.Management.Automation/engine/regex.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #pragma warning disable 1634, 1691 diff --git a/src/System.Management.Automation/engine/remoting/client/ClientMethodExecutor.cs b/src/System.Management.Automation/engine/remoting/client/ClientMethodExecutor.cs index a1ba8526465..8f4cd97678d 100644 --- a/src/System.Management.Automation/engine/remoting/client/ClientMethodExecutor.cs +++ b/src/System.Management.Automation/engine/remoting/client/ClientMethodExecutor.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation.Host; diff --git a/src/System.Management.Automation/engine/remoting/client/ClientRemotePowerShell.cs b/src/System.Management.Automation/engine/remoting/client/ClientRemotePowerShell.cs index b3c89a4f802..11e3b2e52b9 100644 --- a/src/System.Management.Automation/engine/remoting/client/ClientRemotePowerShell.cs +++ b/src/System.Management.Automation/engine/remoting/client/ClientRemotePowerShell.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/remoting/client/Job.cs b/src/System.Management.Automation/engine/remoting/client/Job.cs index adf0d5ad3bd..a86af8f8ec4 100644 --- a/src/System.Management.Automation/engine/remoting/client/Job.cs +++ b/src/System.Management.Automation/engine/remoting/client/Job.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/remoting/client/Job2.cs b/src/System.Management.Automation/engine/remoting/client/Job2.cs index 43ec4f9b079..97022d689e0 100644 --- a/src/System.Management.Automation/engine/remoting/client/Job2.cs +++ b/src/System.Management.Automation/engine/remoting/client/Job2.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Linq; diff --git a/src/System.Management.Automation/engine/remoting/client/JobManager.cs b/src/System.Management.Automation/engine/remoting/client/JobManager.cs index c27c7dd3898..2d7862a9318 100644 --- a/src/System.Management.Automation/engine/remoting/client/JobManager.cs +++ b/src/System.Management.Automation/engine/remoting/client/JobManager.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/remoting/client/JobSourceAdapter.cs b/src/System.Management.Automation/engine/remoting/client/JobSourceAdapter.cs index a972cd27935..4424e4fa547 100644 --- a/src/System.Management.Automation/engine/remoting/client/JobSourceAdapter.cs +++ b/src/System.Management.Automation/engine/remoting/client/JobSourceAdapter.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/remoting/client/PSProxyJob.cs b/src/System.Management.Automation/engine/remoting/client/PSProxyJob.cs index 3f9bbe36327..ca011590fd4 100644 --- a/src/System.Management.Automation/engine/remoting/client/PSProxyJob.cs +++ b/src/System.Management.Automation/engine/remoting/client/PSProxyJob.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/remoting/client/PowerShellStreams.cs b/src/System.Management.Automation/engine/remoting/client/PowerShellStreams.cs index 7dbcddf2f32..d0cd4dd1830 100644 --- a/src/System.Management.Automation/engine/remoting/client/PowerShellStreams.cs +++ b/src/System.Management.Automation/engine/remoting/client/PowerShellStreams.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ namespace System.Management.Automation diff --git a/src/System.Management.Automation/engine/remoting/client/RemoteRunspacePoolInternal.cs b/src/System.Management.Automation/engine/remoting/client/RemoteRunspacePoolInternal.cs index d9110ed693f..705eaa49be4 100644 --- a/src/System.Management.Automation/engine/remoting/client/RemoteRunspacePoolInternal.cs +++ b/src/System.Management.Automation/engine/remoting/client/RemoteRunspacePoolInternal.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/remoting/client/RemotingErrorRecord.cs b/src/System.Management.Automation/engine/remoting/client/RemotingErrorRecord.cs index cf52f20cc26..ebc5040c507 100644 --- a/src/System.Management.Automation/engine/remoting/client/RemotingErrorRecord.cs +++ b/src/System.Management.Automation/engine/remoting/client/RemotingErrorRecord.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System.Runtime.Serialization; diff --git a/src/System.Management.Automation/engine/remoting/client/RemotingProtocol2.cs b/src/System.Management.Automation/engine/remoting/client/RemotingProtocol2.cs index 22fa7f254f2..d2199a65938 100644 --- a/src/System.Management.Automation/engine/remoting/client/RemotingProtocol2.cs +++ b/src/System.Management.Automation/engine/remoting/client/RemotingProtocol2.cs @@ -1,5 +1,5 @@ /********************************************************************++ - * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. * --********************************************************************/ using System.Management.Automation.Tracing; diff --git a/src/System.Management.Automation/engine/remoting/client/RunspaceRef.cs b/src/System.Management.Automation/engine/remoting/client/RunspaceRef.cs index f58f1d57c25..3f1d865ef23 100644 --- a/src/System.Management.Automation/engine/remoting/client/RunspaceRef.cs +++ b/src/System.Management.Automation/engine/remoting/client/RunspaceRef.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.ObjectModel; diff --git a/src/System.Management.Automation/engine/remoting/client/ThrottlingJob.cs b/src/System.Management.Automation/engine/remoting/client/ThrottlingJob.cs index 676f3df9101..b9740d7506f 100644 --- a/src/System.Management.Automation/engine/remoting/client/ThrottlingJob.cs +++ b/src/System.Management.Automation/engine/remoting/client/ThrottlingJob.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Concurrent; diff --git a/src/System.Management.Automation/engine/remoting/client/clientremotesession.cs b/src/System.Management.Automation/engine/remoting/client/clientremotesession.cs index 61be0720690..a717ba21959 100644 --- a/src/System.Management.Automation/engine/remoting/client/clientremotesession.cs +++ b/src/System.Management.Automation/engine/remoting/client/clientremotesession.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Threading; diff --git a/src/System.Management.Automation/engine/remoting/client/clientremotesessionprotocolstatemachine.cs b/src/System.Management.Automation/engine/remoting/client/clientremotesessionprotocolstatemachine.cs index c538e221e9c..fd192d15d25 100644 --- a/src/System.Management.Automation/engine/remoting/client/clientremotesessionprotocolstatemachine.cs +++ b/src/System.Management.Automation/engine/remoting/client/clientremotesessionprotocolstatemachine.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Threading; diff --git a/src/System.Management.Automation/engine/remoting/client/remotepipeline.cs b/src/System.Management.Automation/engine/remoting/client/remotepipeline.cs index 73629a3f62a..50ebd75219d 100644 --- a/src/System.Management.Automation/engine/remoting/client/remotepipeline.cs +++ b/src/System.Management.Automation/engine/remoting/client/remotepipeline.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ diff --git a/src/System.Management.Automation/engine/remoting/client/remoterunspace.cs b/src/System.Management.Automation/engine/remoting/client/remoterunspace.cs index 96c1f0eb0df..a13b0a90e1e 100644 --- a/src/System.Management.Automation/engine/remoting/client/remoterunspace.cs +++ b/src/System.Management.Automation/engine/remoting/client/remoterunspace.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation.Runspaces; diff --git a/src/System.Management.Automation/engine/remoting/client/remoterunspaceinfo.cs b/src/System.Management.Automation/engine/remoting/client/remoterunspaceinfo.cs index 0228bac6866..787f4de24cd 100644 --- a/src/System.Management.Automation/engine/remoting/client/remoterunspaceinfo.cs +++ b/src/System.Management.Automation/engine/remoting/client/remoterunspaceinfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation.Internal; diff --git a/src/System.Management.Automation/engine/remoting/client/remotingprotocol.cs b/src/System.Management.Automation/engine/remoting/client/remotingprotocol.cs index 8ea0739455d..77d39aa2238 100644 --- a/src/System.Management.Automation/engine/remoting/client/remotingprotocol.cs +++ b/src/System.Management.Automation/engine/remoting/client/remotingprotocol.cs @@ -1,5 +1,5 @@ /********************************************************************++ - * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. * --********************************************************************/ using System.Management.Automation.Remoting.Client; diff --git a/src/System.Management.Automation/engine/remoting/client/remotingprotocolimplementation.cs b/src/System.Management.Automation/engine/remoting/client/remotingprotocolimplementation.cs index b6dc41ba9c0..0fac991e7a6 100644 --- a/src/System.Management.Automation/engine/remoting/client/remotingprotocolimplementation.cs +++ b/src/System.Management.Automation/engine/remoting/client/remotingprotocolimplementation.cs @@ -1,5 +1,5 @@ /********************************************************************++ - * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. * --********************************************************************/ using System.Management.Automation.Internal; diff --git a/src/System.Management.Automation/engine/remoting/commands/ConnectPSSession.cs b/src/System.Management.Automation/engine/remoting/commands/ConnectPSSession.cs index cdb3cc2aeb3..d68f5506d10 100644 --- a/src/System.Management.Automation/engine/remoting/commands/ConnectPSSession.cs +++ b/src/System.Management.Automation/engine/remoting/commands/ConnectPSSession.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/engine/remoting/commands/CustomShellCommands.cs b/src/System.Management.Automation/engine/remoting/commands/CustomShellCommands.cs index 5178faa489c..f550f163ca4 100644 --- a/src/System.Management.Automation/engine/remoting/commands/CustomShellCommands.cs +++ b/src/System.Management.Automation/engine/remoting/commands/CustomShellCommands.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/engine/remoting/commands/DebugJob.cs b/src/System.Management.Automation/engine/remoting/commands/DebugJob.cs index d2a7efddf4e..449c4011f3d 100644 --- a/src/System.Management.Automation/engine/remoting/commands/DebugJob.cs +++ b/src/System.Management.Automation/engine/remoting/commands/DebugJob.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/engine/remoting/commands/DisconnectPSSession.cs b/src/System.Management.Automation/engine/remoting/commands/DisconnectPSSession.cs index 13cd3bd98d5..78b48f48198 100644 --- a/src/System.Management.Automation/engine/remoting/commands/DisconnectPSSession.cs +++ b/src/System.Management.Automation/engine/remoting/commands/DisconnectPSSession.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/engine/remoting/commands/EnterPSHostProcessCommand.cs b/src/System.Management.Automation/engine/remoting/commands/EnterPSHostProcessCommand.cs index 8fc706ab0bd..6538474339e 100644 --- a/src/System.Management.Automation/engine/remoting/commands/EnterPSHostProcessCommand.cs +++ b/src/System.Management.Automation/engine/remoting/commands/EnterPSHostProcessCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/engine/remoting/commands/GetJob.cs b/src/System.Management.Automation/engine/remoting/commands/GetJob.cs index fa0d3efdbb5..b906542a2ad 100644 --- a/src/System.Management.Automation/engine/remoting/commands/GetJob.cs +++ b/src/System.Management.Automation/engine/remoting/commands/GetJob.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Diagnostics.CodeAnalysis; diff --git a/src/System.Management.Automation/engine/remoting/commands/InvokeCommandCommand.cs b/src/System.Management.Automation/engine/remoting/commands/InvokeCommandCommand.cs index 813e3161716..9c400743c89 100644 --- a/src/System.Management.Automation/engine/remoting/commands/InvokeCommandCommand.cs +++ b/src/System.Management.Automation/engine/remoting/commands/InvokeCommandCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/engine/remoting/commands/JobRepository.cs b/src/System.Management.Automation/engine/remoting/commands/JobRepository.cs index 8d8c57f5a10..f99e6a20439 100644 --- a/src/System.Management.Automation/engine/remoting/commands/JobRepository.cs +++ b/src/System.Management.Automation/engine/remoting/commands/JobRepository.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/remoting/commands/NewPSSessionConfigurationOptionCommand.cs b/src/System.Management.Automation/engine/remoting/commands/NewPSSessionConfigurationOptionCommand.cs index bea7a541c8b..0823bc7cad8 100644 --- a/src/System.Management.Automation/engine/remoting/commands/NewPSSessionConfigurationOptionCommand.cs +++ b/src/System.Management.Automation/engine/remoting/commands/NewPSSessionConfigurationOptionCommand.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System.Text; diff --git a/src/System.Management.Automation/engine/remoting/commands/NewPSSessionOptionCommand.cs b/src/System.Management.Automation/engine/remoting/commands/NewPSSessionOptionCommand.cs index 5f97bc4941a..ea7bf4ce0e9 100644 --- a/src/System.Management.Automation/engine/remoting/commands/NewPSSessionOptionCommand.cs +++ b/src/System.Management.Automation/engine/remoting/commands/NewPSSessionOptionCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; @@ -12,24 +12,24 @@ namespace System.Management.Automation.Remoting { /// - /// IMPORTANT: proxy configuration is supported for HTTPS only; for HTTP, the direct - /// connection to the server is used + /// IMPORTANT: proxy configuration is supported for HTTPS only; for HTTP, the direct + /// connection to the server is used /// [SuppressMessage("Microsoft.Design", "CA1027:MarkEnumsWithFlags")] public enum ProxyAccessType { /// - /// ProxyAccessType is not specified. That means Proxy information (ProxyAccessType, ProxyAuthenticationMechanism + /// ProxyAccessType is not specified. That means Proxy information (ProxyAccessType, ProxyAuthenticationMechanism /// and ProxyCredential)is not passed to WSMan at all. /// None = 0, /// /// use the Internet Explorer proxy configuration for the current user. - /// Internet Explorer proxy settings for the current active network connection. - /// This option requires the user profile to be loaded, so the option can - /// be directly used when called within a process that is running under - /// an interactive user account identity; if the client application is running - /// under a user context different than the interactive user, the client + /// Internet Explorer proxy settings for the current active network connection. + /// This option requires the user profile to be loaded, so the option can + /// be directly used when called within a process that is running under + /// an interactive user account identity; if the client application is running + /// under a user context different than the interactive user, the client /// application has to explicitly load the user profile prior to using this option. /// IEConfig = 1, @@ -67,9 +67,9 @@ public PSSessionOption() /// /// If false, underlying WSMan infrastructure will compress data sent on the network. - /// If true, data will not be compressed. Compression improves performance by + /// If true, data will not be compressed. Compression improves performance by /// reducing the amount of data sent on the network. Compression my require extra - /// memory consumption and CPU usage. In cases where available memory / CPU is less, + /// memory consumption and CPU usage. In cases where available memory / CPU is less, /// set this property to "true". /// By default the value of this property is "false". /// @@ -78,25 +78,25 @@ public PSSessionOption() /// /// If true then Operating System won't load the user profile (i.e. registry keys under HKCU) on the remote server /// which can result in a faster session creation time. This option won't have any effect if the remote machine has - /// already loaded the profile (i.e. in another session). + /// already loaded the profile (i.e. in another session). /// public bool NoMachineProfile { get; set; } = false; /// - /// By default, ProxyAccessType is None, that means Proxy information (ProxyAccessType, + /// By default, ProxyAccessType is None, that means Proxy information (ProxyAccessType, /// ProxyAuthenticationMechanism and ProxyCredential)is not passed to WSMan at all. /// public ProxyAccessType ProxyAccessType { get; set; } = ProxyAccessType.None; /// /// The following is the definition of the input parameter "ProxyAuthentication". - /// This parameter takes a set of authentication methods the user can select + /// This parameter takes a set of authentication methods the user can select /// from. The available options should be as follows: - /// - Negotiate: Use the default authentication (as defined by the underlying + /// - Negotiate: Use the default authentication (as defined by the underlying /// protocol) for establishing a remote connection. /// - Basic: Use basic authentication for establishing a remote connection /// - Digest: Use Digest authentication for establishing a remote connection - /// + /// /// Default is Negotiate. /// public AuthenticationMechanism ProxyAuthentication @@ -130,47 +130,47 @@ public AuthenticationMechanism ProxyAuthentication /// - /// When connecting over HTTPS, the client does not validate that the server - /// certificate is signed by a trusted certificate authority (CA). Use only when - /// the remote computer is trusted by other means, for example, if the remote - /// computer is part of a network that is physically secure and isolated or the + /// When connecting over HTTPS, the client does not validate that the server + /// certificate is signed by a trusted certificate authority (CA). Use only when + /// the remote computer is trusted by other means, for example, if the remote + /// computer is part of a network that is physically secure and isolated or the /// remote computer is listed as a trusted host in WinRM configuration /// public bool SkipCACheck { get; set; } /// - /// Indicates that certificate common name (CN) of the server need not match the - /// hostname of the server. Used only in remote operations using https. This + /// Indicates that certificate common name (CN) of the server need not match the + /// hostname of the server. Used only in remote operations using https. This /// option should only be used for trusted machines. /// public bool SkipCNCheck { get; set; } /// - /// Indicates that certificate common name (CN) of the server need not match the - /// hostname of the server. Used only in remote operations using https. This + /// Indicates that certificate common name (CN) of the server need not match the + /// hostname of the server. Used only in remote operations using https. This /// option should only be used for trusted machines /// public bool SkipRevocationCheck { get; set; } /// - /// The duration for which PowerShell remoting waits before timing out - /// for any operation. The user would like to tweak this timeout + /// The duration for which PowerShell remoting waits before timing out + /// for any operation. The user would like to tweak this timeout /// depending on whether he/she is connecting to a machine in the data /// center or across a slow WAN. - /// + /// /// Default: 3*60*1000 == 3minutes /// public TimeSpan OperationTimeout { get; set; } = TimeSpan.FromMilliseconds(BaseTransportManager.ClientDefaultOperationTimeoutMs); /// - /// Specifies that no encryption will be used when doing remote operations over - /// http. Unencrypted traffic is not allowed by default and must be enabled in + /// Specifies that no encryption will be used when doing remote operations over + /// http. Unencrypted traffic is not allowed by default and must be enabled in /// the local configuration /// public bool NoEncryption { get; set; } /// - /// Indicates the request is encoded in UTF16 format rather than UTF8 format; + /// Indicates the request is encoded in UTF16 format rather than UTF8 format; /// UTF8 is the default. /// [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "UTF")] @@ -226,31 +226,31 @@ public AuthenticationMechanism ProxyAuthentication public PSPrimitiveDictionary ApplicationArguments { get; set; } /// - /// The duration for which PowerShell remoting waits before timing out on a connection to a remote machine. - /// Simply put, the timeout for a remote runspace creation. - /// The user would like to tweak this timeout depending on whether + /// The duration for which PowerShell remoting waits before timing out on a connection to a remote machine. + /// Simply put, the timeout for a remote runspace creation. + /// The user would like to tweak this timeout depending on whether /// he/she is connecting to a machine in the data center or across a slow WAN. - /// + /// /// Default: 3 * 60 * 1000 = 3 minutes /// public TimeSpan OpenTimeout { get; set; } = TimeSpan.FromMilliseconds(RunspaceConnectionInfo.DefaultOpenTimeout); /// - /// The duration for which PowerShell should wait before it times out on cancel operations - /// (close runspace or stop powershell). For instance, when the user hits ctrl-C, - /// New-PSSession cmdlet tries to call a stop on all remote runspaces which are in the Opening state. - /// The user wouldn’t mind waiting for 15 seconds, but this should be time bound and of a shorter duration. + /// The duration for which PowerShell should wait before it times out on cancel operations + /// (close runspace or stop powershell). For instance, when the user hits ctrl-C, + /// New-PSSession cmdlet tries to call a stop on all remote runspaces which are in the Opening state. + /// The user wouldn't mind waiting for 15 seconds, but this should be time bound and of a shorter duration. /// A high timeout here like 3 minutes will give the user a feeling that the PowerShell client has hung. - /// + /// /// Default: 60 * 1000 = 1 minute /// public TimeSpan CancelTimeout { get; set; } = TimeSpan.FromMilliseconds(RunspaceConnectionInfo.defaultCancelTimeout); /// - /// The duration for which a Runspace on server needs to wait before it declares the client dead and closes itself down. - /// This is especially important as these values may have to be configured differently for enterprise administration + /// The duration for which a Runspace on server needs to wait before it declares the client dead and closes itself down. + /// This is especially important as these values may have to be configured differently for enterprise administration /// and exchange scenarios. - /// + /// /// Default: -1 -> Use current server value for IdleTimeout. /// public TimeSpan IdleTimeout { get; set; } = TimeSpan.FromMilliseconds(RunspaceConnectionInfo.DefaultIdleTimeout); @@ -260,7 +260,7 @@ public AuthenticationMechanism ProxyAuthentication namespace Microsoft.PowerShell.Commands { /// - /// This class implements New-PSSessionOption cmdlet. + /// This class implements New-PSSessionOption cmdlet. /// Spec: TBD /// [Cmdlet(VerbsCommon.New, "PSSessionOption", HelpUri = "https://go.microsoft.com/fwlink/?LinkID=144305", RemotingCapability = RemotingCapability.None)] @@ -284,9 +284,9 @@ public int MaximumRedirection /// /// If false, underlying WSMan infrastructure will compress data sent on the network. - /// If true, data will not be compressed. Compression improves performance by + /// If true, data will not be compressed. Compression improves performance by /// reducing the amount of data sent on the network. Compression my require extra - /// memory consumption and CPU usage. In cases where available memory / CPU is less, + /// memory consumption and CPU usage. In cases where available memory / CPU is less, /// set this property to "true". /// By default the value of this property is "false". /// @@ -296,7 +296,7 @@ public int MaximumRedirection /// /// If true then Operating System won't load the user profile (i.e. registry keys under HKCU) on the remote server /// which can result in a faster session creation time. This option won't have any effect if the remote machine has - /// already loaded the profile (i.e. in another session). + /// already loaded the profile (i.e. in another session). /// [Parameter] public SwitchParameter NoMachineProfile { get; set; } @@ -364,11 +364,11 @@ public int MaximumReceivedObjectSize public PSPrimitiveDictionary ApplicationArguments { get; set; } /// - /// The duration for which PowerShell remoting waits (in milliseconds) before timing - /// out on a connection to a remote machine. Simply put, the timeout for a remote - /// runspace creation. - /// - /// The user would like to tweak this timeout depending on whether + /// The duration for which PowerShell remoting waits (in milliseconds) before timing + /// out on a connection to a remote machine. Simply put, the timeout for a remote + /// runspace creation. + /// + /// The user would like to tweak this timeout depending on whether /// he/she is connecting to a machine in the data center or across a slow WAN. /// [Parameter] @@ -386,11 +386,11 @@ public int OpenTimeout private int? _openTimeout; /// - /// The duration for which PowerShell should wait (in milliseconds) before it + /// The duration for which PowerShell should wait (in milliseconds) before it /// times out on cancel operations (close runspace or stop powershell). For /// instance, when the user hits ctrl-C, New-PSSession cmdlet tries to call a - /// stop on all remote runspaces which are in the Opening state. The user - /// wouldn’t mind waiting for 15 seconds, but this should be time bound and of a + /// stop on all remote runspaces which are in the Opening state. The user + /// wouldn't mind waiting for 15 seconds, but this should be time bound and of a /// shorter duration. A high timeout here like 3 minutes will give the user /// a feeling that the PowerShell client has hung. /// @@ -410,8 +410,8 @@ public int CancelTimeout /// /// The duration for which a Runspace on server needs to wait (in milliseconds) before it - /// declares the client dead and closes itself down. - /// This is especially important as these values may have to be configured differently + /// declares the client dead and closes itself down. + /// This is especially important as these values may have to be configured differently /// for enterprise administration scenarios. /// [Parameter] @@ -433,7 +433,7 @@ public int IdleTimeout #region Parameters copied from New-WSManSessionOption /// - /// By default, ProxyAccessType is None, that means Proxy information (ProxyAccessType, + /// By default, ProxyAccessType is None, that means Proxy information (ProxyAccessType, /// ProxyAuthenticationMechanism and ProxyCredential)is not passed to WSMan at all. /// [Parameter] @@ -442,9 +442,9 @@ public int IdleTimeout /// /// The following is the definition of the input parameter "ProxyAuthentication". - /// This parameter takes a set of authentication methods the user can select + /// This parameter takes a set of authentication methods the user can select /// from. The available options should be as follows: - /// - Negotiate: Use the default authentication (as defined by the underlying + /// - Negotiate: Use the default authentication (as defined by the underlying /// protocol) for establishing a remote connection. /// - Basic: Use basic authentication for establishing a remote connection /// - Digest: Use Digest authentication for establishing a remote connection @@ -462,10 +462,10 @@ public int IdleTimeout /// /// The following is the definition of the input parameter "SkipCACheck". - /// When connecting over HTTPS, the client does not validate that the server - /// certificate is signed by a trusted certificate authority (CA). Use only when - /// the remote computer is trusted by other means, for example, if the remote - /// computer is part of a network that is physically secure and isolated or the + /// When connecting over HTTPS, the client does not validate that the server + /// certificate is signed by a trusted certificate authority (CA). Use only when + /// the remote computer is trusted by other means, for example, if the remote + /// computer is part of a network that is physically secure and isolated or the /// remote computer is listed as a trusted host in WinRM configuration /// [Parameter] @@ -478,8 +478,8 @@ public SwitchParameter SkipCACheck /// /// The following is the definition of the input parameter "SkipCNCheck". - /// Indicates that certificate common name (CN) of the server need not match the - /// hostname of the server. Used only in remote operations using https. This + /// Indicates that certificate common name (CN) of the server need not match the + /// hostname of the server. Used only in remote operations using https. This /// option should only be used for trusted machines /// [Parameter] @@ -492,8 +492,8 @@ public SwitchParameter SkipCNCheck /// /// The following is the definition of the input parameter "SkipRevocation". - /// Indicates that certificate common name (CN) of the server need not match the - /// hostname of the server. Used only in remote operations using https. This + /// Indicates that certificate common name (CN) of the server need not match the + /// hostname of the server. Used only in remote operations using https. This /// option should only be used for trusted machines /// [Parameter] @@ -524,8 +524,8 @@ public Int32 OperationTimeout /// /// The following is the definition of the input parameter "UnEncrypted". - /// Specifies that no encryption will be used when doing remote operations over - /// http. Unencrypted traffic is not allowed by default and must be enabled in + /// Specifies that no encryption will be used when doing remote operations over + /// http. Unencrypted traffic is not allowed by default and must be enabled in /// the local configuration /// [Parameter] @@ -541,7 +541,7 @@ public SwitchParameter NoEncryption /// /// The following is the definition of the input parameter "UTF16". - /// Indicates the request is encoded in UTF16 format rather than UTF8 format; + /// Indicates the request is encoded in UTF16 format rather than UTF8 format; /// UTF8 is the default. /// [Parameter] diff --git a/src/System.Management.Automation/engine/remoting/commands/PSRemotingCmdlet.cs b/src/System.Management.Automation/engine/remoting/commands/PSRemotingCmdlet.cs index e56618139c5..12b445f9c9b 100644 --- a/src/System.Management.Automation/engine/remoting/commands/PSRemotingCmdlet.cs +++ b/src/System.Management.Automation/engine/remoting/commands/PSRemotingCmdlet.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/engine/remoting/commands/PopRunspaceCommand.cs b/src/System.Management.Automation/engine/remoting/commands/PopRunspaceCommand.cs index 54c66f6b04e..a4540fd23d4 100644 --- a/src/System.Management.Automation/engine/remoting/commands/PopRunspaceCommand.cs +++ b/src/System.Management.Automation/engine/remoting/commands/PopRunspaceCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/engine/remoting/commands/PushRunspaceCommand.cs b/src/System.Management.Automation/engine/remoting/commands/PushRunspaceCommand.cs index 67064d645fc..9733a601c62 100644 --- a/src/System.Management.Automation/engine/remoting/commands/PushRunspaceCommand.cs +++ b/src/System.Management.Automation/engine/remoting/commands/PushRunspaceCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; @@ -1293,7 +1293,7 @@ private RemoteRunspace GetRunspaceForSSHSession() _tempRunspace.ShouldCloseOnPop = true; var remoteRunspace = _tempRunspace; _tempRunspace = null; - + return remoteRunspace; } diff --git a/src/System.Management.Automation/engine/remoting/commands/ReceiveJob.cs b/src/System.Management.Automation/engine/remoting/commands/ReceiveJob.cs index 385e493fabb..3d256fe253b 100644 --- a/src/System.Management.Automation/engine/remoting/commands/ReceiveJob.cs +++ b/src/System.Management.Automation/engine/remoting/commands/ReceiveJob.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/engine/remoting/commands/ReceivePSSession.cs b/src/System.Management.Automation/engine/remoting/commands/ReceivePSSession.cs index 30502cfd4ca..1f814cd9ed7 100644 --- a/src/System.Management.Automation/engine/remoting/commands/ReceivePSSession.cs +++ b/src/System.Management.Automation/engine/remoting/commands/ReceivePSSession.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/engine/remoting/commands/RemoveJob.cs b/src/System.Management.Automation/engine/remoting/commands/RemoveJob.cs index 466e37d2fe9..a26c947ab34 100644 --- a/src/System.Management.Automation/engine/remoting/commands/RemoveJob.cs +++ b/src/System.Management.Automation/engine/remoting/commands/RemoveJob.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/engine/remoting/commands/ResumeJob.cs b/src/System.Management.Automation/engine/remoting/commands/ResumeJob.cs index 1f45100ac68..06c3c85cf8c 100644 --- a/src/System.Management.Automation/engine/remoting/commands/ResumeJob.cs +++ b/src/System.Management.Automation/engine/remoting/commands/ResumeJob.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System; diff --git a/src/System.Management.Automation/engine/remoting/commands/StartJob.cs b/src/System.Management.Automation/engine/remoting/commands/StartJob.cs index 1931a8d61a0..fd468499dfb 100644 --- a/src/System.Management.Automation/engine/remoting/commands/StartJob.cs +++ b/src/System.Management.Automation/engine/remoting/commands/StartJob.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/engine/remoting/commands/StopJob.cs b/src/System.Management.Automation/engine/remoting/commands/StopJob.cs index 76219bdcbd7..829d69b110c 100644 --- a/src/System.Management.Automation/engine/remoting/commands/StopJob.cs +++ b/src/System.Management.Automation/engine/remoting/commands/StopJob.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System; diff --git a/src/System.Management.Automation/engine/remoting/commands/SuspendJob.cs b/src/System.Management.Automation/engine/remoting/commands/SuspendJob.cs index 282acfb6e22..e80f7d1b331 100644 --- a/src/System.Management.Automation/engine/remoting/commands/SuspendJob.cs +++ b/src/System.Management.Automation/engine/remoting/commands/SuspendJob.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System; diff --git a/src/System.Management.Automation/engine/remoting/commands/TestPSSessionConfigurationFile.cs b/src/System.Management.Automation/engine/remoting/commands/TestPSSessionConfigurationFile.cs index a33978d6139..f575206786a 100644 --- a/src/System.Management.Automation/engine/remoting/commands/TestPSSessionConfigurationFile.cs +++ b/src/System.Management.Automation/engine/remoting/commands/TestPSSessionConfigurationFile.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System; diff --git a/src/System.Management.Automation/engine/remoting/commands/WaitJob.cs b/src/System.Management.Automation/engine/remoting/commands/WaitJob.cs index b08528e1174..9d6ff32aabe 100644 --- a/src/System.Management.Automation/engine/remoting/commands/WaitJob.cs +++ b/src/System.Management.Automation/engine/remoting/commands/WaitJob.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System; diff --git a/src/System.Management.Automation/engine/remoting/commands/getrunspacecommand.cs b/src/System.Management.Automation/engine/remoting/commands/getrunspacecommand.cs index 7351dcbc1e8..2c5a4672b6d 100644 --- a/src/System.Management.Automation/engine/remoting/commands/getrunspacecommand.cs +++ b/src/System.Management.Automation/engine/remoting/commands/getrunspacecommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/engine/remoting/commands/newrunspacecommand.cs b/src/System.Management.Automation/engine/remoting/commands/newrunspacecommand.cs index 2fb8b96c0ff..db99e761b1c 100644 --- a/src/System.Management.Automation/engine/remoting/commands/newrunspacecommand.cs +++ b/src/System.Management.Automation/engine/remoting/commands/newrunspacecommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/engine/remoting/commands/remotingcommandutil.cs b/src/System.Management.Automation/engine/remoting/commands/remotingcommandutil.cs index 65165ebd984..eff6d69aed9 100644 --- a/src/System.Management.Automation/engine/remoting/commands/remotingcommandutil.cs +++ b/src/System.Management.Automation/engine/remoting/commands/remotingcommandutil.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System; diff --git a/src/System.Management.Automation/engine/remoting/commands/removerunspacecommand.cs b/src/System.Management.Automation/engine/remoting/commands/removerunspacecommand.cs index 91aac9d251d..5ee1ea92225 100644 --- a/src/System.Management.Automation/engine/remoting/commands/removerunspacecommand.cs +++ b/src/System.Management.Automation/engine/remoting/commands/removerunspacecommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/engine/remoting/commands/runspacerepository.cs b/src/System.Management.Automation/engine/remoting/commands/runspacerepository.cs index ba96a69509e..8bd4b8fe0d5 100644 --- a/src/System.Management.Automation/engine/remoting/commands/runspacerepository.cs +++ b/src/System.Management.Automation/engine/remoting/commands/runspacerepository.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/remoting/common/AsyncObject.cs b/src/System.Management.Automation/engine/remoting/common/AsyncObject.cs index 420996e4f23..996a1793833 100644 --- a/src/System.Management.Automation/engine/remoting/common/AsyncObject.cs +++ b/src/System.Management.Automation/engine/remoting/common/AsyncObject.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Threading; diff --git a/src/System.Management.Automation/engine/remoting/common/DispatchTable.cs b/src/System.Management.Automation/engine/remoting/common/DispatchTable.cs index 3dffac5965c..d6abab8e3e8 100644 --- a/src/System.Management.Automation/engine/remoting/common/DispatchTable.cs +++ b/src/System.Management.Automation/engine/remoting/common/DispatchTable.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/remoting/common/Indexer.cs b/src/System.Management.Automation/engine/remoting/common/Indexer.cs index 764058fc1aa..5387386967e 100644 --- a/src/System.Management.Automation/engine/remoting/common/Indexer.cs +++ b/src/System.Management.Automation/engine/remoting/common/Indexer.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/remoting/common/ObjectRef.cs b/src/System.Management.Automation/engine/remoting/common/ObjectRef.cs index 74795906195..2ab00025256 100644 --- a/src/System.Management.Automation/engine/remoting/common/ObjectRef.cs +++ b/src/System.Management.Automation/engine/remoting/common/ObjectRef.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using Dbg = System.Management.Automation.Diagnostics; diff --git a/src/System.Management.Automation/engine/remoting/common/PSETWTracer.cs b/src/System.Management.Automation/engine/remoting/common/PSETWTracer.cs index 81bd364f602..54ae63b4fbf 100644 --- a/src/System.Management.Automation/engine/remoting/common/PSETWTracer.cs +++ b/src/System.Management.Automation/engine/remoting/common/PSETWTracer.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using Dbg = System.Management.Automation.Diagnostics; diff --git a/src/System.Management.Automation/engine/remoting/common/PSSessionConfigurationTypeOption.cs b/src/System.Management.Automation/engine/remoting/common/PSSessionConfigurationTypeOption.cs index 179748f4c32..1c1728d5e52 100644 --- a/src/System.Management.Automation/engine/remoting/common/PSSessionConfigurationTypeOption.cs +++ b/src/System.Management.Automation/engine/remoting/common/PSSessionConfigurationTypeOption.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System.Collections; diff --git a/src/System.Management.Automation/engine/remoting/common/RemoteSessionHyperVSocket.cs b/src/System.Management.Automation/engine/remoting/common/RemoteSessionHyperVSocket.cs index 0cc4b790aad..1f6e49e34a8 100644 --- a/src/System.Management.Automation/engine/remoting/common/RemoteSessionHyperVSocket.cs +++ b/src/System.Management.Automation/engine/remoting/common/RemoteSessionHyperVSocket.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation.Tracing; diff --git a/src/System.Management.Automation/engine/remoting/common/RemoteSessionNamedPipe.cs b/src/System.Management.Automation/engine/remoting/common/RemoteSessionNamedPipe.cs index ad967129d74..a2452581a73 100644 --- a/src/System.Management.Automation/engine/remoting/common/RemoteSessionNamedPipe.cs +++ b/src/System.Management.Automation/engine/remoting/common/RemoteSessionNamedPipe.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation.Tracing; diff --git a/src/System.Management.Automation/engine/remoting/common/RunspaceConnectionInfo.cs b/src/System.Management.Automation/engine/remoting/common/RunspaceConnectionInfo.cs index ecb94832b0e..7684f7b0afb 100644 --- a/src/System.Management.Automation/engine/remoting/common/RunspaceConnectionInfo.cs +++ b/src/System.Management.Automation/engine/remoting/common/RunspaceConnectionInfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Net; @@ -37,7 +37,7 @@ namespace System.Management.Automation.Runspaces public enum AuthenticationMechanism { /// - /// Use the default authentication (as defined by the underlying protocol) + /// Use the default authentication (as defined by the underlying protocol) /// for establishing a remote connection. /// Default = 0x0, @@ -60,11 +60,11 @@ public enum AuthenticationMechanism [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Credssp")] Credssp = 0x4, /// - /// Use Digest authentication mechanism. Digest authentication operates much - /// like Basic authentication. However, unlike Basic authentication, Digest authentication + /// Use Digest authentication mechanism. Digest authentication operates much + /// like Basic authentication. However, unlike Basic authentication, Digest authentication /// transmits credentials across the network as a hash value, also known as a message digest. - /// The user name and password cannot be deciphered from the hash value. Conversely, Basic - /// authentication sends a Base 64 encoded password, essentially in clear text, across the + /// The user name and password cannot be deciphered from the hash value. Conversely, Basic + /// authentication sends a Base 64 encoded password, essentially in clear text, across the /// network. /// Digest = 0x5, @@ -116,14 +116,14 @@ public enum PSSessionConfigurationAccessMode /// /// WSManTransportManager supports disconnected PowerShell sessions. - /// When a remote PS session server is in disconnected state, output - /// from the running command pipeline is cached on the server. This + /// When a remote PS session server is in disconnected state, output + /// from the running command pipeline is cached on the server. This /// enum determines what the server does when the cache is full. /// public enum OutputBufferingMode { /// - /// No output buffering mode specified. Output buffering mode on server will + /// No output buffering mode specified. Output buffering mode on server will /// default to Block if a new session is created, or will retain its current /// mode for non-creation scenarios (e.g., disconnect/connect operations). /// @@ -141,7 +141,7 @@ public enum OutputBufferingMode } /// - /// Class which defines connection path to a remote runspace + /// Class which defines connection path to a remote runspace /// that needs to be created. Transport specific connection /// paths will be derived from this /// @@ -214,9 +214,9 @@ public CultureInfo UICulture private CultureInfo _uiCulture = CultureInfo.CurrentUICulture; /// - /// The duration (in ms) for which PowerShell remoting waits before timing out on a connection to a remote machine. - /// Simply put, the timeout for a remote runspace creation. - /// The administrator would like to tweak this timeout depending on whether + /// The duration (in ms) for which PowerShell remoting waits before timing out on a connection to a remote machine. + /// Simply put, the timeout for a remote runspace creation. + /// The administrator would like to tweak this timeout depending on whether /// he/she is connecting to a machine in the data center or across a slow WAN. /// public int OpenTimeout @@ -232,9 +232,9 @@ public int OpenTimeout } else if (this is WSManConnectionInfo && _openTimeout == InfiniteTimeout) { - // this timeout value gets passed to a - // timer associated with the session - // data structure handler state machine. + // this timeout value gets passed to a + // timer associated with the session + // data structure handler state machine. // The timer constructor will throw an exception // for any value greater than Int32.MaxValue // hence this is the maximum possible limit @@ -249,10 +249,10 @@ public int OpenTimeout /// - /// The duration (in ms) for which PowerShell should wait before it times out on cancel operations - /// (close runspace or stop powershell). For instance, when the user hits ctrl-C, - /// New-PSSession cmdlet tries to call a stop on all remote runspaces which are in the Opening state. - /// The administrator wouldn't mind waiting for 15 seconds, but this should be time bound and of a shorter duration. + /// The duration (in ms) for which PowerShell should wait before it times out on cancel operations + /// (close runspace or stop powershell). For instance, when the user hits ctrl-C, + /// New-PSSession cmdlet tries to call a stop on all remote runspaces which are in the Opening state. + /// The administrator wouldn't mind waiting for 15 seconds, but this should be time bound and of a shorter duration. /// A high timeout here like 3 minutes will give the administrator a feeling that the PowerShell client has hung. /// public int CancelTimeout { get; set; } = defaultCancelTimeout; @@ -260,18 +260,18 @@ public int OpenTimeout internal const int defaultCancelTimeout = BaseTransportManager.ClientCloseTimeoutMs; /// - /// The duration for which PowerShell remoting waits before timing out - /// for any operation. The user would like to tweak this timeout + /// The duration for which PowerShell remoting waits before timing out + /// for any operation. The user would like to tweak this timeout /// depending on whether he/she is connecting to a machine in the data /// center or across a slow WAN. - /// + /// /// Default: 3*60*1000 == 3minutes /// public int OperationTimeout { get; set; } = BaseTransportManager.ClientDefaultOperationTimeoutMs; /// - /// The duration (in ms) for which a Runspace on server needs to wait before it declares the client dead and closes itself down. - /// This is especially important as these values may have to be configured differently for enterprise administration + /// The duration (in ms) for which a Runspace on server needs to wait before it declares the client dead and closes itself down. + /// This is especially important as these values may have to be configured differently for enterprise administration /// and exchange scenarios. /// public int IdleTimeout { get; set; } = DefaultIdleTimeout; @@ -309,8 +309,8 @@ public virtual void SetSessionOptions(PSSessionOption options) CancelTimeout = TimeSpanToTimeOutMs(options.CancelTimeout); OperationTimeout = TimeSpanToTimeOutMs(options.OperationTimeout); - // Special case for idle timeout. A value of milliseconds == -1 - // (BaseTransportManager.UseServerDefaultIdleTimeout) is allowed for + // Special case for idle timeout. A value of milliseconds == -1 + // (BaseTransportManager.UseServerDefaultIdleTimeout) is allowed for // specifying the default value on the server. IdleTimeout = (options.IdleTimeout.TotalMilliseconds >= BaseTransportManager.UseServerDefaultIdleTimeout && options.IdleTimeout.TotalMilliseconds < int.MaxValue) @@ -464,7 +464,7 @@ public Int32 Port } /// - /// AppName which identifies the connection + /// AppName which identifies the connection /// end point in the machine /// public String AppName @@ -497,8 +497,8 @@ public override PSCredential Credential } /// - /// - /// + /// + /// [SuppressMessage("Microsoft.Design", "CA1056:UriPropertiesShouldNotBeStrings", Scope = "member", Target = "System.Management.Automation.Runspaces.WSManConnectionInfo.#ShellUri")] public string ShellUri { @@ -632,9 +632,9 @@ public override string CertificateThumbprint /// /// If true, underlying WSMan infrastructure will compress data sent on the network. - /// If false, data will not be compressed. Compression improves performance by + /// If false, data will not be compressed. Compression improves performance by /// reducing the amount of data sent on the network. Compression my require extra - /// memory consumption and CPU usage. In cases where available memory / CPU is less, + /// memory consumption and CPU usage. In cases where available memory / CPU is less, /// set this property to false. /// By default the value of this property is "true". /// @@ -643,31 +643,31 @@ public override string CertificateThumbprint /// /// If true then Operating System won't load the user profile (i.e. registry keys under HKCU) on the remote server /// which can result in a faster session creation time. This option won't have any effect if the remote machine has - /// already loaded the profile (i.e. in another session). + /// already loaded the profile (i.e. in another session). /// public bool NoMachineProfile { get; set; } // BEGIN: Session Options /// - /// By default, wsman uses IEConfig - the current user - /// Internet Explorer proxy settings for the current active network connection. - /// This option requires the user profile to be loaded, so the option can - /// be directly used when called within a process that is running under - /// an interactive user account identity; if the client application is running - /// under a user context different then the interactive user, the client + /// By default, wsman uses IEConfig - the current user + /// Internet Explorer proxy settings for the current active network connection. + /// This option requires the user profile to be loaded, so the option can + /// be directly used when called within a process that is running under + /// an interactive user account identity; if the client application is running + /// under a user context different then the interactive user, the client /// application has to explicitly load the user profile prior to using this option. - /// - /// IMPORTANT: proxy configuration is supported for HTTPS only; for HTTP, the direct - /// connection to the server is used + /// + /// IMPORTANT: proxy configuration is supported for HTTPS only; for HTTP, the direct + /// connection to the server is used /// public ProxyAccessType ProxyAccessType { get; set; } = ProxyAccessType.None; /// /// The following is the definition of the input parameter "ProxyAuthentication". - /// This parameter takes a set of authentication methods the user can select + /// This parameter takes a set of authentication methods the user can select /// from. The available options should be as follows: - /// - Negotiate: Use the default authentication (ad defined by the underlying + /// - Negotiate: Use the default authentication (ad defined by the underlying /// protocol) for establishing a remote connection. /// - Basic: Use basic authentication for establishing a remote connection /// - Digest: Use Digest authentication for establishing a remote connection @@ -716,37 +716,37 @@ public PSCredential ProxyCredential /// - /// When connecting over HTTPS, the client does not validate that the server - /// certificate is signed by a trusted certificate authority (CA). Use only when - /// the remote computer is trusted by other means, for example, if the remote - /// computer is part of a network that is physically secure and isolated or the + /// When connecting over HTTPS, the client does not validate that the server + /// certificate is signed by a trusted certificate authority (CA). Use only when + /// the remote computer is trusted by other means, for example, if the remote + /// computer is part of a network that is physically secure and isolated or the /// remote computer is listed as a trusted host in WinRM configuration /// public bool SkipCACheck { get; set; } /// - /// Indicates that certificate common name (CN) of the server need not match the - /// hostname of the server. Used only in remote operations using https. This + /// Indicates that certificate common name (CN) of the server need not match the + /// hostname of the server. Used only in remote operations using https. This /// option should only be used for trusted machines. /// public bool SkipCNCheck { get; set; } /// - /// Indicates that certificate common name (CN) of the server need not match the - /// hostname of the server. Used only in remote operations using https. This + /// Indicates that certificate common name (CN) of the server need not match the + /// hostname of the server. Used only in remote operations using https. This /// option should only be used for trusted machines /// public bool SkipRevocationCheck { get; set; } /// - /// Specifies that no encryption will be used when doing remote operations over - /// http. Unencrypted traffic is not allowed by default and must be enabled in + /// Specifies that no encryption will be used when doing remote operations over + /// http. Unencrypted traffic is not allowed by default and must be enabled in /// the local configuration /// public bool NoEncryption { get; set; } /// - /// Indicates the request is encoded in UTF16 format rather than UTF8 format; + /// Indicates the request is encoded in UTF16 format rather than UTF8 format; /// UTF8 is the default. /// [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "UTF")] @@ -768,8 +768,8 @@ public PSCredential ProxyCredential /// /// When true and in loopback scenario (localhost) this enables creation of WSMan - /// host process with the user interactive token, allowing PowerShell script network access, - /// i.e., allows going off box. When this property is true and a PSSession is disconnected, + /// host process with the user interactive token, allowing PowerShell script network access, + /// i.e., allows going off box. When this property is true and a PSSession is disconnected, /// reconnection is allowed only if reconnecting from a PowerShell session on the same box. /// public bool EnableNetworkAccess { get; set; } @@ -791,9 +791,9 @@ public PSCredential ProxyCredential /// scheme to be used for connection /// port to connect to /// application end point to connect to - /// remote shell to launch + /// remote shell to launch /// on connection - /// credential to be used + /// credential to be used /// for connection /// Timeout in milliseconds for open /// call on Runspace to finish @@ -820,9 +820,9 @@ public WSManConnectionInfo(String scheme, String computerName, Int32 port, Strin /// Scheme to be used for connection. /// port to connect to /// application end point to connect to - /// remote shell to launch + /// remote shell to launch /// on connection - /// credential to be used + /// credential to be used /// for connection /// Invalid /// scheme or invalid port is specified @@ -853,7 +853,7 @@ public WSManConnectionInfo(bool useSsl, string computerName, Int32 port, string } /// - /// + /// /// /// /// @@ -876,7 +876,7 @@ public WSManConnectionInfo(bool useSsl, String computerName, Int32 port, String /// and with the default credentials, default server /// life time and default open timeout /// http://localhost/ - /// The default shellname Microsoft.PowerShell will be + /// The default shellname Microsoft.PowerShell will be /// used /// public WSManConnectionInfo() @@ -892,7 +892,7 @@ public WSManConnectionInfo() /// /// uri of remote runspace /// - /// credentials to use to + /// credentials to use to /// connect to the remote runspace /// When an /// uri representing an invalid path is specified @@ -915,7 +915,7 @@ public WSManConnectionInfo(Uri uri, String shellUri, PSCredential credential) (RemotingErrorIdStrings.RelativeUriForRunspacePathNotSupported)); } - // This check is needed to make sure we connect to WSMan app in the + // This check is needed to make sure we connect to WSMan app in the // default case (when user did not specify any appname) like // http://localhost , http://127.0.0.1 etc. if (uri.AbsolutePath.Equals("/", StringComparison.OrdinalIgnoreCase) && @@ -951,7 +951,7 @@ public WSManConnectionInfo(Uri uri, String shellUri, String certificateThumbprin } /// - /// constructor to create a WSManConnectionInfo with a + /// constructor to create a WSManConnectionInfo with a /// uri specified and the default credentials, /// default server life time and default open /// timeout @@ -973,7 +973,7 @@ public WSManConnectionInfo(Uri uri) /// /// /// - /// 1. Proxy credential cannot be specified when proxy accesstype is None. + /// 1. Proxy credential cannot be specified when proxy accesstype is None. /// Either specify a valid proxy accesstype other than None or do not specify proxy credential. /// public override void SetSessionOptions(PSSessionOption options) @@ -1207,7 +1207,7 @@ internal void ConstructUri(String scheme, String computerName, Nullable p // resolve to default ports if required if (port.Value == DefaultPort) { - // this is needed so that the OriginalString on + // this is needed so that the OriginalString on // connection uri is fine PortSetting = -1; UseDefaultWSManPort = true; @@ -1271,7 +1271,7 @@ internal static string GetConnectionString(Uri connectionUri, /// User has the following options: /// 1. AuthMechanism + Credential /// 2. CertificateThumbPrint - /// + /// /// All the above are mutually exclusive. /// /// @@ -1301,7 +1301,7 @@ private void UpdateUri(Uri uri) UseDefaultWSManPort = false; } - // This check is needed to make sure we connect to WSMan app in the + // This check is needed to make sure we connect to WSMan app in the // default case (when user did not specify any appname) like // http://localhost , http://127.0.0.1 etc. string appname; @@ -1345,8 +1345,8 @@ private void UpdateUri(Uri uri) #region constants /// - /// Default disconnected server output mode is set to None. This mode allows the - /// server to set the buffering mode to Block for new sessions and retain its + /// Default disconnected server output mode is set to None. This mode allows the + /// server to set the buffering mode to Block for new sessions and retain its /// current mode during disconnect/connect operations. /// internal const OutputBufferingMode DefaultOutputBufferingMode = OutputBufferingMode.None; @@ -1372,7 +1372,7 @@ internal bool UseDefaultWSManPort private const string DefaultScheme = HttpScheme; private const string DefaultSslScheme = HttpsScheme; /// - /// Default appname. This is empty as WSMan configuration has support + /// Default appname. This is empty as WSMan configuration has support /// for this. Look at /// get-item WSMan:\localhost\Client\URLPrefix /// @@ -1381,7 +1381,7 @@ internal bool UseDefaultWSManPort /// /// Default scheme. /// As part of port DCR, WSMan changed the default ports - /// from 80,443 to 5985,5986 respectively no-SSL,SSL + /// from 80,443 to 5985,5986 respectively no-SSL,SSL /// connections. Since the standards say http,https use /// 80,443 as defaults..we came up with new mechanism /// to specify scheme as empty. For SSL, WSMan introduced @@ -1695,7 +1695,7 @@ public int ProcessId } /// - /// Optional application domain name. If not specified then the + /// Optional application domain name. If not specified then the /// default application domain is used. /// public string AppDomainName @@ -2223,7 +2223,7 @@ private static string[] ParseArgv(ProcessStartInfo psi) for (int i=0; i /// Create a process through native Win32 APIs and return StdIn, StdOut, StdError reader/writers - /// This needs to be done via Win32 APIs because managed code creates anonymous synchronous pipes + /// This needs to be done via Win32 APIs because managed code creates anonymous synchronous pipes /// for redirected StdIn/Out and SSH (and PSRP) require asynchronous (overlapped) pipes, which must /// be through named pipes. Managed code for named pipes is unreliable and so this is done via /// P-Invoking native APIs. @@ -2363,7 +2363,7 @@ private static int StartSSHProcessImpl( // // These std pipe handles are bound to managed Reader/Writer objects and returned to the transport // manager object, which uses them for PSRP communication. The lifetime of these handles are then - // tied to the reader/writer objects which the transport is responsible for disposing (see + // tied to the reader/writer objects which the transport is responsible for disposing (see // SSHClientSessionTransportManger and the CloseConnection() method. // SafePipeHandle stdInPipeServer = null; @@ -2387,7 +2387,7 @@ private static int StartSSHProcessImpl( (sshProcess.HasExited == true)) { throw new InvalidOperationException( - StringUtil.Format(RemotingErrorIdStrings.CannotStartSSHClient, (ex != null) ? ex.Message : string.Empty), + StringUtil.Format(RemotingErrorIdStrings.CannotStartSSHClient, (ex != null) ? ex.Message : string.Empty), ex); } @@ -3197,7 +3197,7 @@ private void CreateContainerProcessInternal() { // // The ComputeSystemExists call depends on the existence of microsoft.hostcompute.interop.dll, - // which requires Containers feature to be enabled. In case Containers feature is + // which requires Containers feature to be enabled. In case Containers feature is // not enabled, we need to output a corresponding error message to inform user. // ProcessId = 0; @@ -3308,7 +3308,7 @@ private void RunOnMTAThread(ThreadStart threadProc) // and do the work. // // For OneCore PowerShell, its ApartmentState is always MTA. - // + // #if CORECLR threadProc(); #else diff --git a/src/System.Management.Automation/engine/remoting/common/RunspaceInitInfo.cs b/src/System.Management.Automation/engine/remoting/common/RunspaceInitInfo.cs index 05b90135088..8773def9aa9 100644 --- a/src/System.Management.Automation/engine/remoting/common/RunspaceInitInfo.cs +++ b/src/System.Management.Automation/engine/remoting/common/RunspaceInitInfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using Dbg = System.Management.Automation.Diagnostics; diff --git a/src/System.Management.Automation/engine/remoting/common/RunspacePoolStateInfo.cs b/src/System.Management.Automation/engine/remoting/common/RunspacePoolStateInfo.cs index 7498483daed..e5ea2c5c3e4 100644 --- a/src/System.Management.Automation/engine/remoting/common/RunspacePoolStateInfo.cs +++ b/src/System.Management.Automation/engine/remoting/common/RunspacePoolStateInfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation.Runspaces; diff --git a/src/System.Management.Automation/engine/remoting/common/WireDataFormat/EncodeAndDecode.cs b/src/System.Management.Automation/engine/remoting/common/WireDataFormat/EncodeAndDecode.cs index 5411dc2dba6..3fddda979b3 100644 --- a/src/System.Management.Automation/engine/remoting/common/WireDataFormat/EncodeAndDecode.cs +++ b/src/System.Management.Automation/engine/remoting/common/WireDataFormat/EncodeAndDecode.cs @@ -1,5 +1,5 @@ /********************************************************************++ - * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. * --********************************************************************/ using System.Management.Automation.Tracing; diff --git a/src/System.Management.Automation/engine/remoting/common/WireDataFormat/RemoteHost.cs b/src/System.Management.Automation/engine/remoting/common/WireDataFormat/RemoteHost.cs index 4645d4394f3..3ccc625612b 100644 --- a/src/System.Management.Automation/engine/remoting/common/WireDataFormat/RemoteHost.cs +++ b/src/System.Management.Automation/engine/remoting/common/WireDataFormat/RemoteHost.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/remoting/common/WireDataFormat/RemoteHostEncoder.cs b/src/System.Management.Automation/engine/remoting/common/WireDataFormat/RemoteHostEncoder.cs index 93b4faa3f6c..fd9ccc85034 100644 --- a/src/System.Management.Automation/engine/remoting/common/WireDataFormat/RemoteHostEncoder.cs +++ b/src/System.Management.Automation/engine/remoting/common/WireDataFormat/RemoteHostEncoder.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/remoting/common/WireDataFormat/RemoteSessionCapability.cs b/src/System.Management.Automation/engine/remoting/common/WireDataFormat/RemoteSessionCapability.cs index 1834be7b587..cec2926cfeb 100644 --- a/src/System.Management.Automation/engine/remoting/common/WireDataFormat/RemoteSessionCapability.cs +++ b/src/System.Management.Automation/engine/remoting/common/WireDataFormat/RemoteSessionCapability.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/remoting/common/WireDataFormat/RemotingDataObject.cs b/src/System.Management.Automation/engine/remoting/common/WireDataFormat/RemotingDataObject.cs index 32a64f59e36..48e13f2b1df 100644 --- a/src/System.Management.Automation/engine/remoting/common/WireDataFormat/RemotingDataObject.cs +++ b/src/System.Management.Automation/engine/remoting/common/WireDataFormat/RemotingDataObject.cs @@ -1,5 +1,5 @@ /********************************************************************++ - * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. * --********************************************************************/ using System.IO; diff --git a/src/System.Management.Automation/engine/remoting/common/fragmentor.cs b/src/System.Management.Automation/engine/remoting/common/fragmentor.cs index af4f97f42ae..8208b3a8aff 100644 --- a/src/System.Management.Automation/engine/remoting/common/fragmentor.cs +++ b/src/System.Management.Automation/engine/remoting/common/fragmentor.cs @@ -1,5 +1,5 @@ /********************************************************************++ - * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. * --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/remoting/common/misc.cs b/src/System.Management.Automation/engine/remoting/common/misc.cs index 31db0f313a9..863b00c7169 100644 --- a/src/System.Management.Automation/engine/remoting/common/misc.cs +++ b/src/System.Management.Automation/engine/remoting/common/misc.cs @@ -1,5 +1,5 @@ /********************************************************************++ - * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. * --********************************************************************/ using System.Management.Automation.Remoting; diff --git a/src/System.Management.Automation/engine/remoting/common/psstreamobject.cs b/src/System.Management.Automation/engine/remoting/common/psstreamobject.cs index 1d78e32dc9e..b686d7d9792 100644 --- a/src/System.Management.Automation/engine/remoting/common/psstreamobject.cs +++ b/src/System.Management.Automation/engine/remoting/common/psstreamobject.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation.Runspaces; diff --git a/src/System.Management.Automation/engine/remoting/common/remotesession.cs b/src/System.Management.Automation/engine/remoting/common/remotesession.cs index d0c4add15da..43a26a440ee 100644 --- a/src/System.Management.Automation/engine/remoting/common/remotesession.cs +++ b/src/System.Management.Automation/engine/remoting/common/remotesession.cs @@ -1,5 +1,5 @@ /********************************************************************++ - * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. * --********************************************************************/ using System.Management.Automation.Remoting; diff --git a/src/System.Management.Automation/engine/remoting/common/remotingexceptions.cs b/src/System.Management.Automation/engine/remoting/common/remotingexceptions.cs index 5e0f2c09779..4a307b767bd 100644 --- a/src/System.Management.Automation/engine/remoting/common/remotingexceptions.cs +++ b/src/System.Management.Automation/engine/remoting/common/remotingexceptions.cs @@ -1,5 +1,5 @@ /********************************************************************++ - * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. * --********************************************************************/ using System.Runtime.Serialization; diff --git a/src/System.Management.Automation/engine/remoting/common/throttlemanager.cs b/src/System.Management.Automation/engine/remoting/common/throttlemanager.cs index 808916d9d14..f987027c1d9 100644 --- a/src/System.Management.Automation/engine/remoting/common/throttlemanager.cs +++ b/src/System.Management.Automation/engine/remoting/common/throttlemanager.cs @@ -1,5 +1,5 @@ /********************************************************************++ - * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. * --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/remoting/fanin/BaseTransportManager.cs b/src/System.Management.Automation/engine/remoting/fanin/BaseTransportManager.cs index 1dc5deaa99f..25b9bb0b455 100644 --- a/src/System.Management.Automation/engine/remoting/fanin/BaseTransportManager.cs +++ b/src/System.Management.Automation/engine/remoting/fanin/BaseTransportManager.cs @@ -1,5 +1,5 @@ /********************************************************************++ - * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. * --********************************************************************/ /* * Common file that contains interface definitions for generic server and client diff --git a/src/System.Management.Automation/engine/remoting/fanin/InitialSessionStateProvider.cs b/src/System.Management.Automation/engine/remoting/fanin/InitialSessionStateProvider.cs index fc82d5c4f4a..1d450d7c9dd 100644 --- a/src/System.Management.Automation/engine/remoting/fanin/InitialSessionStateProvider.cs +++ b/src/System.Management.Automation/engine/remoting/fanin/InitialSessionStateProvider.cs @@ -1,5 +1,5 @@ /********************************************************************++ - * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. * --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/remoting/fanin/OutOfProcTransportManager.cs b/src/System.Management.Automation/engine/remoting/fanin/OutOfProcTransportManager.cs index b15c38edf35..125a618bf10 100644 --- a/src/System.Management.Automation/engine/remoting/fanin/OutOfProcTransportManager.cs +++ b/src/System.Management.Automation/engine/remoting/fanin/OutOfProcTransportManager.cs @@ -1,5 +1,5 @@ /********************************************************************++ - * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. * --********************************************************************/ /* @@ -1555,7 +1555,7 @@ private void ProcessErrorThread(object state) "Transport manager error thread ended with error: {0}", errorMsg); PSRemotingTransportException psrte = new PSRemotingTransportException( - StringUtil.Format(RemotingErrorIdStrings.SSHClientEndWithErrorMessage, errorMsg), + StringUtil.Format(RemotingErrorIdStrings.SSHClientEndWithErrorMessage, errorMsg), e); HandleSSHError(psrte); } @@ -1642,7 +1642,7 @@ private void ProcessReaderThread(object state) if (data == null) { // End of stream indicates that the SSH transport is broken. - // SSH will return the appropriate error in StdErr stream so + // SSH will return the appropriate error in StdErr stream so // let the error reader thread report the error. break; } diff --git a/src/System.Management.Automation/engine/remoting/fanin/PSPrincipal.cs b/src/System.Management.Automation/engine/remoting/fanin/PSPrincipal.cs index 1b374cf061f..dc8acb41f51 100644 --- a/src/System.Management.Automation/engine/remoting/fanin/PSPrincipal.cs +++ b/src/System.Management.Automation/engine/remoting/fanin/PSPrincipal.cs @@ -1,5 +1,5 @@ /********************************************************************++ - * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. * --********************************************************************/ /* diff --git a/src/System.Management.Automation/engine/remoting/fanin/PSSessionConfigurationData.cs b/src/System.Management.Automation/engine/remoting/fanin/PSSessionConfigurationData.cs index fd480daf588..44dfdac2546 100644 --- a/src/System.Management.Automation/engine/remoting/fanin/PSSessionConfigurationData.cs +++ b/src/System.Management.Automation/engine/remoting/fanin/PSSessionConfigurationData.cs @@ -1,5 +1,5 @@ /********************************************************************++ - * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. * --********************************************************************/ using System.IO; diff --git a/src/System.Management.Automation/engine/remoting/fanin/PriorityCollection.cs b/src/System.Management.Automation/engine/remoting/fanin/PriorityCollection.cs index ada1b93f475..4e2ed03a9af 100644 --- a/src/System.Management.Automation/engine/remoting/fanin/PriorityCollection.cs +++ b/src/System.Management.Automation/engine/remoting/fanin/PriorityCollection.cs @@ -1,5 +1,5 @@ /********************************************************************++ - * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. * --********************************************************************/ using System.IO; diff --git a/src/System.Management.Automation/engine/remoting/fanin/WSManNativeAPI.cs b/src/System.Management.Automation/engine/remoting/fanin/WSManNativeAPI.cs index 8238277877f..2fcd0a2f889 100644 --- a/src/System.Management.Automation/engine/remoting/fanin/WSManNativeAPI.cs +++ b/src/System.Management.Automation/engine/remoting/fanin/WSManNativeAPI.cs @@ -1,5 +1,5 @@ /********************************************************************++ - * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. * --********************************************************************/ using System.Text; diff --git a/src/System.Management.Automation/engine/remoting/fanin/WSManPlugin.cs b/src/System.Management.Automation/engine/remoting/fanin/WSManPlugin.cs index ab5aa753be4..1abef92b3bc 100644 --- a/src/System.Management.Automation/engine/remoting/fanin/WSManPlugin.cs +++ b/src/System.Management.Automation/engine/remoting/fanin/WSManPlugin.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------- // // Microsoft Windows NT -// Copyright (C) Microsoft Corporation, 2007. +// Copyright (c) Microsoft Corporation. All rights reserved. // // Contents: Entry points for managed PowerShell plugin worker used to // host powershell in a WSMan service. diff --git a/src/System.Management.Automation/engine/remoting/fanin/WSManPluginFacade.cs b/src/System.Management.Automation/engine/remoting/fanin/WSManPluginFacade.cs index 1aa7bbb753a..226438e2172 100644 --- a/src/System.Management.Automation/engine/remoting/fanin/WSManPluginFacade.cs +++ b/src/System.Management.Automation/engine/remoting/fanin/WSManPluginFacade.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------- // // Microsoft Windows NT -// Copyright (C) Microsoft Corporation, 2007. +// Copyright (c) Microsoft Corporation. All rights reserved. // // Contents: Entry points for managed PowerShell plugin worker used to // host powershell in a WSMan service. diff --git a/src/System.Management.Automation/engine/remoting/fanin/WSManPluginShellSession.cs b/src/System.Management.Automation/engine/remoting/fanin/WSManPluginShellSession.cs index 9f88316c8a0..d8d98c2d8e3 100644 --- a/src/System.Management.Automation/engine/remoting/fanin/WSManPluginShellSession.cs +++ b/src/System.Management.Automation/engine/remoting/fanin/WSManPluginShellSession.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------- // // Microsoft Windows NT -// Copyright (C) Microsoft Corporation, 2007. +// Copyright (c) Microsoft Corporation. All rights reserved. // // Contents: Entry points for managed PowerShell plugin worker used to // host powershell in a WSMan service. diff --git a/src/System.Management.Automation/engine/remoting/fanin/WSManPluginTransportManager.cs b/src/System.Management.Automation/engine/remoting/fanin/WSManPluginTransportManager.cs index 6dc38bf9e8d..923c65894fa 100644 --- a/src/System.Management.Automation/engine/remoting/fanin/WSManPluginTransportManager.cs +++ b/src/System.Management.Automation/engine/remoting/fanin/WSManPluginTransportManager.cs @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------- // // Microsoft Windows NT -// Copyright (C) Microsoft Corporation, 2007. +// Copyright (c) Microsoft Corporation. All rights reserved. // // Contents: Entry points for managed PowerShell plugin worker used to // host powershell in a WSMan service. diff --git a/src/System.Management.Automation/engine/remoting/fanin/WSManTransportManager.cs b/src/System.Management.Automation/engine/remoting/fanin/WSManTransportManager.cs index 7d1d08bc263..b5725fe3cf2 100644 --- a/src/System.Management.Automation/engine/remoting/fanin/WSManTransportManager.cs +++ b/src/System.Management.Automation/engine/remoting/fanin/WSManTransportManager.cs @@ -1,5 +1,5 @@ /********************************************************************++ - * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. * --********************************************************************/ /* diff --git a/src/System.Management.Automation/engine/remoting/host/RemoteHostMethodInfo.cs b/src/System.Management.Automation/engine/remoting/host/RemoteHostMethodInfo.cs index 4dc1d0ed5c0..85c3beeb9b3 100644 --- a/src/System.Management.Automation/engine/remoting/host/RemoteHostMethodInfo.cs +++ b/src/System.Management.Automation/engine/remoting/host/RemoteHostMethodInfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/remoting/server/OutOfProcServerMediator.cs b/src/System.Management.Automation/engine/remoting/server/OutOfProcServerMediator.cs index b42186c00e6..450718e3edc 100644 --- a/src/System.Management.Automation/engine/remoting/server/OutOfProcServerMediator.cs +++ b/src/System.Management.Automation/engine/remoting/server/OutOfProcServerMediator.cs @@ -1,5 +1,5 @@ /********************************************************************++ - * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. * --********************************************************************/ using System.Management.Automation.Tracing; diff --git a/src/System.Management.Automation/engine/remoting/server/ServerMethodExecutor.cs b/src/System.Management.Automation/engine/remoting/server/ServerMethodExecutor.cs index 4500080b301..19e0c78ecd2 100644 --- a/src/System.Management.Automation/engine/remoting/server/ServerMethodExecutor.cs +++ b/src/System.Management.Automation/engine/remoting/server/ServerMethodExecutor.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation.Remoting.Server; diff --git a/src/System.Management.Automation/engine/remoting/server/ServerPowerShellDriver.cs b/src/System.Management.Automation/engine/remoting/server/ServerPowerShellDriver.cs index a21cea97117..4786d4f29b4 100644 --- a/src/System.Management.Automation/engine/remoting/server/ServerPowerShellDriver.cs +++ b/src/System.Management.Automation/engine/remoting/server/ServerPowerShellDriver.cs @@ -1,5 +1,5 @@ /********************************************************************++ - * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. * --********************************************************************/ using System.Security.Principal; diff --git a/src/System.Management.Automation/engine/remoting/server/ServerRemoteHost.cs b/src/System.Management.Automation/engine/remoting/server/ServerRemoteHost.cs index 37ace9c6393..5cfe0c0e538 100644 --- a/src/System.Management.Automation/engine/remoting/server/ServerRemoteHost.cs +++ b/src/System.Management.Automation/engine/remoting/server/ServerRemoteHost.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation.Host; diff --git a/src/System.Management.Automation/engine/remoting/server/ServerRemoteHostRawUserInterface.cs b/src/System.Management.Automation/engine/remoting/server/ServerRemoteHostRawUserInterface.cs index a6cfc7b111c..9f5abf2238e 100644 --- a/src/System.Management.Automation/engine/remoting/server/ServerRemoteHostRawUserInterface.cs +++ b/src/System.Management.Automation/engine/remoting/server/ServerRemoteHostRawUserInterface.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation.Host; diff --git a/src/System.Management.Automation/engine/remoting/server/ServerRemoteHostUserInterface.cs b/src/System.Management.Automation/engine/remoting/server/ServerRemoteHostUserInterface.cs index abfb692cd6b..663b76b342e 100644 --- a/src/System.Management.Automation/engine/remoting/server/ServerRemoteHostUserInterface.cs +++ b/src/System.Management.Automation/engine/remoting/server/ServerRemoteHostUserInterface.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/remoting/server/ServerRemotingProtocol2.cs b/src/System.Management.Automation/engine/remoting/server/ServerRemotingProtocol2.cs index d69f9ed5583..4d2661c53e9 100644 --- a/src/System.Management.Automation/engine/remoting/server/ServerRemotingProtocol2.cs +++ b/src/System.Management.Automation/engine/remoting/server/ServerRemotingProtocol2.cs @@ -1,5 +1,5 @@ /********************************************************************++ - * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. * --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/remoting/server/ServerRunspacePoolDriver.cs b/src/System.Management.Automation/engine/remoting/server/ServerRunspacePoolDriver.cs index a262751b792..d5eb20893de 100644 --- a/src/System.Management.Automation/engine/remoting/server/ServerRunspacePoolDriver.cs +++ b/src/System.Management.Automation/engine/remoting/server/ServerRunspacePoolDriver.cs @@ -1,5 +1,5 @@ /********************************************************************++ - * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. * --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/remoting/server/ServerSteppablePipelineDriver.cs b/src/System.Management.Automation/engine/remoting/server/ServerSteppablePipelineDriver.cs index d59bb598dc9..1dcf430923c 100644 --- a/src/System.Management.Automation/engine/remoting/server/ServerSteppablePipelineDriver.cs +++ b/src/System.Management.Automation/engine/remoting/server/ServerSteppablePipelineDriver.cs @@ -1,5 +1,5 @@ /********************************************************************++ - * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. * --********************************************************************/ using System.Threading; diff --git a/src/System.Management.Automation/engine/remoting/server/ServerSteppablePipelineSubscriber.cs b/src/System.Management.Automation/engine/remoting/server/ServerSteppablePipelineSubscriber.cs index 2df0f6d4984..7159a203eb2 100644 --- a/src/System.Management.Automation/engine/remoting/server/ServerSteppablePipelineSubscriber.cs +++ b/src/System.Management.Automation/engine/remoting/server/ServerSteppablePipelineSubscriber.cs @@ -1,5 +1,5 @@ /********************************************************************++ - * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. * --********************************************************************/ using Dbg = System.Management.Automation.Diagnostics; diff --git a/src/System.Management.Automation/engine/remoting/server/WSManChannelEvents.cs b/src/System.Management.Automation/engine/remoting/server/WSManChannelEvents.cs index 85e1620693c..d09127c86be 100644 --- a/src/System.Management.Automation/engine/remoting/server/WSManChannelEvents.cs +++ b/src/System.Management.Automation/engine/remoting/server/WSManChannelEvents.cs @@ -1,5 +1,5 @@ /********************************************************************++ - * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. * --********************************************************************/ namespace System.Management.Automation.Remoting.WSMan diff --git a/src/System.Management.Automation/engine/remoting/server/serverremotesession.cs b/src/System.Management.Automation/engine/remoting/server/serverremotesession.cs index d342f4c1155..ada9ba95ab6 100644 --- a/src/System.Management.Automation/engine/remoting/server/serverremotesession.cs +++ b/src/System.Management.Automation/engine/remoting/server/serverremotesession.cs @@ -1,5 +1,5 @@ /********************************************************************++ - * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. * --********************************************************************/ using System.Threading; diff --git a/src/System.Management.Automation/engine/remoting/server/serverremotesessionstatemachine.cs b/src/System.Management.Automation/engine/remoting/server/serverremotesessionstatemachine.cs index 50768e434a9..e87557155f4 100644 --- a/src/System.Management.Automation/engine/remoting/server/serverremotesessionstatemachine.cs +++ b/src/System.Management.Automation/engine/remoting/server/serverremotesessionstatemachine.cs @@ -1,5 +1,5 @@ /********************************************************************++ - * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. * --********************************************************************/ using System.Threading; diff --git a/src/System.Management.Automation/engine/remoting/server/serverremotingprotocol.cs b/src/System.Management.Automation/engine/remoting/server/serverremotingprotocol.cs index 002be8ff46a..88010ddb3e2 100644 --- a/src/System.Management.Automation/engine/remoting/server/serverremotingprotocol.cs +++ b/src/System.Management.Automation/engine/remoting/server/serverremotingprotocol.cs @@ -1,5 +1,5 @@ /********************************************************************++ - * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. * --********************************************************************/ using Dbg = System.Management.Automation.Diagnostics; diff --git a/src/System.Management.Automation/engine/remoting/server/serverremotingprotocolimplementation.cs b/src/System.Management.Automation/engine/remoting/server/serverremotingprotocolimplementation.cs index da8b38ba95a..a2d9604d14c 100644 --- a/src/System.Management.Automation/engine/remoting/server/serverremotingprotocolimplementation.cs +++ b/src/System.Management.Automation/engine/remoting/server/serverremotingprotocolimplementation.cs @@ -1,5 +1,5 @@ /********************************************************************++ - * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. * --********************************************************************/ using System.Management.Automation.Remoting.Server; diff --git a/src/System.Management.Automation/engine/runtime/Binding/Binders.cs b/src/System.Management.Automation/engine/runtime/Binding/Binders.cs index 3436efee062..72934c33485 100644 --- a/src/System.Management.Automation/engine/runtime/Binding/Binders.cs +++ b/src/System.Management.Automation/engine/runtime/Binding/Binders.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/runtime/CompiledScriptBlock.cs b/src/System.Management.Automation/engine/runtime/CompiledScriptBlock.cs index a46d6dacc42..f457796a4e1 100644 --- a/src/System.Management.Automation/engine/runtime/CompiledScriptBlock.cs +++ b/src/System.Management.Automation/engine/runtime/CompiledScriptBlock.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/runtime/Operations/ArrayOps.cs b/src/System.Management.Automation/engine/runtime/Operations/ArrayOps.cs index c2051c91201..5c44e281e28 100644 --- a/src/System.Management.Automation/engine/runtime/Operations/ArrayOps.cs +++ b/src/System.Management.Automation/engine/runtime/Operations/ArrayOps.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ // ReSharper disable UnusedMember.Global diff --git a/src/System.Management.Automation/engine/runtime/Operations/ClassOps.cs b/src/System.Management.Automation/engine/runtime/Operations/ClassOps.cs index b6a2855da66..28cab722d0c 100644 --- a/src/System.Management.Automation/engine/runtime/Operations/ClassOps.cs +++ b/src/System.Management.Automation/engine/runtime/Operations/ClassOps.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/runtime/Operations/MiscOps.cs b/src/System.Management.Automation/engine/runtime/Operations/MiscOps.cs index 9559c61d8db..0e669eebfd9 100644 --- a/src/System.Management.Automation/engine/runtime/Operations/MiscOps.cs +++ b/src/System.Management.Automation/engine/runtime/Operations/MiscOps.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; @@ -410,7 +410,7 @@ internal static void InvokePipeline(object input, commandProcessor = AddCommand(pipelineProcessor, pipeElements[i], pipeElementAsts[i], commandRedirection, context); } - + var cmdletInfo = commandProcessor?.CommandInfo as CmdletInfo; if (cmdletInfo?.ImplementingType == typeof(OutNullCommand)) { @@ -420,7 +420,7 @@ internal static void InvokePipeline(object input, // Out-Null is the only command, bail without running anything return; } - + // Out-Null is the last command, rewrite command before Out-Null to a null pipe, but // only if it didn't redirect anything, e.g. `Get-Stuff > o.txt | Out-Null` var nextToLastCommand = pipelineProcessor.Commands[commandsCount - 2]; @@ -493,7 +493,7 @@ internal static void InvokePipelineInBackground( System.Text.StringBuilder updatedScriptblock = new System.Text.StringBuilder(cmdPrefix.Length + scriptblockBodyString.Length + 18); updatedScriptblock.Append(cmdPrefix); int position = 0; - // Prefix variables in the scriptblock with $using: + // Prefix variables in the scriptblock with $using: foreach (var v in variables) { var vName = ((VariableExpressionAst) v).VariablePath.UserPath; @@ -502,7 +502,7 @@ internal static void InvokePipelineInBackground( continue; // Skip PowerShell magic variables if (Regex.Match(vName, - "^(global:){0,1}(PID|PSVersionTable|PSEdition|PSHOME|HOST|TRUE|FALSE|NULL)$", + "^(global:){0,1}(PID|PSVersionTable|PSEdition|PSHOME|HOST|TRUE|FALSE|NULL)$", RegexOptions.IgnoreCase|RegexOptions.CultureInvariant).Success == false ) { diff --git a/src/System.Management.Automation/engine/runtime/Operations/NumericOps.cs b/src/System.Management.Automation/engine/runtime/Operations/NumericOps.cs index 89349361ed2..534b714302c 100644 --- a/src/System.Management.Automation/engine/runtime/Operations/NumericOps.cs +++ b/src/System.Management.Automation/engine/runtime/Operations/NumericOps.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ // ReSharper disable UnusedMember.Global diff --git a/src/System.Management.Automation/engine/runtime/Operations/StringOps.cs b/src/System.Management.Automation/engine/runtime/Operations/StringOps.cs index 4e705f125bf..c513cc569da 100644 --- a/src/System.Management.Automation/engine/runtime/Operations/StringOps.cs +++ b/src/System.Management.Automation/engine/runtime/Operations/StringOps.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Globalization; diff --git a/src/System.Management.Automation/engine/runtime/Operations/VariableOps.cs b/src/System.Management.Automation/engine/runtime/Operations/VariableOps.cs index 33cb89991ce..402257788c5 100644 --- a/src/System.Management.Automation/engine/runtime/Operations/VariableOps.cs +++ b/src/System.Management.Automation/engine/runtime/Operations/VariableOps.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Linq; diff --git a/src/System.Management.Automation/engine/runtime/ScriptBlockToPowerShell.cs b/src/System.Management.Automation/engine/runtime/ScriptBlockToPowerShell.cs index e63fb06a84d..d86a8e9cada 100644 --- a/src/System.Management.Automation/engine/runtime/ScriptBlockToPowerShell.cs +++ b/src/System.Management.Automation/engine/runtime/ScriptBlockToPowerShell.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/scriptparameterbinder.cs b/src/System.Management.Automation/engine/scriptparameterbinder.cs index c4d5ea7d266..3d40f11d344 100644 --- a/src/System.Management.Automation/engine/scriptparameterbinder.cs +++ b/src/System.Management.Automation/engine/scriptparameterbinder.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/engine/scriptparameterbindercontroller.cs b/src/System.Management.Automation/engine/scriptparameterbindercontroller.cs index 7767e25727f..cde402ebbd3 100644 --- a/src/System.Management.Automation/engine/scriptparameterbindercontroller.cs +++ b/src/System.Management.Automation/engine/scriptparameterbindercontroller.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/engine/serialization.cs b/src/System.Management.Automation/engine/serialization.cs index 5cf890e990c..feadb81279f 100644 --- a/src/System.Management.Automation/engine/serialization.cs +++ b/src/System.Management.Automation/engine/serialization.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/help/AliasHelpInfo.cs b/src/System.Management.Automation/help/AliasHelpInfo.cs index 253cab15c31..da026404d97 100644 --- a/src/System.Management.Automation/help/AliasHelpInfo.cs +++ b/src/System.Management.Automation/help/AliasHelpInfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Diagnostics.CodeAnalysis; // for fxcop diff --git a/src/System.Management.Automation/help/AliasHelpProvider.cs b/src/System.Management.Automation/help/AliasHelpProvider.cs index 3f10cd91407..e6c268d2dfa 100644 --- a/src/System.Management.Automation/help/AliasHelpProvider.cs +++ b/src/System.Management.Automation/help/AliasHelpProvider.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/help/BaseCommandHelpInfo.cs b/src/System.Management.Automation/help/BaseCommandHelpInfo.cs index c67d82d3f69..9c0c8b3c409 100644 --- a/src/System.Management.Automation/help/BaseCommandHelpInfo.cs +++ b/src/System.Management.Automation/help/BaseCommandHelpInfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; @@ -44,7 +44,7 @@ internal PSObject Details } /// - /// Name of command. + /// Name of command. /// /// Name of command internal override string Name @@ -130,7 +130,7 @@ internal override string Synopsis /// RelatedLinks. /// /// - /// Null if no Uri is specified by the helpinfo or a + /// Null if no Uri is specified by the helpinfo or a /// valid Uri. /// /// @@ -249,8 +249,8 @@ internal Uri LookupUriFromCommandInfo() if (!System.Uri.IsWellFormedUriString(uriString, UriKind.RelativeOrAbsolute)) { // WinBlue: 545315 Online help links are broken with localized help - // Example: https://go.microsoft.com/fwlink/?LinkID=113324 (möglicherwei se auf Englisch) - // Split the string based on (space). We decided to go with this approach as + // Example: https://go.microsoft.com/fwlink/?LinkID=113324 (moglicherwei se auf Englisch) + // Split the string based on (space). We decided to go with this approach as // UX localization authors use spaces. Correctly extracting only the wellformed URI // is out-of-scope for this fix. string[] tempUriSplitArray = uriString.Split(Utils.Separators.Space); @@ -316,8 +316,8 @@ internal static Uri GetUriFromCommandPSObject(PSObject commandFullHelp) if (!System.Uri.IsWellFormedUriString(uriString, UriKind.RelativeOrAbsolute)) { // WinBlue: 545315 Online help links are broken with localized help - // Example: https://go.microsoft.com/fwlink/?LinkID=113324 (möglicherwei se auf Englisch) - // Split the string based on (space). We decided to go with this approach as + // Example: https://go.microsoft.com/fwlink/?LinkID=113324 (moglicherwei se auf Englisch) + // Split the string based on (space). We decided to go with this approach as // UX localization authors use spaces. Correctly extracting only the wellformed URI // is out-of-scope for this fix. string[] tempUriSplitArray = uriString.Split(Utils.Separators.Space); @@ -342,10 +342,10 @@ internal static Uri GetUriFromCommandPSObject(PSObject commandFullHelp) /// /// Returns true if help content in help info matches the - /// pattern contained in . + /// pattern contained in . /// The underlying code will usually run pattern.IsMatch() on /// content it wants to search. - /// Cmdlet help info looks for pattern in Synopsis and + /// Cmdlet help info looks for pattern in Synopsis and /// DetailedDescription /// /// @@ -374,7 +374,7 @@ internal override bool MatchPatternInContent(WildcardPattern pattern) /// Returns help information for a parameter(s) identified by pattern /// /// pattern to search for parameters - /// A collection of parameters that match pattern + /// A collection of parameters that match pattern internal override PSObject[] GetParameter(string pattern) { // this object knows Maml format... diff --git a/src/System.Management.Automation/help/CabinetAPI.cs b/src/System.Management.Automation/help/CabinetAPI.cs index 4711520c656..a28dcf990e3 100644 --- a/src/System.Management.Automation/help/CabinetAPI.cs +++ b/src/System.Management.Automation/help/CabinetAPI.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Diagnostics.CodeAnalysis; diff --git a/src/System.Management.Automation/help/CabinetNativeApi.cs b/src/System.Management.Automation/help/CabinetNativeApi.cs index 1078d7a8959..4c3521e20bf 100644 --- a/src/System.Management.Automation/help/CabinetNativeApi.cs +++ b/src/System.Management.Automation/help/CabinetNativeApi.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.IO; diff --git a/src/System.Management.Automation/help/CommandHelpProvider.cs b/src/System.Management.Automation/help/CommandHelpProvider.cs index 63fb98885e1..4c0967338f9 100644 --- a/src/System.Management.Automation/help/CommandHelpProvider.cs +++ b/src/System.Management.Automation/help/CommandHelpProvider.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.IO; @@ -22,7 +22,7 @@ namespace System.Management.Automation /// /// Class CommandHelpProvider implement the help provider for commands. /// - /// + /// /// /// Command Help information are stored in 'help.xml' files. Location of these files /// can be found from through the engine execution context. @@ -38,7 +38,7 @@ internal CommandHelpProvider(HelpSystem helpSystem) : base(helpSystem) } /// - /// + /// /// static CommandHelpProvider() { @@ -405,13 +405,13 @@ private HelpInfo GetHelpInfo(CommandInfo commandInfo, bool reportErrors, bool se /// /// ExactMatchHelp implementation for this help provider. /// - /// + /// /// - /// ExactMatchHelp is overridden instead of DoExactMatchHelp to make sure - /// all help item retrieval will go through command discovery. Because each + /// ExactMatchHelp is overridden instead of DoExactMatchHelp to make sure + /// all help item retrieval will go through command discovery. Because each /// help file can contain multiple help items for different commands. Directly /// retrieve help cache can result in a invalid command to contain valid - /// help item. Forcing each ExactMatchHelp to go through command discovery + /// help item. Forcing each ExactMatchHelp to go through command discovery /// will make sure helpInfo for invalid command will not be returned. /// /// help request object @@ -477,10 +477,10 @@ private static string GetCmdletAssemblyPath(CmdletInfo cmdletInfo) } /// - /// This is a hashtable to track which help files are loaded already. - /// - /// This will avoid one help file getting loaded again and again. - /// (Which should not happen unless some commandlet is pointing + /// This is a hashtable to track which help files are loaded already. + /// + /// This will avoid one help file getting loaded again and again. + /// (Which should not happen unless some commandlet is pointing /// to a help file that actually doesn't contain the help for it). /// /// @@ -585,7 +585,7 @@ private string FindHelpFile(CmdletInfo cmdletInfo) // e.g., .ni.dll as supposed to .dll. // When cmdlet metadata is generated for the 'HelpFile' field, we use the name assembly and we append '-Help.xml' to it. - // Because of this, if the cmdlet is part of an N’gen assembly, then 'HelpFile' field will be pointing to a help file which does not exist. + // Because of this, if the cmdlet is part of an Ngen assembly, then 'HelpFile' field will be pointing to a help file which does not exist. // If this is the case, we remove '.ni' from the help file name and try again. // For example: // Ngen assembly name: Microsoft.PowerShell.Commands.Management.ni.dll @@ -604,7 +604,7 @@ private string FindHelpFile(CmdletInfo cmdletInfo) if (String.IsNullOrEmpty(location)) { // If the help file could not be found, then it is possible that the actual assembly name is something like - // .ni.dll, e.g., MyAssembly.ni.dll, so let’s try to find the original help file in the cmdlet metadata. + // .ni.dll, e.g., MyAssembly.ni.dll, so let's try to find the original help file in the cmdlet metadata. location = GetHelpFile(helpFile, cmdletInfo); } } @@ -661,13 +661,13 @@ private void LoadHelpFile(string helpFile, string helpFileIdentifier, string com } /// - /// Load help file for HelpInfo objects. The HelpInfo objects will be + /// Load help file for HelpInfo objects. The HelpInfo objects will be /// put into help cache. /// /// - /// 1. Needs to pay special attention about error handling in this function. + /// 1. Needs to pay special attention about error handling in this function. /// Common errors include: file not found and invalid xml. None of these error - /// should cause help search to stop. + /// should cause help search to stop. /// 2. a helpfile cache is used to avoid same file got loaded again and again. /// private void LoadHelpFile(string helpFile, string helpFileIdentifier) @@ -738,7 +738,7 @@ private void LoadHelpFile(string helpFile, string helpFileIdentifier) } /// - /// Process user defined help data by finding the corresponding helpInfo and inserting + /// Process user defined help data by finding the corresponding helpInfo and inserting /// necessary helpdata info to command help. /// /// PSSnapIn Name for the current help file. @@ -873,7 +873,7 @@ private HelpInfo GetFromCommandCacheOrCmdletInfo(CmdletInfo cmdletInfo) /// Import-Module and Import-PSSession supports changing the name of a command /// by suppling a custom prefix. In those cases, the help content is stored by using the /// original command name (without prefix) as the key. - /// + /// /// This method retrieves the help content by suppressing the prefix and then making a copy /// of the help content + change the name and then returns the copied help content. /// @@ -956,15 +956,15 @@ private void AddToCommandCache(string mshSnapInId, string cmdletName, MamlComman } /// - /// Check whether a HelpItems node indicates that the help content is - /// authored using maml schema. - /// - /// This covers two cases: + /// Check whether a HelpItems node indicates that the help content is + /// authored using maml schema. + /// + /// This covers two cases: /// a. If the help file has an extension .maml. /// b. If HelpItems node (which should be the top node of any command help file) /// has an attribute "schema" with value "maml", its content is in maml /// schema - /// + /// /// /// /// @@ -990,7 +990,7 @@ internal static bool IsMamlHelp(string helpFile, XmlNode helpItemsNode) } /// - /// Search help for a specific target. + /// Search help for a specific target. /// /// help request object /// @@ -1005,7 +1005,7 @@ internal override IEnumerable SearchHelp(HelpRequest helpRequest, bool // this will be used only when searchOnlyContent == true WildcardPattern wildCardPattern = null; // Decorated Search means that original match target is a target without - // wildcard patterns. It come here to because exact match was not found + // wildcard patterns. It come here to because exact match was not found // and search target will be decorated with wildcard character '*' to // search again. bool decoratedSearch = !WildcardPattern.ContainsWildcardCharacters(helpRequest.Target); @@ -1208,7 +1208,7 @@ private static bool Match(string target, string pattern) /// content to search in. /// string patterns to look for. /// - /// true if contains any of the patterns + /// true if contains any of the patterns /// present in /// false otherwise. /// @@ -1237,7 +1237,7 @@ private static bool Match(string target, ICollection patterns) /// This can return more than 1 helpinfo object. /// /// HelpInfo that is forwarded over - /// Help request object + /// Help request object /// The result helpInfo objects after processing internal override IEnumerable ProcessForwardedHelp(HelpInfo helpInfo, HelpRequest helpRequest) { @@ -1284,8 +1284,8 @@ internal override IEnumerable ProcessForwardedHelp(HelpInfo helpInfo, } /// - /// This will reset the help cache. Normally this corresponds to a - /// help culture change. + /// This will reset the help cache. Normally this corresponds to a + /// help culture change. /// internal override void Reset() { @@ -1345,9 +1345,9 @@ internal virtual CommandSearcher GetCommandSearcherForSearch(string pattern, Exe } /// - /// This is the class to track the user-defined Help Data which is separate from the - /// commandHelp itself. - /// + /// This is the class to track the user-defined Help Data which is separate from the + /// commandHelp itself. + /// /// Legally, user-defined Help Data should be within the same file as the corresponding /// commandHelp and it should appear after the commandHelp. /// diff --git a/src/System.Management.Automation/help/DefaultCommandHelpObjectBuilder.cs b/src/System.Management.Automation/help/DefaultCommandHelpObjectBuilder.cs index 69316612c31..610bdb5795c 100644 --- a/src/System.Management.Automation/help/DefaultCommandHelpObjectBuilder.cs +++ b/src/System.Management.Automation/help/DefaultCommandHelpObjectBuilder.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation.Internal; diff --git a/src/System.Management.Automation/help/DefaultHelpProvider.cs b/src/System.Management.Automation/help/DefaultHelpProvider.cs index 8089061b52a..4586a78a400 100644 --- a/src/System.Management.Automation/help/DefaultHelpProvider.cs +++ b/src/System.Management.Automation/help/DefaultHelpProvider.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/help/DscResourceHelpProvider.cs b/src/System.Management.Automation/help/DscResourceHelpProvider.cs index 428801dcfd9..ab363ca5e17 100644 --- a/src/System.Management.Automation/help/DscResourceHelpProvider.cs +++ b/src/System.Management.Automation/help/DscResourceHelpProvider.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/help/HelpCategoryInvalidException.cs b/src/System.Management.Automation/help/HelpCategoryInvalidException.cs index ec24e0804ff..df48e634250 100644 --- a/src/System.Management.Automation/help/HelpCategoryInvalidException.cs +++ b/src/System.Management.Automation/help/HelpCategoryInvalidException.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #pragma warning disable 1634, 1691 diff --git a/src/System.Management.Automation/help/HelpCommands.cs b/src/System.Management.Automation/help/HelpCommands.cs index 5766c027060..95951fd17cb 100644 --- a/src/System.Management.Automation/help/HelpCommands.cs +++ b/src/System.Management.Automation/help/HelpCommands.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/help/HelpCommentsParser.cs b/src/System.Management.Automation/help/HelpCommentsParser.cs index a0c6bd7eb77..99226dba1a3 100644 --- a/src/System.Management.Automation/help/HelpCommentsParser.cs +++ b/src/System.Management.Automation/help/HelpCommentsParser.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.IO; diff --git a/src/System.Management.Automation/help/HelpErrorTracer.cs b/src/System.Management.Automation/help/HelpErrorTracer.cs index c1ac33d846a..913913466cc 100644 --- a/src/System.Management.Automation/help/HelpErrorTracer.cs +++ b/src/System.Management.Automation/help/HelpErrorTracer.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/help/HelpFileHelpInfo.cs b/src/System.Management.Automation/help/HelpFileHelpInfo.cs index 6c59810d6fd..257dabb14da 100644 --- a/src/System.Management.Automation/help/HelpFileHelpInfo.cs +++ b/src/System.Management.Automation/help/HelpFileHelpInfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.IO; diff --git a/src/System.Management.Automation/help/HelpFileHelpProvider.cs b/src/System.Management.Automation/help/HelpFileHelpProvider.cs index fb58ef69169..cfccf547731 100644 --- a/src/System.Management.Automation/help/HelpFileHelpProvider.cs +++ b/src/System.Management.Automation/help/HelpFileHelpProvider.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.IO; diff --git a/src/System.Management.Automation/help/HelpInfo.cs b/src/System.Management.Automation/help/HelpInfo.cs index 00096d1a19a..f73baefd1a7 100644 --- a/src/System.Management.Automation/help/HelpInfo.cs +++ b/src/System.Management.Automation/help/HelpInfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.ObjectModel; diff --git a/src/System.Management.Automation/help/HelpNotFoundException.cs b/src/System.Management.Automation/help/HelpNotFoundException.cs index aec33ac03a7..e1b4b9a55b7 100644 --- a/src/System.Management.Automation/help/HelpNotFoundException.cs +++ b/src/System.Management.Automation/help/HelpNotFoundException.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #pragma warning disable 1634, 1691 diff --git a/src/System.Management.Automation/help/HelpProvider.cs b/src/System.Management.Automation/help/HelpProvider.cs index d9a40346dcf..4675113e04c 100644 --- a/src/System.Management.Automation/help/HelpProvider.cs +++ b/src/System.Management.Automation/help/HelpProvider.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.IO; diff --git a/src/System.Management.Automation/help/HelpProviderWithCache.cs b/src/System.Management.Automation/help/HelpProviderWithCache.cs index 82b0a6be759..895a4515ca5 100644 --- a/src/System.Management.Automation/help/HelpProviderWithCache.cs +++ b/src/System.Management.Automation/help/HelpProviderWithCache.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/help/HelpProviderWithFullCache.cs b/src/System.Management.Automation/help/HelpProviderWithFullCache.cs index ee6a0f49718..81221cf37c4 100644 --- a/src/System.Management.Automation/help/HelpProviderWithFullCache.cs +++ b/src/System.Management.Automation/help/HelpProviderWithFullCache.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/help/HelpRequest.cs b/src/System.Management.Automation/help/HelpRequest.cs index 50049c8d9bf..fab35c51f5d 100644 --- a/src/System.Management.Automation/help/HelpRequest.cs +++ b/src/System.Management.Automation/help/HelpRequest.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ namespace System.Management.Automation diff --git a/src/System.Management.Automation/help/HelpSystem.cs b/src/System.Management.Automation/help/HelpSystem.cs index 13aaf69551a..d12f7e32048 100644 --- a/src/System.Management.Automation/help/HelpSystem.cs +++ b/src/System.Management.Automation/help/HelpSystem.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/help/MUIFileSearcher.cs b/src/System.Management.Automation/help/MUIFileSearcher.cs index 798ca01b44d..7e12f26cdbb 100644 --- a/src/System.Management.Automation/help/MUIFileSearcher.cs +++ b/src/System.Management.Automation/help/MUIFileSearcher.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.IO; diff --git a/src/System.Management.Automation/help/MamlClassHelpInfo.cs b/src/System.Management.Automation/help/MamlClassHelpInfo.cs index 6037574e576..4bc7c03db3e 100644 --- a/src/System.Management.Automation/help/MamlClassHelpInfo.cs +++ b/src/System.Management.Automation/help/MamlClassHelpInfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Xml; diff --git a/src/System.Management.Automation/help/MamlCommandHelpInfo.cs b/src/System.Management.Automation/help/MamlCommandHelpInfo.cs index 052fb80e1fa..d122a91a12f 100644 --- a/src/System.Management.Automation/help/MamlCommandHelpInfo.cs +++ b/src/System.Management.Automation/help/MamlCommandHelpInfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Globalization; diff --git a/src/System.Management.Automation/help/MamlNode.cs b/src/System.Management.Automation/help/MamlNode.cs index 693256be69b..2bf558910e7 100644 --- a/src/System.Management.Automation/help/MamlNode.cs +++ b/src/System.Management.Automation/help/MamlNode.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/help/MamlUtil.cs b/src/System.Management.Automation/help/MamlUtil.cs index f4e97a74e6a..29fe3c165b4 100644 --- a/src/System.Management.Automation/help/MamlUtil.cs +++ b/src/System.Management.Automation/help/MamlUtil.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation.Help; diff --git a/src/System.Management.Automation/help/PSClassHelpProvider.cs b/src/System.Management.Automation/help/PSClassHelpProvider.cs index b2c123634e1..ec418adfd86 100644 --- a/src/System.Management.Automation/help/PSClassHelpProvider.cs +++ b/src/System.Management.Automation/help/PSClassHelpProvider.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/help/ProviderCommandHelpInfo.cs b/src/System.Management.Automation/help/ProviderCommandHelpInfo.cs index 35bb3f3c8ac..b092467768a 100644 --- a/src/System.Management.Automation/help/ProviderCommandHelpInfo.cs +++ b/src/System.Management.Automation/help/ProviderCommandHelpInfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using Dbg = System.Management.Automation.Diagnostics; diff --git a/src/System.Management.Automation/help/ProviderContext.cs b/src/System.Management.Automation/help/ProviderContext.cs index c5ab2e911b2..993376789cf 100644 --- a/src/System.Management.Automation/help/ProviderContext.cs +++ b/src/System.Management.Automation/help/ProviderContext.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation.Provider; diff --git a/src/System.Management.Automation/help/ProviderHelpInfo.cs b/src/System.Management.Automation/help/ProviderHelpInfo.cs index a162857fdc0..6ec2faa4d34 100644 --- a/src/System.Management.Automation/help/ProviderHelpInfo.cs +++ b/src/System.Management.Automation/help/ProviderHelpInfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/help/ProviderHelpProvider.cs b/src/System.Management.Automation/help/ProviderHelpProvider.cs index f51424380e3..7323aeba6cf 100644 --- a/src/System.Management.Automation/help/ProviderHelpProvider.cs +++ b/src/System.Management.Automation/help/ProviderHelpProvider.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.IO; diff --git a/src/System.Management.Automation/help/RemoteHelpInfo.cs b/src/System.Management.Automation/help/RemoteHelpInfo.cs index 6fa8ef0ffdc..4e581a98cb2 100644 --- a/src/System.Management.Automation/help/RemoteHelpInfo.cs +++ b/src/System.Management.Automation/help/RemoteHelpInfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.ObjectModel; diff --git a/src/System.Management.Automation/help/SaveHelpCommand.cs b/src/System.Management.Automation/help/SaveHelpCommand.cs index e1ea74b5ad7..4329fa25b8a 100644 --- a/src/System.Management.Automation/help/SaveHelpCommand.cs +++ b/src/System.Management.Automation/help/SaveHelpCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/help/ScriptCommandHelpProvider.cs b/src/System.Management.Automation/help/ScriptCommandHelpProvider.cs index a08328db188..8501b963d78 100644 --- a/src/System.Management.Automation/help/ScriptCommandHelpProvider.cs +++ b/src/System.Management.Automation/help/ScriptCommandHelpProvider.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ namespace System.Management.Automation diff --git a/src/System.Management.Automation/help/SyntaxHelpInfo.cs b/src/System.Management.Automation/help/SyntaxHelpInfo.cs index f8087b8b0dd..4e2081dbe2d 100644 --- a/src/System.Management.Automation/help/SyntaxHelpInfo.cs +++ b/src/System.Management.Automation/help/SyntaxHelpInfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ namespace System.Management.Automation diff --git a/src/System.Management.Automation/help/UpdatableHelpCommandBase.cs b/src/System.Management.Automation/help/UpdatableHelpCommandBase.cs index ff3bf2a6746..66f6575b6d1 100644 --- a/src/System.Management.Automation/help/UpdatableHelpCommandBase.cs +++ b/src/System.Management.Automation/help/UpdatableHelpCommandBase.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/help/UpdatableHelpInfo.cs b/src/System.Management.Automation/help/UpdatableHelpInfo.cs index f6da9ded1e1..467de5a53f1 100644 --- a/src/System.Management.Automation/help/UpdatableHelpInfo.cs +++ b/src/System.Management.Automation/help/UpdatableHelpInfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation.Internal; diff --git a/src/System.Management.Automation/help/UpdatableHelpModuleInfo.cs b/src/System.Management.Automation/help/UpdatableHelpModuleInfo.cs index 8abd2df282c..c525ed0cf51 100644 --- a/src/System.Management.Automation/help/UpdatableHelpModuleInfo.cs +++ b/src/System.Management.Automation/help/UpdatableHelpModuleInfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Globalization; diff --git a/src/System.Management.Automation/help/UpdatableHelpSystem.cs b/src/System.Management.Automation/help/UpdatableHelpSystem.cs index 2b90450b27c..6c1fc5f75a5 100644 --- a/src/System.Management.Automation/help/UpdatableHelpSystem.cs +++ b/src/System.Management.Automation/help/UpdatableHelpSystem.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Globalization; diff --git a/src/System.Management.Automation/help/UpdatableHelpUri.cs b/src/System.Management.Automation/help/UpdatableHelpUri.cs index 23241997fbc..c8c4286505c 100644 --- a/src/System.Management.Automation/help/UpdatableHelpUri.cs +++ b/src/System.Management.Automation/help/UpdatableHelpUri.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Globalization; diff --git a/src/System.Management.Automation/help/UpdateHelpCommand.cs b/src/System.Management.Automation/help/UpdateHelpCommand.cs index d8e748612b7..a7eca22ee38 100644 --- a/src/System.Management.Automation/help/UpdateHelpCommand.cs +++ b/src/System.Management.Automation/help/UpdateHelpCommand.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/logging/LogContext.cs b/src/System.Management.Automation/logging/LogContext.cs index 238c7674670..97af8b6d7ad 100644 --- a/src/System.Management.Automation/logging/LogContext.cs +++ b/src/System.Management.Automation/logging/LogContext.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ namespace System.Management.Automation diff --git a/src/System.Management.Automation/logging/LogProvider.cs b/src/System.Management.Automation/logging/LogProvider.cs index 8161f1e6f00..362a417c67c 100644 --- a/src/System.Management.Automation/logging/LogProvider.cs +++ b/src/System.Management.Automation/logging/LogProvider.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/logging/MshLog.cs b/src/System.Management.Automation/logging/MshLog.cs index 07e919640af..5e9c554cb52 100644 --- a/src/System.Management.Automation/logging/MshLog.cs +++ b/src/System.Management.Automation/logging/MshLog.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Concurrent; diff --git a/src/System.Management.Automation/logging/eventlog/EventLogLogProvider.cs b/src/System.Management.Automation/logging/eventlog/EventLogLogProvider.cs index e6c735b07b1..084f6f2b12e 100644 --- a/src/System.Management.Automation/logging/eventlog/EventLogLogProvider.cs +++ b/src/System.Management.Automation/logging/eventlog/EventLogLogProvider.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/namespaces/AliasProvider.cs b/src/System.Management.Automation/namespaces/AliasProvider.cs index c7bbaabcaed..b8c6557dfcc 100644 --- a/src/System.Management.Automation/namespaces/AliasProvider.cs +++ b/src/System.Management.Automation/namespaces/AliasProvider.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ diff --git a/src/System.Management.Automation/namespaces/ContainerProviderBase.cs b/src/System.Management.Automation/namespaces/ContainerProviderBase.cs index 6feaa2fa2d1..b67a2f9f46f 100644 --- a/src/System.Management.Automation/namespaces/ContainerProviderBase.cs +++ b/src/System.Management.Automation/namespaces/ContainerProviderBase.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Diagnostics.CodeAnalysis; diff --git a/src/System.Management.Automation/namespaces/CoreCommandContext.cs b/src/System.Management.Automation/namespaces/CoreCommandContext.cs index 60e95567f79..3ecbd9c5163 100644 --- a/src/System.Management.Automation/namespaces/CoreCommandContext.cs +++ b/src/System.Management.Automation/namespaces/CoreCommandContext.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.ObjectModel; diff --git a/src/System.Management.Automation/namespaces/DriveProviderBase.cs b/src/System.Management.Automation/namespaces/DriveProviderBase.cs index b6852a68148..323bcaeddf7 100644 --- a/src/System.Management.Automation/namespaces/DriveProviderBase.cs +++ b/src/System.Management.Automation/namespaces/DriveProviderBase.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.ObjectModel; diff --git a/src/System.Management.Automation/namespaces/EnvironmentProvider.cs b/src/System.Management.Automation/namespaces/EnvironmentProvider.cs index f9af5240e73..5f4dcf71db8 100644 --- a/src/System.Management.Automation/namespaces/EnvironmentProvider.cs +++ b/src/System.Management.Automation/namespaces/EnvironmentProvider.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ diff --git a/src/System.Management.Automation/namespaces/FileSystemContentStream.cs b/src/System.Management.Automation/namespaces/FileSystemContentStream.cs index 121a40f54e7..7402e52bf9b 100644 --- a/src/System.Management.Automation/namespaces/FileSystemContentStream.cs +++ b/src/System.Management.Automation/namespaces/FileSystemContentStream.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/namespaces/FileSystemProvider.cs b/src/System.Management.Automation/namespaces/FileSystemProvider.cs index d08125db5c2..904bbf83cf2 100644 --- a/src/System.Management.Automation/namespaces/FileSystemProvider.cs +++ b/src/System.Management.Automation/namespaces/FileSystemProvider.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/namespaces/FileSystemSecurity.cs b/src/System.Management.Automation/namespaces/FileSystemSecurity.cs index 947a8c50d6b..22f07c89cf5 100644 --- a/src/System.Management.Automation/namespaces/FileSystemSecurity.cs +++ b/src/System.Management.Automation/namespaces/FileSystemSecurity.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/namespaces/FunctionProvider.cs b/src/System.Management.Automation/namespaces/FunctionProvider.cs index 97723b51fc8..0ec824c5362 100644 --- a/src/System.Management.Automation/namespaces/FunctionProvider.cs +++ b/src/System.Management.Automation/namespaces/FunctionProvider.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ diff --git a/src/System.Management.Automation/namespaces/IContentProvider.cs b/src/System.Management.Automation/namespaces/IContentProvider.cs index ed889e3b804..dee126fffad 100644 --- a/src/System.Management.Automation/namespaces/IContentProvider.cs +++ b/src/System.Management.Automation/namespaces/IContentProvider.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ namespace System.Management.Automation.Provider diff --git a/src/System.Management.Automation/namespaces/IContentReader.cs b/src/System.Management.Automation/namespaces/IContentReader.cs index ad9d360a337..359bb89f551 100644 --- a/src/System.Management.Automation/namespaces/IContentReader.cs +++ b/src/System.Management.Automation/namespaces/IContentReader.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/namespaces/IContentWriter.cs b/src/System.Management.Automation/namespaces/IContentWriter.cs index f319fccb2cc..03e89f6829f 100644 --- a/src/System.Management.Automation/namespaces/IContentWriter.cs +++ b/src/System.Management.Automation/namespaces/IContentWriter.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/namespaces/IDynamicPropertyProvider.cs b/src/System.Management.Automation/namespaces/IDynamicPropertyProvider.cs index bdfa2ed8a08..274b147b3d5 100644 --- a/src/System.Management.Automation/namespaces/IDynamicPropertyProvider.cs +++ b/src/System.Management.Automation/namespaces/IDynamicPropertyProvider.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ namespace System.Management.Automation.Provider diff --git a/src/System.Management.Automation/namespaces/IPermissionProvider.cs b/src/System.Management.Automation/namespaces/IPermissionProvider.cs index 2841ce144be..29b6f33aad0 100644 --- a/src/System.Management.Automation/namespaces/IPermissionProvider.cs +++ b/src/System.Management.Automation/namespaces/IPermissionProvider.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Security.AccessControl; diff --git a/src/System.Management.Automation/namespaces/IPropertiesProvider.cs b/src/System.Management.Automation/namespaces/IPropertiesProvider.cs index d3ac44ffdea..47f92c7fb7e 100644 --- a/src/System.Management.Automation/namespaces/IPropertiesProvider.cs +++ b/src/System.Management.Automation/namespaces/IPropertiesProvider.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.ObjectModel; diff --git a/src/System.Management.Automation/namespaces/ItemProviderBase.cs b/src/System.Management.Automation/namespaces/ItemProviderBase.cs index 1e846bf1c20..9dff69f286c 100644 --- a/src/System.Management.Automation/namespaces/ItemProviderBase.cs +++ b/src/System.Management.Automation/namespaces/ItemProviderBase.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation.Internal; diff --git a/src/System.Management.Automation/namespaces/LocationGlobber.cs b/src/System.Management.Automation/namespaces/LocationGlobber.cs index 718052aa123..ec2db5033a3 100644 --- a/src/System.Management.Automation/namespaces/LocationGlobber.cs +++ b/src/System.Management.Automation/namespaces/LocationGlobber.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/namespaces/NavigationProviderBase.cs b/src/System.Management.Automation/namespaces/NavigationProviderBase.cs index dbfad2c48f6..46eca2d3d00 100644 --- a/src/System.Management.Automation/namespaces/NavigationProviderBase.cs +++ b/src/System.Management.Automation/namespaces/NavigationProviderBase.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/namespaces/PathInfo.cs b/src/System.Management.Automation/namespaces/PathInfo.cs index 976c169d3a9..2643dbd94b8 100644 --- a/src/System.Management.Automation/namespaces/PathInfo.cs +++ b/src/System.Management.Automation/namespaces/PathInfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using Dbg = System.Management.Automation; diff --git a/src/System.Management.Automation/namespaces/ProviderBase.cs b/src/System.Management.Automation/namespaces/ProviderBase.cs index 4d406a82717..69ba4aaa608 100644 --- a/src/System.Management.Automation/namespaces/ProviderBase.cs +++ b/src/System.Management.Automation/namespaces/ProviderBase.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #pragma warning disable 1634, 1691 diff --git a/src/System.Management.Automation/namespaces/ProviderBaseSecurity.cs b/src/System.Management.Automation/namespaces/ProviderBaseSecurity.cs index b27ebfd12be..8f7ec8e2f9f 100644 --- a/src/System.Management.Automation/namespaces/ProviderBaseSecurity.cs +++ b/src/System.Management.Automation/namespaces/ProviderBaseSecurity.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Security.AccessControl; diff --git a/src/System.Management.Automation/namespaces/ProviderDeclarationAttribute.cs b/src/System.Management.Automation/namespaces/ProviderDeclarationAttribute.cs index 3ae25d73ac2..cfdbc770576 100644 --- a/src/System.Management.Automation/namespaces/ProviderDeclarationAttribute.cs +++ b/src/System.Management.Automation/namespaces/ProviderDeclarationAttribute.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ namespace System.Management.Automation.Provider diff --git a/src/System.Management.Automation/namespaces/RegistryProvider.cs b/src/System.Management.Automation/namespaces/RegistryProvider.cs index 90baabc6821..681cc600415 100644 --- a/src/System.Management.Automation/namespaces/RegistryProvider.cs +++ b/src/System.Management.Automation/namespaces/RegistryProvider.cs @@ -1,6 +1,6 @@ #if !UNIX /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/namespaces/RegistrySecurity.cs b/src/System.Management.Automation/namespaces/RegistrySecurity.cs index cf7674be4ba..96bbcb00569 100644 --- a/src/System.Management.Automation/namespaces/RegistrySecurity.cs +++ b/src/System.Management.Automation/namespaces/RegistrySecurity.cs @@ -1,6 +1,6 @@ #if !UNIX /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/namespaces/RegistryWrapper.cs b/src/System.Management.Automation/namespaces/RegistryWrapper.cs index 5ca64c7ab63..b6dfe795e4e 100644 --- a/src/System.Management.Automation/namespaces/RegistryWrapper.cs +++ b/src/System.Management.Automation/namespaces/RegistryWrapper.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ /* * The registry wrapper provides a common interface to both the transacted diff --git a/src/System.Management.Automation/namespaces/SafeTransactionHandle.cs b/src/System.Management.Automation/namespaces/SafeTransactionHandle.cs index 9bbe7c51f2e..9699241da55 100644 --- a/src/System.Management.Automation/namespaces/SafeTransactionHandle.cs +++ b/src/System.Management.Automation/namespaces/SafeTransactionHandle.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // #pragma warning disable 1634, 1691 @@ -42,10 +42,10 @@ internal static SafeTransactionHandle Create(Transaction managedTransaction) } // MSDTC is not available on WinPE machine. - // CommitableTransaction will use DTC APIs under the covers to get KTM transaction manager interface. - // KTM is kernel Transaction Manager to handle file, registry etc and MSDTC provides an integration support - // with KTM to handle transaction across kernel resources and MSDTC resources like SQL, MSMQ etc. - // We need KTMRM service as well. WinPE doesn’t have these services installed + // CommitableTransaction will use DTC APIs under the covers to get KTM transaction manager interface. + // KTM is kernel Transaction Manager to handle file, registry etc and MSDTC provides an integration support + // with KTM to handle transaction across kernel resources and MSDTC resources like SQL, MSMQ etc. + // We need KTMRM service as well. WinPE doesn't have these services installed if (Utils.IsWinPEHost() || PsUtils.IsRunningOnProcessorArchitectureARM()) { throw new NotSupportedException(RegistryProviderStrings.NotSupported_KernelTransactions); diff --git a/src/System.Management.Automation/namespaces/SessionStateProviderBase.cs b/src/System.Management.Automation/namespaces/SessionStateProviderBase.cs index f01e737976e..617825157e5 100644 --- a/src/System.Management.Automation/namespaces/SessionStateProviderBase.cs +++ b/src/System.Management.Automation/namespaces/SessionStateProviderBase.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #pragma warning disable 1634, 1691 diff --git a/src/System.Management.Automation/namespaces/StackInfo.cs b/src/System.Management.Automation/namespaces/StackInfo.cs index 5d77c8e5d56..e362f35b1b2 100644 --- a/src/System.Management.Automation/namespaces/StackInfo.cs +++ b/src/System.Management.Automation/namespaces/StackInfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/namespaces/VariableProvider.cs b/src/System.Management.Automation/namespaces/VariableProvider.cs index 457928e3a10..accf720aa6a 100644 --- a/src/System.Management.Automation/namespaces/VariableProvider.cs +++ b/src/System.Management.Automation/namespaces/VariableProvider.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ diff --git a/src/System.Management.Automation/security/Authenticode.cs b/src/System.Management.Automation/security/Authenticode.cs index d79aad4b0f9..ac4d1bc3cac 100644 --- a/src/System.Management.Automation/security/Authenticode.cs +++ b/src/System.Management.Automation/security/Authenticode.cs @@ -1,7 +1,7 @@ #pragma warning disable 1634, 1691 /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #pragma warning disable 1634, 1691 diff --git a/src/System.Management.Automation/security/CatalogHelper.cs b/src/System.Management.Automation/security/CatalogHelper.cs index d08ffc278cc..fea05cfe09c 100644 --- a/src/System.Management.Automation/security/CatalogHelper.cs +++ b/src/System.Management.Automation/security/CatalogHelper.cs @@ -1,7 +1,7 @@ #if !UNIX /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using Dbg = System.Management.Automation; diff --git a/src/System.Management.Automation/security/CredentialParameter.cs b/src/System.Management.Automation/security/CredentialParameter.cs index 4abde8527d1..127adaa9cb4 100644 --- a/src/System.Management.Automation/security/CredentialParameter.cs +++ b/src/System.Management.Automation/security/CredentialParameter.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #pragma warning disable 1634, 1691 diff --git a/src/System.Management.Automation/security/MshSignature.cs b/src/System.Management.Automation/security/MshSignature.cs index dbbdc98fe2c..61b8e569918 100644 --- a/src/System.Management.Automation/security/MshSignature.cs +++ b/src/System.Management.Automation/security/MshSignature.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ diff --git a/src/System.Management.Automation/security/SecureStringHelper.cs b/src/System.Management.Automation/security/SecureStringHelper.cs index f96881b1de7..ea30e395cf0 100644 --- a/src/System.Management.Automation/security/SecureStringHelper.cs +++ b/src/System.Management.Automation/security/SecureStringHelper.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/security/SecurityManager.cs b/src/System.Management.Automation/security/SecurityManager.cs index fabde5335f8..e4c79e2e72e 100644 --- a/src/System.Management.Automation/security/SecurityManager.cs +++ b/src/System.Management.Automation/security/SecurityManager.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using Dbg = System.Management.Automation; diff --git a/src/System.Management.Automation/security/SecuritySupport.cs b/src/System.Management.Automation/security/SecuritySupport.cs index ba737881b9d..bf0e87c867d 100644 --- a/src/System.Management.Automation/security/SecuritySupport.cs +++ b/src/System.Management.Automation/security/SecuritySupport.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #pragma warning disable 1634, 1691 @@ -266,7 +266,7 @@ internal static ExecutionPolicy GetExecutionPolicy(string shellId) /// Used to determine execution policy when group policies are in effect /// /// - /// This is somewhat expensive to determine and does not change within the lifetime of the current process + /// This is somewhat expensive to determine and does not change within the lifetime of the current process /// private static bool HasGpScriptParent { @@ -358,12 +358,12 @@ internal static ExecutionPolicy GetExecutionPolicy(string shellId, ExecutionPoli // Be sure we aren't being called by Group Policy // itself. A group policy should never block a logon / - // logoff script. + // logoff script. if (String.IsNullOrEmpty(groupPolicyPreference) || HasGpScriptParent) { return ExecutionPolicy.Undefined; - } - return ParseExecutionPolicy(groupPolicyPreference); + } + return ParseExecutionPolicy(groupPolicyPreference); } } diff --git a/src/System.Management.Automation/security/nativeMethods.cs b/src/System.Management.Automation/security/nativeMethods.cs index 49561ae58df..7e486e6ef69 100644 --- a/src/System.Management.Automation/security/nativeMethods.cs +++ b/src/System.Management.Automation/security/nativeMethods.cs @@ -1,7 +1,7 @@ #pragma warning disable 1634, 1691 /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #pragma warning disable 1634, 1691 diff --git a/src/System.Management.Automation/singleshell/config/MshConsoleLoadException.cs b/src/System.Management.Automation/singleshell/config/MshConsoleLoadException.cs index ee252cd112a..eee78a4205a 100644 --- a/src/System.Management.Automation/singleshell/config/MshConsoleLoadException.cs +++ b/src/System.Management.Automation/singleshell/config/MshConsoleLoadException.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Runtime.Serialization; diff --git a/src/System.Management.Automation/singleshell/config/MshSnapinInfo.cs b/src/System.Management.Automation/singleshell/config/MshSnapinInfo.cs index ded9214632a..56784516778 100644 --- a/src/System.Management.Automation/singleshell/config/MshSnapinInfo.cs +++ b/src/System.Management.Automation/singleshell/config/MshSnapinInfo.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/singleshell/config/MshSnapinLoadException.cs b/src/System.Management.Automation/singleshell/config/MshSnapinLoadException.cs index a156a96ae7d..c3ac0e252d8 100644 --- a/src/System.Management.Automation/singleshell/config/MshSnapinLoadException.cs +++ b/src/System.Management.Automation/singleshell/config/MshSnapinLoadException.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Runtime.Serialization; diff --git a/src/System.Management.Automation/utils/ArchitectureSensitiveAttribute.cs b/src/System.Management.Automation/utils/ArchitectureSensitiveAttribute.cs index a84c60d515a..5843ec7308a 100644 --- a/src/System.Management.Automation/utils/ArchitectureSensitiveAttribute.cs +++ b/src/System.Management.Automation/utils/ArchitectureSensitiveAttribute.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ namespace System.Management.Automation.Internal diff --git a/src/System.Management.Automation/utils/BackgroundDispatcher.cs b/src/System.Management.Automation/utils/BackgroundDispatcher.cs index 5297eaecb74..724ce27bb39 100644 --- a/src/System.Management.Automation/utils/BackgroundDispatcher.cs +++ b/src/System.Management.Automation/utils/BackgroundDispatcher.cs @@ -1,6 +1,6 @@ //----------------------------------------------------------------------- // -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------- diff --git a/src/System.Management.Automation/utils/ClrFacade.cs b/src/System.Management.Automation/utils/ClrFacade.cs index f8eafa3622e..9a3947c2c6b 100644 --- a/src/System.Management.Automation/utils/ClrFacade.cs +++ b/src/System.Management.Automation/utils/ClrFacade.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System.Collections.Generic; diff --git a/src/System.Management.Automation/utils/CommandDiscoveryExceptions.cs b/src/System.Management.Automation/utils/CommandDiscoveryExceptions.cs index a1e3fce7e33..41fdfed9efd 100644 --- a/src/System.Management.Automation/utils/CommandDiscoveryExceptions.cs +++ b/src/System.Management.Automation/utils/CommandDiscoveryExceptions.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Runtime.Serialization; diff --git a/src/System.Management.Automation/utils/CommandProcessorExceptions.cs b/src/System.Management.Automation/utils/CommandProcessorExceptions.cs index 40385b3c1f9..ece59d5a15a 100644 --- a/src/System.Management.Automation/utils/CommandProcessorExceptions.cs +++ b/src/System.Management.Automation/utils/CommandProcessorExceptions.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Runtime.Serialization; diff --git a/src/System.Management.Automation/utils/CoreProviderCmdlets.cs b/src/System.Management.Automation/utils/CoreProviderCmdlets.cs index a4a059bcc45..591de52d813 100644 --- a/src/System.Management.Automation/utils/CoreProviderCmdlets.cs +++ b/src/System.Management.Automation/utils/CoreProviderCmdlets.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ namespace System.Management.Automation diff --git a/src/System.Management.Automation/utils/CryptoUtils.cs b/src/System.Management.Automation/utils/CryptoUtils.cs index 8e7fe44ded7..2a6acccd556 100644 --- a/src/System.Management.Automation/utils/CryptoUtils.cs +++ b/src/System.Management.Automation/utils/CryptoUtils.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Text; diff --git a/src/System.Management.Automation/utils/EncodingUtils.cs b/src/System.Management.Automation/utils/EncodingUtils.cs index e98ef8968a1..126314d7d38 100644 --- a/src/System.Management.Automation/utils/EncodingUtils.cs +++ b/src/System.Management.Automation/utils/EncodingUtils.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/utils/ExecutionExceptions.cs b/src/System.Management.Automation/utils/ExecutionExceptions.cs index c1e276cb516..c80c9e038ea 100644 --- a/src/System.Management.Automation/utils/ExecutionExceptions.cs +++ b/src/System.Management.Automation/utils/ExecutionExceptions.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #pragma warning disable 1634, 1691 diff --git a/src/System.Management.Automation/utils/ExtensionMethods.cs b/src/System.Management.Automation/utils/ExtensionMethods.cs index 2ed40105724..783f7b6909e 100644 --- a/src/System.Management.Automation/utils/ExtensionMethods.cs +++ b/src/System.Management.Automation/utils/ExtensionMethods.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System.Collections.Generic; diff --git a/src/System.Management.Automation/utils/FormatAndTypeDataHelper.cs b/src/System.Management.Automation/utils/FormatAndTypeDataHelper.cs index 2817677295a..9af3de5e71d 100644 --- a/src/System.Management.Automation/utils/FormatAndTypeDataHelper.cs +++ b/src/System.Management.Automation/utils/FormatAndTypeDataHelper.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.IO; diff --git a/src/System.Management.Automation/utils/GraphicalHostReflectionWrapper.cs b/src/System.Management.Automation/utils/GraphicalHostReflectionWrapper.cs index 6e12613071d..42facc45013 100644 --- a/src/System.Management.Automation/utils/GraphicalHostReflectionWrapper.cs +++ b/src/System.Management.Automation/utils/GraphicalHostReflectionWrapper.cs @@ -1,6 +1,6 @@ //----------------------------------------------------------------------- // -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // // // Implements GraphicalHostReflectionWrapper diff --git a/src/System.Management.Automation/utils/HostInterfacesExceptions.cs b/src/System.Management.Automation/utils/HostInterfacesExceptions.cs index ad7e421790b..f5fdbb88d8d 100644 --- a/src/System.Management.Automation/utils/HostInterfacesExceptions.cs +++ b/src/System.Management.Automation/utils/HostInterfacesExceptions.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Runtime.Serialization; diff --git a/src/System.Management.Automation/utils/IObjectReader.cs b/src/System.Management.Automation/utils/IObjectReader.cs index 0aa40826f9c..5962ce5a65b 100644 --- a/src/System.Management.Automation/utils/IObjectReader.cs +++ b/src/System.Management.Automation/utils/IObjectReader.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Threading; diff --git a/src/System.Management.Automation/utils/IObjectWriter.cs b/src/System.Management.Automation/utils/IObjectWriter.cs index ef7ceb237ab..b33282bacbf 100644 --- a/src/System.Management.Automation/utils/IObjectWriter.cs +++ b/src/System.Management.Automation/utils/IObjectWriter.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ namespace System.Management.Automation.Runspaces diff --git a/src/System.Management.Automation/utils/MetadataExceptions.cs b/src/System.Management.Automation/utils/MetadataExceptions.cs index 69e4dad6fc0..5253113fe62 100644 --- a/src/System.Management.Automation/utils/MetadataExceptions.cs +++ b/src/System.Management.Automation/utils/MetadataExceptions.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Diagnostics.CodeAnalysis; diff --git a/src/System.Management.Automation/utils/MshArgumentException.cs b/src/System.Management.Automation/utils/MshArgumentException.cs index 0f1cbb4a040..9be5db46b12 100644 --- a/src/System.Management.Automation/utils/MshArgumentException.cs +++ b/src/System.Management.Automation/utils/MshArgumentException.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Runtime.Serialization; diff --git a/src/System.Management.Automation/utils/MshArgumentNullException.cs b/src/System.Management.Automation/utils/MshArgumentNullException.cs index 48fda99021a..ac439801f62 100644 --- a/src/System.Management.Automation/utils/MshArgumentNullException.cs +++ b/src/System.Management.Automation/utils/MshArgumentNullException.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Runtime.Serialization; diff --git a/src/System.Management.Automation/utils/MshArgumentOutOfRangeException.cs b/src/System.Management.Automation/utils/MshArgumentOutOfRangeException.cs index c440aec5184..3bf01bf663c 100644 --- a/src/System.Management.Automation/utils/MshArgumentOutOfRangeException.cs +++ b/src/System.Management.Automation/utils/MshArgumentOutOfRangeException.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Runtime.Serialization; diff --git a/src/System.Management.Automation/utils/MshInvalidOperationException.cs b/src/System.Management.Automation/utils/MshInvalidOperationException.cs index 2a034416e0e..a05810a5fc0 100644 --- a/src/System.Management.Automation/utils/MshInvalidOperationException.cs +++ b/src/System.Management.Automation/utils/MshInvalidOperationException.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Runtime.Serialization; diff --git a/src/System.Management.Automation/utils/MshNotImplementedException.cs b/src/System.Management.Automation/utils/MshNotImplementedException.cs index c250a3d7b61..f5ab26deaa9 100644 --- a/src/System.Management.Automation/utils/MshNotImplementedException.cs +++ b/src/System.Management.Automation/utils/MshNotImplementedException.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Runtime.Serialization; diff --git a/src/System.Management.Automation/utils/MshNotSupportedException.cs b/src/System.Management.Automation/utils/MshNotSupportedException.cs index a1f2c57f05e..93cc9754604 100644 --- a/src/System.Management.Automation/utils/MshNotSupportedException.cs +++ b/src/System.Management.Automation/utils/MshNotSupportedException.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Runtime.Serialization; diff --git a/src/System.Management.Automation/utils/MshObjectDisposedException.cs b/src/System.Management.Automation/utils/MshObjectDisposedException.cs index 4b3f437dbd8..0a83ba5db21 100644 --- a/src/System.Management.Automation/utils/MshObjectDisposedException.cs +++ b/src/System.Management.Automation/utils/MshObjectDisposedException.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Runtime.Serialization; diff --git a/src/System.Management.Automation/utils/MshTraceSource.cs b/src/System.Management.Automation/utils/MshTraceSource.cs index 1b5b7c305a4..8d2f5c888fc 100644 --- a/src/System.Management.Automation/utils/MshTraceSource.cs +++ b/src/System.Management.Automation/utils/MshTraceSource.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #define TRACE diff --git a/src/System.Management.Automation/utils/ObjectReader.cs b/src/System.Management.Automation/utils/ObjectReader.cs index 6fd90292022..d5594fc42d2 100644 --- a/src/System.Management.Automation/utils/ObjectReader.cs +++ b/src/System.Management.Automation/utils/ObjectReader.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ namespace System.Management.Automation.Internal diff --git a/src/System.Management.Automation/utils/ObjectStream.cs b/src/System.Management.Automation/utils/ObjectStream.cs index 7b86a2a02ce..cc70e79af5f 100644 --- a/src/System.Management.Automation/utils/ObjectStream.cs +++ b/src/System.Management.Automation/utils/ObjectStream.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ diff --git a/src/System.Management.Automation/utils/ObjectWriter.cs b/src/System.Management.Automation/utils/ObjectWriter.cs index 7e72338b1ac..35fc754f5d7 100644 --- a/src/System.Management.Automation/utils/ObjectWriter.cs +++ b/src/System.Management.Automation/utils/ObjectWriter.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ namespace System.Management.Automation.Internal diff --git a/src/System.Management.Automation/utils/PInvokeDllNames.cs b/src/System.Management.Automation/utils/PInvokeDllNames.cs index 1841115f560..9458ae964e1 100644 --- a/src/System.Management.Automation/utils/PInvokeDllNames.cs +++ b/src/System.Management.Automation/utils/PInvokeDllNames.cs @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // namespace System.Management.Automation diff --git a/src/System.Management.Automation/utils/PSTelemetryMethods.cs b/src/System.Management.Automation/utils/PSTelemetryMethods.cs index c6118e71456..9558e6e02c7 100644 --- a/src/System.Management.Automation/utils/PSTelemetryMethods.cs +++ b/src/System.Management.Automation/utils/PSTelemetryMethods.cs @@ -1,6 +1,6 @@ #if LEGACYTELEMETRY /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/src/System.Management.Automation/utils/PSTelemetryWrapper.cs b/src/System.Management.Automation/utils/PSTelemetryWrapper.cs index 09b5dc2dd62..6be313afee5 100644 --- a/src/System.Management.Automation/utils/PSTelemetryWrapper.cs +++ b/src/System.Management.Automation/utils/PSTelemetryWrapper.cs @@ -1,6 +1,6 @@ #if LEGACYTELEMETRY /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Reflection; diff --git a/src/System.Management.Automation/utils/ParameterBinderExceptions.cs b/src/System.Management.Automation/utils/ParameterBinderExceptions.cs index bbbfa0447c4..b23db53835a 100644 --- a/src/System.Management.Automation/utils/ParameterBinderExceptions.cs +++ b/src/System.Management.Automation/utils/ParameterBinderExceptions.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation.Internal; diff --git a/src/System.Management.Automation/utils/ParserException.cs b/src/System.Management.Automation/utils/ParserException.cs index bc16ea00cd7..52a208466fd 100644 --- a/src/System.Management.Automation/utils/ParserException.cs +++ b/src/System.Management.Automation/utils/ParserException.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Diagnostics.CodeAnalysis; diff --git a/src/System.Management.Automation/utils/PathUtils.cs b/src/System.Management.Automation/utils/PathUtils.cs index 62ffc54faea..6b8b0de42da 100644 --- a/src/System.Management.Automation/utils/PathUtils.cs +++ b/src/System.Management.Automation/utils/PathUtils.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Generic; diff --git a/src/System.Management.Automation/utils/PlatformInvokes.cs b/src/System.Management.Automation/utils/PlatformInvokes.cs index e6c734d4e3b..028d768c0b6 100644 --- a/src/System.Management.Automation/utils/PlatformInvokes.cs +++ b/src/System.Management.Automation/utils/PlatformInvokes.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Runtime.InteropServices; diff --git a/src/System.Management.Automation/utils/PowerShellETWTracer.cs b/src/System.Management.Automation/utils/PowerShellETWTracer.cs index 59375d10e80..06e9bf39319 100644 --- a/src/System.Management.Automation/utils/PowerShellETWTracer.cs +++ b/src/System.Management.Automation/utils/PowerShellETWTracer.cs @@ -1,6 +1,6 @@ #if !UNIX // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System.Globalization; using System.Management.Automation.Runspaces; diff --git a/src/System.Management.Automation/utils/PowerShellExecutionHelper.cs b/src/System.Management.Automation/utils/PowerShellExecutionHelper.cs index 93ca34b8b71..0278962d6b9 100644 --- a/src/System.Management.Automation/utils/PowerShellExecutionHelper.cs +++ b/src/System.Management.Automation/utils/PowerShellExecutionHelper.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/utils/PsUtils.cs b/src/System.Management.Automation/utils/PsUtils.cs index 6ca4e411170..70d5a7cde28 100644 --- a/src/System.Management.Automation/utils/PsUtils.cs +++ b/src/System.Management.Automation/utils/PsUtils.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections; diff --git a/src/System.Management.Automation/utils/ResourceManagerCache.cs b/src/System.Management.Automation/utils/ResourceManagerCache.cs index cc9db9bae25..373947dca2b 100644 --- a/src/System.Management.Automation/utils/ResourceManagerCache.cs +++ b/src/System.Management.Automation/utils/ResourceManagerCache.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Reflection; diff --git a/src/System.Management.Automation/utils/RuntimeException.cs b/src/System.Management.Automation/utils/RuntimeException.cs index aa40d8f8b61..53011603272 100644 --- a/src/System.Management.Automation/utils/RuntimeException.cs +++ b/src/System.Management.Automation/utils/RuntimeException.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation.Language; diff --git a/src/System.Management.Automation/utils/SessionStateExceptions.cs b/src/System.Management.Automation/utils/SessionStateExceptions.cs index 0c0065807b9..f19ff72be24 100644 --- a/src/System.Management.Automation/utils/SessionStateExceptions.cs +++ b/src/System.Management.Automation/utils/SessionStateExceptions.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.ObjectModel; diff --git a/src/System.Management.Automation/utils/StringUtil.cs b/src/System.Management.Automation/utils/StringUtil.cs index 825372d1489..685866297d6 100644 --- a/src/System.Management.Automation/utils/StringUtil.cs +++ b/src/System.Management.Automation/utils/StringUtil.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Management.Automation.Host; diff --git a/src/System.Management.Automation/utils/StructuredTraceSource.cs b/src/System.Management.Automation/utils/StructuredTraceSource.cs index 0c94fa96597..1eb71840bd0 100644 --- a/src/System.Management.Automation/utils/StructuredTraceSource.cs +++ b/src/System.Management.Automation/utils/StructuredTraceSource.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #define TRACE diff --git a/src/System.Management.Automation/utils/Verbs.cs b/src/System.Management.Automation/utils/Verbs.cs index c05071fedaa..8b1997f3a5b 100644 --- a/src/System.Management.Automation/utils/Verbs.cs +++ b/src/System.Management.Automation/utils/Verbs.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Diagnostics.CodeAnalysis; diff --git a/src/System.Management.Automation/utils/assert.cs b/src/System.Management.Automation/utils/assert.cs index 0a80a465629..5985b4e39c1 100644 --- a/src/System.Management.Automation/utils/assert.cs +++ b/src/System.Management.Automation/utils/assert.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ // The define below is only valid for this file. It allows the methods diff --git a/src/System.Management.Automation/utils/perfCounters/CounterSetInstanceBase.cs b/src/System.Management.Automation/utils/perfCounters/CounterSetInstanceBase.cs index c028ac2a377..868ee0aef6a 100644 --- a/src/System.Management.Automation/utils/perfCounters/CounterSetInstanceBase.cs +++ b/src/System.Management.Automation/utils/perfCounters/CounterSetInstanceBase.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Concurrent; diff --git a/src/System.Management.Automation/utils/perfCounters/CounterSetRegistrarBase.cs b/src/System.Management.Automation/utils/perfCounters/CounterSetRegistrarBase.cs index 840aa87bd6b..f6bf886cede 100644 --- a/src/System.Management.Automation/utils/perfCounters/CounterSetRegistrarBase.cs +++ b/src/System.Management.Automation/utils/perfCounters/CounterSetRegistrarBase.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Diagnostics.PerformanceData; diff --git a/src/System.Management.Automation/utils/perfCounters/PSPerfCountersMgr.cs b/src/System.Management.Automation/utils/perfCounters/PSPerfCountersMgr.cs index 7632fbef109..17a7e50404c 100644 --- a/src/System.Management.Automation/utils/perfCounters/PSPerfCountersMgr.cs +++ b/src/System.Management.Automation/utils/perfCounters/PSPerfCountersMgr.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System.Collections.Concurrent; diff --git a/src/System.Management.Automation/utils/tracing/EtwActivity.cs b/src/System.Management.Automation/utils/tracing/EtwActivity.cs index d51d7b57845..45794cc00bd 100644 --- a/src/System.Management.Automation/utils/tracing/EtwActivity.cs +++ b/src/System.Management.Automation/utils/tracing/EtwActivity.cs @@ -1,6 +1,6 @@ #if !UNIX // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System.Collections.Generic; using System.Diagnostics.Eventing; diff --git a/src/System.Management.Automation/utils/tracing/EtwActivityReverter.cs b/src/System.Management.Automation/utils/tracing/EtwActivityReverter.cs index cb33d322f25..8ae9dd9248a 100644 --- a/src/System.Management.Automation/utils/tracing/EtwActivityReverter.cs +++ b/src/System.Management.Automation/utils/tracing/EtwActivityReverter.cs @@ -1,7 +1,7 @@ #if !UNIX //----------------------------------------------------------------------- // -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------- diff --git a/src/System.Management.Automation/utils/tracing/EtwActivityReverterMethodInvoker.cs b/src/System.Management.Automation/utils/tracing/EtwActivityReverterMethodInvoker.cs index 349568bf7a0..682accc7d81 100644 --- a/src/System.Management.Automation/utils/tracing/EtwActivityReverterMethodInvoker.cs +++ b/src/System.Management.Automation/utils/tracing/EtwActivityReverterMethodInvoker.cs @@ -1,7 +1,7 @@ #if !UNIX //----------------------------------------------------------------------- // -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------- diff --git a/src/System.Management.Automation/utils/tracing/EtwEventCorrelator.cs b/src/System.Management.Automation/utils/tracing/EtwEventCorrelator.cs index b82b9734c5b..7ffdf909532 100644 --- a/src/System.Management.Automation/utils/tracing/EtwEventCorrelator.cs +++ b/src/System.Management.Automation/utils/tracing/EtwEventCorrelator.cs @@ -1,7 +1,7 @@ #if !UNIX //----------------------------------------------------------------------- // -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------- diff --git a/src/System.Management.Automation/utils/tracing/IMethodInvoker.cs b/src/System.Management.Automation/utils/tracing/IMethodInvoker.cs index 25c621ca696..1da52df3207 100644 --- a/src/System.Management.Automation/utils/tracing/IMethodInvoker.cs +++ b/src/System.Management.Automation/utils/tracing/IMethodInvoker.cs @@ -1,7 +1,7 @@ #if !UNIX //----------------------------------------------------------------------- // -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------- diff --git a/src/System.Management.Automation/utils/tracing/PSEtwLog.cs b/src/System.Management.Automation/utils/tracing/PSEtwLog.cs index c7e7f39df8b..c2f449862f4 100644 --- a/src/System.Management.Automation/utils/tracing/PSEtwLog.cs +++ b/src/System.Management.Automation/utils/tracing/PSEtwLog.cs @@ -1,6 +1,6 @@ #if !UNIX // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System.Globalization; using System.Management.Automation.Internal; diff --git a/src/System.Management.Automation/utils/tracing/PSEtwLogProvider.cs b/src/System.Management.Automation/utils/tracing/PSEtwLogProvider.cs index 67ac09ffb3b..01b3b636bcb 100644 --- a/src/System.Management.Automation/utils/tracing/PSEtwLogProvider.cs +++ b/src/System.Management.Automation/utils/tracing/PSEtwLogProvider.cs @@ -1,6 +1,6 @@ #if !UNIX // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System.Diagnostics.Eventing; using System.Management.Automation.Internal; diff --git a/src/System.Management.Automation/utils/tracing/Tracing.cs b/src/System.Management.Automation/utils/tracing/Tracing.cs index 06744989e19..b93061723c9 100644 --- a/src/System.Management.Automation/utils/tracing/Tracing.cs +++ b/src/System.Management.Automation/utils/tracing/Tracing.cs @@ -1,6 +1,6 @@ #if !UNIX // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // using System.Text; diff --git a/src/powershell-native/nativemsh/pwrshcommon/ClrHostWrapper.h b/src/powershell-native/nativemsh/pwrshcommon/ClrHostWrapper.h index cb1b870cc9d..6001cc3f8ba 100644 --- a/src/powershell-native/nativemsh/pwrshcommon/ClrHostWrapper.h +++ b/src/powershell-native/nativemsh/pwrshcommon/ClrHostWrapper.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------- // // Microsoft Windows NT -// Copyright (C) Microsoft Corporation, 2014. +// Copyright (c) Microsoft Corporation. All rights reserved. // // File: ClrHostWrapper.h // @@ -14,7 +14,7 @@ #include #include "NativeMshConstants.h" -namespace NativeMsh +namespace NativeMsh { // // Abstract class to abstract CLR runtime host operations so that they can be @@ -57,7 +57,7 @@ namespace NativeMsh }; // - // Concrete implementation of the wrapper for CoreClr.dll's + // Concrete implementation of the wrapper for CoreClr.dll's // Platform-Agnostic hosting interface. // class CoreClrHostingApiWrapper : public ClrHostWrapper @@ -104,13 +104,13 @@ namespace NativeMsh coreclr_create_delegate_ptr createDelegatePtr; public: - CoreClrHostingApiWrapper() - : coreClrHandle(NULL), - pinnedModuleHandle(NULL), + CoreClrHostingApiWrapper() + : coreClrHandle(NULL), + pinnedModuleHandle(NULL), hostHandle(NULL), domainId(0), - initPtr(NULL), - shutdownPtr(NULL), + initPtr(NULL), + shutdownPtr(NULL), createDelegatePtr(NULL) {} @@ -119,12 +119,12 @@ namespace NativeMsh this->CleanUpHostWrapper(); } - virtual bool IsInitialized() - { - return (NULL != coreClrHandle); + virtual bool IsInitialized() + { + return (NULL != coreClrHandle); } - - // + + // // Attempts to load CoreCLR.dll from the specified directory. // On success pins the dll, sets coreCLRDirectoryPath and returns the HMODULE. // On failure returns NULL. @@ -171,7 +171,7 @@ namespace NativeMsh { return g_STOP_CLR_HOST_FAILED; } - + if (this->coreClrHandle) { // TODO: Is this comment still relevant with the new hosting API? @@ -196,12 +196,12 @@ namespace NativeMsh if (initPtr) { return initPtr( - exePath, - appDomainFriendlyName, - propertyCount, - propertyKeys, - propertyValues, - &(this->hostHandle), + exePath, + appDomainFriendlyName, + propertyCount, + propertyKeys, + propertyValues, + &(this->hostHandle), &(this->domainId)); } return E_FAIL; diff --git a/src/powershell-native/nativemsh/pwrshcommon/ConfigFileReader.h b/src/powershell-native/nativemsh/pwrshcommon/ConfigFileReader.h index 265992dbccd..e73a4c8d70b 100644 --- a/src/powershell-native/nativemsh/pwrshcommon/ConfigFileReader.h +++ b/src/powershell-native/nativemsh/pwrshcommon/ConfigFileReader.h @@ -1,7 +1,7 @@ // --------------------------------------------------------------------------- // // Microsoft Windows NT -// Copyright (C) Microsoft Corporation, 2014. +// Copyright (c) Microsoft Corporation. All rights reserved. // // Contents: A class that extracts the path to $PSHOME and the path to its // CoreCLR from a configuration file. @@ -11,7 +11,7 @@ #include -namespace NativeMsh +namespace NativeMsh { class ConfigFileReader { diff --git a/src/powershell-native/nativemsh/pwrshcommon/IPwrshCommonOutput.h b/src/powershell-native/nativemsh/pwrshcommon/IPwrshCommonOutput.h index c746d452ff1..421ce8275fc 100644 --- a/src/powershell-native/nativemsh/pwrshcommon/IPwrshCommonOutput.h +++ b/src/powershell-native/nativemsh/pwrshcommon/IPwrshCommonOutput.h @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #pragma once diff --git a/src/powershell-native/nativemsh/pwrshcommon/NativeMsh.h b/src/powershell-native/nativemsh/pwrshcommon/NativeMsh.h index 67809afb5e0..26896d0dfab 100644 --- a/src/powershell-native/nativemsh/pwrshcommon/NativeMsh.h +++ b/src/powershell-native/nativemsh/pwrshcommon/NativeMsh.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------- // // Microsoft Windows NT -// Copyright (C) Microsoft Corporation, 2005. +// Copyright (c) Microsoft Corporation. All rights reserved. // // File: NativeMsh.h // @@ -24,7 +24,7 @@ #include #endif -namespace NativeMsh +namespace NativeMsh { class PwrshCommon { @@ -35,7 +35,7 @@ namespace NativeMsh public: // Provides default implementations of all dependencies - PwrshCommon(); + PwrshCommon(); // Allows users to override the default dependency objects with a specific implementations. // diff --git a/src/powershell-native/nativemsh/pwrshcommon/NativeMshConstants.h b/src/powershell-native/nativemsh/pwrshcommon/NativeMshConstants.h index 1b325232595..55702b062c1 100644 --- a/src/powershell-native/nativemsh/pwrshcommon/NativeMshConstants.h +++ b/src/powershell-native/nativemsh/pwrshcommon/NativeMshConstants.h @@ -1,12 +1,12 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #pragma once #include -namespace NativeMsh +namespace NativeMsh { // // Begin nativemsh.mc codes @@ -49,7 +49,7 @@ namespace NativeMsh const int g_NONSTANDARD_CLR_VERSION = 36; const int g_SHELLBANNER1 = 37; const int g_SHELLBANNER2 = 38; - // Win8: 622653 Creating a copy of g_MISSING_REG_KEY to address scenarios where pwszMonadVersion is NULL. + // Win8: 622653 Creating a copy of g_MISSING_REG_KEY to address scenarios where pwszMonadVersion is NULL. const int g_MISSING_REG_KEY1 = 39; // // End nativemsh.mc codes diff --git a/src/powershell-native/nativemsh/pwrshcommon/SystemCallFacade.h b/src/powershell-native/nativemsh/pwrshcommon/SystemCallFacade.h index c44d6a31455..52021a19af8 100644 --- a/src/powershell-native/nativemsh/pwrshcommon/SystemCallFacade.h +++ b/src/powershell-native/nativemsh/pwrshcommon/SystemCallFacade.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------- // // Microsoft Windows NT -// Copyright (C) Microsoft Corporation, 2014. +// Copyright (c) Microsoft Corporation. All rights reserved. // // File: SystemCallFacade.h // @@ -14,7 +14,7 @@ #include #include -namespace NativeMsh +namespace NativeMsh { // // Abstract class to abstract system call operations so that they can be diff --git a/src/powershell-native/nativemsh/pwrshcommon/WinSystemCallFacade.cpp b/src/powershell-native/nativemsh/pwrshcommon/WinSystemCallFacade.cpp index 0c61d5bf640..5f65d70777f 100644 --- a/src/powershell-native/nativemsh/pwrshcommon/WinSystemCallFacade.cpp +++ b/src/powershell-native/nativemsh/pwrshcommon/WinSystemCallFacade.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------- // // Microsoft Windows NT -// Copyright (C) Microsoft Corporation, 2014. +// Copyright (c) Microsoft Corporation. All rights reserved. // // File: WinSystemCallFacade.h // @@ -11,7 +11,7 @@ #include "WinSystemCallFacade.h" -namespace NativeMsh +namespace NativeMsh { HMODULE WINAPI WinSystemCallFacade::LoadLibraryExW( _In_ LPCWSTR lpFileName, diff --git a/src/powershell-native/nativemsh/pwrshcommon/WinSystemCallFacade.h b/src/powershell-native/nativemsh/pwrshcommon/WinSystemCallFacade.h index 76ecf01f313..ec8b2bf9c00 100644 --- a/src/powershell-native/nativemsh/pwrshcommon/WinSystemCallFacade.h +++ b/src/powershell-native/nativemsh/pwrshcommon/WinSystemCallFacade.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------- // // Microsoft Windows NT -// Copyright (C) Microsoft Corporation, 2014. +// Copyright (c) Microsoft Corporation. All rights reserved. // // File: WinSystemCallFacade.h // @@ -13,7 +13,7 @@ #include "SystemCallFacade.h" -namespace NativeMsh +namespace NativeMsh { // // Actual implementation of the system calls for use during production. diff --git a/src/powershell-native/nativemsh/pwrshcommon/pwrshcommon.cpp b/src/powershell-native/nativemsh/pwrshcommon/pwrshcommon.cpp index fb68297b53d..dce1a721faa 100644 --- a/src/powershell-native/nativemsh/pwrshcommon/pwrshcommon.cpp +++ b/src/powershell-native/nativemsh/pwrshcommon/pwrshcommon.cpp @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ // @@ -13,7 +13,7 @@ Copyright (c) Microsoft Corporation. All rights reserved. #include #include "WinSystemCallFacade.h" -namespace NativeMsh +namespace NativeMsh { // // Defining these as "static" ensures internal linkage of the values. @@ -60,7 +60,7 @@ namespace NativeMsh // this should never cause overflow because VerifyInteger guarantees pwchMinorVersion // has less than g_MAX_NUMBER_OF_DIGITS_IN_VERSION which is 10. unsigned long ulTempResult = wcstoul(pwchStart, &pwchIntEnd, 10); - // Make sure the whole string is an integer and fits an int + // Make sure the whole string is an integer and fits an int if (pwchEnd != pwchIntEnd || ulTempResult > (unsigned long)INT_MAX) { returnResult = false; @@ -486,7 +486,7 @@ namespace NativeMsh } unsigned int PwrshCommon::IsEngineRegKeyWithVersionExisting( - LPCWSTR wszMonadVersion, + LPCWSTR wszMonadVersion, LPCWSTR wszMonadMajorVersion) { unsigned int exitCode = EXIT_CODE_SUCCESS; @@ -554,7 +554,7 @@ namespace NativeMsh break; } - // For PowerShell 3 and 4, the registry is 3. + // For PowerShell 3 and 4, the registry is 3. if ((monadMajorVersion == 4) || (monadMajorVersion == 5)) { monadMajorVersion = 3; @@ -871,20 +871,20 @@ namespace NativeMsh // The location where CoreCLR PowerShell Ext binaries are expected to be installed for inbox PowerShell. static PCSTR coreCLRPowerShellExtInstallDirectory = "%windir%\\system32\\CoreClrPowerShellExt\\v1.0\\"; - // The default PowerShell install directory for inbox PowerShell. + // The default PowerShell install directory for inbox PowerShell. // This location may be overridden by placing a config file in the same directory as the PowerShell host. static PCSTR powerShellInstallPath = "%windir%\\System32\\WindowsPowerShell\\v1.0\\"; unsigned int PwrshCommon::IdentifyHostDirectory( HostEnvironment& hostEnvironment) { - // Discover the path to the plugin or the executable (pwrshplugin.dll or powershell.exe). + // Discover the path to the plugin or the executable (pwrshplugin.dll or powershell.exe). // For PowerShell Core, the plugin no longer resides in %windir%\\system32 (it is in a sub-directory). // If pwrshplugin.dll is not loaded, it means that this is running via powershell.exe. wchar_t hostPath[MAX_PATH]; DWORD thisModuleLength; - if (GetModuleHandleW(L"pwrshplugin.dll")) + if (GetModuleHandleW(L"pwrshplugin.dll")) { thisModuleLength = GetModuleFileNameW(GetModuleHandleW(L"pwrshplugin.dll"), hostPath, MAX_PATH); } @@ -897,7 +897,7 @@ namespace NativeMsh // TODO: Use GetLastError() to find the specific error # return EXIT_CODE_INIT_FAILURE; } - + // Search for the last backslash in the host path. int lastBackslashIndex; for (lastBackslashIndex = thisModuleLength - 1; lastBackslashIndex >= 0; lastBackslashIndex--) @@ -923,13 +923,13 @@ namespace NativeMsh hostEnvironment.SetHostDirectoryPathW(reader->GetPathToPowerShell().c_str()); hostEnvironment.SetCoreCLRDirectoryPathW(reader->GetPathToCoreClr().c_str()); } - else + else { // There was an issue accessing or parsing the config file OR // we are working for the EXE. // - // TODO: This should not be the fallback for inbox PowerShell.exe. - // It should use coreCLRInstallDirectory and coreCLRPowerShellExtInstallDirectory. + // TODO: This should not be the fallback for inbox PowerShell.exe. + // It should use coreCLRInstallDirectory and coreCLRPowerShellExtInstallDirectory. // // Use the directory detected via GetModuleFileName + GetModuleHandle hostEnvironment.SetHostDirectoryPathW(hostPath); @@ -1033,15 +1033,15 @@ namespace NativeMsh // // - PwrshCommon::PwrshCommon() + PwrshCommon::PwrshCommon() : output(new PwrshCommonOutputDefault()), reader(new ConfigFileReader()), sysCalls(new WinSystemCallFacade()) { } PwrshCommon::PwrshCommon( - IPwrshCommonOutput* outObj, + IPwrshCommonOutput* outObj, ConfigFileReader* rdr, - SystemCallFacade* systemCalls) + SystemCallFacade* systemCalls) : output(outObj), reader(rdr), sysCalls(systemCalls) { if (NULL == output) @@ -1392,7 +1392,7 @@ namespace NativeMsh this->output->DisplayMessage(false, g_STARTING_CLR_FAILED, GetLastError()); return exitCode; } - + const int nMaxProps = 8; LPCSTR props[nMaxProps]; LPCSTR vals[nMaxProps]; @@ -1413,13 +1413,13 @@ namespace NativeMsh } if (listEmpty) { - // No CoreCLR assemblies were found in either location. There is no + // No CoreCLR assemblies were found in either location. There is no // point in continuing. this->output->DisplayMessage(false, g_STARTING_CLR_FAILED, GetLastError()); return EXIT_CODE_INIT_FAILURE; } - props[nProps] = "TRUSTED_PLATFORM_ASSEMBLIES"; + props[nProps] = "TRUSTED_PLATFORM_ASSEMBLIES"; std::string tempStr = assemblyList.str(); vals[nProps] = tempStr.c_str(); nProps++; @@ -1433,7 +1433,7 @@ namespace NativeMsh nProps++; int hr = hostWrapper->InitializeClr( - hostEnvironment.GetHostDirectoryPath(), + hostEnvironment.GetHostDirectoryPath(), friendlyName, nProps, props, diff --git a/src/powershell-native/nativemsh/pwrshexe/CssMainEntry.cpp b/src/powershell-native/nativemsh/pwrshexe/CssMainEntry.cpp index 35497d89221..113180536ae 100644 --- a/src/powershell-native/nativemsh/pwrshexe/CssMainEntry.cpp +++ b/src/powershell-native/nativemsh/pwrshexe/CssMainEntry.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------- // // Microsoft Windows NT -// Copyright (C) Microsoft Corporation, 2005. +// Copyright (c) Microsoft Corporation. All rights reserved. // // File: CoreCLRHost.cpp // @@ -9,8 +9,8 @@ // // ---------------------------------------------------------------------- -#include -#include +#include +#include #include #if !CORECLR #include "mscoree.h" diff --git a/src/powershell-native/nativemsh/pwrshexe/MainEntry.cpp b/src/powershell-native/nativemsh/pwrshexe/MainEntry.cpp index 5b51e99e151..102074108f6 100644 --- a/src/powershell-native/nativemsh/pwrshexe/MainEntry.cpp +++ b/src/powershell-native/nativemsh/pwrshexe/MainEntry.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------- // // Microsoft Windows NT -// Copyright (C) Microsoft Corporation, 2005. +// Copyright (c) Microsoft Corporation. All rights reserved. // // File: MainEntry.cpp // @@ -11,7 +11,7 @@ #ifdef _PREFAST_ #pragma prefast (push) -#pragma prefast (disable: 6054) +#pragma prefast (disable: 6054) #endif /* _PREFAST_ */ #include "Nativemsh.h" @@ -71,7 +71,7 @@ bool ConvertArgvToSafeArray( } rgsabound[0].lLbound = 0; - + // rgsabound[0].cElements holds the number of elements that need to be passed to managed exe rgsabound[0].cElements = argc - 1 - skipIndex; psa = SafeArrayCreate(VT_BSTR, 1, rgsabound); @@ -83,7 +83,7 @@ bool ConvertArgvToSafeArray( } long psaIndex[1]; - psaIndex[0] = 0; + psaIndex[0] = 0; if (0 != rgsabound[0].cElements) { @@ -116,7 +116,7 @@ bool ConvertArgvToSafeArray( bool FileExists(__in LPWSTR pszFileName) { - return (GetFileAttributesW(pszFileName) != INVALID_FILE_ATTRIBUTES); + return (GetFileAttributesW(pszFileName) != INVALID_FILE_ATTRIBUTES); } unsigned int LaunchManagedMonad( @@ -144,7 +144,7 @@ unsigned int LaunchManagedMonad( break; } // Use the hosting interfaces from .Net Framework 1.1 - CComPtr pCLR = NULL; + CComPtr pCLR = NULL; exitCode = pwrshCommon.LaunchCLR(wszMonadVersion, wszRuntimeVersion, &pCLR); @@ -187,7 +187,7 @@ unsigned int LaunchManagedMonad( // use CreateInstance because we use the assembly strong name (as opposed to CreateInstanceFrom) _bstr_t bstrConsoleHostAssemblyName = _bstr_t(wszConsoleHostAssemblyName); - _bstr_t bstrUnmanagedMshEntryClass = _bstr_t(L"Microsoft.PowerShell.UnmanagedPSEntry"); + _bstr_t bstrUnmanagedMshEntryClass = _bstr_t(L"Microsoft.PowerShell.UnmanagedPSEntry"); hr = spDefaultDomain->CreateInstance( bstrConsoleHostAssemblyName, @@ -211,13 +211,13 @@ unsigned int LaunchManagedMonad( CComPtr pDisp; pDisp = VntUnwrapped.pdispVal; - + OLECHAR FAR * wszMember = L"Start"; - + DISPID dispid; //Retrieve the DISPID hr = pDisp->GetIDsOfNames ( - IID_NULL, + IID_NULL, &wszMember, 1, LOCALE_SYSTEM_DEFAULT, @@ -233,7 +233,7 @@ unsigned int LaunchManagedMonad( VARIANT pVarArgs[2]; // Both EnterWithConsoleFile and EnterWithConsoleFile take a string and a string array - // The order of the arguments need to be reversed in this array + // The order of the arguments need to be reversed in this array pVarArgs[0].vt = VT_ARRAY; pVarArgs[0].parray = pArgvSA; @@ -761,7 +761,7 @@ unsigned int ParseCommandLineArguments( const wchar_t * wszArgumentServerMode20Short = L"s"; const int cchArgumentServerMode20Short = 2; // including null terminating bool bServerMode20Specified = false; - + int version_lpMonadMajorVersion = -1; int version_lpMonadMinorVersion = -1; wchar_t * version_pwszMonadVersion = NULL; @@ -783,7 +783,7 @@ unsigned int ParseCommandLineArguments( exitCode = EXIT_CODE_BAD_COMMAND_LINE_PARAMETER; break; } - + *lpMonadVersionIndex = *lpMonadMinorVersion = -1; if (1 >= argc) { @@ -794,7 +794,7 @@ unsigned int ParseCommandLineArguments( int idxParameterPosition = 1; LPCWSTR wszCommandLineInput = argv[idxParameterPosition]; - + // Parse for -version if (IsParameterMatched(wszArgumentVersion, cchArgumentVersion, wszCommandLineInput)) { @@ -806,14 +806,14 @@ unsigned int ParseCommandLineArguments( exitCode = EXIT_CODE_BAD_COMMAND_LINE_PARAMETER; break; } - *lpMonadVersionIndex = idxParameterPosition - 1; + *lpMonadVersionIndex = idxParameterPosition - 1; *pwszMonadVersion = argv[idxParameterPosition]; - + // Save the version values in case we need to override the version in psconsolefile version_lpMonadMajorVersion = *lpMonadMajorVersion; version_lpMonadMinorVersion = *lpMonadMinorVersion; version_pwszMonadVersion = argv[idxParameterPosition]; - + if (idxParameterPosition < argc - 1) { idxParameterPosition = idxParameterPosition + 1; @@ -846,11 +846,11 @@ unsigned int ParseCommandLineArguments( *lpMonadMinorVersion = -1; bServerMode20Specified = true; *pwszMonadVersion = L"2.0"; - + // let the rest of the parameter processing happen in managed code for -ServerMode // hence not updating wszCommandLineInput } - + // Parse for CLR Version if (IsParameterMatched(wszArgumentRuntimeVersion, cchArgumentRuntimeVersion, wszCommandLineInput)) { @@ -909,7 +909,7 @@ unsigned int ParseCommandLineArguments( exitCode = EXIT_CODE_BAD_COMMAND_LINE_PARAMETER; break; } - } + } // Parse for NoProfile if (IsParameterMatched(wszArgumentMonadProfile, cchArgumentMonadProfile, wszCommandLineInput) || @@ -924,20 +924,20 @@ unsigned int ParseCommandLineArguments( { *lpMonadMajorVersion = 3; *lpMonadMinorVersion = -1; - + wchar_t * wszConsoleFile = NULL; wchar_t * wszConsoleHostAssemblyName = NULL; wchar_t * wszRuntimeVersion = NULL; wchar_t * tempMonadVersion = NULL; - - // This gets the Monad Version from the registry + + // This gets the Monad Version from the registry exitCode = pwrshCommon.GetRegistryInfo( &tempMonadVersion, lpMonadMajorVersion, *lpMonadMinorVersion, &wszRuntimeVersion, &wszConsoleHostAssemblyName); - + if (EXIT_CODE_SUCCESS != exitCode) { break; @@ -963,7 +963,7 @@ unsigned int ParseCommandLineArguments( #pragma prefast(pop) -/********************************************************* +/********************************************************* Loads a string from the modules resource **********************************************************/ HRESULT SafeLoadString(UINT uId, __deref_out LPWSTR* ppszString) @@ -1020,8 +1020,8 @@ shortcut Note that the above short cut will not be stored on disk **************************************************************************/ -HRESULT CreateShortCut(PCWSTR pszDisplay, PCWSTR pszAppPath, PCWSTR pszDescription, - PCWSTR pszArguments, PCWSTR pszIconAppPath, int iIconIndex, bool requiresElevation, +HRESULT CreateShortCut(PCWSTR pszDisplay, PCWSTR pszAppPath, PCWSTR pszDescription, + PCWSTR pszArguments, PCWSTR pszIconAppPath, int iIconIndex, bool requiresElevation, bool console,IShellLink **ppShortCut) { CComPtr pShellLink; // pointer to a shell link @@ -1085,7 +1085,7 @@ HRESULT CreateShortCut(PCWSTR pszDisplay, PCWSTR pszAppPath, PCWSTR pszDescripti if (requiresElevation) { // It has methods GetFlags() and SetFlags() to obtain - // and modify the flags on a shell link. The + // and modify the flags on a shell link. The // SLDF_RUNAS_USER should be set to allow running as an // administrator @@ -1128,7 +1128,7 @@ INT CheckForISE() } free(pszExpandedPath); } - + return isePresent; } @@ -1205,16 +1205,16 @@ unsigned int ValidateDownlevelSetupHadClrWhenInstalled( // Else, Launch PowerShell LONG lResult = RegQueryValueExW(hEngineKey, g_NetFX_V4_IS_INSTALLED_KEY, NULL, NULL, NULL, &valueLengthInByte); if (lResult == ERROR_SUCCESS) - { - // If the data has the REG_SZ, REG_MULTI_SZ or REG_EXPAND_SZ type, this size includes any terminating null character or characters + { + // If the data has the REG_SZ, REG_MULTI_SZ or REG_EXPAND_SZ type, this size includes any terminating null character or characters // unless the data was stored without them - http://msdn.microsoft.com/en-us/library/ms724911(VS.85).aspx - NetFxV4IsInstalledKeyValue = new wchar_t[valueLengthInByte / sizeof(wchar_t)]; + NetFxV4IsInstalledKeyValue = new wchar_t[valueLengthInByte / sizeof(wchar_t)]; if (NULL == NetFxV4IsInstalledKeyValue) { exitCode = EXIT_CODE_INIT_FAILURE; } else - { + { memset(NetFxV4IsInstalledKeyValue, 0, valueLengthInByte); lResult = RegQueryValueExW( @@ -1222,9 +1222,9 @@ unsigned int ValidateDownlevelSetupHadClrWhenInstalled( g_NetFX_V4_IS_INSTALLED_KEY, NULL, NULL, - (LPBYTE) NetFxV4IsInstalledKeyValue, + (LPBYTE) NetFxV4IsInstalledKeyValue, &valueLengthInByte); - + if (lResult == ERROR_SUCCESS) { if (0 == wcsncmp(NetFxV4IsInstalledKeyValue, L"No", 2)) @@ -1272,7 +1272,7 @@ HRESULT AddPowerShellTasksToList(ICustomDestinationList *pCustDestList, STARTUPI LPCWSTR lpParentShortCut = startupInfo.lpTitle; LPWSTR pathRegValue = NULL; BOOL foundlnkFile = false; - + if (NULL == lpParentShortCut || ( (startupInfo.dwFlags & STARTF_TITLEISLINKNAME) != STARTF_TITLEISLINKNAME ) ) { LPWSTR pathRegValueName =NULL; @@ -1291,12 +1291,12 @@ HRESULT AddPowerShellTasksToList(ICustomDestinationList *pCustDestList, STARTUPI retVal = RegGetValue(HKEY_LOCAL_MACHINE, g_ConsoleHostShortcutTarget_KEY_PATH, pathRegValueName, RRF_RT_REG_SZ | RRF_RT_REG_EXPAND_SZ | RRF_NOEXPAND, NULL, NULL, &valueLengthInByte); if (ERROR_SUCCESS == retVal) { - pathRegValue = new wchar_t[valueLengthInByte / sizeof(wchar_t) +1]; + pathRegValue = new wchar_t[valueLengthInByte / sizeof(wchar_t) +1]; memset(pathRegValue, 0, valueLengthInByte + sizeof(wchar_t)); - retVal = RegGetValue(HKEY_LOCAL_MACHINE, g_ConsoleHostShortcutTarget_KEY_PATH, pathRegValueName, RRF_RT_REG_SZ | RRF_RT_REG_EXPAND_SZ | RRF_NOEXPAND, NULL, pathRegValue, &valueLengthInByte); + retVal = RegGetValue(HKEY_LOCAL_MACHINE, g_ConsoleHostShortcutTarget_KEY_PATH, pathRegValueName, RRF_RT_REG_SZ | RRF_RT_REG_EXPAND_SZ | RRF_NOEXPAND, NULL, pathRegValue, &valueLengthInByte); if (retVal == ERROR_SUCCESS) - { + { lpParentShortCut = pathRegValue; foundlnkFile = true; } @@ -1377,9 +1377,9 @@ HRESULT AddPowerShellTasksToList(ICustomDestinationList *pCustDestList, STARTUPI HRESULT hr = pShellLink.CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER); CheckAndReturn(hr); - hr = pShellLink->QueryInterface(IID_IPersistFile, (LPVOID*)&pPersistFile); + hr = pShellLink->QueryInterface(IID_IPersistFile, (LPVOID*)&pPersistFile); CheckAndReturn(hr); - + hr = pPersistFile->Load(g_IconApp, STGM_READWRITE); int iconIndex = 0; if (SUCCEEDED(hr)) @@ -1387,7 +1387,7 @@ HRESULT AddPowerShellTasksToList(ICustomDestinationList *pCustDestList, STARTUPI hr = pShellLink->GetIconLocation(g_IconApp, MAX_PATH, &iconIndex); CheckAndReturn(hr); } - else + else { LPCWSTR powerShellExec = L"%windir%\\System32\\WindowsPowerShell\\v1.0\\powershell.exe"; @@ -1395,7 +1395,7 @@ HRESULT AddPowerShellTasksToList(ICustomDestinationList *pCustDestList, STARTUPI StringCchLength(powerShellExec, STRSAFE_MAX_LENGTH, &length); - StringCchCopy(g_IconApp, length+1, powerShellExec); + StringCchCopy(g_IconApp, length+1, powerShellExec); } CComPtr pShortCutCollection; @@ -1407,14 +1407,14 @@ HRESULT AddPowerShellTasksToList(ICustomDestinationList *pCustDestList, STARTUPI LPWSTR pszDisplay = NULL; // display string LPWSTR pszDescription = NULL; // description string - + // 1. Add "Run Windows PowerShell as admin" hr = SafeLoadString(118, &pszDisplay); CheckAndReturn(hr); SafeLoadString(119, &pszDescription); CheckAndReturn(hr); - + // create shortcut hr = CreateShortCut(pszDisplay, lpParentShortCut, pszDescription, NULL, g_IconApp, iconIndex, true, true, &pShortCut); @@ -1431,7 +1431,7 @@ HRESULT AddPowerShellTasksToList(ICustomDestinationList *pCustDestList, STARTUPI // check if ISE is present if (CheckForISE()) { - // Add shortcut for "Run ISE as Administrator" + // Add shortcut for "Run ISE as Administrator" hr = SafeLoadString(122, &pszDisplay); CheckAndReturn(hr); SafeLoadString(123, &pszDescription); @@ -1477,7 +1477,7 @@ HRESULT AddPowerShellTasksToList(ICustomDestinationList *pCustDestList, STARTUPI } /********************************************************************* -* FileExists is a helper function used to check if the file path +* FileExists is a helper function used to check if the file path * provided as argument to this function exists or not. *********************************************************************/ BOOL FileExists(LPCWSTR fileName) @@ -1485,16 +1485,16 @@ BOOL FileExists(LPCWSTR fileName) HANDLE hFile; LPSECURITY_ATTRIBUTES pSec = (LPSECURITY_ATTRIBUTES)NULL; ::SetLastError(ERROR_SUCCESS); - hFile = ::CreateFile(fileName, + hFile = ::CreateFile(fileName, GENERIC_READ, FILE_SHARE_READ, // | FILE_SHARE_WRITE, pSec, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS, 0); - if(hFile != INVALID_HANDLE_VALUE) + if(hFile != INVALID_HANDLE_VALUE) { - ::CloseHandle(hFile); + ::CloseHandle(hFile); return TRUE; } else { @@ -1510,7 +1510,7 @@ void CreateCustomDestinationList(STARTUPINFO &startupInfo) CoInitialize(NULL); CComPtr pCustDestList; // pointer to the jump list - UINT uMaxSlots = 0; // maximum slots available for us + UINT uMaxSlots = 0; // maximum slots available for us // to create items in jump list HRESULT hr = pCustDestList.CoCreateInstance(CLSID_DestinationList, NULL, CLSCTX_INPROC_SERVER); @@ -1520,7 +1520,7 @@ void CreateCustomDestinationList(STARTUPINFO &startupInfo) CComPtr pRemovedItems; // Items just removed when this transaction begins // start a list building transaction - // this method needs to be called before + // this method needs to be called before // any of the other methods in ICustomDestinationList hr = pCustDestList->BeginList(&uMaxSlots, IID_PPV_ARGS(&pRemovedItems)); @@ -1572,7 +1572,7 @@ int __cdecl wchar_t * wszDefaultRuntimeVersion = NULL; wchar_t * wszRuntimeVersion = NULL; wchar_t * wszConsoleHostAssemblyName = NULL; - + bool isDeletewszMonadVersionNeeded = false; unsigned int exitCode = EXIT_CODE_SUCCESS; @@ -1584,7 +1584,7 @@ int __cdecl // interface language separate from thread locale. // Setting this will enable OS resource loader to load correct // resource that can display properly in a console window. - // Note: If the language identifier is 0, the function always + // Note: If the language identifier is 0, the function always // succeeds. SetThreadUILanguage(0); @@ -1615,7 +1615,7 @@ int __cdecl int consoleFileIndex = -1; int profileIndex = -1; const float win8DefaultMonadMajorVersion = 3.0; - + exitCode = ParseCommandLineArguments( argc, argv, @@ -1634,7 +1634,7 @@ int __cdecl } // WinPE supports only PowerShell >=3.0. - // If the PowerShell host is a WinPE machine & if the requested + // If the PowerShell host is a WinPE machine & if the requested // PowerShell version is not 3.0, then display an not supported monad version error message. if(IsWinPEHost() && (monadMajorVersion == 1 || monadMajorVersion == 2)) { @@ -1643,13 +1643,13 @@ int __cdecl break; } - // This is for remembering which major version is requested from command line. + // This is for remembering which major version is requested from command line. // GetRegistryInfo call after this will change monadMajorVersion to be PowerShell - // major version installed (based on registry). + // major version installed (based on registry). // int requestedMonadMajorVersion = monadMajorVersion; // For GetRegistryInfo call, monadMajorVersion is used to calculate the version key in registry. - // For PowerShell V2, version key in registry is 1. + // For PowerShell V2, version key in registry is 1. if (monadMajorVersion == 2) { monadMajorVersion = 1; @@ -1675,24 +1675,24 @@ int __cdecl } bool skipProfile = profileIndex != -1; - + // skipIndex holds the position of the last parameter that needs to be handled by the native layer. // In other words, skipIndex + 1 will give the position of the first parameter that needs to be passed to managed layer. // Find the last native parameter, and chomp everything up until it. - // We don't do this for NoProfile. We parse it once here and then parse it again in the managed layer. + // We don't do this for NoProfile. We parse it once here and then parse it again in the managed layer. int skipIndex = -1; - + if(monadVersionIndex > skipIndex) { skipIndex = monadVersionIndex; } if(consoleFileIndex > skipIndex) { skipIndex = consoleFileIndex; } if(runtimeVersionIndex > skipIndex) { skipIndex = runtimeVersionIndex; } - + skipIndex = skipIndex + 1; - // WTR - Check for the key that indicates absence of NetFx4 and output appropriate message to the user - + // WTR - Check for the key that indicates absence of NetFx4 and output appropriate message to the user + // Open PowerShellEngine Registry Key // For GetRegistryInfo call, monadMajorVersion is used to calculate the version key in registry. - // For PowerShell V2, version key in registry is 1. + // For PowerShell V2, version key in registry is 1. int useMonadMajorVersion = -1; if (monadMajorVersion == 2) { @@ -1700,9 +1700,9 @@ int __cdecl } else { - useMonadMajorVersion = 3; + useMonadMajorVersion = 3; } - + // If runtimeVersion is not supplied, validate that the defaultRuntimeVersion is installed. // We can't do runtimeVersion validation on the user input, as this frequently changes per // release of the .NET Framework. @@ -1775,7 +1775,7 @@ int __cdecl if (g_hResInstance) { FreeMUILibrary(g_hResInstance); - } + } return exitCode; } diff --git a/src/powershell-native/nativemsh/pwrshexe/MshResources.rc b/src/powershell-native/nativemsh/pwrshexe/MshResources.rc index 7180af2633f..ec1afc43daa 100644 --- a/src/powershell-native/nativemsh/pwrshexe/MshResources.rc +++ b/src/powershell-native/nativemsh/pwrshexe/MshResources.rc @@ -1,4 +1,4 @@ -// Copyright (C) 2005 Microsoft Corporation +// Copyright (c) Microsoft Corporation. All rights reserved. // // resource script for msh.exe // @@ -28,16 +28,16 @@ BEGIN 110 "Windows PowerShell (x86)" 111 "Performs object-based (command-line) functions" 112 "Run as 32" - 113 "Windows PowerShell Integrated Scripting Environment. Performs object-based (command-line) functions" + 113 "Windows PowerShell Integrated Scripting Environment. Performs object-based (command-line) functions" 118 "Run as Administrator" 119 "Runs with administrator privileges" 120 "Windows PowerShell Cmdlet Definition XML Document" 121 "Windows PowerShell Session Configuration File" 122 "Run ISE as Administrator" 123 "Runs ISE with administrator privileges" - + // Misc resources - + // Friendly name for our OID mapping 124 "Document Encryption" END diff --git a/src/powershell-native/nativemsh/pwrshexe/NativeMsh.mc b/src/powershell-native/nativemsh/pwrshexe/NativeMsh.mc index 3ff1a74938f..63f9ba41ffb 100644 --- a/src/powershell-native/nativemsh/pwrshexe/NativeMsh.mc +++ b/src/powershell-native/nativemsh/pwrshexe/NativeMsh.mc @@ -1,4 +1,4 @@ -;// Copyright (C) Microsoft Corporation, 2000 - 2002 +;// Copyright (c) Microsoft Corporation. All rights reserved. MessageId=1 SymbolicName=MISSING_COMMAND_LINE_ARGUMENT @@ -225,7 +225,7 @@ Windows PowerShell MessageId=38 SymbolicName=SHELLBANNER2 Language=English -Copyright (C) 2015 Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. . MessageId=39 diff --git a/src/powershell-native/nativemsh/pwrshexe/OutputWriter.h b/src/powershell-native/nativemsh/pwrshexe/OutputWriter.h index 6a5ccb76ccc..84033f7f03a 100644 --- a/src/powershell-native/nativemsh/pwrshexe/OutputWriter.h +++ b/src/powershell-native/nativemsh/pwrshexe/OutputWriter.h @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ #pragma once @@ -83,7 +83,7 @@ void WriteStandard( } /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ class PwrshExeOutput : public NativeMsh::IPwrshCommonOutput diff --git a/src/powershell-native/nativemsh/pwrshexe/version.rc b/src/powershell-native/nativemsh/pwrshexe/version.rc index 071f08b7cfa..796fc8c0390 100644 --- a/src/powershell-native/nativemsh/pwrshexe/version.rc +++ b/src/powershell-native/nativemsh/pwrshexe/version.rc @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // #include #include diff --git a/src/powershell-native/nativemsh/pwrshplugin/entrypoints.cpp b/src/powershell-native/nativemsh/pwrshplugin/entrypoints.cpp index 6c40a8162ca..ee7685a0c9c 100644 --- a/src/powershell-native/nativemsh/pwrshplugin/entrypoints.cpp +++ b/src/powershell-native/nativemsh/pwrshplugin/entrypoints.cpp @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------- // // Microsoft Windows NT -// Copyright (C) Microsoft Corporation, 2007. +// Copyright (c) Microsoft Corporation. All rights reserved. // // Contents: Entry points for PowerShell plugin used to host powershell // in a WSMan service. @@ -38,7 +38,7 @@ DWORD GetFormattedErrorMessage(__deref_out PWSTR * pwszErrorMessage, DWORD dwMes { DWORD dwLength = 0; - do + do { *pwszErrorMessage = NULL; @@ -50,7 +50,7 @@ DWORD GetFormattedErrorMessage(__deref_out PWSTR * pwszErrorMessage, DWORD dwMes g_hResourceInstance = LoadMUILibraryW(g_MAIN_BINARY_NAME, MUI_LANGUAGE_NAME, 0); #endif } - + LPWSTR wszSystemErrorMessage = NULL; //string function dwLength = FormatMessageW( @@ -78,7 +78,7 @@ DWORD GetFormattedErrorMessage(__deref_out PWSTR * pwszErrorMessage, DWORD dwMes LocalFree(wszSystemErrorMessage); } - }while(false); + }while(false); return dwLength; } @@ -101,8 +101,8 @@ DWORD GetFormattedErrorMessage(__deref_out PZPWSTR pwszErrorMessage, DWORD dwMes #pragma prefast (disable: 6101) #pragma prefast (disable: 6054) -unsigned int ConstructPowerShellVersion(int iPSMajorVersion, - int iPSMinorVersion, +unsigned int ConstructPowerShellVersion(int iPSMajorVersion, + int iPSMinorVersion, __deref_out_opt PWSTR *pwszMonadVersion) { unsigned int exitCode = EXIT_CODE_SUCCESS; @@ -187,7 +187,7 @@ static PwrshCommon sPwrshCommon; // returns: 0 on success, non-zero on failure. _Success_(return == 0) //EXIT_CODE_SUCCESS extern "C" -unsigned int GetCLRVersionForPSVersion(int iPSMajorVersion, +unsigned int GetCLRVersionForPSVersion(int iPSMajorVersion, int iPSMinorVersion, size_t runtimeVersionLength, __inout_ecount_part(runtimeVersionLength, *pRuntimeVersionLength) wchar_t* pwszRuntimeVersion, @@ -211,24 +211,24 @@ unsigned int GetCLRVersionForPSVersion(int iPSMajorVersion, int requestedMonadMinorVersion = iPSMinorVersion; // For GetRegistryInfo call, monadMajorVersion is used to calculate the version key in registry. - // For PowerShell V2, version key in registry is 1. + // For PowerShell V2, version key in registry is 1. if (2 == requestedMonadMajorVersion) { requestedMonadMajorVersion = 1; } - // For PowerShell 3, 4 and 5, the registry is 3. + // For PowerShell 3, 4 and 5, the registry is 3. if ((requestedMonadMajorVersion == 4) || (requestedMonadMajorVersion == 5)) { requestedMonadMajorVersion = 3; } - + exitCode = ConstructPowerShellVersion(iPSMajorVersion, iPSMinorVersion, &wszMonadVersion); if (EXIT_CODE_SUCCESS != exitCode) { - break; + break; } - + exitCode = sPwrshCommon.GetRegistryInfo( &wszMonadVersion, &requestedMonadMajorVersion, @@ -248,7 +248,7 @@ unsigned int GetCLRVersionForPSVersion(int iPSMajorVersion, exitCode = EXIT_CODE_READ_REGISTRY_FAILURE; break; } - + if (NULL != pwszRuntimeVersion) { // +1 for the '\0' @@ -308,7 +308,7 @@ DWORD ReportOperationComplete(WSMAN_PLUGIN_REQUEST *requestDetails, DWORD errorC DWORD result = EXIT_CODE_SUCCESS; PWSTR pwszErrorMessage = NULL; GetFormattedErrorMessage(&pwszErrorMessage, errorCode); - + result = WSManPluginOperationComplete(requestDetails, 0, errorCode, pwszErrorMessage); if (NULL != pwszErrorMessage) @@ -320,8 +320,8 @@ DWORD ReportOperationComplete(WSMAN_PLUGIN_REQUEST *requestDetails, DWORD errorC } // ----------------------------------------------------------------------------- -// Each plug-in needs to support the Startup callback. A plug-in may be -// initialized more than once within the same process, but only once per +// Each plug-in needs to support the Startup callback. A plug-in may be +// initialized more than once within the same process, but only once per // applicationIdentification. // ----------------------------------------------------------------------------- extern "C" @@ -332,7 +332,7 @@ DWORD WINAPI WSManPluginStartup( __out PVOID *pluginContext ) { -// +// #ifdef REMOTINGDEBUG // This loop is added to assist debugging server. // Attach a debugger to the server and set this variable to true @@ -346,7 +346,7 @@ DWORD WINAPI WSManPluginStartup( PwrshPlugIn* result = NULL; try - { + { *pluginContext = NULL; PwrshPlugInMediator* pluginMediator = PwrshPlugInMediator::GetPwrshPlugInMediator(extraInfo); @@ -368,7 +368,7 @@ DWORD WINAPI WSManPluginStartup( // { // pfnWinSqmSetDWORD( // NULL, - // DATAID_WINRMREMOTEENABLED, + // DATAID_WINRMREMOTEENABLED, // WINRM_SQM_DATA_REMOTEENABLED // ); // } @@ -396,16 +396,16 @@ DWORD WINAPI WSManPluginStartup( // ------------------------------------------------------------------------------------ //The WSManPluginShutdown method is called after all operations have been cancelled and -//right before the DLL is unloaded. The DLL entry point name must be WSManPluginShutdown. -//This method has an important purpose of making sure all plug-in threads are shut down -//before this method returns. If the plug-in only handles synchronous operations and all -//threads report a cancellation result before they return then this method does not have to -//do anything too complex other than plug-in cleanup. However for an asynchronous plug-in, -//any threads that are used to process the plug-in threads, including the ones that just reported +//right before the DLL is unloaded. The DLL entry point name must be WSManPluginShutdown. +//This method has an important purpose of making sure all plug-in threads are shut down +//before this method returns. If the plug-in only handles synchronous operations and all +//threads report a cancellation result before they return then this method does not have to +//do anything too complex other than plug-in cleanup. However for an asynchronous plug-in, +//any threads that are used to process the plug-in threads, including the ones that just reported //the cancellation for all operations need to completely shutdown. Not doing this will cause //potential crashes in the DLL because code may be executed after the DLL is unloaded. // ------------------------------------------------------------------------------------ -// reason: If this is a system shutdown this will be WSMAN_PLUGIN_SHUTDOWN_SYSTEM. +// reason: If this is a system shutdown this will be WSMAN_PLUGIN_SHUTDOWN_SYSTEM. // For WSMan service shutdown this will be WSMAN_PLUGIN_SHUTDOWN_SERVICE. For an IIS host //shutdown this will be WSMAN_PLUGIN_SHUTDOWN_IISHOST. extern "C" @@ -414,7 +414,7 @@ DWORD WINAPI WSManPluginShutdown( __in DWORD flags, __in DWORD reason ) -{ +{ if (NULL == pluginContext) { return g_NULL_PLUGIN_CONTEXT; @@ -429,11 +429,11 @@ DWORD WINAPI WSManPluginShutdown( { // ignore plugin exceptions during shutdown. if (NULL != e) - { + { delete e; } } - + // free resources occupied by this plugin.. // WSMan frees shell/command resources before calling // plugin shutdown. @@ -444,15 +444,15 @@ DWORD WINAPI WSManPluginShutdown( } #ifndef WIN32_FROM_HRESULT -#define WIN32_FROM_HRESULT(hr) (HRESULT_FACILITY(hr) == FACILITY_WIN32 ? HRESULT_CODE(hr) : hr) +#define WIN32_FROM_HRESULT(hr) (HRESULT_FACILITY(hr) == FACILITY_WIN32 ? HRESULT_CODE(hr) : hr) #endif // ----------------------------------------------------------------------------- // A plug-in that supports the Shell operations needs to implement this callback // to allow commands to be created and to allow data to be streamed into either -// a shell or command. The plug-in must call WSManPluginReportContext to +// a shell or command. The plug-in must call WSManPluginReportContext to // report the shell context. Once the shell is completed or when it is closed -// via the operationClosed boolean value or operationClosedHandle in the +// via the operationClosed boolean value or operationClosedHandle in the // requestDetails the plug-in needs to call WSManPluginOperationComplete. // The shell is active until this time. // ----------------------------------------------------------------------------- @@ -490,7 +490,7 @@ VOID WINAPI WSManPluginShell( } else if (hr == RPC_E_CHANGED_MODE) { - comInitialized = false; //ignore + comInitialized = false; //ignore } else { @@ -526,9 +526,9 @@ VOID WINAPI WSManPluginShell( } // ----------------------------------------------------------------------------- -// WS-Man calls the WSMAN_PLUGIN_RELEASE_SHELL_CONTEXT entry point during shell -// shutdown when it is safe to delete the plug-in shell context. Any context -// reported through WSManPluginReportContext may not be deleted until the +// WS-Man calls the WSMAN_PLUGIN_RELEASE_SHELL_CONTEXT entry point during shell +// shutdown when it is safe to delete the plug-in shell context. Any context +// reported through WSManPluginReportContext may not be deleted until the // corresponding release function has been called. Failure to follow the contract // will result in errors being generated. // ----------------------------------------------------------------------------- @@ -549,7 +549,7 @@ VOID WINAPI WSManPluginReleaseShellContext(__in PVOID shellContext) { // ignore plugin exceptions. if (NULL != e) - { + { delete e; } } @@ -559,9 +559,9 @@ VOID WINAPI WSManPluginReleaseShellContext(__in PVOID shellContext) // ----------------------------------------------------------------------------- // A plug-in that supports the Shell operations and needs to create commands // that are associated with the shell needs to implement this callback. -// The plug-in must call WSManPluginReportContext to +// The plug-in must call WSManPluginReportContext to // report the command context. Once the command is completed or when it is closed -// via the operationClosed boolean value or operationClosedHandle in the +// via the operationClosed boolean value or operationClosedHandle in the // requestDetails the plug-in needs to call WSManPluginOperationComplete. // The command is active until this time. // ----------------------------------------------------------------------------- @@ -593,9 +593,9 @@ VOID WINAPI WSManPluginCommand( } // --------------------------------------------------------------------------------- -// WS-Man calls the WSMAN_PLUGIN_RELEASE_COMMAND_CONTEXT entry point during command -// shutdown when it is safe to delete the plug-in shell context. Any context -// reported through WSManPluginReportContext may not be deleted until the +// WS-Man calls the WSMAN_PLUGIN_RELEASE_COMMAND_CONTEXT entry point during command +// shutdown when it is safe to delete the plug-in shell context. Any context +// reported through WSManPluginReportContext may not be deleted until the // corresponding release function has been called. Failure to follow the contract // will result in errors being generated. // --------------------------------------------------------------------------------- @@ -619,7 +619,7 @@ VOID WINAPI WSManPluginReleaseCommandContext( { // ignore plugin exceptions. if (NULL != e) - { + { delete e; } } @@ -628,7 +628,7 @@ VOID WINAPI WSManPluginReleaseCommandContext( // ----------------------------------------------------------------------------- // A plug-in receives an inbound data stream to either the shell or command // via this callback. Each piece of data causes the callback to be called once. -// For each piece of data the plug-in calls WSManPluginResultComplete to +// For each piece of data the plug-in calls WSManPluginResultComplete to // acknowledge receipt and to allow the next piece of data to be delivered. // ----------------------------------------------------------------------------- extern "C" @@ -664,11 +664,11 @@ VOID WINAPI WSManPluginSend( // via this callback. This API is called when an inbound request from a client // is received. This callback may be called against the shell and/or command // based on the client request. Each piece of data that needs to be sent back -// to the client is done so through the WSManPluginReceiveResult API. Once +// to the client is done so through the WSManPluginReceiveResult API. Once // all data has been send, when the stream is terminated via some internal means, -// or if the receive call is cancelled through the operationClosed boolean -// value or operationClosedHandle, the plug-in needs to call -// WSManPluginResultComplete. The operation is marked as active until this +// or if the receive call is cancelled through the operationClosed boolean +// value or operationClosedHandle, the plug-in needs to call +// WSManPluginResultComplete. The operation is marked as active until this // time. // ----------------------------------------------------------------------------- extern "C" @@ -701,7 +701,7 @@ VOID WINAPI WSManPluginReceive( // ----------------------------------------------------------------------------- // A plug-in receives an inbound signal to either the shell or command // via this callback. Each signal causes the callback to be called once. -// For each callthe plug-in calls WSManPluginResultComplete to +// For each callthe plug-in calls WSManPluginResultComplete to // acknowledge receipt and to allow the next signal to be received. // A signal can cause the shell or command to be terminated, so the result // of this callback may be many completion calls for the Signal, Receive, Command diff --git a/src/powershell-native/nativemsh/pwrshplugin/entrypoints.h b/src/powershell-native/nativemsh/pwrshplugin/entrypoints.h index bd2e92d7a3a..90365cd4825 100644 --- a/src/powershell-native/nativemsh/pwrshplugin/entrypoints.h +++ b/src/powershell-native/nativemsh/pwrshplugin/entrypoints.h @@ -1,7 +1,7 @@ // Microsoft Windows NT -// Copyright (C) Microsoft Corporation, 2007. +// Copyright (c) Microsoft Corporation. All rights reserved. // -// Contents: Headers used by pwrshplugin. +// Contents: Headers used by pwrshplugin. // pwrshplugin is totally unmanaged. // ---------------------------------------------------------------------- diff --git a/src/powershell-native/nativemsh/pwrshplugin/pwrshclrhost.cpp b/src/powershell-native/nativemsh/pwrshplugin/pwrshclrhost.cpp index 891775193e9..1f2bcf085db 100644 --- a/src/powershell-native/nativemsh/pwrshplugin/pwrshclrhost.cpp +++ b/src/powershell-native/nativemsh/pwrshplugin/pwrshclrhost.cpp @@ -1,9 +1,9 @@ // ---------------------------------------------------------------------- // // Microsoft Windows NT -// Copyright (C) Microsoft Corporation, 2014. +// Copyright (c) Microsoft Corporation. All rights reserved. // -// Contents: Source code for abstraction of CLR and worker differences between PowerShell versions. +// Contents: Source code for abstraction of CLR and worker differences between PowerShell versions. // pwrshplugin is totally unmanaged. // ---------------------------------------------------------------------- @@ -58,7 +58,7 @@ unsigned int PowerShellCoreClrWorker::LoadWorkerCallbackPtrs( "System.Management.Automation.Remoting.WSManPluginManagedEntryWrapper", "InitPlugin", (void**)&entryPointDelegate); - + if (FAILED(hr)) { output->DisplayMessage(false, g_CREATING_MSH_ENTRANCE_FAILED, hr); @@ -71,36 +71,36 @@ unsigned int PowerShellCoreClrWorker::LoadWorkerCallbackPtrs( } PowerShellCoreClrWorker::PowerShellCoreClrWorker() - : systemCalls(new WinSystemCallFacade()), - hostWrapper(new CoreClrHostingApiWrapper()), - output(new PwrshPluginOutputDefault()), + : systemCalls(new WinSystemCallFacade()), + hostWrapper(new CoreClrHostingApiWrapper()), + output(new PwrshPluginOutputDefault()), commonLib(new PwrshCommon()) { } // -// sysCalls is expected to be new'd by the caller. +// sysCalls is expected to be new'd by the caller. // It will be freed in PowerShellCoreClrWorker's destructor. // PowerShellCoreClrWorker::PowerShellCoreClrWorker( - SystemCallFacade* sysCalls, + SystemCallFacade* sysCalls, ClrHostWrapper* hstWrp, PwrshCommon* cmnLib) - : systemCalls(sysCalls), - hostWrapper(hstWrp), - output(new PwrshPluginOutputDefault()), + : systemCalls(sysCalls), + hostWrapper(hstWrp), + output(new PwrshPluginOutputDefault()), commonLib(cmnLib) { if (NULL == systemCalls) { - // Instantiate it even if one is not provided to guarantee that it will + // Instantiate it even if one is not provided to guarantee that it will // always be non-NULL during execution. systemCalls = new WinSystemCallFacade(); } - + if (NULL == hostWrapper) { - // Instantiate it even if one is not provided to guarantee that it will + // Instantiate it even if one is not provided to guarantee that it will // always be non-NULL during execution. hostWrapper = new CoreClrHostingApiWrapper(); } @@ -146,8 +146,8 @@ PowerShellCoreClrWorker::~PowerShellCoreClrWorker() #else // !CORECLR -PowerShellClrWorker::PowerShellClrWorker() : - pHost(NULL), +PowerShellClrWorker::PowerShellClrWorker() : + pHost(NULL), hManagedPluginModule(NULL), systemCalls(new WinSystemCallFacade()), g_INIT_PLUGIN("InitPlugin"), @@ -164,7 +164,7 @@ PowerShellClrWorker::PowerShellClrWorker() : {} PowerShellClrWorker::PowerShellClrWorker( - SystemCallFacade* sysCalls) + SystemCallFacade* sysCalls) : pHost(NULL), hManagedPluginModule(NULL), systemCalls(sysCalls), @@ -295,7 +295,7 @@ unsigned int PowerShellClrManagedWorker::LoadWorkerCallbackPtrs( HRESULT hr = S_OK; *pPluginException = NULL; - do + do { // Get a pointer to the default AppDomain CComPtr<_AppDomain> spDefaultDomain = NULL; @@ -383,7 +383,7 @@ unsigned int PowerShellClrManagedWorker::LoadWorkerCallbackPtrs( &varResult, &exception, &uArgErr); - + InitPluginWkrPtrsFuncPtr entryPointDelegate = (InitPluginWkrPtrsFuncPtr)varResult.byref; if (FAILED(hr) || diff --git a/src/powershell-native/nativemsh/pwrshplugin/pwrshclrhost.h b/src/powershell-native/nativemsh/pwrshplugin/pwrshclrhost.h index 75c2e1f5c6f..169e9803ae2 100644 --- a/src/powershell-native/nativemsh/pwrshplugin/pwrshclrhost.h +++ b/src/powershell-native/nativemsh/pwrshplugin/pwrshclrhost.h @@ -1,9 +1,9 @@ // ---------------------------------------------------------------------- // // Microsoft Windows NT -// Copyright (C) Microsoft Corporation, 2007. +// Copyright (c) Microsoft Corporation. All rights reserved. // -// Contents: Headers used by pwrshplugin. +// Contents: Headers used by pwrshplugin. // pwrshplugin is totally unmanaged. // ---------------------------------------------------------------------- @@ -47,7 +47,7 @@ class IPowerShellClrHost virtual ~IPowerShellClrHost() {} virtual unsigned int LaunchClr( - _In_ LPCWSTR wszMonadVersion, + _In_ LPCWSTR wszMonadVersion, _In_ LPCWSTR wszRuntimeVersion, _In_ LPCSTR friendlyName) = 0; @@ -83,7 +83,7 @@ class PowerShellClrWorker : public IPowerShellClrHost public: PowerShellClrWorker(); PowerShellClrWorker(NativeMsh::SystemCallFacade* sysCalls); - + virtual ~PowerShellClrWorker(); // @@ -140,9 +140,9 @@ class PowerShellCoreClrWorker : public IPowerShellClrHost public: PowerShellCoreClrWorker(); - + PowerShellCoreClrWorker( - NativeMsh::SystemCallFacade* sysCalls, + NativeMsh::SystemCallFacade* sysCalls, NativeMsh::ClrHostWrapper* hstWrp, NativeMsh::PwrshCommon* cmnLib); diff --git a/src/powershell-native/nativemsh/pwrshplugin/pwrshheaders.h b/src/powershell-native/nativemsh/pwrshplugin/pwrshheaders.h index 60df4ab2f59..bfc12fb27c9 100644 --- a/src/powershell-native/nativemsh/pwrshplugin/pwrshheaders.h +++ b/src/powershell-native/nativemsh/pwrshplugin/pwrshheaders.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------- // // Microsoft Windows NT -// Copyright (C) Microsoft Corporation, 2008. +// Copyright (c) Microsoft Corporation. All rights reserved. // // Contents: Headers used by internal windows teams to access certain // Powershell functionality @@ -16,7 +16,7 @@ // returns: 0 on success, non-zero on failure. _Success_(return == 0) // EXIT_CODE_SUCCESS extern "C" -unsigned int GetCLRVersionForPSVersion(int iPSMajorVersion, +unsigned int GetCLRVersionForPSVersion(int iPSMajorVersion, int iPSMinorVersion, size_t runtimeVersionLength, __inout_ecount_part(runtimeVersionLength , *pRuntimeVersionLength) wchar_t* pwszRuntimeVersion, diff --git a/src/powershell-native/nativemsh/pwrshplugin/pwrshplugin.h b/src/powershell-native/nativemsh/pwrshplugin/pwrshplugin.h index 61b6cda4285..7d2f25d94fe 100644 --- a/src/powershell-native/nativemsh/pwrshplugin/pwrshplugin.h +++ b/src/powershell-native/nativemsh/pwrshplugin/pwrshplugin.h @@ -1,9 +1,9 @@ // ---------------------------------------------------------------------- // // Microsoft Windows NT -// Copyright (C) Microsoft Corporation, 2007. +// Copyright (c) Microsoft Corporation. All rights reserved. // -// Contents: Headers used by pwrshplugin. +// Contents: Headers used by pwrshplugin. // pwrshplugin is totally unmanaged. // ---------------------------------------------------------------------- @@ -38,9 +38,9 @@ class PwrshPlugIn public: // applicationIdentification: - // This relates to the application HTTP suffix that is hosting the plug-in. - // For the main WSMan service by default this would be "wsman", whereas for - // an IIS host it would relate to the application endpoint for that host and + // This relates to the application HTTP suffix that is hosting the plug-in. + // For the main WSMan service by default this would be "wsman", whereas for + // an IIS host it would relate to the application endpoint for that host and // would be something like "MyCompany/MyApplication". PwrshPlugIn(PCWSTR applicationIdentification, PCWSTR pInitParams) { @@ -89,8 +89,8 @@ class PwrshPlugInMediator bool bIsDisposed; // fields needed to validate 2 plugins initializing at the same time - CRITICAL_SECTION criticalSection; - bool isCSInitSucceeded; + CRITICAL_SECTION criticalSection; + bool isCSInitSucceeded; // Abstraction of the differences between CLR hosting environments with // respect to the interface with pspluginwkr. @@ -127,7 +127,7 @@ class PwrshPlugInMediator { isCSInitSucceeded = true; } - } + } // Clear plugin specific resources. void CleanUp() @@ -199,7 +199,7 @@ class PwrshPlugInMediator } ~PwrshPlugInMediator() - { + { if (isCSInitSucceeded) { DeleteCriticalSection(&criticalSection); @@ -211,11 +211,11 @@ class PwrshPlugInMediator // Clear plugin specific resources. DWORD Shutdown(__in DWORD flags, __in DWORD reason) throw (...) { - // this null condition should never occur.. but for server process safety ensure we - // fail safely.. + // this null condition should never occur.. but for server process safety ensure we + // fail safely.. if (NULL != hShutdownPluginMethodAddress) { - (hShutdownPluginMethodAddress)((PVOID)this); + (hShutdownPluginMethodAddress)((PVOID)this); } CleanUp(); @@ -242,16 +242,16 @@ class PwrshPlugInMediator __in_opt WSMAN_DATA *inboundShellInformation) { if ((NULL == plugInToUseWithCreateShell) || - (NULL == requestDetails) || - (NULL == startupInfo) || + (NULL == requestDetails) || + (NULL == startupInfo) || (NULL == requestDetails->operationInfo)) { ReportError(requestDetails, g_INVALID_INPUT, L"WSManPluginShell"); return; } - // this null condition should never occur.. but for server process safety ensure we - // fail safely.. + // this null condition should never occur.. but for server process safety ensure we + // fail safely.. if (NULL == hCreateShellMethodAddress) { ReportError(requestDetails, g_MANAGED_METHOD_RESOLUTION_FAILED); @@ -261,7 +261,7 @@ class PwrshPlugInMediator __try { PCWSTR initParameters = plugInToUseWithCreateShell->GetInitParameters(); - (hCreateShellMethodAddress)((PVOID)this, requestDetails, flags, initParameters, startupInfo, inboundShellInformation); + (hCreateShellMethodAddress)((PVOID)this, requestDetails, flags, initParameters, startupInfo, inboundShellInformation); } __except(ProcessException(requestDetails, GetExceptionCode())) { @@ -270,8 +270,8 @@ class PwrshPlugInMediator VOID ReleaseShell(__in PVOID shellContext) { - // this null condition should never occur.. but for server process safety ensure we - // fail safely.. + // this null condition should never occur.. but for server process safety ensure we + // fail safely.. if (NULL != hReleaseShellMethodAddress) { (hReleaseShellMethodAddress)((PVOID)this, shellContext); @@ -300,7 +300,7 @@ class PwrshPlugInMediator __try { (hCreateCommandMethodAddress)((PVOID)this, requestDetails, flags, shellContext, commandLine, arguments); - } + } __except(ProcessException(requestDetails, GetExceptionCode())) { } @@ -309,8 +309,8 @@ class PwrshPlugInMediator VOID ReleaseCommand(__in PVOID shellContext, __in PVOID commandContext) { - // this null condition should never occur.. but for server process safety ensure we - // fail safely.. + // this null condition should never occur.. but for server process safety ensure we + // fail safely.. if (NULL != hReleaseShellMethodAddress) { (hReleaseCommandMethodAddress)((PVOID)this, shellContext, commandContext); @@ -403,7 +403,7 @@ class PwrshPlugInMediator } } - VOID SignalShellOrCmd( + VOID SignalShellOrCmd( __in WSMAN_PLUGIN_REQUEST *requestDetails, __in DWORD flags, __in PVOID shellContext, @@ -456,7 +456,7 @@ class PwrshPlugInMediator va_list args; va_start(args, dwMessageId); - GetFormattedErrorMessage(&extendedErrorInformation, dwMessageId, &args); + GetFormattedErrorMessage(&extendedErrorInformation, dwMessageId, &args); va_end(args); @@ -474,8 +474,8 @@ class PwrshPlugInMediator DWORD ReportError(WSMAN_PLUGIN_REQUEST *requestDetails, PlugInException* e) { DWORD errorCode = e->dwMessageId; - - DWORD result = WSManPluginOperationComplete(requestDetails, 0, errorCode, e->extendedErrorInformation); + + DWORD result = WSManPluginOperationComplete(requestDetails, 0, errorCode, e->extendedErrorInformation); return result; } @@ -560,7 +560,7 @@ class PwrshPlugInMediator } // returns non-zero code on error + plugin exception is populated in some cases - // like plugin load error. so the caller is expected to check both these + // like plugin load error. so the caller is expected to check both these // to see if there is any error. unsigned int LoadManagedPlugIn( _In_ PWSTR wszMgdPlugInFileName, @@ -672,7 +672,7 @@ class PwrshPlugInMediator unsigned int exitCode = EXIT_CODE_SUCCESS; PlugInException* pErrorMsg = NULL; - do + do { exitCode = ConstructPowerShellVersion(iPSMajorVersion, iPSMinorVersion, &wszMonadVersion); if (exitCode != EXIT_CODE_SUCCESS) @@ -746,7 +746,7 @@ class PwrshPlugInMediator { delete[] wszMonadVersion; } - + if (NULL != wszMgdPlugInFileName) { delete[] wszMgdPlugInFileName; @@ -777,7 +777,7 @@ class PwrshPlugInMediator throw new PlugInException(exitCode, msg); } } - } + } public: // extraInfo is supplied by WSMan and WSMan validates the XML syntax @@ -789,7 +789,7 @@ class PwrshPlugInMediator if (NULL == extraInfo) { PWSTR msg = NULL; - GetFormattedErrorMessage(&msg, + GetFormattedErrorMessage(&msg, g_PSVERSION_NOT_FOUND_IN_CONFIG, g_PSVERSION_CONFIG, g_INITIALIZATIONPARAM_CONFIG); throw new PlugInException(g_PSVERSION_NOT_FOUND_IN_CONFIG, msg); } @@ -798,7 +798,7 @@ class PwrshPlugInMediator if (FAILED(StringCchLength(extraInfo, STRSAFE_MAX_CCH, &initParamsLength))) { PWSTR msg = NULL; - GetFormattedErrorMessage(&msg, + GetFormattedErrorMessage(&msg, g_BAD_INITPARAMETERS, g_INITIALIZATIONPARAM_CONFIG); throw new PlugInException(g_BAD_INITPARAMETERS, msg); } @@ -811,7 +811,7 @@ class PwrshPlugInMediator if (FAILED(StringCchCopyNW(*initParameters, initParamsLength + 1, extraInfo, initParamsLength))) { PWSTR msg = NULL; - GetFormattedErrorMessage(&msg, + GetFormattedErrorMessage(&msg, g_BAD_INITPARAMETERS, g_INITIALIZATIONPARAM_CONFIG); throw new PlugInException(g_BAD_INITPARAMETERS, msg); } @@ -819,15 +819,15 @@ class PwrshPlugInMediator } void ProcessExtraInfo(PCWSTR extraInfo, - __deref_opt_out PWSTR *initParameters) throw(...) + __deref_opt_out PWSTR *initParameters) throw(...) { - VerifyAndStoreExtraInfo(extraInfo, initParameters); + VerifyAndStoreExtraInfo(extraInfo, initParameters); // Get PSVersion and MaxPSVersion values from the config xml wchar_t* psversion = NULL; wchar_t* maxpsversion = NULL; // Win8: 97936: To support backward compatability, if PSVersion = 2.0 and AssemblyToken - // is specified we set maxPSVersion = 2.0..so that the endpoint is not automatically + // is specified we set maxPSVersion = 2.0..so that the endpoint is not automatically // transferred to PS 3.0 wchar_t* assemblyToken = NULL; @@ -838,13 +838,13 @@ class PwrshPlugInMediator if (FAILED(StringCchLength(extraInfo, STRSAFE_MAX_CCH, &initParamsLength))) { PWSTR msg = NULL; - GetFormattedErrorMessage(&msg, + GetFormattedErrorMessage(&msg, g_BAD_INITPARAMETERS, g_INITIALIZATIONPARAM_CONFIG); throw new PlugInException(g_BAD_INITPARAMETERS, msg); - } + } PCWSTR param = wcsstr(extraInfo, L" majorPSVersionNumber) { PWSTR msg = NULL; - GetFormattedErrorMessage(&msg, + GetFormattedErrorMessage(&msg, g_BAD_INITPARAMETERS, g_INITIALIZATIONPARAM_CONFIG); - throw new PlugInException(g_BAD_INITPARAMETERS, msg); + throw new PlugInException(g_BAD_INITPARAMETERS, msg); } // TODO: why hardcoding is needed here if (majorPSVersionNumber == 3 && majorMaxPSVersionNumber == 2) { PWSTR msg = NULL; - GetFormattedErrorMessage(&msg, + GetFormattedErrorMessage(&msg, g_BAD_INITPARAMETERS, g_INITIALIZATIONPARAM_CONFIG); throw new PlugInException(g_BAD_INITPARAMETERS, msg); } @@ -1063,9 +1063,9 @@ class PwrshPlugInMediator { size_t length; if (FAILED(StringCchLength(psversion, STRSAFE_MAX_CCH, &length))) - { + { PWSTR msg = NULL; - GetFormattedErrorMessage(&msg, + GetFormattedErrorMessage(&msg, g_BAD_INITPARAMETERS, g_INITIALIZATIONPARAM_CONFIG); throw new PlugInException(g_BAD_INITPARAMETERS, msg); } @@ -1075,7 +1075,7 @@ class PwrshPlugInMediator if (FAILED(StringCchCopyNW(version, length + 1, psversion, length))) { PWSTR msg = NULL; - GetFormattedErrorMessage(&msg, + GetFormattedErrorMessage(&msg, g_BAD_INITPARAMETERS, g_INITIALIZATIONPARAM_CONFIG); throw new PlugInException(g_BAD_INITPARAMETERS, msg); } diff --git a/src/powershell-native/nativemsh/pwrshplugin/pwrshpluginResources.rc b/src/powershell-native/nativemsh/pwrshplugin/pwrshpluginResources.rc index 864a873e3af..cbf92dff714 100644 --- a/src/powershell-native/nativemsh/pwrshplugin/pwrshpluginResources.rc +++ b/src/powershell-native/nativemsh/pwrshplugin/pwrshpluginResources.rc @@ -1,4 +1,4 @@ -// Copyright (C) 2005 Microsoft Corporation +// Copyright (c) Microsoft Corporation. All rights reserved. // // resource script for msh.exe // diff --git a/src/powershell-native/nativemsh/pwrshplugin/pwrshplugindefs.h b/src/powershell-native/nativemsh/pwrshplugin/pwrshplugindefs.h index 3e1ad66762a..b4b4cc0811b 100644 --- a/src/powershell-native/nativemsh/pwrshplugin/pwrshplugindefs.h +++ b/src/powershell-native/nativemsh/pwrshplugin/pwrshplugindefs.h @@ -1,9 +1,9 @@ // ---------------------------------------------------------------------- // // Microsoft Windows NT -// Copyright (C) Microsoft Corporation, 2007. +// Copyright (c) Microsoft Corporation. All rights reserved. // -// Contents: Headers used by pwrshplugin. +// Contents: Headers used by pwrshplugin. // pwrshplugin is totally unmanaged. // ---------------------------------------------------------------------- @@ -105,7 +105,7 @@ typedef void (WINAPI *WSManPluginReceiveFuncPtr)( __in PVOID shellContext, __in_opt PVOID commandContext, __in_opt WSMAN_STREAM_ID_SET* streamSet - ); + ); typedef void (WINAPI *WSManPluginSignalFuncPtr)( __in PVOID pluginContext, diff --git a/src/powershell-native/nativemsh/pwrshplugin/pwrshpluginerrorcodes.mc b/src/powershell-native/nativemsh/pwrshplugin/pwrshpluginerrorcodes.mc index c6f6d95fd1e..45e389e42da 100644 --- a/src/powershell-native/nativemsh/pwrshplugin/pwrshpluginerrorcodes.mc +++ b/src/powershell-native/nativemsh/pwrshplugin/pwrshpluginerrorcodes.mc @@ -1,4 +1,4 @@ -;// Copyright (C) Microsoft Corporation, 2000 - 2007 +;// Copyright (c) Microsoft Corporation. All rights reserved. ;#undef FACILITY_POWERSHELL FacilityNames=(PowerShell=84:FACILITY_POWERSHELL) diff --git a/src/powershell-native/nativemsh/pwrshplugin/version.rc b/src/powershell-native/nativemsh/pwrshplugin/version.rc index 20f390fdd47..016c85d0b83 100644 --- a/src/powershell-native/nativemsh/pwrshplugin/version.rc +++ b/src/powershell-native/nativemsh/pwrshplugin/version.rc @@ -1,5 +1,5 @@ // -// Copyright (C) Microsoft. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // #include #include diff --git a/src/powershell/Program.cs b/src/powershell/Program.cs index 20b84250da8..e208c9cd754 100644 --- a/src/powershell/Program.cs +++ b/src/powershell/Program.cs @@ -1,5 +1,5 @@ /********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ using System; diff --git a/test/PSReadLine/AssemblyInfo.cs b/test/PSReadLine/AssemblyInfo.cs index b3818510675..4b8e4a20134 100644 --- a/test/PSReadLine/AssemblyInfo.cs +++ b/test/PSReadLine/AssemblyInfo.cs @@ -9,7 +9,7 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("TestPSReadLine")] -[assembly: AssemblyCopyright("Copyright © 2013")] +[assembly: AssemblyCopyright("Copyright (c) 2013")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/test/powershell/Language/Classes/Scripting.Classes.BasicParsing.Tests.ps1 b/test/powershell/Language/Classes/Scripting.Classes.BasicParsing.Tests.ps1 index 3d72abe33f9..88b7ea77a53 100644 --- a/test/powershell/Language/Classes/Scripting.Classes.BasicParsing.Tests.ps1 +++ b/test/powershell/Language/Classes/Scripting.Classes.BasicParsing.Tests.ps1 @@ -1,5 +1,5 @@ # -# Copyright (c) Microsoft Corporation, 2014 +# Copyright (c) Microsoft Corporation. All rights reserved. # try { diff --git a/test/powershell/Language/Classes/scripting.Classes.inheritance.tests.ps1 b/test/powershell/Language/Classes/scripting.Classes.inheritance.tests.ps1 index ac95bba2e27..cf7e7f1b4cd 100644 --- a/test/powershell/Language/Classes/scripting.Classes.inheritance.tests.ps1 +++ b/test/powershell/Language/Classes/scripting.Classes.inheritance.tests.ps1 @@ -1,5 +1,5 @@ # -# Copyright (c) Microsoft Corporation, 2015 +# Copyright (c) Microsoft Corporation. All rights reserved. # try { diff --git a/test/powershell/Language/Classes/scripting.enums.tests.ps1 b/test/powershell/Language/Classes/scripting.enums.tests.ps1 index 23a5532e53f..daf8fbb432f 100644 --- a/test/powershell/Language/Classes/scripting.enums.tests.ps1 +++ b/test/powershell/Language/Classes/scripting.enums.tests.ps1 @@ -1,5 +1,5 @@ # -# Copyright (c) Microsoft Corporation, 2015 +# Copyright (c) Microsoft Corporation. All rights reserved. # Describe 'enums' -Tags "CI" { diff --git a/test/powershell/Language/Scripting/Debugging/DebuggerScriptTests.Tests.ps1 b/test/powershell/Language/Scripting/Debugging/DebuggerScriptTests.Tests.ps1 index e1adf01338e..53b0dfeca24 100644 --- a/test/powershell/Language/Scripting/Debugging/DebuggerScriptTests.Tests.ps1 +++ b/test/powershell/Language/Scripting/Debugging/DebuggerScriptTests.Tests.ps1 @@ -1,5 +1,5 @@ ## -## Copyright (c) Microsoft Corporation, 2015 +## Copyright (c) Microsoft Corporation. All rights reserved. ## ## Script debugging tests ## diff --git a/test/powershell/Language/Scripting/Debugging/DebuggingInHost.Tests.ps1 b/test/powershell/Language/Scripting/Debugging/DebuggingInHost.Tests.ps1 index 8201cb8da7e..ff9398b0781 100644 --- a/test/powershell/Language/Scripting/Debugging/DebuggingInHost.Tests.ps1 +++ b/test/powershell/Language/Scripting/Debugging/DebuggingInHost.Tests.ps1 @@ -1,5 +1,5 @@ ## -## Copyright (c) Microsoft Corporation +## Copyright (c) Microsoft Corporation. All rights reserved. ## ## Debugging in Host tests ## diff --git a/test/powershell/Modules/Microsoft.PowerShell.Core/PSSessionConfiguration.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Core/PSSessionConfiguration.Tests.ps1 index 1ce879f0295..9255952eb4a 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Core/PSSessionConfiguration.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Core/PSSessionConfiguration.Tests.ps1 @@ -656,7 +656,7 @@ namespace PowershellTestConfigNamespace SessionType = 'Default' Author = 'User' CompanyName = 'Microsoft Corporation' - Copyright = 'Copyright (c) 2011 Microsoft Corporation. All rights reserved.' + Copyright = 'Copyright (c) Microsoft Corporation. All rights reserved.' Description = 'This is a sample session configuration file.' GUID = '73cba863-aa49-4cbf-9917-269ddcf2b1e3' SchemaVersion = '1.0.0.0' diff --git a/test/powershell/Modules/Microsoft.PowerShell.Core/Pester.Commands.Cmdlets.GetCommand.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Core/Pester.Commands.Cmdlets.GetCommand.Tests.ps1 index f54cfe04dd6..856992eca76 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Core/Pester.Commands.Cmdlets.GetCommand.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Core/Pester.Commands.Cmdlets.GetCommand.Tests.ps1 @@ -1,5 +1,5 @@ ## -## Copyright (c) Microsoft Corporation, 2015 +## Copyright (c) Microsoft Corporation. All rights reserved. ## Describe "Tests Get-Command with relative paths and wildcards" -Tag "CI" { @@ -50,15 +50,15 @@ Describe "Tests Get-Command with relative paths and wildcards" -Tag "CI" { Pop-Location } - It "Get-Command -ShowCommandInfo property field test" { + It "Get-Command -ShowCommandInfo property field test" { $properties = ($commandInfo | Get-Member -MemberType NoteProperty) - $propertiesAsString = $properties.name | out-string - $propertiesAsString | Should MatchExactly 'CommandType' - $propertiesAsString | Should MatchExactly 'Definition' - $propertiesAsString | Should MatchExactly 'Module' - $propertiesAsString | Should MatchExactly 'ModuleName' - $propertiesAsString | Should MatchExactly 'Name' - $propertiesAsString | Should MatchExactly 'ParameterSets' + $propertiesAsString = $properties.name | out-string + $propertiesAsString | Should MatchExactly 'CommandType' + $propertiesAsString | Should MatchExactly 'Definition' + $propertiesAsString | Should MatchExactly 'Module' + $propertiesAsString | Should MatchExactly 'ModuleName' + $propertiesAsString | Should MatchExactly 'Name' + $propertiesAsString | Should MatchExactly 'ParameterSets' } $testcases = @( @@ -80,20 +80,20 @@ Describe "Tests Get-Command with relative paths and wildcards" -Tag "CI" { It "Get-Command -ShowCommandInfo ParameterSets property field test" { $properties = ($commandInfo.ParameterSets[0] | Get-Member -MemberType NoteProperty) - $propertiesAsString = $properties.name | out-string - $propertiesAsString | Should MatchExactly 'IsDefault' - $propertiesAsString | Should MatchExactly 'Name' + $propertiesAsString = $properties.name | out-string + $propertiesAsString | Should MatchExactly 'IsDefault' + $propertiesAsString | Should MatchExactly 'Name' $propertiesAsString | Should MatchExactly 'Parameters' } It "Get-Command -ShowCommandInfo Parameters property field test" { $properties = ($commandInfo.ParameterSets[0].Parameters | Get-Member -MemberType NoteProperty) - $propertiesAsString = $properties.name | out-string - $propertiesAsString | Should MatchExactly 'HasParameterSet' - $propertiesAsString | Should MatchExactly 'IsMandatory' + $propertiesAsString = $properties.name | out-string + $propertiesAsString | Should MatchExactly 'HasParameterSet' + $propertiesAsString | Should MatchExactly 'IsMandatory' $propertiesAsString | Should MatchExactly 'Name' - $propertiesAsString | Should MatchExactly 'ParameterType' - $propertiesAsString | Should MatchExactly 'Position' + $propertiesAsString | Should MatchExactly 'ParameterType' + $propertiesAsString | Should MatchExactly 'Position' $propertiesAsString | Should MatchExactly 'ValidParamSetValues' $propertiesAsString | Should MatchExactly 'ValueFromPipeline' } diff --git a/test/powershell/Modules/Microsoft.PowerShell.LocalAccounts/Pester.Command.Cmdlets.LocalAccounts.LocalGroup.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.LocalAccounts/Pester.Command.Cmdlets.LocalAccounts.LocalGroup.Tests.ps1 index a80942779b9..0de45d4cb1c 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.LocalAccounts/Pester.Command.Cmdlets.LocalAccounts.LocalGroup.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.LocalAccounts/Pester.Command.Cmdlets.LocalAccounts.LocalGroup.Tests.ps1 @@ -1,6 +1,6 @@ # This is a Pester test suite to validate the cmdlets in LocalAccounts module # -# Copyright (c) Microsoft Corporation, 2015 +# Copyright (c) Microsoft Corporation. All rights reserved. # Module removed due to #4272 # disabling tests diff --git a/test/powershell/Modules/Microsoft.PowerShell.LocalAccounts/Pester.Command.Cmdlets.LocalAccounts.LocalGroupMember.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.LocalAccounts/Pester.Command.Cmdlets.LocalAccounts.LocalGroupMember.Tests.ps1 index f19430a5f7e..1601287a65f 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.LocalAccounts/Pester.Command.Cmdlets.LocalAccounts.LocalGroupMember.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.LocalAccounts/Pester.Command.Cmdlets.LocalAccounts.LocalGroupMember.Tests.ps1 @@ -1,6 +1,6 @@ # This is a Pester test suite to validate the cmdlets in LocalAccounts module # -# Copyright (c) Microsoft Corporation, 2015 +# Copyright (c) Microsoft Corporation. All rights reserved. # Module removed due to #4272 # disabling tests @@ -119,7 +119,7 @@ try { RemoveTestUsers -basename TestUser } } - + It "Can add user to group using SID" { Add-LocalGroupMember -SID $group1sid -Member TestUser1 $result = Get-LocalGroupMember TestGroup1 @@ -234,7 +234,7 @@ try { } VerifyFailingTest $sb "GroupNotFound,Microsoft.PowerShell.Commands.AddLocalGroupMemberCommand" } - + It "Can respond to -ErrorAction Stop" { $sb = { Add-LocalGroupMember TestGroup1 -Member @("TestUser1", "TestNonexistentUser1", "TestNonexistentUser2") -ErrorAction Stop -ErrorVariable OutputError | Out-Null @@ -512,7 +512,7 @@ try { } VerifyFailingTest $sb "MemberNotFound,Microsoft.PowerShell.Commands.RemoveLocalGroupMemberCommand" } - + It "Errors on remove group members by array of name" { $sb = { Remove-LocalGroupMember TestGroupRemove2 -Member TestUserRemove2 diff --git a/test/powershell/Modules/Microsoft.PowerShell.LocalAccounts/Pester.Command.Cmdlets.LocalAccounts.LocalUser.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.LocalAccounts/Pester.Command.Cmdlets.LocalAccounts.LocalUser.Tests.ps1 index 347caab9e9c..445921971e8 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.LocalAccounts/Pester.Command.Cmdlets.LocalAccounts.LocalUser.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.LocalAccounts/Pester.Command.Cmdlets.LocalAccounts.LocalUser.Tests.ps1 @@ -1,6 +1,6 @@ # This is a Pester test suite to validate the cmdlets in LocalAccounts module # -# Copyright (c) Microsoft Corporation, 2015 +# Copyright (c) Microsoft Corporation. All rights reserved. # Module removed due to #4272 # disabling tests diff --git a/test/powershell/Modules/Microsoft.PowerShell.Management/Copy.Item.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Management/Copy.Item.Tests.ps1 index 099acbef8e9..b09c6eae3a3 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Management/Copy.Item.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Management/Copy.Item.Tests.ps1 @@ -1,6 +1,6 @@ # This is a Pester test suite to validate Copy-Item remotely using a remote session. # -# Copyright (c) Microsoft Corporation, 2015 +# Copyright (c) Microsoft Corporation. All rights reserved. # # diff --git a/test/powershell/Modules/Microsoft.PowerShell.Management/TimeZone.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Management/TimeZone.Tests.ps1 index 782fcd0292f..236b98ca058 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Management/TimeZone.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Management/TimeZone.Tests.ps1 @@ -1,6 +1,6 @@ # This is a Pester test suite to validate the cmdlets in the TimeZone module # -# Copyright (c) Microsoft Corporation, 2016 +# Copyright (c) Microsoft Corporation. All rights reserved. <# -------------------------------------- @@ -107,7 +107,7 @@ Describe "Get-Timezone test cases" -Tags "CI" { $observed.StandardName | Should Be $timezoneName } - It "Call Get-TimeZone using Name param with wild card" { + It "Call Get-TimeZone using Name param with wild card" { $result = (Get-TimeZone -Name "Pacific*").Id $expectedIdList = ($TimeZonesAvailable | Where-Object { $_.StandardName -match "^Pacific" }).Id Assert-ListsSame $expectedIdList $result diff --git a/test/powershell/Modules/Microsoft.PowerShell.Security/FileCatalog.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Security/FileCatalog.Tests.ps1 index 48f28203a9e..85e4c9c8710 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Security/FileCatalog.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Security/FileCatalog.Tests.ps1 @@ -1,6 +1,6 @@ # This is a Pester test suite to validate the New-FileCatalog & Test-FileCatalog cmdlets on PowerShell Core. # -# Copyright (c) Microsoft Corporation, 2016 +# Copyright (c) Microsoft Corporation. All rights reserved. # try { diff --git a/test/powershell/Modules/Microsoft.PowerShell.Security/TestData/CatalogTestData/UserConfigProv/UserConfigProv.psd1 b/test/powershell/Modules/Microsoft.PowerShell.Security/TestData/CatalogTestData/UserConfigProv/UserConfigProv.psd1 index 2bbd83efc56..fe48cbc407f 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Security/TestData/CatalogTestData/UserConfigProv/UserConfigProv.psd1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Security/TestData/CatalogTestData/UserConfigProv/UserConfigProv.psd1 @@ -2,7 +2,7 @@ ModuleVersion = '3.0.0.1' Author = 'fayzas' CompanyName = 'Microsoft Corporation' - Copyright = '(c) 2013 Microsoft Corporation. All rights reserved.' + Copyright = 'Copyright (c) Microsoft Corporation. All rights reserved.' Description = 'Hello World!' PowerShellVersion = '3.0' CLRVersion = '4.0' diff --git a/test/powershell/Modules/Microsoft.PowerShell.Utility/FormatHex.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Utility/FormatHex.Tests.ps1 index f325b00ea5f..2b401fc7c6b 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Utility/FormatHex.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Utility/FormatHex.Tests.ps1 @@ -1,6 +1,6 @@ # This is a Pester test suite to validate the Format-Hex cmdlet in the Microsoft.PowerShell.Utility module. # -# Copyright (c) Microsoft Corporation, 2015 +# Copyright (c) Microsoft Corporation. All rights reserved. # <# diff --git a/test/powershell/Modules/Microsoft.PowerShell.Utility/NewTemporaryFile.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Utility/NewTemporaryFile.Tests.ps1 index 03240d2ddea..b9bd916036a 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Utility/NewTemporaryFile.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Utility/NewTemporaryFile.Tests.ps1 @@ -1,6 +1,6 @@ # This is a Pester test suite to validate the New-TemporaryFile cmdlet in the Microsoft.PowerShell.Utility module. # -# Copyright (c) Microsoft Corporation, 2015 +# Copyright (c) Microsoft Corporation. All rights reserved. # <# diff --git a/test/powershell/Modules/Microsoft.PowerShell.Utility/Pester.Commands.Cmdlets.Json.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Utility/Pester.Commands.Cmdlets.Json.Tests.ps1 index fe1cc85a84d..e257fe89cea 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Utility/Pester.Commands.Cmdlets.Json.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Utility/Pester.Commands.Cmdlets.Json.Tests.ps1 @@ -1,5 +1,5 @@ # -# Copyright (c) Microsoft Corporation, 2015 +# Copyright (c) Microsoft Corporation. All rights reserved. # # This is a Pester test suite which validate the Json cmdlets. # @@ -1383,11 +1383,11 @@ Describe "Validate Json serialization" -Tags "CI" { 'one' = 1 'two' = 2 'three' = 3 - } + } $response2 = $dictionary | ConvertTo-Json ($response2 -split "\r?\n")[1] | Should Be ' "one": 1,' } - + It "Should minify Json with Compress switch" { (@{ a = 1 } | ConvertTo-Json -Compress).Length | Should Be 7 } diff --git a/test/powershell/Modules/Microsoft.PowerShell.Utility/WebCmdlets.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Utility/WebCmdlets.Tests.ps1 index e4b9ebe22d4..43e072bd25d 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Utility/WebCmdlets.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Utility/WebCmdlets.Tests.ps1 @@ -1,5 +1,5 @@ # -# Copyright (c) Microsoft Corporation, 2016 +# Copyright (c) Microsoft Corporation. All rights reserved. # # This is a Pester test suite which validate the Web cmdlets. # @@ -455,7 +455,7 @@ Describe "Invoke-WebRequest tests" -Tags "Feature" { #User-Agent changes on different platforms, so tests should only be run if on the correct platform It "Invoke-WebRequest returns Correct User-Agent on MacOSX" -Skip:(!$IsMacOS) { - + $uri = Get-WebListenerUrl -Test 'Get' $command = "Invoke-WebRequest -Uri '$uri' -TimeoutSec 5" @@ -468,7 +468,7 @@ Describe "Invoke-WebRequest tests" -Tags "Feature" { } It "Invoke-WebRequest returns Correct User-Agent on Linux" -Skip:(!$IsLinux) { - + $uri = Get-WebListenerUrl -Test 'Get' $command = "Invoke-WebRequest -Uri '$uri' -TimeoutSec 5" @@ -633,7 +633,7 @@ Describe "Invoke-WebRequest tests" -Tags "Feature" { # Validate response content $result.Output.Headers.'Content-Encoding'[0] | Should BeExactly $dataEncoding - $jsonContent = $result.Output.Content | ConvertFrom-Json + $jsonContent = $result.Output.Content | ConvertFrom-Json $jsonContent.Headers.Host | Should BeExactly $uri.Authority } @@ -1317,7 +1317,7 @@ Describe "Invoke-WebRequest tests" -Tags "Feature" { param($Authentication) $params = @{ Uri = $httpsUri - Authentication = $Authentication + Authentication = $Authentication Token = $token SkipCertificateCheck = $true } @@ -1437,7 +1437,7 @@ Describe "Invoke-RestMethod tests" -Tags "Feature" { #User-Agent changes on different platforms, so tests should only be run if on the correct platform It "Invoke-RestMethod returns Correct User-Agent on MacOSX" -Skip:(!$IsMacOS) { - + $uri = Get-WebListenerUrl -Test 'Get' $command = "Invoke-RestMethod -Uri '$uri' -TimeoutSec 5" @@ -1448,7 +1448,7 @@ Describe "Invoke-RestMethod tests" -Tags "Feature" { } It "Invoke-RestMethod returns Correct User-Agent on Linux" -Skip:(!$IsLinux) { - + $uri = Get-WebListenerUrl -Test 'Get' $command = "Invoke-RestMethod -Uri '$uri' -TimeoutSec 5" @@ -1596,7 +1596,7 @@ Describe "Invoke-RestMethod tests" -Tags "Feature" { $result = Invoke-RestMethod -Uri $uri -ResponseHeadersVariable 'headers' # Validate response content - $headers.'Content-Encoding'[0] | Should BeExactly $dataEncoding + $headers.'Content-Encoding'[0] | Should BeExactly $dataEncoding $result.Headers.Host | Should BeExactly $uri.Authority } @@ -2237,7 +2237,7 @@ Describe "Invoke-RestMethod tests" -Tags "Feature" { param($Authentication) $params = @{ Uri = $httpsUri - Authentication = $Authentication + Authentication = $Authentication Token = $token SkipCertificateCheck = $true } diff --git a/test/powershell/engine/Cdxml/assets/CimTest/CdxmlTest.psd1 b/test/powershell/engine/Cdxml/assets/CimTest/CdxmlTest.psd1 index 728885ae681..3998c527e4f 100644 --- a/test/powershell/engine/Cdxml/assets/CimTest/CdxmlTest.psd1 +++ b/test/powershell/engine/Cdxml/assets/CimTest/CdxmlTest.psd1 @@ -2,7 +2,7 @@ GUID = '41486F7D-842F-40F1-ACE4-8405F9C2ED9B' Author="Microsoft Corporation" CompanyName="Microsoft Corporation" - Copyright="(c) Microsoft Corporation. All rights reserved." + Copyright="Copyright (c) Microsoft Corporation. All rights reserved." ModuleVersion = '2.0.0.0' PowerShellVersion = '3.0' FormatsToProcess = @() diff --git a/test/tools/Modules/HelpersCommon/HelpersCommon.psd1 b/test/tools/Modules/HelpersCommon/HelpersCommon.psd1 index b5c57ce46dd..c376c03d376 100644 --- a/test/tools/Modules/HelpersCommon/HelpersCommon.psd1 +++ b/test/tools/Modules/HelpersCommon/HelpersCommon.psd1 @@ -12,7 +12,7 @@ GUID = 'cc1c8e94-51d1-4bc1-b508-62bc09f02f54' CompanyName = 'Microsoft Corporation' -Copyright = 'Copyright (C) Microsoft Corporation, All rights reserved.' +Copyright = 'Copyright (c) Microsoft Corporation. All rights reserved.' Description = 'Temporary module contains functions for using in tests' diff --git a/test/tools/Modules/HelpersHostCS/HelpersHostCS.psd1 b/test/tools/Modules/HelpersHostCS/HelpersHostCS.psd1 index 5900c5c5fab..31322188879 100644 --- a/test/tools/Modules/HelpersHostCS/HelpersHostCS.psd1 +++ b/test/tools/Modules/HelpersHostCS/HelpersHostCS.psd1 @@ -12,7 +12,7 @@ GUID = '40a19c05-d765-41a1-995e-98ca5f247ee1' CompanyName = 'Microsoft Corporation' -Copyright = 'Copyright (C) Microsoft Corporation, All rights reserved.' +Copyright = 'Copyright (c) Microsoft Corporation. All rights reserved.' Description = 'Simple console host for console IO tests.' diff --git a/test/tools/Modules/HelpersLanguage/HelpersLanguage.psd1 b/test/tools/Modules/HelpersLanguage/HelpersLanguage.psd1 index b71a9c8ef03..955acd7bd35 100644 --- a/test/tools/Modules/HelpersLanguage/HelpersLanguage.psd1 +++ b/test/tools/Modules/HelpersLanguage/HelpersLanguage.psd1 @@ -12,7 +12,7 @@ GUID = 'a575af5e-2bd1-427f-b966-48640788896b' CompanyName = 'Microsoft Corporation' -Copyright = 'Copyright (C) Microsoft Corporation, All rights reserved.' +Copyright = 'Copyright (c) Microsoft Corporation. All rights reserved.' Description = 'Temporary module for language tests' diff --git a/test/tools/Modules/HelpersRemoting/HelpersRemoting.psd1 b/test/tools/Modules/HelpersRemoting/HelpersRemoting.psd1 index ec53921ddd8..5786599a940 100644 --- a/test/tools/Modules/HelpersRemoting/HelpersRemoting.psd1 +++ b/test/tools/Modules/HelpersRemoting/HelpersRemoting.psd1 @@ -12,7 +12,7 @@ GUID = '7acf3c68-64f4-4550-bf14-b9361bfbfea3' CompanyName = 'Microsoft Corporation' -Copyright = 'Copyright (C) Microsoft Corporation, All rights reserved.' +Copyright = 'Copyright (c) Microsoft Corporation. All rights reserved.' Description = 'Temporary module for remoting tests' diff --git a/test/tools/Modules/HttpListener/HttpListener.psd1 b/test/tools/Modules/HttpListener/HttpListener.psd1 index 0487ba10da8..0199dab6007 100644 --- a/test/tools/Modules/HttpListener/HttpListener.psd1 +++ b/test/tools/Modules/HttpListener/HttpListener.psd1 @@ -3,7 +3,7 @@ ModuleVersion = '1.0.0' GUID = 'e148b26c-0594-4963-99e5-419d4ff302e2' Author = 'Steve Lee' CompanyName = 'Microsoft' -Copyright = '(c) Microsoft. All rights reserved.' +Copyright = 'Copyright (c) Microsoft Corporation. All rights reserved.' Description = 'Creates a new HTTP Listener for testing purposes' RootModule = 'HttpListener.psm1' FunctionsToExport = @('Start-HttpListener','Stop-HttpListener') diff --git a/test/tools/OpenCover/OpenCover.psd1 b/test/tools/OpenCover/OpenCover.psd1 index fca6e97edaa..0b92431fd9d 100644 --- a/test/tools/OpenCover/OpenCover.psd1 +++ b/test/tools/OpenCover/OpenCover.psd1 @@ -4,7 +4,7 @@ ModuleVersion = '1.1.0.0' GUID = '4eedcffd-26e8-4172-8aad-9b882c13d370' Author = 'Microsoft Corporation' CompanyName = 'Microsoft Corporation' -Copyright = '(c) Microsoft Corporation. All rights reserved.' +Copyright = 'Copyright (c) Microsoft Corporation. All rights reserved.' Description = 'Module to install OpenCover and run Powershell tests to collect code coverage' DotNetFrameworkVersion = 4.5 TypesToProcess = @('OpenCover.Types.ps1xml') diff --git a/tools/packaging/packaging.psd1 b/tools/packaging/packaging.psd1 index e997b8f5bbf..bb102ec1bef 100644 --- a/tools/packaging/packaging.psd1 +++ b/tools/packaging/packaging.psd1 @@ -2,7 +2,7 @@ GUID="41857994-4283-4757-a932-0b0edb104913" Author="Microsoft Corporation" CompanyName="Microsoft Corporation" -Copyright="© Microsoft Corporation. All rights reserved." +Copyright="Copyright (c) Microsoft Corporation. All rights reserved." ModuleVersion="1.0.0" PowerShellVersion="5.0" CmdletsToExport="Start-PSPackage" diff --git a/tools/packaging/project/powershell.nuspec b/tools/packaging/project/powershell.nuspec index 96812dc47bb..4207a096f75 100644 --- a/tools/packaging/project/powershell.nuspec +++ b/tools/packaging/project/powershell.nuspec @@ -11,7 +11,7 @@ https://github.com/powershell/powershell https://github.com/PowerShell/PowerShell/blob/master/assets/Powershell_64.png This package contains the PowerShell Core for $runtime$. - Copyright © Microsoft Corporation + Copyright (c) Microsoft Corporation. All rights reserved. PowerShell From 7407a9e300e8ec5177b46e5423990b9e60ba3e5e Mon Sep 17 00:00:00 2001 From: Steve Lee Date: Fri, 27 Oct 2017 05:14:46 +0800 Subject: [PATCH 051/617] Fix 'get-item -literalpath a*b' to return error if `a*b` doesn't actually exist (#5197) --- .../namespaces/LocationGlobber.cs | 2 +- .../FileSystem.Tests.ps1 | 29 +++++++++++++------ 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/System.Management.Automation/namespaces/LocationGlobber.cs b/src/System.Management.Automation/namespaces/LocationGlobber.cs index ec2db5033a3..9998476f759 100644 --- a/src/System.Management.Automation/namespaces/LocationGlobber.cs +++ b/src/System.Management.Automation/namespaces/LocationGlobber.cs @@ -252,7 +252,7 @@ internal Collection GetGlobbedMonadPathsFromMonadPath( if (!allowNonexistingPaths && result.Count < 1 && - !WildcardPattern.ContainsWildcardCharacters(path) && + (!WildcardPattern.ContainsWildcardCharacters(path) || context.SuppressWildcardExpansion) && (context.Include == null || context.Include.Count == 0) && (context.Exclude == null || context.Exclude.Count == 0)) { diff --git a/test/powershell/Modules/Microsoft.PowerShell.Management/FileSystem.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Management/FileSystem.Tests.ps1 index 32f676d6c91..c04b9472a1a 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Management/FileSystem.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Management/FileSystem.Tests.ps1 @@ -949,6 +949,16 @@ Describe "Extended FileSystem Item/Content Cmdlet Provider Tests" -Tags "Feature $result = Get-Item -Path "TestDrive:\*" -filter "*2.txt" $result.Name | Should Be $testFile2 } + + It "Verify -LiteralPath with wildcard fails for file that doesn't exist" { + { Get-Item -LiteralPath "a*b.txt" -ErrorAction Stop } | ShouldBeErrorId "PathNotFound,Microsoft.PowerShell.Commands.GetItemCommand" + } + + It "Verify -LiteralPath with wildcard succeeds for file" -Skip:($IsWindows) { + New-Item -Path "$testdrive\a*b.txt" -ItemType File > $null + $file = Get-Item -LiteralPath "$testdrive\a*b.txt" + $file.Name | Should BeExactly "a*b.txt" + } } Context "Valdiate Move-Item parameters" { @@ -957,15 +967,15 @@ Describe "Extended FileSystem Item/Content Cmdlet Provider Tests" -Tags "Feature } BeforeEach { - New-Item -Path $testFile -ItemType File > $null - New-Item -Path $testFile2 -ItemType File > $null + New-Item -Path $testFile -ItemType File -Force > $null + New-Item -Path $testFile2 -ItemType File -Force > $null } AfterEach { Remove-Item -Path * -Recurse -Force -ErrorAction SilentlyContinue } - It "Verify WhatIf" -Skip:$true { #Skipped until issue #2385 gets resolved + It "Verify WhatIf" { Move-Item -Path $testFile -Destination $altTestFile -WhatIf try { Get-Item -Path $altTestFile -ErrorAction Stop @@ -974,15 +984,16 @@ Describe "Extended FileSystem Item/Content Cmdlet Provider Tests" -Tags "Feature catch { $_.FullyQualifiedErrorId | Should Be "PathNotFound,Microsoft.PowerShell.Commands.GetItemCommand" } } - It "Verify Include and Exclude Intersection" -Skip:$true { #Skipped until issue #2385 gets resolved - Move-Item -Path "TestDrive:\*" -Destination $altTestFile -Include "*.txt" -Exclude "*2*" - $file1 = Get-Item $testFile2 -ErrorAction SilentlyContinue - $file2 = Get-Item $altTestFile -ErrorAction SilentlyContinue + It "Verify Include and Exclude Intersection" { + New-Item -Path "TestDrive:\dest" -ItemType Directory + Move-Item -Path "TestDrive:\*" -Destination "TestDrive:\dest" -Include "*.txt" -Exclude "*2*" + $file1 = Get-Item "TestDrive:\dest\$testFile2" -ErrorAction SilentlyContinue + $file2 = Get-Item "TestDrive:\dest\$testFile" -ErrorAction SilentlyContinue $file1 | Should BeNullOrEmpty - $file2.Name | Should Be $altTestFile + $file2.Name | Should Be $testFile } - It "Verify Filter" -Skip:$true { #Skipped until issue #2385 gets resolved + It "Verify Filter" { Move-Item -Path "TestDrive:\*" -Filter "*2.txt" -Destination $altTestFile $file1 = Get-Item $testFile2 -ErrorAction SilentlyContinue $file2 = Get-Item $altTestFile -ErrorAction SilentlyContinue From 967ed8b66416f6ad9a5aecea9207bed6f5289189 Mon Sep 17 00:00:00 2001 From: Steve Lee Date: Fri, 27 Oct 2017 05:16:47 +0800 Subject: [PATCH 052/617] Fix 'Import-module' to not report a loaded module was not found (#5238) Missed a 'break' statement after the module was loaded successfully, so the loop continues when it shouldn't. --- .../engine/Modules/ModuleCmdletBase.cs | 8 ++++---- .../Import-Module.Tests.ps1 | 19 ++++++++++++++++++- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/System.Management.Automation/engine/Modules/ModuleCmdletBase.cs b/src/System.Management.Automation/engine/Modules/ModuleCmdletBase.cs index 57eee77c40b..a44549cf99c 100644 --- a/src/System.Management.Automation/engine/Modules/ModuleCmdletBase.cs +++ b/src/System.Management.Automation/engine/Modules/ModuleCmdletBase.cs @@ -317,12 +317,12 @@ internal bool LoadUsingModulePath(PSModuleInfo parentModule, bool found, IEnumer module = LoadUsingExtensions(parentModule, name, qualifiedPath, extension, null, this.BasePrefix, ss, options, manifestProcessingFlags, out found); } + if (found) + { + break; + } #if UNIX } - if (found) - { - break; - } } if (found) { diff --git a/test/powershell/Modules/Microsoft.PowerShell.Core/Import-Module.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Core/Import-Module.Tests.ps1 index 4dc287ab881..e532e32e085 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Core/Import-Module.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Core/Import-Module.Tests.ps1 @@ -1,5 +1,17 @@ Describe "Import-Module" -Tags "CI" { $moduleName = "Microsoft.PowerShell.Security" + BeforeAll { + $originalPSModulePath = $env:PSModulePath + New-Item -ItemType Directory -Path "$testdrive\Modules\TestModule\1.1" -Force > $null + New-Item -ItemType Directory -Path "$testdrive\Modules\TestModule\2.0" -Force > $null + $env:PSModulePath += [System.IO.Path]::PathSeparator + "$testdrive\Modules" + New-ModuleManifest -Path "$testdrive\Modules\TestModule\1.1\TestModule.psd1" -ModuleVersion 1.1 + New-ModuleManifest -Path "$testdrive\Modules\TestModule\2.0\TestModule.psd1" -ModuleVersion 2.0 + } + + AfterAll { + $env:PSModulePath = $originalPSModulePath + } BeforeEach { Remove-Module -Name $moduleName -Force @@ -24,9 +36,14 @@ It "should be able to load an already loaded module" { Import-Module $moduleName - { $script:module = Import-Module $moduleName -PassThru } | Should Not Throw + { $script:module = Import-Module $moduleName -PassThru -ErrorAction Stop } | Should Not Throw Get-Module -Name $moduleName | Should Be $script:module } + + It "should only load the specified version" { + Import-Module TestModule -RequiredVersion 1.1 + (Get-Module TestModule).Version | Should Be "1.1" + } } Describe "Import-Module with ScriptsToProcess" -Tags "CI" { From 4df703616ae7f3fe2e11484702dbc84b89c21a52 Mon Sep 17 00:00:00 2001 From: Steve Lee Date: Fri, 27 Oct 2017 12:52:08 +0800 Subject: [PATCH 053/617] use rcedit to embed icon and version information into pwsh.exe (#5178) pwsh.exe today doesn't contain file version information and the icon is only associated with the shortcut file and not the exe Fix is to use rcedit to embed: icon product version file version product name copyright Fix #2883 Fix #5166 Fix #5034 --- build.psm1 | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/build.psm1 b/build.psm1 index 43124942bba..435fe63bbb1 100644 --- a/build.psm1 +++ b/build.psm1 @@ -1442,6 +1442,15 @@ function Start-PSBootstrap { # Install Windows dependencies if `-Package` or `-BuildWindowsNative` is specified if ($Environment.IsWindows) { + ## need RCEdit to modify the binaries embedded resources + if (-not (Test-Path "~/.rcedit/rcedit-x64.exe")) + { + log "Install RCEdit for modifying exe resources" + $rceditUrl = "https://github.com/electron/rcedit/releases/download/v1.0.0/rcedit-x64.exe" + New-Item -Path "~/.rcedit" -Type Directory -Force > $null + Invoke-WebRequest -OutFile "~/.rcedit/rcedit-x64.exe" -Uri $rceditUrl + } + if ($BuildWindowsNative) { log "Install Windows dependencies for building PSRP plugin" @@ -1862,6 +1871,16 @@ function New-MSIPackage [Switch] $Force ) + ## need RCEdit to modify the binaries embedded resources + if (-not (Test-Path "~/.rcedit/rcedit-x64.exe")) + { + throw "RCEdit is required to modify pwsh.exe resources, please run 'Start-PSBootStrap' to install" + } + + Start-NativeExecution { & "~/.rcedit/rcedit-x64.exe" (Get-PSOutput) --set-icon "$AssetsPath\Powershell_black.ico" ` + --set-file-version $ProductVersion --set-product-version $ProductVersion --set-version-string "ProductName" "PowerShell Core 6" ` + --set-version-string "LegalCopyright" "(C) Microsoft Corporation. All Rights Reserved." } | Write-Verbose + ## AppVeyor base image might update the version for Wix. Hence, we should ## not hard code version numbers. $wixToolsetBinPath = "${env:ProgramFiles(x86)}\WiX Toolset *\bin" From ce03a6c2bee486a758cc137d2064e56953def756 Mon Sep 17 00:00:00 2001 From: Travis Plunk Date: Fri, 27 Oct 2017 11:35:40 -0700 Subject: [PATCH 054/617] Make sure web hook gets called (#5249) if something goes wrong during the build, we might exit and not update the badge or fire the webhook. Enable the after_success and after_failure stages of the travis-ci build so we can have a better chance of getting these done. --- .travis.yml | 8 +++++- tools/travis.ps1 | 65 +++++++++++++++++++++++++++++------------------- 2 files changed, 47 insertions(+), 26 deletions(-) diff --git a/.travis.yml b/.travis.yml index ddbdf11f07a..888d5404f9a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -35,7 +35,7 @@ install: npm install -g markdown-spellcheck@0.11.0; fi - ulimit -n 4096 - - pwsh -File tools/travis.ps1 -Bootstrap + - pwsh -File tools/travis.ps1 -Stage Bootstrap script: - pwsh -File tools/travis.ps1 @@ -43,3 +43,9 @@ script: - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then mdspell '**/*.md' '!powershell/**/*.md' --ignore-numbers --ignore-acronyms --report; fi + +after_failure: + - pwsh -File tools/travis.ps1 -Stage Failure + +after_success: + - pwsh -File tools/travis.ps1 -Stage Success diff --git a/tools/travis.ps1 b/tools/travis.ps1 index fe665737f62..73c3a74808e 100644 --- a/tools/travis.ps1 +++ b/tools/travis.ps1 @@ -1,6 +1,8 @@ param( - [switch]$Bootstrap + [ValidateSet('Bootstrap','Build','Failure','Success')] + [String]$Stage = 'Build' ) + Import-Module $PSScriptRoot/../build.psm1 -Force Import-Module $PSScriptRoot/packaging -Force @@ -158,14 +160,14 @@ $isDailyBuild = $env:TRAVIS_EVENT_TYPE -eq 'cron' -or $env:TRAVIS_EVENT_TYPE -eq $cronBuild = $env:TRAVIS_EVENT_TYPE -eq 'cron' $isFullBuild = $isDailyBuild -or $hasFeatureTag -if($Bootstrap.IsPresent) +if($Stage -eq 'Bootstrap') { Write-Host -Foreground Green "Executing travis.ps1 -BootStrap `$isPR='$isPr' - $commitMessage" # Make sure we have all the tags Sync-PSTags -AddRemoteIfMissing Start-PSBootstrap -Package:(-not $isPr) } -else +elseif($Stage -eq 'Build') { $BaseVersion = (Get-PSVersion -OmitCommitId) + '-' Write-Host -Foreground Green "Executing travis.ps1 `$isPR='$isPr' `$isFullBuild='$isFullBuild' - $commitMessage" @@ -269,33 +271,46 @@ else Start-NativeExecution -sb {dotnet nuget push $package --api-key $env:NUGET_KEY --source "$env:NUGET_URL/api/v2/package"} -IgnoreExitcode } } + } + + # if the tests did not pass, throw the reason why + if ( $result -eq "FAIL" ) { + Throw $resultError + } +} +elseif($Stage -in 'Failure', 'Success') +{ + $result = 'PASS' + if($Stage -eq 'Failure') + { + $result = 'FAIL' + } + if ($cronBuild) { # update the badge if you've done a cron build, these are not fatal issues - if ( $cronBuild ) { - try { - $svgData = Get-DailyBadge -result $result - if ( ! $svgData ) { - write-warning "Could not retrieve $result badge" - } - else { - log "Setting status badge to '$result'" - Set-DailyBuildBadge -content $svgData - } + try { + $svgData = Get-DailyBadge -result $result + if ( ! $svgData ) { + write-warning "Could not retrieve $result badge" } - catch { - Write-Warning "Could not update status badge: $_" - } - try { - Send-DailyWebHook -result $result - } - catch { - Write-Warning "Could not send webhook: $_" + else { + log "Setting status badge to '$result'" + Set-DailyBuildBadge -content $svgData } } - } + catch { + Write-Warning "Could not update status badge: $_" + } - # if the tests did not pass, throw the reason why - if ( $result -eq "FAIL" ) { - Throw $resultError + try { + Send-DailyWebHook -result $result + } + catch { + Write-Warning "Could not send webhook: $_" + } } + else { + log 'We only send bagde or webhook update for Cron builds' + } + } From 14af3e12972873676f76b2a456a86c1bf33749b9 Mon Sep 17 00:00:00 2001 From: Travis Plunk Date: Fri, 27 Oct 2017 11:57:21 -0700 Subject: [PATCH 055/617] update docker file for nanoserver 1709 release (#5252) --- docker/release/nanoserver-insider/Dockerfile | 55 -------------- docker/release/nanoserver/Dockerfile | 76 ++++++++++---------- 2 files changed, 36 insertions(+), 95 deletions(-) delete mode 100755 docker/release/nanoserver-insider/Dockerfile mode change 100644 => 100755 docker/release/nanoserver/Dockerfile diff --git a/docker/release/nanoserver-insider/Dockerfile b/docker/release/nanoserver-insider/Dockerfile deleted file mode 100755 index 1146233b52a..00000000000 --- a/docker/release/nanoserver-insider/Dockerfile +++ /dev/null @@ -1,55 +0,0 @@ -# escape=` -# Args used by from statements must be defined here: -ARG NanoServerVersion=10.0.16257.1000 -ARG WindowsServerCoreVersion=10.0.16257.1000 -ARG WindowsServerCoreRepo=microsoft/windowsservercore-insider -ARG NanoServerRepo=microsoft/nanoserver-insider - -# Use server core as an installer container to extract PowerShell, -# As this is a multi-stage build, this stage will eventually be thrown away -FROM ${WindowsServerCoreRepo}:$WindowsServerCoreVersion AS installer-env - -# Arguments for installing powershell, must be defined in the container they are used -ARG PS_VERSION=6.0.0-beta.9 - -ENV PS_DOWNLOAD_URL https://github.com/PowerShell/PowerShell/releases/download/v$PS_VERSION/PowerShell-$PS_VERSION-win-x64.zip - -SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"] -RUN Invoke-WebRequest $Env:PS_DOWNLOAD_URL -OutFile powershell.zip - -RUN Expand-Archive powershell.zip -DestinationPath \PowerShell - -# Install PowerShell into NanoServer -FROM ${NanoServerRepo}:$NanoServerVersion - -ARG VCS_REF="none" -ARG PS_VERSION=6.0.0-beta.9 -ARG IMAGE_NAME=microsoft/nanoserver-insider-powershell - -LABEL maintainer="PowerShell Team " ` - readme.md="https://github.com/PowerShell/PowerShell/blob/master/docker/README.md" ` - description="This Dockerfile will install the latest release of PS." ` - org.label-schema.usage="https://github.com/PowerShell/PowerShell/tree/master/docker#run-the-docker-image-you-built" ` - org.label-schema.url="https://github.com/PowerShell/PowerShell/blob/master/docker/README.md" ` - org.label-schema.vcs-url="https://github.com/PowerShell/PowerShell" ` - org.label-schema.name="powershell" ` - org.label-schema.vcs-ref=${VCS_REF} ` - org.label-schema.vendor="PowerShell" ` - org.label-schema.version=${PS_VERSION} ` - org.label-schema.schema-version="1.0" ` - org.label-schema.docker.cmd="docker run ${IMAGE_NAME} pwsh -c '$psversiontable'" ` - org.label-schema.docker.cmd.devel="docker run ${IMAGE_NAME}" ` - org.label-schema.docker.cmd.test="docker run ${IMAGE_NAME} pwsh -c Invoke-Pester" ` - org.label-schema.docker.cmd.help="docker run ${IMAGE_NAME} pwsh -c Get-Help" - -# Copy Powershell Core from the installer containter -ENV ProgramFiles C:\Program Files -COPY --from=installer-env ["\\PowerShell\\", "$ProgramFiles\\PowerShell"] - -# Persist %PSCORE% ENV variable for user convenience -ENV PSCORE="$ProgramFiles\PowerShell\pwsh.exe" - -# Set the path -RUN setx PATH "%PATH%;%ProgramFiles%\PowerShell" - -CMD ["pwsh.exe"] diff --git a/docker/release/nanoserver/Dockerfile b/docker/release/nanoserver/Dockerfile old mode 100644 new mode 100755 index 34f791428b2..3a7121c0617 --- a/docker/release/nanoserver/Dockerfile +++ b/docker/release/nanoserver/Dockerfile @@ -1,9 +1,32 @@ # escape=` -FROM microsoft/nanoserver:latest +# Args used by from statements must be defined here: +ARG NanoServerVersion=1709 +ARG WindowsServerCoreVersion=latest +ARG WindowsServerCoreRepo=microsoft/windowsservercore +ARG NanoServerRepo=microsoft/nanoserver -ARG POWERSHELL_ZIP=https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.9/PowerShell-6.0.0-beta.9-win-x64.zip -ARG POWERSHELL_VERSION=6.0.0-beta.9 -ARG IMAGE_NAME=microsoft/powershell:nanoserver +# Use server core as an installer container to extract PowerShell, +# As this is a multi-stage build, this stage will eventually be thrown away +FROM ${WindowsServerCoreRepo}:$WindowsServerCoreVersion AS installer-env + +# Arguments for installing powershell, must be defined in the container they are used +ARG PS_VERSION=6.0.0-beta.9 + +ENV PS_DOWNLOAD_URL https://github.com/PowerShell/PowerShell/releases/download/v$PS_VERSION/PowerShell-$PS_VERSION-win-x64.zip + +SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"] + +RUN if (!($env:PS_VERSION -match '^\d+\.\d+\.\d+(-\w+\.\d+)?$' )) {throw ('PS_Version ({0}) must match the regex "^\d+\.\d+\.\d+(-\w+\.\d+)?$"' -f $env:PS_VERSION)} +RUN Invoke-WebRequest $Env:PS_DOWNLOAD_URL -OutFile powershell.zip + +RUN Expand-Archive powershell.zip -DestinationPath \PowerShell + +# Install PowerShell into NanoServer +FROM ${NanoServerRepo}:$NanoServerVersion + +ARG VCS_REF="none" +ARG PS_VERSION=6.0.0-beta.9 +ARG IMAGE_NAME=microsoft/powershell LABEL maintainer="PowerShell Team " ` readme.md="https://github.com/PowerShell/PowerShell/blob/master/docker/README.md" ` @@ -12,50 +35,23 @@ LABEL maintainer="PowerShell Team " ` org.label-schema.url="https://github.com/PowerShell/PowerShell/blob/master/docker/README.md" ` org.label-schema.vcs-url="https://github.com/PowerShell/PowerShell" ` org.label-schema.name="powershell" ` + org.label-schema.vcs-ref=${VCS_REF} ` org.label-schema.vendor="PowerShell" ` - org.label-schema.version=${POWERSHELL_VERSION} ` + org.label-schema.version=${PS_VERSION} ` org.label-schema.schema-version="1.0" ` org.label-schema.docker.cmd="docker run ${IMAGE_NAME} pwsh -c '$psversiontable'" ` org.label-schema.docker.cmd.devel="docker run ${IMAGE_NAME}" ` org.label-schema.docker.cmd.test="docker run ${IMAGE_NAME} pwsh -c Invoke-Pester" ` org.label-schema.docker.cmd.help="docker run ${IMAGE_NAME} pwsh -c Get-Help" -# TODO: addd LABEL org.label-schema.vcs-ref=${VCS_REF} - -RUN setx /M PATH "%ProgramFiles%\PowerShell\latest;%PATH%" -# Setup PowerShell - Log-to > C:\Docker.log -SHELL ["C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe", "-command"] -ADD $POWERSHELL_ZIP /powershell-win-x64.zip - -# Install PowerShell package and clean up -RUN $ErrorActionPreference='Stop'; ` - $ConfirmPreference='None'; ` - $VerbosePreference='Continue'; ` - Start-Transcript -path C:\Dockerfile.log -append -IncludeInvocationHeader ; ` - $PSVersionTable | Write-Output ; ` - $VerInfo = Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion' ; ` - ('FullBuildString: '+$VerInfo.BuildLabEx) | Write-Output ; ` - ('OperatingSystem: '+$VerInfo.ProductName+' '+$VerInfo.EditionId+' '+$VerInfo.InstallationType) | Write-Output ; ` - [System.IO.FileInfo]$ZipFile = Get-Item -Path ./powershell-win-x64.zip ; ` - New-Item -Path $Env:ProgramFiles/PowerShell -ItemType Directory -Force | out-null ; ` - [System.IO.DirectoryInfo]$PsFolder=New-Item -Path $Env:ProgramFiles\PowerShell -ItemType Directory -Force ; ` - Add-Type -AssemblyName System.IO.Compression.ZipFile ; ` - [System.IO.Compression.ZipFile]::ExtractToDirectory($ZipFile,$PsFolder) ; ` - if (Get-ChildItem -Path $PsFolder/pwsh.exe) { ` - Remove-Item -Path $ZipFile ; ` - New-Item -Type SymbolicLink -Path $PsFolder\ -Name latest -Value $PsFolder ` - } else { throw 'Installation failed! See c:\Dockerfile.log' } ; - -# Verify New pwsh.exe runs -SHELL ["C:\\Program Files\\PowerShell\\latest\\pwsh.exe", "-command"] -RUN Start-Transcript -path C:\Dockerfile.log -append -IncludeInvocationHeader ; ` - $ErrorActionPreference='Stop'; ` - Write-Output $PSVersionTable ; ` - If (-not($PSVersionTable.PSEdition -Match 'Core')) { ` - Throw [String]$('['+$PSVersionTable.PSEdition+'] is not [Core]!') ; ` - } ; +# Copy Powershell Core from the installer containter +ENV ProgramFiles C:\Program Files +COPY --from=installer-env ["\\PowerShell\\", "$ProgramFiles\\PowerShell"] # Persist %PSCORE% ENV variable for user convenience -ENV PSCORE='"C:\Program Files\PowerShell\latest\pwsh.exe"' +ENV PSCORE="$ProgramFiles\PowerShell\pwsh.exe" + +# Set the path +RUN setx PATH "%PATH%;%ProgramFiles%\PowerShell" CMD ["pwsh.exe"] From 9b32c1d039b94ad247b6e3eacc6c3a52bbc50466 Mon Sep 17 00:00:00 2001 From: "Mathias R. Jessen" Date: Sun, 29 Oct 2017 01:47:10 +0800 Subject: [PATCH 056/617] Add char range overload to DotDot operator (#5026) --- .../engine/parser/Compiler.cs | 7 ++ .../engine/runtime/Operations/NumericOps.cs | 29 +++++- .../Operators/RangeOperator.Tests.ps1 | 97 +++++++++++++++++++ 3 files changed, 128 insertions(+), 5 deletions(-) create mode 100644 test/powershell/Language/Operators/RangeOperator.Tests.ps1 diff --git a/src/System.Management.Automation/engine/parser/Compiler.cs b/src/System.Management.Automation/engine/parser/Compiler.cs index 9a01f0de215..a33f9ea7bb1 100644 --- a/src/System.Management.Automation/engine/parser/Compiler.cs +++ b/src/System.Management.Automation/engine/parser/Compiler.cs @@ -65,6 +65,8 @@ internal static class CachedReflectionInfo typeof(CharOps).GetMethod(nameof(CharOps.CompareStringIeq), staticFlags); internal static readonly MethodInfo CharOps_CompareStringIne = typeof(CharOps).GetMethod(nameof(CharOps.CompareStringIne), staticFlags); + internal static readonly MethodInfo CharOps_Range = + typeof(CharOps).GetMethod(nameof(CharOps.Range), staticFlags); internal static readonly MethodInfo CommandParameterInternal_CreateArgument = typeof(CommandParameterInternal).GetMethod(nameof(CommandParameterInternal.CreateArgument), staticFlags); @@ -4901,6 +4903,11 @@ public object VisitBinaryExpression(BinaryExpressionAst binaryExpressionAst) return Expression.Call(CachedReflectionInfo.TypeOps_AsOperator, lhs.Cast(typeof(object)), rhs.Convert(typeof(Type))); case TokenKind.DotDot: + if(lhs.Type == typeof(string)){ + return Expression.Call(CachedReflectionInfo.CharOps_Range, + lhs.Convert(typeof(char)), + rhs.Convert(typeof(char))); + } return Expression.Call(CachedReflectionInfo.IntOps_Range, lhs.Convert(typeof(int)), rhs.Convert(typeof(int))); diff --git a/src/System.Management.Automation/engine/runtime/Operations/NumericOps.cs b/src/System.Management.Automation/engine/runtime/Operations/NumericOps.cs index 534b714302c..a1957f7732a 100644 --- a/src/System.Management.Automation/engine/runtime/Operations/NumericOps.cs +++ b/src/System.Management.Automation/engine/runtime/Operations/NumericOps.cs @@ -101,11 +101,6 @@ internal static object Remainder(int lhs, int rhs) internal static object[] Range(int lower, int upper) { - if (lower == upper) - { - return new object[] { lower }; - } - int absRange = Math.Abs(checked(upper - lower)); object[] ra = new object[absRange + 1]; @@ -863,5 +858,29 @@ internal static object CompareIne(char lhs, char rhs) char secondAsUpper = char.ToUpperInvariant(rhs); return firstAsUpper != secondAsUpper ? Boxed.True : Boxed.False; } + + internal static object[] Range(char start, char end) + { + int lower = (int)start; + int upper = (int)end; + + int absRange = Math.Abs(checked(upper - lower)); + + object[] ra = new object[absRange + 1]; + if (lower > upper) + { + // 3 .. 1 => 3 2 1 + for (int offset = 0; offset < ra.Length; offset++) + ra[offset] = (char)lower--; + } + else + { + // 1 .. 3 => 1 2 3 + for (int offset = 0; offset < ra.Length; offset++) + ra[offset] = (char)lower++; + } + + return ra; + } } } diff --git a/test/powershell/Language/Operators/RangeOperator.Tests.ps1 b/test/powershell/Language/Operators/RangeOperator.Tests.ps1 new file mode 100644 index 00000000000..0f15ebdcb5a --- /dev/null +++ b/test/powershell/Language/Operators/RangeOperator.Tests.ps1 @@ -0,0 +1,97 @@ +Describe "Range Operator" -Tags CI { + Context "Range integer operations" { + It "Range operator generates arrays of integers" { + $Range = 5..8 + $Range.count | Should Be 4 + $Range[0] | Should BeOfType [int] + $Range[1] | Should BeOfType [int] + $Range[2] | Should BeOfType [int] + $Range[3] | Should BeOfType [int] + + $Range[0] | Should Be 5 + $Range[1] | Should Be 6 + $Range[2] | Should Be 7 + $Range[3] | Should Be 8 + } + + It "Range operator accepts negative integer values" { + $Range = -8..-5 + $Range.count | Should Be 4 + $Range[0] | Should Be -8 + $Range[1] | Should Be -7 + $Range[2] | Should Be -6 + $Range[3] | Should Be -5 + } + + It "Range operator support single-item sequences" { + $Range = 0..0 + $Range.count | Should Be 1 + $Range[0] | Should BeOfType [int] + $Range[0] | Should Be 0 + } + + It "Range operator works in descending order" { + $Range = 4..3 + $Range.count | Should Be 2 + $Range[0] | Should Be 4 + $Range[1] | Should Be 3 + } + + It "Range operator works for sequences of both negative and positive numbers" { + $Range = -2..2 + $Range.count | Should Be 5 + $Range[0] | Should Be -2 + $Range[1] | Should Be -1 + $Range[2] | Should Be 0 + $Range[3] | Should Be 1 + $Range[4] | Should Be 2 + } + } + + Context "Character expansion" { + It "Range operator generates an array of [char] from single-character string operands" { + $CharRange = 'A'..'E' + $CharRange.count | Should Be 5 + $CharRange[0] | Should BeOfType [char] + $CharRange[1] | Should BeOfType [char] + $CharRange[2] | Should BeOfType [char] + $CharRange[3] | Should BeOfType [char] + $CharRange[4] | Should BeOfType [char] + } + + It "Range operator works in ascending and descending order" { + $CharRange = 'a'..'b' + $CharRange.count | Should Be 2 + $CharRange[0] | Should Be ([char]'a') + $CharRange[1] | Should Be ([char]'b') + + $CharRange = 'b'..'a' + $CharRange.count | Should Be 2 + $CharRange[0] | Should Be ([char]'b') + $CharRange[1] | Should Be ([char]'a') + } + + It "Range operator works with 16-bit unicode characters" { + $UnicodeRange = "`u{0110}".."`u{0114}" + $UnicodeRange.count | Should Be 5 + $UnicodeRange[0] | Should Be "`u{0110}"[0] + $UnicodeRange[1] | Should Be "`u{0111}"[0] + $UnicodeRange[2] | Should Be "`u{0112}"[0] + $UnicodeRange[3] | Should Be "`u{0113}"[0] + $UnicodeRange[4] | Should Be "`u{0114}"[0] + $UnicodeRange.Where({$_ -is [char]}).count | Should Be 5 + } + } + + Context "Range operator operand types" { + It "Range operator works on [decimal]" { + $Range = 1.1d..3.9d + $Range.count | Should Be 4 + $Range[0] | Should Be 1 + $Range[1] | Should Be 2 + $Range[2] | Should Be 3 + $Range[3] | Should Be 4 + $Range.Where({$_ -is [int]}).count | Should Be 4 + } + } +} From 8234e3cd19a0eda96e494217f6973c91b23be188 Mon Sep 17 00:00:00 2001 From: Jason Shirk Date: Sat, 28 Oct 2017 21:01:47 -0700 Subject: [PATCH 057/617] Remove CommandFactory (#5266) The class CommandFactory served no real purpose in command lookup other than to unnecessarily add a few frames to the call stack, introduce an extra indirection, and add a couple of unnecessary checks that essential instances like ExecutionContext are not null. --- .../engine/CommandDiscovery.cs | 21 +-- .../engine/CommandFactory.cs | 129 ------------------ .../engine/ExecutionContext.cs | 13 +- .../engine/hostifaces/Command.cs | 7 +- .../engine/hostifaces/LocalConnection.cs | 17 --- .../engine/hostifaces/LocalPipeline.cs | 1 - .../engine/hostifaces/PowerShell.cs | 1 - .../resources/DiscoveryExceptions.resx | 6 - 8 files changed, 7 insertions(+), 188 deletions(-) delete mode 100644 src/System.Management.Automation/engine/CommandFactory.cs diff --git a/src/System.Management.Automation/engine/CommandDiscovery.cs b/src/System.Management.Automation/engine/CommandDiscovery.cs index 2586900c8ac..826bb6bc6a2 100644 --- a/src/System.Management.Automation/engine/CommandDiscovery.cs +++ b/src/System.Management.Automation/engine/CommandDiscovery.cs @@ -301,26 +301,7 @@ internal void AddSessionStateCmdletEntryToCache(SessionStateCmdletEntry entry, b internal CommandProcessorBase LookupCommandProcessor(string commandName, CommandOrigin commandOrigin, bool? useLocalScope) { - CommandInfo commandInfo = null; -#if false - if (tokenCache.ContainsKey (commandName)) - { - commandInfo = tokenCache[commandName]; - } - else - { - commandInfo = LookupCommandInfo (commandName); - - if (commandInfo.CommandType == CommandTypes.Alias) - { - commandInfo = ((AliasInfo)commandInfo).ResolvedCommand; - } - - tokenCache[commandName] = commandInfo; - } -#else - commandInfo = LookupCommandInfo(commandName, commandOrigin); -#endif + CommandInfo commandInfo = LookupCommandInfo(commandName, commandOrigin); CommandProcessorBase processor = LookupCommandProcessor(commandInfo, commandOrigin, useLocalScope, null); // commandInfo.Name might be different than commandName - restore the original invocation name diff --git a/src/System.Management.Automation/engine/CommandFactory.cs b/src/System.Management.Automation/engine/CommandFactory.cs deleted file mode 100644 index 1cf2e3de671..00000000000 --- a/src/System.Management.Automation/engine/CommandFactory.cs +++ /dev/null @@ -1,129 +0,0 @@ -/********************************************************************++ -Copyright (c) Microsoft Corporation. All rights reserved. ---********************************************************************/ - -namespace System.Management.Automation -{ - /// - /// Command factory provides a generic interface to create different types of commands. - /// - internal class CommandFactory - { - #region private_members - - private ExecutionContext _context; - - #endregion private_members - - #region public_properties - - /// - /// Execution context under which the command should be created. - /// - internal ExecutionContext Context - { - get { return _context; } - set { _context = value; } - } - - #endregion public_properties - - #region ctor - - /// - /// Initializes the new instance of CommandFactory class. - /// - internal CommandFactory() - { - } - - /// - /// Initializes the new instance of CommandFactory class. - /// - /// Execution context. - internal CommandFactory(ExecutionContext context) - { - this.Context = context; - } - - #endregion ctor - - #region public_methods - - /// - /// Creates a command object corresponding to specified name. The command processor will use global scope. - /// - /// Creates a command object corresponding to specified name. - /// Location where the command was dispatched from. - /// Created command processor object. - /// - /// Thrown if session state does not contain the CommandDiscovery instance. - /// - internal CommandProcessorBase CreateCommand(string commandName, CommandOrigin commandOrigin) - { - return _CreateCommand(commandName, commandOrigin, false); - } - - /// - /// Creates a command object corresponding to specified name. - /// - /// Creates a command object corresponding to specified name. - /// Location where the command was dispatched from. - /// - /// True if command processor should use local scope to execute the command, - /// False otherwise. - /// - /// Created command processor object. - /// - /// Thrown if session state does not contain the CommandDiscovery instance. - /// - internal CommandProcessorBase CreateCommand(string commandName, - CommandOrigin commandOrigin, bool? useLocalScope) - { - return _CreateCommand(commandName, commandOrigin, useLocalScope); - } - - /// - /// Creates a command object corresponding to specified name. - /// - /// Creates a command object corresponding to specified name. - /// Execution Context. - /// Location where the command was dispatched from. - /// Created command processor object. - /// - /// Thrown if session state does not contain the CommandDiscovery instance. - /// - internal CommandProcessorBase CreateCommand(string commandName, ExecutionContext executionContext, CommandOrigin commandOrigin) - { - this.Context = executionContext; - return _CreateCommand(commandName, commandOrigin, false); - } - #endregion public_methods - - #region helper_methods - - private CommandProcessorBase _CreateCommand(string commandName, - CommandOrigin commandOrigin, bool? useLocalScope) - { - if (_context == null) - { - throw PSTraceSource.NewInvalidOperationException(DiscoveryExceptions.ExecutionContextNotSet); - } - - // Look for a cmdlet... - CommandDiscovery discovery = _context.CommandDiscovery; - - if (discovery == null) - { - throw PSTraceSource.NewInvalidOperationException(DiscoveryExceptions.CommandDiscoveryMissing); - } - - // Look for the command using command discovery mechanisms. This will resolve - // aliases, functions, filters, cmdlets, scripts, and applications. - - return discovery.LookupCommandProcessor(commandName, commandOrigin, useLocalScope); - } - #endregion helper_methods - } -} - diff --git a/src/System.Management.Automation/engine/ExecutionContext.cs b/src/System.Management.Automation/engine/ExecutionContext.cs index 73aabb1c919..13974e8ef30 100644 --- a/src/System.Management.Automation/engine/ExecutionContext.cs +++ b/src/System.Management.Automation/engine/ExecutionContext.cs @@ -546,8 +546,6 @@ internal HelpSystem HelpSystem internal Dictionary CustomArgumentCompleters { get; set; } internal Dictionary NativeArgumentCompleters { get; set; } - private CommandFactory _commandFactory; - /// /// Routine to create a command(processor) instance using the factory. /// @@ -556,15 +554,14 @@ internal HelpSystem HelpSystem /// The command processor object internal CommandProcessorBase CreateCommand(string command, bool dotSource) { - if (_commandFactory == null) - { - _commandFactory = new CommandFactory(this); - } - CommandProcessorBase commandProcessor = _commandFactory.CreateCommand(command, - this.EngineSessionState.CurrentScope.ScopeOrigin, !dotSource); + CommandOrigin commandOrigin = this.EngineSessionState.CurrentScope.ScopeOrigin; + CommandProcessorBase commandProcessor = + CommandDiscovery.LookupCommandProcessor(command, commandOrigin, !dotSource); // Reset the command origin for script commands... //BUGBUG - dotting can get around command origin checks??? if (commandProcessor != null && commandProcessor is ScriptCommandProcessorBase) + { commandProcessor.Command.CommandOriginInternal = CommandOrigin.Internal; + } return commandProcessor; } diff --git a/src/System.Management.Automation/engine/hostifaces/Command.cs b/src/System.Management.Automation/engine/hostifaces/Command.cs index 11cedec7b24..c08209fbb31 100644 --- a/src/System.Management.Automation/engine/hostifaces/Command.cs +++ b/src/System.Management.Automation/engine/hostifaces/Command.cs @@ -427,7 +427,6 @@ private Pipe GetRedirectionPipe( /// Create a CommandProcessorBase for this Command /// /// - /// /// /// /// @@ -436,14 +435,11 @@ private Pipe GetRedirectionPipe( CreateCommandProcessor ( ExecutionContext executionContext, - CommandFactory commandFactory, bool addToHistory, CommandOrigin origin ) { Dbg.Assert(executionContext != null, "Caller should verify the parameters"); - Dbg.Assert(commandFactory != null, "Caller should verify the parameters"); - CommandProcessorBase commandProcessorBase; @@ -515,8 +511,7 @@ CommandOrigin origin } } - commandProcessorBase = - commandFactory.CreateCommand(CommandText, origin, _useLocalScope); + commandProcessorBase = executionContext.CommandDiscovery.LookupCommandProcessor(CommandText, origin, _useLocalScope); } CommandParameterCollection parameters = Parameters; diff --git a/src/System.Management.Automation/engine/hostifaces/LocalConnection.cs b/src/System.Management.Automation/engine/hostifaces/LocalConnection.cs index bf625202bff..21804bdab53 100644 --- a/src/System.Management.Automation/engine/hostifaces/LocalConnection.cs +++ b/src/System.Management.Automation/engine/hostifaces/LocalConnection.cs @@ -270,16 +270,6 @@ internal override bool InNestedPrompt #endregion protected_properties #region internal_properties - /// - /// CommandFactory object for this runspace. - /// - internal CommandFactory CommandFactory - { - get - { - return _commandFactory; - } - } /// /// Gets history manager for this runspace @@ -648,7 +638,6 @@ private void DoOpenHelper() MshLog.LogEngineLifecycleEvent(_engine.Context, EngineState.Available); startLifeCycleEventWritten = true; - _commandFactory = new CommandFactory(_engine.Context); _history = new History(_engine.Context); _jobRepository = new JobRepository(); _jobManager = new JobManager(); @@ -902,7 +891,6 @@ private void DoCloseHelper() //All pipelines have been canceled. Close the runspace. _engine = null; - _commandFactory = null; SetRunspaceState(RunspaceState.Closed); @@ -1290,11 +1278,6 @@ public override void Close() #region private fields - /// - /// CommandFactory for creating Command objects - /// - private CommandFactory _commandFactory; - /// /// AutomationEngine instance for this runspace /// diff --git a/src/System.Management.Automation/engine/hostifaces/LocalPipeline.cs b/src/System.Management.Automation/engine/hostifaces/LocalPipeline.cs index 03c4e922fbb..ce77c12f538 100644 --- a/src/System.Management.Automation/engine/hostifaces/LocalPipeline.cs +++ b/src/System.Management.Automation/engine/hostifaces/LocalPipeline.cs @@ -912,7 +912,6 @@ private PipelineProcessor CreatePipelineProcessor() command.CreateCommandProcessor ( LocalRunspace.ExecutionContext, - LocalRunspace.CommandFactory, AddToHistory, commandOrigin ); diff --git a/src/System.Management.Automation/engine/hostifaces/PowerShell.cs b/src/System.Management.Automation/engine/hostifaces/PowerShell.cs index 39d8ba249b1..a6eebe194b9 100644 --- a/src/System.Management.Automation/engine/hostifaces/PowerShell.cs +++ b/src/System.Management.Automation/engine/hostifaces/PowerShell.cs @@ -3662,7 +3662,6 @@ private SteppablePipeline GetSteppablePipeline(ExecutionContext context, Command cmd.CreateCommandProcessor ( Runspace.DefaultRunspace.ExecutionContext, - ((LocalRunspace)Runspace.DefaultRunspace).CommandFactory, false, IsNested == true ? CommandOrigin.Internal : CommandOrigin.Runspace ); diff --git a/src/System.Management.Automation/resources/DiscoveryExceptions.resx b/src/System.Management.Automation/resources/DiscoveryExceptions.resx index 37585b32734..7e1a3bcf578 100644 --- a/src/System.Management.Automation/resources/DiscoveryExceptions.resx +++ b/src/System.Management.Automation/resources/DiscoveryExceptions.resx @@ -132,9 +132,6 @@ Cannot process the cmdlet. A cmdlet name must consist of a verb and noun pair separated by '-'. - - Cannot retrieve an instance of CommandDiscovery. - The term '{0}' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. @@ -151,9 +148,6 @@ Check the spelling of the name, or if a path was included, verify that the path Parameter '{0}' with value '{1}' cannot be processed because it is not a cmdlet and cannot be processed by the CommandProcessor. - - An ExecutionContext has not been set. - A cmdlet named '{0}' already exists. Cmdlets must have unique names. From a384c6ea1174277fbf0f8880643b9f955ebd780f Mon Sep 17 00:00:00 2001 From: Steve Lee Date: Tue, 31 Oct 2017 00:54:44 +0800 Subject: [PATCH 058/617] Change to not insert line breaks to output (except for tables) (#5193) --- .../FormatAndOutput/out-file/Out-File.cs | 21 +------ .../FormatAndOutput/out-string/out-string.cs | 20 +------ .../host/msh/ConsoleHost.cs | 2 +- .../host/msh/ConsoleHostUserInterface.cs | 50 ++--------------- .../common/BaseOutputtingCommand.cs | 18 +++++- .../PowerShellCore_format_ps1xml.cs | 10 +--- .../FormatAndOutput/common/TableWriter.cs | 12 ++++ .../NativeExecution/NativeStreams.Tests.ps1 | 13 ++++- .../Write-Debug.Tests.ps1 | 17 ++++++ .../Write-Error.Tests.ps1 | 55 +++++++++++-------- .../Write-Verbose.Tests.ps1 | 16 ++++++ 11 files changed, 116 insertions(+), 118 deletions(-) create mode 100644 test/powershell/Modules/Microsoft.PowerShell.Utility/Write-Debug.Tests.ps1 diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/out-file/Out-File.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/out-file/Out-File.cs index 95e0abfb69a..3b01c1b57fb 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/out-file/Out-File.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/out-file/Out-File.cs @@ -207,32 +207,13 @@ private LineOutput InstantiateLineOutputInterface() return null; // compute the # of columns available - int computedWidth = 120; + int computedWidth = int.MaxValue; if (_width != null) { // use the value from the command line computedWidth = _width.Value; } - else - { - // use the value we get from the console - try - { - // NOTE: we subtract 1 because we want to properly handle - // the following scenario: - // MSH>get-foo|out-file foo.txt - // MSH>get-content foo.txt - // in this case, if the computed width is (say) 80, get-content - // would cause a wrapping of the 80 column long raw strings. - // Hence we set the width to 79. - computedWidth = this.Host.UI.RawUI.BufferSize.Width - 1; - } - catch (HostException) - { - // non interactive host - } - } // use the stream writer to create and initialize the Line Output writer TextWriterLineOutput twlo = new TextWriterLineOutput(_sw, computedWidth, _suppressNewline); diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/out-string/out-string.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/out-string/out-string.cs index 37fa2afe8e6..55f3db8f07d 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/out-string/out-string.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/out-string/out-string.cs @@ -94,31 +94,13 @@ private LineOutput InstantiateLineOutputInterface() _writer = new StreamingTextWriter(callback, Host.CurrentCulture); // compute the # of columns available - int computedWidth = 120; + int computedWidth = int.MaxValue; if (_width != null) { // use the value from the command line computedWidth = _width.Value; } - else - { - // use the value we get from the console - try - { - // NOTE: we subtract 1 because we want to properly handle - // the following scenario: - // MSH>get-foo|format-table|out-string - // in this case, if the computed width is (say) 80, get-content - // would cause a wrapping of the 80 column long raw strings. - // Hence we set the width to 79. - computedWidth = this.Host.UI.RawUI.BufferSize.Width - 1; - } - catch (HostException) - { - // non interactive host - } - } // use it to create and initialize the Line Output writer TextWriterLineOutput twlo = new TextWriterLineOutput(_writer, computedWidth); diff --git a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHost.cs b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHost.cs index 036dbf06ddc..5a4c3768b29 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHost.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHost.cs @@ -2222,7 +2222,7 @@ private void ExitDebugMode(DebuggerResumeAction resumeAction) /// private void WriteDebuggerMessage(string line) { - this.ui.WriteWrappedLine(this.ui.DebugForegroundColor, this.ui.DebugBackgroundColor, line); + this.ui.WriteLine(this.ui.DebugForegroundColor, this.ui.DebugBackgroundColor, line); } #endregion debugger diff --git a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostUserInterface.cs b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostUserInterface.cs index d31420bf2c7..6d178849871 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostUserInterface.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHostUserInterface.cs @@ -1148,44 +1148,6 @@ internal void AddWord(string text, int startIndex, int endIndex, } } - /// - /// - /// Writes text, wrapping a "word" boundaries when needed. - /// - /// - /// - /// - /// Foreground color to output the text. - /// - /// - /// - /// - /// Background color to output the text. - /// - /// - /// - /// - /// Text to be emitted. - /// - /// - - internal void WriteWrappedLine(ConsoleColor fg, ConsoleColor bg, string text) - { - WriteLine(fg, bg, WrapToCurrentWindowWidth(text)); - } - - - - // unused for now. - //internal - //void - //WriteWrappedLine(string text) - //{ - // WriteWrappedLine(RawUI.ForegroundColor, RawUI.BackgroundColor, text); - //} - - - internal string WrapToCurrentWindowWidth(string text) { StringBuilder sb = new StringBuilder(); @@ -1207,11 +1169,7 @@ internal string WrapToCurrentWindowWidth(string text) return sb.ToString(); } - - - #endregion Word Wrapping - - +#endregion Word Wrapping /// /// @@ -1248,7 +1206,7 @@ public override void WriteDebugLine(string message) else { // NTRAID#Windows OS Bugs-1061752-2004/12/15-sburns should read a skin setting here... - WriteWrappedLine( + WriteLine( DebugForegroundColor, DebugBackgroundColor, StringUtil.Format(ConsoleHostUserInterfaceStrings.DebugFormatString, message)); @@ -1309,7 +1267,7 @@ public override void WriteVerboseLine(string message) } else { - WriteWrappedLine( + WriteLine( VerboseForegroundColor, VerboseBackgroundColor, StringUtil.Format(ConsoleHostUserInterfaceStrings.VerboseFormatString, message)); @@ -1352,7 +1310,7 @@ public override void WriteWarningLine(string message) } else { - WriteWrappedLine( + WriteLine( WarningForegroundColor, WarningBackgroundColor, StringUtil.Format(ConsoleHostUserInterfaceStrings.WarningFormatString, message)); diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/BaseOutputtingCommand.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/BaseOutputtingCommand.cs index 48cd07c9e03..bb64bde1db0 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/BaseOutputtingCommand.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/BaseOutputtingCommand.cs @@ -565,7 +565,7 @@ private void ProcessOutOfBandPayload(FormatEntryData fed) { ComplexWriter complexWriter = new ComplexWriter(); - complexWriter.Initialize(_lo, _lo.ColumnNumber); + complexWriter.Initialize(_lo, int.MaxValue); complexWriter.WriteObject(cve.formatValueList); return; @@ -921,6 +921,22 @@ internal override void Initialize() } int columnsOnTheScreen = this.InnerCommand._lo.ColumnNumber; + // Tables need to use spaces for padding to maintain table look even if console window is resized. + // For all other output, we use int.MaxValue if the user didn't explicitly specify a width. + // If we detect that int.MaxValue is used, first we try to get the current console window width. + // However, if we can't read that (for example, implicit remoting has no console window), we default + // to something reasonable: 120 columns. + if (columnsOnTheScreen == int.MaxValue) + { + try + { + columnsOnTheScreen = Console.WindowWidth; + } + catch + { + columnsOnTheScreen = 120; + } + } int columns = this.CurrentTableHeaderInfo.tableColumnInfoList.Count; if (columns == 0) diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/PowerShellCore_format_ps1xml.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/PowerShellCore_format_ps1xml.cs index 61c72950236..331f84d93d1 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/PowerShellCore_format_ps1xml.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/PowerShellCore_format_ps1xml.cs @@ -789,7 +789,6 @@ private static IEnumerable ViewsOf_System_Management_Autom } $indent = 4 - $width = $host.UI.RawUI.BufferSize.Width - $indent - 2 $errorCategoryMsg = & { Set-StrictMode -Version 1; $_.ErrorCategory_Message } if ($null -ne $errorCategoryMsg) @@ -800,19 +799,16 @@ private static IEnumerable ViewsOf_System_Management_Autom { $indentString = ""+ CategoryInfo : "" + $_.CategoryInfo } - $posmsg += ""`n"" - foreach($line in @($indentString -split ""(.{$width})"")) { if($line) { $posmsg += ("" "" * $indent + $line) } } + $posmsg += ""`n"" + $indentString $indentString = ""+ FullyQualifiedErrorId : "" + $_.FullyQualifiedErrorId - $posmsg += ""`n"" - foreach($line in @($indentString -split ""(.{$width})"")) { if($line) { $posmsg += ("" "" * $indent + $line) } } + $posmsg += ""`n"" + $indentString $originInfo = & { Set-StrictMode -Version 1; $_.OriginInfo } if (($null -ne $originInfo) -and ($null -ne $originInfo.PSComputerName)) { $indentString = ""+ PSComputerName : "" + $originInfo.PSComputerName - $posmsg += ""`n"" - foreach($line in @($indentString -split ""(.{$width})"")) { if($line) { $posmsg += ("" "" * $indent + $line) } } + $posmsg += ""`n"" + $indentString } if ($ErrorView -eq ""CategoryView"") { diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/TableWriter.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/TableWriter.cs index d373b121cd6..27cfa6d5a8c 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/TableWriter.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/TableWriter.cs @@ -82,6 +82,18 @@ internal void Initialize(int leftMarginIndent, int screenColumns, int[] columnWi //Console.WriteLine(" 1 2 3 4 5 6 7"); //Console.WriteLine("01234567890123456789012345678901234567890123456789012345678901234567890123456789"); + if (screenColumns == int.MaxValue) + { + try + { + screenColumns = System.Console.WindowWidth; + } + catch + { + screenColumns = 120; + } + } + if (leftMarginIndent < 0) { leftMarginIndent = 0; diff --git a/test/powershell/Language/Scripting/NativeExecution/NativeStreams.Tests.ps1 b/test/powershell/Language/Scripting/NativeExecution/NativeStreams.Tests.ps1 index 7ff0bde45a5..f4aa0b5d994 100644 --- a/test/powershell/Language/Scripting/NativeExecution/NativeStreams.Tests.ps1 +++ b/test/powershell/Language/Scripting/NativeExecution/NativeStreams.Tests.ps1 @@ -49,6 +49,17 @@ Describe "Native streams behavior with PowerShell" -Tags 'CI' { It 'preserves error stream as is with Out-String' { ($out | Out-String).Replace("`r", '') | Should Be "foo`n`nbar`n`nbazmiddlefoo`n`nbar`n`nbaz`n" } + + It 'does not get truncated or split when redirected' { + $longtext = "0123456789" + while ($longtext.Length -lt [console]::WindowWidth) { + $longtext += $longtext + } + pwsh -c "& { [Console]::Error.WriteLine('$longtext') }" 2>&1 > $testdrive\error.txt + $e = Get-Content -Path $testdrive\error.txt + $e.Count | Should BeExactly 1 + $e | Should BeExactly $longtext + } } } @@ -56,7 +67,7 @@ Describe 'piping powershell objects to finished native executable' -Tags 'CI' { It 'doesn''t throw any exceptions, when we are piping to the closed executable' { 1..3 | ForEach-Object { Start-Sleep -Milliseconds 100 - # yeild some multi-line formatted object + # yield some multi-line formatted object @{'a' = 'b'} } | testexe -echoargs | Should Be $null } diff --git a/test/powershell/Modules/Microsoft.PowerShell.Utility/Write-Debug.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Utility/Write-Debug.Tests.ps1 new file mode 100644 index 00000000000..f1a6f920bfa --- /dev/null +++ b/test/powershell/Modules/Microsoft.PowerShell.Utility/Write-Debug.Tests.ps1 @@ -0,0 +1,17 @@ +Describe "Write-Debug tests" -Tags "CI" { + It "Should not have added line breaks" { + $text = "0123456789" + while ($text.Length -lt [Console]::WindowWidth) { + $text += $text + } + $origDebugPref = $DebugPreference + $DebugPreference = "Continue" + try { + $out = Write-Debug $text 5>&1 + $out | Should BeExactly $text + } + finally { + $DebugPreference = $origDebugPref + } + } +} diff --git a/test/powershell/Modules/Microsoft.PowerShell.Utility/Write-Error.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Utility/Write-Error.Tests.ps1 index d2979a72a1c..5e15f20ea6a 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Utility/Write-Error.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Utility/Write-Error.Tests.ps1 @@ -1,4 +1,4 @@ -Describe "Write-Error DRT Unit Tests" -Tags "CI" { +Describe "Write-Error Tests" -Tags "CI" { It "Should be works with command: write-error myerrortext" { $e = Write-Error myerrortext 2>&1 $e | Should BeOfType 'System.Management.Automation.ErrorRecord' @@ -74,40 +74,49 @@ Describe "Write-Error DRT Unit Tests" -Tags "CI" { $e.CategoryInfo.TargetType | Should Be 'fooTargetType' $e.CategoryInfo.GetMessage() | Should Be 'NotSpecified: (fooTargetName:fooTargetType) [fooAct], fooReason' } -} -Describe "Write-Error" -Tags "CI" { It "Should be able to throw" { - Write-Error "test throw" -ErrorAction SilentlyContinue | Should Throw + Write-Error "test throw" -ErrorAction SilentlyContinue | Should Throw } It "Should throw a non-terminating error" { - Write-Error "test throw" -ErrorAction SilentlyContinue + Write-Error "test throw" -ErrorAction SilentlyContinue - 1 + 1 | Should Be 2 + 1 + 1 | Should Be 2 } It "Should trip an exception using the exception switch" { - $var = 0 - try - { - Write-Error -Exception -Message "test throw" - } - catch [System.Exception] - { - - $var++ - } - finally - { - $var | Should Be 1 - } + $var = 0 + try + { + Write-Error -Exception -Message "test throw" + } + catch [System.Exception] + { + + $var++ + } + finally + { + $var | Should Be 1 + } } It "Should output the error message to the `$error automatic variable" { - $theError = "Error: Too many input values." - write-error -message $theError -category InvalidArgument -ErrorAction SilentlyContinue + $theError = "Error: Too many input values." + write-error -message $theError -category InvalidArgument -ErrorAction SilentlyContinue + + $error[0]| Should Be $theError + } - $error[0]| Should Be $theError + It "ErrorRecord should not be truncated" { + $longtext = "0123456789" + while ($longtext.Length -lt [console]::WindowWidth) { + $longtext += $longtext + } + pwsh -c Write-Error -Message $longtext 2>&1 > $testdrive\error.txt + $e = Get-Content -Path $testdrive\error.txt + $e.Count | Should BeExactly 4 + $e[0] | Should Match $longtext } } diff --git a/test/powershell/Modules/Microsoft.PowerShell.Utility/Write-Verbose.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Utility/Write-Verbose.Tests.ps1 index 155be64b7ef..dbb14c27793 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Utility/Write-Verbose.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Utility/Write-Verbose.Tests.ps1 @@ -26,4 +26,20 @@ Describe "Write-Verbose" -Tags "CI" { $(Write-Verbose -Message "test" -Verbose:$true) 4>&1 | Should Be "test" } + + It "Should not have added line breaks" { + $text = "0123456789" + while ($text.Length -lt [Console]::WindowWidth) { + $text += $text + } + $origVerbosePref = $VerbosePreference + $VerbosePreference = "continue" + try { + $out = Write-Verbose $text 4>&1 + $out | Should BeExactly $text + } + finally { + $VerbosePreference = $origVerbosePref + } + } } From 33b4e67d3711c1facbdbc2e39956a6d442f2a2a3 Mon Sep 17 00:00:00 2001 From: Steve Lee Date: Tue, 31 Oct 2017 00:58:44 +0800 Subject: [PATCH 059/617] Change VSCode build task to use pwsh (#5255) --- .vscode/tasks.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 3806a5a8119..38146cfc474 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -1,6 +1,6 @@ { "version": "0.1.0", - "command": "powershell", + "command": "pwsh", "isShellCommand": true, "showOutput": "always", "suppressTaskName": true, From 11e50c1d5da4235cd4f01631ce72487624bdaede Mon Sep 17 00:00:00 2001 From: xa0082249956 <576810415@qq.com> Date: Tue, 31 Oct 2017 01:00:31 +0800 Subject: [PATCH 060/617] Update README.md for binary package beta.9 (#5267) In README.md * Update binary package for beta.9 * Add link for `[rl-macos-tar]` and `[rl-linux-tar]` --- README.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index aff51bfe0a2..7385b20640a 100644 --- a/README.md +++ b/README.md @@ -53,20 +53,20 @@ You can also download the PowerShell binary archives for Windows, macOS and Linu | macOS | [64-bit][rl-macos-tar] | [Instructions][in-tar] | | Linux | [64-bit][rl-linux-tar] | [Instructions][in-tar] | -[rl-windows-64]: https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.8/PowerShell-6.0.0-beta.8-win-x64.msi -[rl-windows-86]: https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.8/PowerShell-6.0.0-beta.8-win-x86.msi -[rl-ubuntu17]: https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.8/powershell_6.0.0-beta.8-1.ubuntu.17.04_amd64.deb -[rl-ubuntu16]: https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.8/powershell_6.0.0-beta.8-1.ubuntu.16.04_amd64.deb -[rl-ubuntu14]: https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.8/powershell_6.0.0-beta.8-1.ubuntu.14.04_amd64.deb -[rl-debian8]: https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.8/powershell_6.0.0-beta.8-1.debian.8_amd64.deb -[rl-debian9]: https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.8/powershell_6.0.0-beta.8-1.debian.9_amd64.deb -[rl-centos]: https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.8/powershell-6.0.0_beta.8-1.rhel.7.x86_64.rpm -[rl-ai]: https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.8/PowerShell-6.0.0-beta.8-x86_64.AppImage -[rl-macos]: https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.8/powershell-6.0.0-beta.8-osx.10.12-x64.pkg -[rl-winx86-zip]: https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.8/PowerShell-6.0.0-beta.8-win-x86.zip -[rl-winx64-zip]: https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.8/PowerShell-6.0.0-beta.8-win-x64.zip -[rl-macos-tar]: TBD -[rl-linux-tar]: TBD +[rl-windows-64]: https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.9/PowerShell-6.0.0-beta.9-win-x64.msi +[rl-windows-86]: https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.9/PowerShell-6.0.0-beta.9-win-x86.msi +[rl-ubuntu17]: https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.9/powershell_6.0.0-beta.9-1.ubuntu.17.04_amd64.deb +[rl-ubuntu16]: https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.9/powershell_6.0.0-beta.9-1.ubuntu.16.04_amd64.deb +[rl-ubuntu14]: https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.9/powershell_6.0.0-beta.9-1.ubuntu.14.04_amd64.deb +[rl-debian8]: https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.9/powershell_6.0.0-beta.9-1.debian.8_amd64.deb +[rl-debian9]: https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.9/powershell_6.0.0-beta.9-1.debian.9_amd64.deb +[rl-centos]: https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.9/powershell-6.0.0_beta.9-1.rhel.7.x86_64.rpm +[rl-ai]: https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.9/PowerShell-6.0.0-beta.9-x86_64.AppImage +[rl-macos]: https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.9/powershell-6.0.0-beta.9-osx.10.12-x64.pkg +[rl-winx86-zip]: https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.9/PowerShell-6.0.0-beta.9-win-x86.zip +[rl-winx64-zip]: https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.9/PowerShell-6.0.0-beta.9-win-x64.zip +[rl-macos-tar]: https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.9/powershell-6.0.0-beta.9-osx-x64.tar.gz +[rl-linux-tar]: https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.9/powershell-6.0.0-beta.9-linux-x64.tar.gz [installation]: docs/installation [in-windows]: docs/installation/windows.md#msi From 8702dea03b2b4ad96ed8fb2b94cc282747229741 Mon Sep 17 00:00:00 2001 From: Travis Plunk Date: Mon, 30 Oct 2017 10:06:47 -0700 Subject: [PATCH 061/617] Sync tags in release build so that shallow cloning can be enabled. (#5248) --- .../Images/GenericLinuxFiles/PowerShellPackage.ps1 | 3 +++ .../PowerShellPackage.ps1 | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/tools/releaseBuild/Images/GenericLinuxFiles/PowerShellPackage.ps1 b/tools/releaseBuild/Images/GenericLinuxFiles/PowerShellPackage.ps1 index e38c22800e1..68149609185 100644 --- a/tools/releaseBuild/Images/GenericLinuxFiles/PowerShellPackage.ps1 +++ b/tools/releaseBuild/Images/GenericLinuxFiles/PowerShellPackage.ps1 @@ -27,6 +27,9 @@ try { Set-Location $location Import-Module "$location/build.psm1" Import-Module "$location/tools/packaging" + + Write-Verbose "Sync'ing Tags..." -verbose + Sync-PSTags Start-PSBootstrap -Package -NoSudo Start-PSBuild -Crossgen -PSModuleRestore @releaseTagParam diff --git a/tools/releaseBuild/Images/microsoft_powershell_windowsservercore/PowerShellPackage.ps1 b/tools/releaseBuild/Images/microsoft_powershell_windowsservercore/PowerShellPackage.ps1 index b43ca5e7135..eb41c6bf480 100644 --- a/tools/releaseBuild/Images/microsoft_powershell_windowsservercore/PowerShellPackage.ps1 +++ b/tools/releaseBuild/Images/microsoft_powershell_windowsservercore/PowerShellPackage.ps1 @@ -52,6 +52,10 @@ try{ Import-Module "$location\build.psm1" -Force Import-Module "$location\tools\packaging" -Force $env:platform = $null + + Write-Verbose "Sync'ing Tags..." -verbose + Sync-PSTags + Write-Verbose "Bootstrapping powershell build..." -verbose Start-PSBootstrap -Force -Package From a8008f8cbb588f8d4278107964c6ab6396ba838f Mon Sep 17 00:00:00 2001 From: Aditya Patwardhan Date: Mon, 30 Oct 2017 15:38:14 -0700 Subject: [PATCH 062/617] Revert "Add macos launcher. (#5138)" (#5259) --- .../PowerShell.app/Contents/Info.plist | 28 ------------- .../Contents/MacOS/PowerShell.sh | 2 - tools/packaging/packaging.psm1 | 42 ------------------- 3 files changed, 72 deletions(-) delete mode 100755 tools/packaging/macos/launcher/ROOT/Applications/PowerShell.app/Contents/Info.plist delete mode 100755 tools/packaging/macos/launcher/ROOT/Applications/PowerShell.app/Contents/MacOS/PowerShell.sh diff --git a/tools/packaging/macos/launcher/ROOT/Applications/PowerShell.app/Contents/Info.plist b/tools/packaging/macos/launcher/ROOT/Applications/PowerShell.app/Contents/Info.plist deleted file mode 100755 index f85b0ed0495..00000000000 --- a/tools/packaging/macos/launcher/ROOT/Applications/PowerShell.app/Contents/Info.plist +++ /dev/null @@ -1,28 +0,0 @@ - - - - - CFBundleExecutable - PowerShell.sh - CFBundleGetInfoString - 1.0 - CFBundleIconFile - Powershell - CFBundleIdentifier - powershell - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - PowerShell - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSupportedPlatforms - - MacOSX - - CFBundleVersion - 1.0 - - diff --git a/tools/packaging/macos/launcher/ROOT/Applications/PowerShell.app/Contents/MacOS/PowerShell.sh b/tools/packaging/macos/launcher/ROOT/Applications/PowerShell.app/Contents/MacOS/PowerShell.sh deleted file mode 100755 index d20a8780b4a..00000000000 --- a/tools/packaging/macos/launcher/ROOT/Applications/PowerShell.app/Contents/MacOS/PowerShell.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -open /usr/local/bin/pwsh diff --git a/tools/packaging/packaging.psm1 b/tools/packaging/packaging.psm1 index 49d55d09bc9..8f9aed023a5 100644 --- a/tools/packaging/packaging.psm1 +++ b/tools/packaging/packaging.psm1 @@ -629,48 +629,6 @@ function New-UnixPackage { "$GzipFile=$ManFile", "/tmp/pwsh=$Link" ) - - # Add macOS powershell launcher - if($Type -eq "osxpkg") - { - if($pscmdlet.ShouldProcess("Add macOS launch application")) { - # Define folder for launch application. - $macosapp = "$PSScriptRoot/macos/launcher/ROOT/Applications/Powershell.app" - - # Update icns file. - $iconfile = "$PSScriptRoot/../../assets/Powershell.icns" - $iconfilebase = (Get-Item -Path $iconfile).BaseName - # Create Resources folder, ignore error if exists. - New-Item -Force -ItemType Directory -Path "$macosapp/Contents/Resources" | Out-Null - Copy-Item -Force -Path $iconfile -Destination "$macosapp/Contents/Resources" - - # Set values in plist. - $plist = "$macosapp/Contents/Info.plist" - Start-NativeExecution { - defaults write $plist CFBundleIdentifier $Name - defaults write $plist CFBundleVersion $Version - defaults write $plist CFBundleShortVersionString $Version - defaults write $plist CFBundleGetInfoString $Version - defaults write $plist CFBundleIconFile $iconfilebase - } - - # Convert to XML plist, needed because defaults native - # app auto converts it to binary format when it modify - # the plist file. - Start-NativeExecution { - plutil -convert xml1 $plist - } - # Set permissions. - Start-NativeExecution { - find $macosapp | xargs chmod 755 - } - - # Add app folder to fpm paths. - $appsfolder = (Resolve-Path -Path "$macosapp/..").Path - $Arguments += "$appsfolder=/" - } - } - # Build package try { if($pscmdlet.ShouldProcess("Create $type package")) { From b1080860a4f9292b6eecbe1ca218732ac3276345 Mon Sep 17 00:00:00 2001 From: Jason Shirk Date: Mon, 30 Oct 2017 20:05:49 -0700 Subject: [PATCH 063/617] Remove AllScope from most default aliases (#5268) * Remove AllScope from most default aliases To speed up scope creation, I removed AllScope from most default aliases. This results in a 15-20% speedup for: function foo {} for ($i = 0; $i -lt 100kb; $i++) { & { foo } } I left AllScope of a few frequently used aliases because it does make command lookup faster. If we introduce something like dynamic sites for command lookup, then we could probably remove the rest of the AllScope aliases. This is a low-risk breaking change. One can ask for aliases at a particular scope: Get-Alias -Scope 1 nsn This could now fail if the scope number doesn't correspond to global scope. --- .../engine/InitialSessionState.cs | 457 ++++++------------ .../engine/Basic/DefaultCommands.Tests.ps1 | 278 +++++------ 2 files changed, 295 insertions(+), 440 deletions(-) diff --git a/src/System.Management.Automation/engine/InitialSessionState.cs b/src/System.Management.Automation/engine/InitialSessionState.cs index 73bf7659a5b..6b57a8318de 100644 --- a/src/System.Management.Automation/engine/InitialSessionState.cs +++ b/src/System.Management.Automation/engine/InitialSessionState.cs @@ -4552,326 +4552,181 @@ internal static SessionStateAliasEntry[] BuiltInAliases { get { + // Too many AllScope entries hurts performance because an entry is + // created in each new scope, so we limit the use of AllScope to the + // most commonly used commands - primarily so command lookup is faster, + // though if we speed up command lookup significantly, then removing + // AllScope for all of these aliases makes sense. + + const ScopedItemOptions AllScope = ScopedItemOptions.AllScope; + const ScopedItemOptions ReadOnly_AllScope = ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope; + const ScopedItemOptions ReadOnly = ScopedItemOptions.ReadOnly; + return new SessionStateAliasEntry[] { - new SessionStateAliasEntry("foreach", - "ForEach-Object", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("%", - "ForEach-Object", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("where", - "Where-Object", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("?", - "Where-Object", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("clc", - "Clear-Content", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("cli", - "Clear-Item", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("clp", - "Clear-ItemProperty", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("clv", - "Clear-Variable", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("cpi", - "Copy-Item", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("cvpa", - "Convert-Path", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("dbp", - "Disable-PSBreakpoint", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("ebp", - "Enable-PSBreakpoint", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("epal", - "Export-Alias", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("epcsv", - "Export-Csv", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("fl", - "Format-List", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("ft", - "Format-Table", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("fw", - "Format-Wide", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("gal", - "Get-Alias", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("gbp", - "Get-PSBreakpoint", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("gc", - "Get-Content", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("gci", - "Get-ChildItem", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("gcm", - "Get-Command", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("gdr", - "Get-PSDrive", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("gcs", - "Get-PSCallStack", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("ghy", - "Get-History", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("gi", - "Get-Item", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("gl", - "Get-Location", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("gm", - "Get-Member", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("gmo", - "Get-Module", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("gp", - "Get-ItemProperty", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("gpv", - "Get-ItemPropertyValue", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("gps", - "Get-Process", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("group", - "Group-Object", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("gu", - "Get-Unique", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("gv", - "Get-Variable", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("iex", - "Invoke-Expression", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("ihy", - "Invoke-History", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("ii", - "Invoke-Item", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("ipmo", - "Import-Module", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("ipal", - "Import-Alias", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("ipcsv", - "Import-Csv", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("measure", - "Measure-Object", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("mi", - "Move-Item", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("mp", - "Move-ItemProperty", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("nal", - "New-Alias", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("ndr", - "New-PSDrive", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("ni", - "New-Item", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("nv", - "New-Variable", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("nmo", - "New-Module", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("oh", - "Out-Host", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("rbp", - "Remove-PSBreakpoint", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("rdr", - "Remove-PSDrive", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("ri", - "Remove-Item", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("rni", - "Rename-Item", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("rnp", - "Rename-ItemProperty", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("rp", - "Remove-ItemProperty", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("rmo", - "Remove-Module", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("rv", - "Remove-Variable", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("rvpa", - "Resolve-Path", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("sal", - "Set-Alias", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("sbp", - "Set-PSBreakpoint", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("sc", - "Set-Content", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - // this conflicts with sd.exe, and makes msh unusable by dev. - // new SessionStateAliasEntry("sd", - // "Set-Date", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.Constant | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("select", - "Select-Object", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("si", - "Set-Item", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("sl", - "Set-Location", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("sp", - "Set-ItemProperty", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("saps", - "Start-Process", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("spps", - "Stop-Process", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("sv", - "Set-Variable", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), + new SessionStateAliasEntry("foreach", "ForEach-Object", "", ReadOnly_AllScope), + new SessionStateAliasEntry("%", "ForEach-Object", "", ReadOnly_AllScope), + new SessionStateAliasEntry("where", "Where-Object", "", ReadOnly_AllScope), + new SessionStateAliasEntry("?", "Where-Object", "", ReadOnly_AllScope), + new SessionStateAliasEntry("clc", "Clear-Content", "", ReadOnly), + new SessionStateAliasEntry("cli", "Clear-Item", "", ReadOnly), + new SessionStateAliasEntry("clp", "Clear-ItemProperty", "", ReadOnly), + new SessionStateAliasEntry("clv", "Clear-Variable", "", ReadOnly), + new SessionStateAliasEntry("cpi", "Copy-Item", "", ReadOnly), + new SessionStateAliasEntry("cvpa", "Convert-Path", "", ReadOnly), + new SessionStateAliasEntry("dbp", "Disable-PSBreakpoint", "", ReadOnly), + new SessionStateAliasEntry("ebp", "Enable-PSBreakpoint", "", ReadOnly), + new SessionStateAliasEntry("epal", "Export-Alias", "", ReadOnly), + new SessionStateAliasEntry("epcsv", "Export-Csv", "", ReadOnly), + new SessionStateAliasEntry("fl", "Format-List", "", ReadOnly), + new SessionStateAliasEntry("ft", "Format-Table", "", ReadOnly), + new SessionStateAliasEntry("fw", "Format-Wide", "", ReadOnly), + new SessionStateAliasEntry("gal", "Get-Alias", "", ReadOnly), + new SessionStateAliasEntry("gbp", "Get-PSBreakpoint", "", ReadOnly), + new SessionStateAliasEntry("gc", "Get-Content", "", ReadOnly), + new SessionStateAliasEntry("gci", "Get-ChildItem", "", ReadOnly), + new SessionStateAliasEntry("gcm", "Get-Command", "", ReadOnly), + new SessionStateAliasEntry("gdr", "Get-PSDrive", "", ReadOnly), + new SessionStateAliasEntry("gcs", "Get-PSCallStack", "", ReadOnly), + new SessionStateAliasEntry("ghy", "Get-History", "", ReadOnly), + new SessionStateAliasEntry("gi", "Get-Item", "", ReadOnly), + new SessionStateAliasEntry("gl", "Get-Location", "", ReadOnly), + new SessionStateAliasEntry("gm", "Get-Member", "", ReadOnly), + new SessionStateAliasEntry("gmo", "Get-Module", "", ReadOnly), + new SessionStateAliasEntry("gp", "Get-ItemProperty", "", ReadOnly), + new SessionStateAliasEntry("gpv", "Get-ItemPropertyValue", "",ReadOnly), + new SessionStateAliasEntry("gps", "Get-Process", "", ReadOnly), + new SessionStateAliasEntry("group", "Group-Object", "", ReadOnly), + new SessionStateAliasEntry("gu", "Get-Unique", "", ReadOnly), + new SessionStateAliasEntry("gv", "Get-Variable", "", ReadOnly), + new SessionStateAliasEntry("iex", "Invoke-Expression", "", ReadOnly), + new SessionStateAliasEntry("ihy", "Invoke-History", "", ReadOnly), + new SessionStateAliasEntry("ii", "Invoke-Item", "", ReadOnly), + new SessionStateAliasEntry("ipmo", "Import-Module", "", ReadOnly), + new SessionStateAliasEntry("ipal", "Import-Alias", "", ReadOnly), + new SessionStateAliasEntry("ipcsv", "Import-Csv", "", ReadOnly), + new SessionStateAliasEntry("measure", "Measure-Object", "", ReadOnly), + new SessionStateAliasEntry("mi", "Move-Item", "", ReadOnly), + new SessionStateAliasEntry("mp", "Move-ItemProperty", "", ReadOnly), + new SessionStateAliasEntry("nal", "New-Alias", "", ReadOnly), + new SessionStateAliasEntry("ndr", "New-PSDrive", "", ReadOnly), + new SessionStateAliasEntry("ni", "New-Item", "", ReadOnly), + new SessionStateAliasEntry("nv", "New-Variable", "", ReadOnly), + new SessionStateAliasEntry("nmo", "New-Module", "", ReadOnly), + new SessionStateAliasEntry("oh", "Out-Host", "", ReadOnly), + new SessionStateAliasEntry("rbp", "Remove-PSBreakpoint", "", ReadOnly), + new SessionStateAliasEntry("rdr", "Remove-PSDrive", "", ReadOnly), + new SessionStateAliasEntry("ri", "Remove-Item", "", ReadOnly), + new SessionStateAliasEntry("rni", "Rename-Item", "", ReadOnly), + new SessionStateAliasEntry("rnp", "Rename-ItemProperty", "", ReadOnly), + new SessionStateAliasEntry("rp", "Remove-ItemProperty", "", ReadOnly), + new SessionStateAliasEntry("rmo", "Remove-Module", "", ReadOnly), + new SessionStateAliasEntry("rv", "Remove-Variable", "", ReadOnly), + new SessionStateAliasEntry("rvpa", "Resolve-Path", "", ReadOnly), + new SessionStateAliasEntry("sal", "Set-Alias", "", ReadOnly), + new SessionStateAliasEntry("sbp", "Set-PSBreakpoint", "", ReadOnly), + new SessionStateAliasEntry("sc", "Set-Content", "", ReadOnly), + new SessionStateAliasEntry("select", "Select-Object", "", ReadOnly_AllScope), + new SessionStateAliasEntry("si", "Set-Item", "", ReadOnly), + new SessionStateAliasEntry("sl", "Set-Location", "", ReadOnly), + new SessionStateAliasEntry("sp", "Set-ItemProperty", "", ReadOnly), + new SessionStateAliasEntry("saps", "Start-Process", "", ReadOnly), + new SessionStateAliasEntry("spps", "Stop-Process", "", ReadOnly), + new SessionStateAliasEntry("sv", "Set-Variable", "", ReadOnly), // Web cmdlets aliases - new SessionStateAliasEntry("irm", - "Invoke-RestMethod", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("iwr", - "Invoke-WebRequest", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), + new SessionStateAliasEntry("irm", "Invoke-RestMethod", "", ReadOnly), + new SessionStateAliasEntry("iwr", "Invoke-WebRequest", "", ReadOnly), // Porting note: #if !UNIX is used to disable aliases for cmdlets which conflict with Linux / macOS #if !UNIX // ac is a native command on macOS - new SessionStateAliasEntry("ac", - "Add-Content", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("compare", - "Compare-Object", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("cpp", - "Copy-ItemProperty", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("diff", - "Compare-Object", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("gsv", - "Get-Service", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("sleep", - "Start-Sleep", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("sort", - "Sort-Object", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("start", - "Start-Process", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("sasv", - "Start-Service", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("spsv", - "Stop-Service", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("tee", - "Tee-Object", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("write", - "Write-Output", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), + new SessionStateAliasEntry("ac", "Add-Content", "", ReadOnly), + new SessionStateAliasEntry("compare", "Compare-Object", "", ReadOnly), + new SessionStateAliasEntry("cpp", "Copy-ItemProperty", "", ReadOnly), + new SessionStateAliasEntry("diff", "Compare-Object", "", ReadOnly), + new SessionStateAliasEntry("gsv", "Get-Service", "", ReadOnly), + new SessionStateAliasEntry("sleep", "Start-Sleep", "", ReadOnly), + new SessionStateAliasEntry("sort", "Sort-Object", "", ReadOnly), + new SessionStateAliasEntry("start", "Start-Process", "", ReadOnly), + new SessionStateAliasEntry("sasv", "Start-Service", "", ReadOnly), + new SessionStateAliasEntry("spsv", "Stop-Service", "", ReadOnly), + new SessionStateAliasEntry("tee", "Tee-Object", "", ReadOnly), + new SessionStateAliasEntry("write", "Write-Output", "", ReadOnly), // These were transferred from the "transferred from the profile" section - new SessionStateAliasEntry("cat", - "Get-Content", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("cp", - "Copy-Item", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("ls", - "Get-ChildItem", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("man", - "help", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("mount", - "New-PSDrive", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("mv", - "Move-Item", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("ps", - "Get-Process", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("rm", - "Remove-Item", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("rmdir", - "Remove-Item", "", ScopedItemOptions.AllScope), + new SessionStateAliasEntry("cat", "Get-Content"), + new SessionStateAliasEntry("cp", "Copy-Item", "", AllScope), + new SessionStateAliasEntry("ls", "Get-ChildItem"), + new SessionStateAliasEntry("man", "help"), + new SessionStateAliasEntry("mount", "New-PSDrive"), + new SessionStateAliasEntry("mv", "Move-Item"), + new SessionStateAliasEntry("ps", "Get-Process"), + new SessionStateAliasEntry("rm", "Remove-Item"), + new SessionStateAliasEntry("rmdir", "Remove-Item"), #endif // Bash built-ins we purposefully keep even if they override native commands - new SessionStateAliasEntry("cd", - "Set-Location", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("dir", - "Get-ChildItem", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("echo", - "Write-Output", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("fc", - "Format-Custom", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("kill", - "Stop-Process", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("pwd", - "Get-Location", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("type", - "Get-Content", "", ScopedItemOptions.AllScope), + new SessionStateAliasEntry("cd", "Set-Location", "", AllScope), + new SessionStateAliasEntry("dir", "Get-ChildItem", "", AllScope), + new SessionStateAliasEntry("echo", "Write-Output", "", AllScope), + new SessionStateAliasEntry("fc", "Format-Custom", "", ReadOnly), + new SessionStateAliasEntry("kill", "Stop-Process"), + new SessionStateAliasEntry("pwd", "Get-Location"), + new SessionStateAliasEntry("type", "Get-Content"), // Native commands we keep because the functions act correctly on Linux - new SessionStateAliasEntry("clear", - "Clear-Host", "", ScopedItemOptions.AllScope), + new SessionStateAliasEntry("clear", "Clear-Host"), //#if !CORECLR is used to disable aliases for cmdlets which are not available on OneCore #if !CORECLR - new SessionStateAliasEntry("gwmi", - "Get-WmiObject", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("iwmi", - "Invoke-WMIMethod", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("ogv", - "Out-GridView", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("ise", - "powershell_ise.exe", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("rsnp", - "Remove-PSSnapin", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("rwmi", - "Remove-WMIObject", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("swmi", - "Set-WMIInstance", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("shcm", - "Show-Command", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("trcm", - "Trace-Command", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("wget", - "Invoke-WebRequest", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("curl", - "Invoke-WebRequest", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("lp", - "Out-Printer", "", ScopedItemOptions.AllScope), + new SessionStateAliasEntry("gwmi", "Get-WmiObject", "", ReadOnly), + new SessionStateAliasEntry("iwmi", "Invoke-WMIMethod", "", ReadOnly), + new SessionStateAliasEntry("ogv", "Out-GridView", "", ReadOnly), + new SessionStateAliasEntry("ise", "powershell_ise.exe", "", ReadOnly), + new SessionStateAliasEntry("rwmi", "Remove-WMIObject", "", ReadOnly), + new SessionStateAliasEntry("swmi", "Set-WMIInstance", "", ReadOnly), + new SessionStateAliasEntry("shcm", "Show-Command", "", ReadOnly), + new SessionStateAliasEntry("trcm", "Trace-Command", "", ReadOnly), + new SessionStateAliasEntry("lp", "Out-Printer"), #endif // Aliases transferred from the profile - new SessionStateAliasEntry("h", - "Get-History", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("history", - "Get-History", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("md", - "mkdir", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("popd", - "Pop-Location", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("pushd", - "Push-Location", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("r", - "Invoke-History", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("cls", - "Clear-Host", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("chdir", - "Set-Location", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("copy", - "Copy-Item", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("del", - "Remove-Item", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("erase", - "Remove-Item", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("move", - "Move-Item", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("rd", - "Remove-Item", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("ren", - "Rename-Item", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("set", - "Set-Variable", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("icm", - "Invoke-Command", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("clhy", - "Clear-History", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), + new SessionStateAliasEntry("h", "Get-History"), + new SessionStateAliasEntry("history", "Get-History"), + new SessionStateAliasEntry("md", "mkdir", "", AllScope), + new SessionStateAliasEntry("popd", "Pop-Location", "", AllScope), + new SessionStateAliasEntry("pushd", "Push-Location", "", AllScope), + new SessionStateAliasEntry("r", "Invoke-History"), + new SessionStateAliasEntry("cls", "Clear-Host"), + new SessionStateAliasEntry("chdir", "Set-Location"), + new SessionStateAliasEntry("copy", "Copy-Item", "", AllScope), + new SessionStateAliasEntry("del", "Remove-Item", "", AllScope), + new SessionStateAliasEntry("erase", "Remove-Item"), + new SessionStateAliasEntry("move", "Move-Item", "", AllScope), + new SessionStateAliasEntry("rd", "Remove-Item"), + new SessionStateAliasEntry("ren", "Rename-Item"), + new SessionStateAliasEntry("set", "Set-Variable"), + new SessionStateAliasEntry("icm", "Invoke-Command"), + new SessionStateAliasEntry("clhy", "Clear-History", "", ReadOnly), // Job Specific aliases - new SessionStateAliasEntry("gjb", - "Get-Job", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("rcjb", - "Receive-Job", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("rjb", - "Remove-Job", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("sajb", - "Start-Job", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("spjb", - "Stop-Job", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("wjb", - "Wait-Job", "", ScopedItemOptions.AllScope), + new SessionStateAliasEntry("gjb", "Get-Job"), + new SessionStateAliasEntry("rcjb", "Receive-Job"), + new SessionStateAliasEntry("rjb", "Remove-Job"), + new SessionStateAliasEntry("sajb", "Start-Job"), + new SessionStateAliasEntry("spjb", "Stop-Job"), + new SessionStateAliasEntry("wjb", "Wait-Job"), #if !CORECLR - new SessionStateAliasEntry("sujb", - "Suspend-Job", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("rujb", - "Resume-Job", "", ScopedItemOptions.AllScope), + new SessionStateAliasEntry("sujb", "Suspend-Job"), + new SessionStateAliasEntry("rujb", "Resume-Job"), // Remoting Cmdlets Specific aliases - new SessionStateAliasEntry("npssc", - "New-PSSessionConfigurationFile", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("ipsn", - "Import-PSSession", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("epsn", - "Export-PSSession", "", ScopedItemOptions.AllScope), + new SessionStateAliasEntry("npssc", "New-PSSessionConfigurationFile", "", ReadOnly), + new SessionStateAliasEntry("ipsn", "Import-PSSession"), + new SessionStateAliasEntry("epsn", "Export-PSSession"), #endif - new SessionStateAliasEntry("cnsn", - "Connect-PSSession", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("dnsn", - "Disconnect-PSSession","", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("nsn", - "New-PSSession", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("gsn", - "Get-PSSession", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("rsn", - "Remove-PSSession", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("etsn", - "Enter-PSSession", "", ScopedItemOptions.AllScope), - new SessionStateAliasEntry("rcsn", - "Receive-PSSession", "", ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope), - new SessionStateAliasEntry("exsn", - "Exit-PSSession", "", ScopedItemOptions.AllScope), + new SessionStateAliasEntry("cnsn", "Connect-PSSession", "", ReadOnly), + new SessionStateAliasEntry("dnsn", "Disconnect-PSSession","", ReadOnly), + new SessionStateAliasEntry("nsn", "New-PSSession"), + new SessionStateAliasEntry("gsn", "Get-PSSession"), + new SessionStateAliasEntry("rsn", "Remove-PSSession"), + new SessionStateAliasEntry("etsn", "Enter-PSSession"), + new SessionStateAliasEntry("rcsn", "Receive-PSSession", "", ReadOnly), + new SessionStateAliasEntry("exsn", "Exit-PSSession"), // Win8: 121662/169179 Add "sls" alias for Select-String cmdlet // - do not use AllScope - this causes errors in profiles that set this somewhat commonly used alias. - new SessionStateAliasEntry("sls", - "Select-String", "", ScopedItemOptions.None), + new SessionStateAliasEntry("sls", "Select-String"), }; } } diff --git a/test/powershell/engine/Basic/DefaultCommands.Tests.ps1 b/test/powershell/engine/Basic/DefaultCommands.Tests.ps1 index a6a54b3bceb..4a9e837cc28 100644 --- a/test/powershell/engine/Basic/DefaultCommands.Tests.ps1 +++ b/test/powershell/engine/Basic/DefaultCommands.Tests.ps1 @@ -12,163 +12,163 @@ Describe "Verify approved aliases list" -Tags "CI" { "CommandType", "Name", "Definition", "Present", "ReadOnlyOption", "AllScopeOption" "Alias", "%", "ForEach-Object", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" "Alias", "?", "Where-Object", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "ac", "Add-Content", $($FullCLR -or $CoreWindows ), "ReadOnly", "AllScope" -"Alias", "asnp", "Add-PSSnapIn", $($FullCLR ), "ReadOnly", "AllScope" -"Alias", "cat", "Get-Content", $($FullCLR -or $CoreWindows ), "", "AllScope" +"Alias", "ac", "Add-Content", $($FullCLR -or $CoreWindows ), "ReadOnly", "" +"Alias", "asnp", "Add-PSSnapIn", $($FullCLR ), "ReadOnly", "" +"Alias", "cat", "Get-Content", $($FullCLR -or $CoreWindows ), "", "" "Alias", "cd", "Set-Location", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "AllScope" -"Alias", "CFS", "ConvertFrom-String", $($FullCLR ), "ReadOnly", "AllScope" -"Alias", "chdir", "Set-Location", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "AllScope" -"Alias", "clc", "Clear-Content", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "clear", "Clear-Host", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "AllScope" -"Alias", "clhy", "Clear-History", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "cli", "Clear-Item", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "clp", "Clear-ItemProperty", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "cls", "Clear-Host", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "AllScope" -"Alias", "clv", "Clear-Variable", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "cnsn", "Connect-PSSession", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "compare", "Compare-Object", $($FullCLR -or $CoreWindows ), "ReadOnly", "AllScope" +"Alias", "CFS", "ConvertFrom-String", $($FullCLR ), "ReadOnly", "" +"Alias", "chdir", "Set-Location", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "" +"Alias", "clc", "Clear-Content", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "clear", "Clear-Host", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "" +"Alias", "clhy", "Clear-History", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "cli", "Clear-Item", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "clp", "Clear-ItemProperty", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "cls", "Clear-Host", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "" +"Alias", "clv", "Clear-Variable", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "cnsn", "Connect-PSSession", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "compare", "Compare-Object", $($FullCLR -or $CoreWindows ), "ReadOnly", "" "Alias", "copy", "Copy-Item", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "AllScope" "Alias", "cp", "Copy-Item", $($FullCLR -or $CoreWindows ), "", "AllScope" -"Alias", "cpi", "Copy-Item", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "cpp", "Copy-ItemProperty", $($FullCLR -or $CoreWindows ), "ReadOnly", "AllScope" -"Alias", "curl", "Invoke-WebRequest", $($FullCLR ), "ReadOnly", "AllScope" -"Alias", "cvpa", "Convert-Path", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "dbp", "Disable-PSBreakpoint", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" +"Alias", "cpi", "Copy-Item", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "cpp", "Copy-ItemProperty", $($FullCLR -or $CoreWindows ), "ReadOnly", "" +"Alias", "curl", "Invoke-WebRequest", $($FullCLR ), "ReadOnly", "" +"Alias", "cvpa", "Convert-Path", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "dbp", "Disable-PSBreakpoint", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" "Alias", "del", "Remove-Item", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "AllScope" -"Alias", "diff", "Compare-Object", $($FullCLR -or $CoreWindows ), "ReadOnly", "AllScope" +"Alias", "diff", "Compare-Object", $($FullCLR -or $CoreWindows ), "ReadOnly", "" "Alias", "dir", "Get-ChildItem", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "AllScope" -"Alias", "dnsn", "Disconnect-PSSession", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "ebp", "Enable-PSBreakpoint", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" +"Alias", "dnsn", "Disconnect-PSSession", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "ebp", "Enable-PSBreakpoint", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" "Alias", "echo", "Write-Output", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "AllScope" -"Alias", "epal", "Export-Alias", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "epcsv", "Export-Csv", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "epsn", "Export-PSSession", $($FullCLR ), "", "AllScope" -"Alias", "erase", "Remove-Item", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "AllScope" -"Alias", "etsn", "Enter-PSSession", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "AllScope" -"Alias", "exsn", "Exit-PSSession", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "AllScope" -"Alias", "fc", "Format-Custom", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" +"Alias", "epal", "Export-Alias", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "epcsv", "Export-Csv", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "epsn", "Export-PSSession", $($FullCLR ), "", "" +"Alias", "erase", "Remove-Item", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "" +"Alias", "etsn", "Enter-PSSession", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "" +"Alias", "exsn", "Exit-PSSession", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "" +"Alias", "fc", "Format-Custom", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" "Alias", "fhx", "Format-Hex", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "" -"Alias", "fl", "Format-List", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" +"Alias", "fl", "Format-List", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" "Alias", "foreach", "ForEach-Object", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "ft", "Format-Table", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "fw", "Format-Wide", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "gal", "Get-Alias", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "gbp", "Get-PSBreakpoint", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "gc", "Get-Content", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "gcb", "Get-Clipboard", $($FullCLR ), "ReadOnly", "AllScope" -"Alias", "gci", "Get-ChildItem", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "gcm", "Get-Command", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "gcs", "Get-PSCallStack", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "gdr", "Get-PSDrive", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "ghy", "Get-History", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "gi", "Get-Item", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" +"Alias", "ft", "Format-Table", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "fw", "Format-Wide", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "gal", "Get-Alias", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "gbp", "Get-PSBreakpoint", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "gc", "Get-Content", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "gcb", "Get-Clipboard", $($FullCLR ), "ReadOnly", "" +"Alias", "gci", "Get-ChildItem", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "gcm", "Get-Command", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "gcs", "Get-PSCallStack", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "gdr", "Get-PSDrive", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "ghy", "Get-History", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "gi", "Get-Item", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" "Alias", "gin", "Get-ComputerInfo", $($FullCLR -or $CoreWindows ), "", "" -"Alias", "gjb", "Get-Job", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "AllScope" -"Alias", "gl", "Get-Location", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "gm", "Get-Member", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "gmo", "Get-Module", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "gp", "Get-ItemProperty", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "gps", "Get-Process", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "gpv", "Get-ItemPropertyValue", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "group", "Group-Object", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "gsn", "Get-PSSession", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "AllScope" -"Alias", "gsnp", "Get-PSSnapIn", $($FullCLR ), "ReadOnly", "AllScope" -"Alias", "gsv", "Get-Service", $($FullCLR -or $CoreWindows ), "ReadOnly", "AllScope" +"Alias", "gjb", "Get-Job", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "" +"Alias", "gl", "Get-Location", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "gm", "Get-Member", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "gmo", "Get-Module", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "gp", "Get-ItemProperty", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "gps", "Get-Process", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "gpv", "Get-ItemPropertyValue", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "group", "Group-Object", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "gsn", "Get-PSSession", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "" +"Alias", "gsnp", "Get-PSSnapIn", $($FullCLR ), "ReadOnly", "" +"Alias", "gsv", "Get-Service", $($FullCLR -or $CoreWindows ), "ReadOnly", "" "Alias", "gtz", "Get-TimeZone", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "" -"Alias", "gu", "Get-Unique", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "gv", "Get-Variable", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "gwmi", "Get-WmiObject", $($FullCLR ), "ReadOnly", "AllScope" -"Alias", "h", "Get-History", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "AllScope" -"Alias", "history", "Get-History", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "AllScope" -"Alias", "icm", "Invoke-Command", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "AllScope" -"Alias", "iex", "Invoke-Expression", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "ihy", "Invoke-History", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "ii", "Invoke-Item", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "ipal", "Import-Alias", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "ipcsv", "Import-Csv", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "ipmo", "Import-Module", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "ipsn", "Import-PSSession", $($FullCLR ), "", "AllScope" -"Alias", "irm", "Invoke-RestMethod", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "ise", "powershell_ise.exe", $($FullCLR ), "ReadOnly", "AllScope" -"Alias", "iwmi", "Invoke-WMIMethod", $($FullCLR ), "ReadOnly", "AllScope" -"Alias", "iwr", "Invoke-WebRequest", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "kill", "Stop-Process", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "AllScope" -"Alias", "lp", "Out-Printer", $($FullCLR ), "ReadOnly", "AllScope" -"Alias", "ls", "Get-ChildItem", $($FullCLR -or $CoreWindows ), "", "AllScope" -"Alias", "man", "help", $($FullCLR -or $CoreWindows ), "", "AllScope" +"Alias", "gu", "Get-Unique", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "gv", "Get-Variable", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "gwmi", "Get-WmiObject", $($FullCLR ), "ReadOnly", "" +"Alias", "h", "Get-History", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "" +"Alias", "history", "Get-History", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "" +"Alias", "icm", "Invoke-Command", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "" +"Alias", "iex", "Invoke-Expression", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "ihy", "Invoke-History", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "ii", "Invoke-Item", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "ipal", "Import-Alias", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "ipcsv", "Import-Csv", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "ipmo", "Import-Module", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "ipsn", "Import-PSSession", $($FullCLR ), "", "" +"Alias", "irm", "Invoke-RestMethod", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "ise", "powershell_ise.exe", $($FullCLR ), "ReadOnly", "" +"Alias", "iwmi", "Invoke-WMIMethod", $($FullCLR ), "ReadOnly", "" +"Alias", "iwr", "Invoke-WebRequest", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "kill", "Stop-Process", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "" +"Alias", "lp", "Out-Printer", $($FullCLR ), "ReadOnly", "" +"Alias", "ls", "Get-ChildItem", $($FullCLR -or $CoreWindows ), "", "" +"Alias", "man", "help", $($FullCLR -or $CoreWindows ), "", "" "Alias", "md", "mkdir", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "AllScope" -"Alias", "measure", "Measure-Object", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "mi", "Move-Item", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "mount", "New-PSDrive", $($FullCLR -or $CoreWindows ), "", "AllScope" +"Alias", "measure", "Measure-Object", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "mi", "Move-Item", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "mount", "New-PSDrive", $($FullCLR -or $CoreWindows ), "", "" "Alias", "move", "Move-Item", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "AllScope" -"Alias", "mp", "Move-ItemProperty", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "mv", "Move-Item", $($FullCLR -or $CoreWindows ), "", "AllScope" -"Alias", "nal", "New-Alias", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "ndr", "New-PSDrive", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "ni", "New-Item", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "nmo", "New-Module", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "npssc", "New-PSSessionConfigurationFile", $($FullCLR ), "ReadOnly", "AllScope" -"Alias", "nsn", "New-PSSession", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "AllScope" -"Alias", "nv", "New-Variable", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "nwsn", "New-PSWorkflowSession", $($FullCLR ), "ReadOnly", "AllScope" -"Alias", "ogv", "Out-GridView", $($FullCLR ), "ReadOnly", "AllScope" -"Alias", "oh", "Out-Host", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" +"Alias", "mp", "Move-ItemProperty", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "mv", "Move-Item", $($FullCLR -or $CoreWindows ), "", "" +"Alias", "nal", "New-Alias", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "ndr", "New-PSDrive", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "ni", "New-Item", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "nmo", "New-Module", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "npssc", "New-PSSessionConfigurationFile", $($FullCLR ), "ReadOnly", "" +"Alias", "nsn", "New-PSSession", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "" +"Alias", "nv", "New-Variable", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "nwsn", "New-PSWorkflowSession", $($FullCLR ), "ReadOnly", "" +"Alias", "ogv", "Out-GridView", $($FullCLR ), "ReadOnly", "" +"Alias", "oh", "Out-Host", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" "Alias", "popd", "Pop-Location", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "AllScope" -"Alias", "ps", "Get-Process", $($FullCLR -or $CoreWindows ), "", "AllScope" +"Alias", "ps", "Get-Process", $($FullCLR -or $CoreWindows ), "", "" "Alias", "pushd", "Push-Location", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "AllScope" -"Alias", "pwd", "Get-Location", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "AllScope" -"Alias", "r", "Invoke-History", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "AllScope" -"Alias", "rbp", "Remove-PSBreakpoint", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "rcjb", "Receive-Job", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "AllScope" -"Alias", "rcsn", "Receive-PSSession", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "rd", "Remove-Item", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "AllScope" -"Alias", "rdr", "Remove-PSDrive", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "ren", "Rename-Item", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "AllScope" -"Alias", "ri", "Remove-Item", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "rjb", "Remove-Job", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "AllScope" -"Alias", "rm", "Remove-Item", $($FullCLR -or $CoreWindows ), "", "AllScope" -"Alias", "rmdir", "Remove-Item", $($FullCLR -or $CoreWindows ), "", "AllScope" -"Alias", "rmo", "Remove-Module", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "rni", "Rename-Item", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "rnp", "Rename-ItemProperty", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "rp", "Remove-ItemProperty", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "rsn", "Remove-PSSession", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "AllScope" -"Alias", "rsnp", "Remove-PSSnapin", $($FullCLR ), "", "AllScope" -"Alias", "rujb", "Resume-Job", $($FullCLR ), "", "AllScope" -"Alias", "rv", "Remove-Variable", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "rvpa", "Resolve-Path", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "rwmi", "Remove-WMIObject", $($FullCLR ), "ReadOnly", "AllScope" -"Alias", "sajb", "Start-Job", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "AllScope" -"Alias", "sal", "Set-Alias", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "saps", "Start-Process", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "sasv", "Start-Service", $($FullCLR -or $CoreWindows ), "ReadOnly", "AllScope" -"Alias", "sbp", "Set-PSBreakpoint", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "sc", "Set-Content", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "scb", "Set-Clipboard", $($FullCLR ), "ReadOnly", "AllScope" +"Alias", "pwd", "Get-Location", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "" +"Alias", "r", "Invoke-History", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "" +"Alias", "rbp", "Remove-PSBreakpoint", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "rcjb", "Receive-Job", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "" +"Alias", "rcsn", "Receive-PSSession", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "rd", "Remove-Item", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "" +"Alias", "rdr", "Remove-PSDrive", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "ren", "Rename-Item", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "" +"Alias", "ri", "Remove-Item", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "rjb", "Remove-Job", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "" +"Alias", "rm", "Remove-Item", $($FullCLR -or $CoreWindows ), "", "" +"Alias", "rmdir", "Remove-Item", $($FullCLR -or $CoreWindows ), "", "" +"Alias", "rmo", "Remove-Module", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "rni", "Rename-Item", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "rnp", "Rename-ItemProperty", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "rp", "Remove-ItemProperty", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "rsn", "Remove-PSSession", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "" +"Alias", "rsnp", "Remove-PSSnapin", $($FullCLR ), "", "" +"Alias", "rujb", "Resume-Job", $($FullCLR ), "", "" +"Alias", "rv", "Remove-Variable", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "rvpa", "Resolve-Path", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "rwmi", "Remove-WMIObject", $($FullCLR ), "ReadOnly", "" +"Alias", "sajb", "Start-Job", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "" +"Alias", "sal", "Set-Alias", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "saps", "Start-Process", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "sasv", "Start-Service", $($FullCLR -or $CoreWindows ), "ReadOnly", "" +"Alias", "sbp", "Set-PSBreakpoint", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "sc", "Set-Content", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "scb", "Set-Clipboard", $($FullCLR ), "ReadOnly", "" "Alias", "select", "Select-Object", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "set", "Set-Variable", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "AllScope" -"Alias", "shcm", "Show-Command", $($FullCLR ), "ReadOnly", "AllScope" -"Alias", "si", "Set-Item", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "sl", "Set-Location", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "sleep", "Start-Sleep", $($FullCLR -or $CoreWindows ), "ReadOnly", "AllScope" +"Alias", "set", "Set-Variable", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "" +"Alias", "shcm", "Show-Command", $($FullCLR ), "ReadOnly", "" +"Alias", "si", "Set-Item", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "sl", "Set-Location", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "sleep", "Start-Sleep", $($FullCLR -or $CoreWindows ), "ReadOnly", "" "Alias", "sls", "Select-String", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "" -"Alias", "sort", "Sort-Object", $($FullCLR -or $CoreWindows ), "ReadOnly", "AllScope" -"Alias", "sp", "Set-ItemProperty", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "spjb", "Stop-Job", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "AllScope" -"Alias", "spps", "Stop-Process", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "spsv", "Stop-Service", $($FullCLR -or $CoreWindows ), "ReadOnly", "AllScope" -"Alias", "start", "Start-Process", $($FullCLR -or $CoreWindows ), "ReadOnly", "AllScope" +"Alias", "sort", "Sort-Object", $($FullCLR -or $CoreWindows ), "ReadOnly", "" +"Alias", "sp", "Set-ItemProperty", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "spjb", "Stop-Job", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "" +"Alias", "spps", "Stop-Process", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "spsv", "Stop-Service", $($FullCLR -or $CoreWindows ), "ReadOnly", "" +"Alias", "start", "Start-Process", $($FullCLR -or $CoreWindows ), "ReadOnly", "" "Alias", "stz", "Set-TimeZone", $($FullCLR -or $CoreWindows ), "", "" -"Alias", "sujb", "Suspend-Job", $($FullCLR ), "", "AllScope" -"Alias", "sv", "Set-Variable", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "swmi", "Set-WMIInstance", $($FullCLR ), "ReadOnly", "AllScope" -"Alias", "tee", "Tee-Object", $($FullCLR -or $CoreWindows ), "ReadOnly", "AllScope" -"Alias", "trcm", "Trace-Command", $($FullCLR ), "ReadOnly", "AllScope" -"Alias", "type", "Get-Content", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "AllScope" -"Alias", "wget", "Invoke-WebRequest", $($FullCLR ), "ReadOnly", "AllScope" +"Alias", "sujb", "Suspend-Job", $($FullCLR ), "", "" +"Alias", "sv", "Set-Variable", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "" +"Alias", "swmi", "Set-WMIInstance", $($FullCLR ), "ReadOnly", "" +"Alias", "tee", "Tee-Object", $($FullCLR -or $CoreWindows ), "ReadOnly", "" +"Alias", "trcm", "Trace-Command", $($FullCLR ), "ReadOnly", "" +"Alias", "type", "Get-Content", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "" +"Alias", "wget", "Invoke-WebRequest", $($FullCLR ), "ReadOnly", "" "Alias", "where", "Where-Object", $($FullCLR -or $CoreWindows -or $CoreUnix), "ReadOnly", "AllScope" -"Alias", "wjb", "Wait-Job", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "AllScope" -"Alias", "write", "Write-Output", $($FullCLR -or $CoreWindows ), "ReadOnly", "AllScope" +"Alias", "wjb", "Wait-Job", $($FullCLR -or $CoreWindows -or $CoreUnix), "", "" +"Alias", "write", "Write-Output", $($FullCLR -or $CoreWindows ), "ReadOnly", "" "Cmdlet", "Add-Computer", , $($FullCLR ) "Cmdlet", "Add-Content", , $($FullCLR -or $CoreWindows -or $CoreUnix) "Cmdlet", "Add-History", , $($FullCLR -or $CoreWindows -or $CoreUnix) From 1c446c1be4ac10dd53a1f822e78801dc3da361d0 Mon Sep 17 00:00:00 2001 From: Ilya Date: Tue, 31 Oct 2017 19:00:41 +0400 Subject: [PATCH 064/617] Fix performance issues in Add-Type (#5243) * Exclude ReadAllText from OutputError() * Exclude double ReadAllText() from EndProcessing * Remove sourceCode initialization * Add StringBuilder init size and remove unneeded code. * Set init size StringBuilder in 8192 --- .../commands/utility/AddType.cs | 76 +++++++++---------- .../Add-Type.Tests.ps1 | 47 +++++++++++- 2 files changed, 83 insertions(+), 40 deletions(-) diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/AddType.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/AddType.cs index 4e0e545fcc9..a3701a56a92 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/AddType.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/AddType.cs @@ -763,6 +763,14 @@ internal string GetUsingSet(Language language) /// protected override void EndProcessing() { + // Prevent code compilation in ConstrainedLanguage mode + if (SessionState.LanguageMode == PSLanguageMode.ConstrainedLanguage) + { + ThrowTerminatingError( + new ErrorRecord( + new PSNotSupportedException(AddTypeStrings.CannotDefineNewType), "CannotDefineNewType", ErrorCategory.PermissionDenied, null)); + } + // Generate an error if they've specified an output // assembly type without an output assembly if (String.IsNullOrEmpty(outputAssembly) && outputTypeSpecified) @@ -779,36 +787,6 @@ protected override void EndProcessing() ThrowTerminatingError(errorRecord); return; } - - PopulateSource(); - } - - internal void PopulateSource() - { - // Prevent code compilation in ConstrainedLanguage mode - if (SessionState.LanguageMode == PSLanguageMode.ConstrainedLanguage) - { - ThrowTerminatingError( - new ErrorRecord( - new PSNotSupportedException(AddTypeStrings.CannotDefineNewType), "CannotDefineNewType", ErrorCategory.PermissionDenied, null)); - } - - // Load the source if they want to load from a file - if (String.Equals(ParameterSetName, "FromPath", StringComparison.OrdinalIgnoreCase) || - String.Equals(ParameterSetName, "FromLiteralPath", StringComparison.OrdinalIgnoreCase) - ) - { - sourceCode = ""; - foreach (string file in paths) - { - sourceCode += System.IO.File.ReadAllText(file) + "\n"; - } - } - - if (String.Equals(ParameterSetName, "FromMember", StringComparison.OrdinalIgnoreCase)) - { - sourceCode = GenerateTypeSource(typeNamespace, Name, sourceCode, language); - } } internal void HandleCompilerErrors(AddTypeCompilerError[] compilerErrors) @@ -853,12 +831,12 @@ private void OutputError(AddTypeCompilerError error, string[] actualSource) { if (!String.IsNullOrEmpty(error.FileName)) { - actualSource = System.IO.File.ReadAllText(error.FileName).Split(Utils.Separators.Newline); + actualSource = System.IO.File.ReadAllLines(error.FileName); } } string errorText = StringUtil.Format(AddTypeStrings.CompilationErrorFormat, - error.FileName, error.Line, error.ErrorText) + "\n"; + error.FileName, error.Line, error.ErrorText) + Environment.NewLine; for (int lineNumber = error.Line - 1; lineNumber < error.Line + 2; lineNumber++) { @@ -876,8 +854,8 @@ private void OutputError(AddTypeCompilerError error, string[] actualSource) lineText += actualSource[lineNumber - 1]; - errorText += "\n" + StringUtil.Format(AddTypeStrings.CompilationErrorFormat, - error.FileName, lineNumber, lineText) + "\n"; + errorText += Environment.NewLine + StringUtil.Format(AddTypeStrings.CompilationErrorFormat, + error.FileName, lineNumber, lineText) + Environment.NewLine; } } @@ -932,13 +910,35 @@ protected override void EndProcessing() { // Load the source if they want to load from a file if (String.Equals(ParameterSetName, "FromPath", StringComparison.OrdinalIgnoreCase) || - String.Equals(ParameterSetName, "FromLiteralPath", StringComparison.OrdinalIgnoreCase)) + String.Equals(ParameterSetName, "FromLiteralPath", StringComparison.OrdinalIgnoreCase) + ) { - this.sourceCode = ""; - foreach (string file in paths) + if (paths.Length == 1) { - this.sourceCode += System.IO.File.ReadAllText(file) + "\n"; + sourceCode = File.ReadAllText(paths[0]); } + else + { + + // We replace 'ReadAllText' with 'StringBuilder' and 'ReadAllLines' + // to avoide temporary LOH allocations. + + StringBuilder sb = new StringBuilder(8192); + + foreach (string file in paths) + { + foreach (string line in File.ReadAllLines(file)) + { + sb.AppendLine(line); + } + } + + sourceCode = sb.ToString(); + } + } + else if (String.Equals(ParameterSetName, "FromMember", StringComparison.OrdinalIgnoreCase)) + { + sourceCode = GenerateTypeSource(typeNamespace, Name, sourceCode, language); } CompileSourceToAssembly(this.sourceCode); diff --git a/test/powershell/Modules/Microsoft.PowerShell.Utility/Add-Type.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Utility/Add-Type.Tests.ps1 index e4efeb10f32..b36ce180d51 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Utility/Add-Type.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Utility/Add-Type.Tests.ps1 @@ -1,6 +1,38 @@ -$guid = [Guid]::NewGuid().ToString().Replace("-","") - Describe "Add-Type" -Tags "CI" { + BeforeAll { + $guid = [Guid]::NewGuid().ToString().Replace("-","") + + $code1 = @" + namespace Test.AddType + { + public class BasicTest1 + { + public static int Add1(int a, int b) + { + return (a + b); + } + } + } +"@ + $code2 = @" + namespace Test.AddType + { + public class BasicTest2 + { + public static int Add2(int a, int b) + { + return (a + b); + } + } + } +"@ + $codeFile1 = Join-Path -Path $TestDrive -ChildPath "codeFile1.cs" + $codeFile2 = Join-Path -Path $TestDrive -ChildPath "codeFile2.cs" + + Set-Content -Path $codeFile1 -Value $code1 -Force + Set-Content -Path $codeFile2 -Value $code2 -Force + } + It "Public 'Language' enumeration contains all members" { [Enum]::GetNames("Microsoft.PowerShell.Commands.Language") -join "," | Should Be "CSharp,CSharpVersion7,CSharpVersion6,CSharpVersion5,CSharpVersion4,CSharpVersion3,CSharpVersion2,CSharpVersion1,VisualBasic,JScript" } @@ -20,4 +52,15 @@ public class AttributeTest$guid {} It "Can load TPA assembly System.Runtime.Serialization.Primitives.dll" { Add-Type -AssemblyName 'System.Runtime.Serialization.Primitives' -PassThru | Should Not Be $null } + + It "Can compile C# files" { + + { [Test.AddType.BasicTest1]::Add1(1, 2) } | Should Throw + { [Test.AddType.BasicTest2]::Add2(3, 4) } | Should Throw + + Add-Type -Path $codeFile1,$codeFile2 + + { [Test.AddType.BasicTest1]::Add1(1, 2) } | Should Not Throw + { [Test.AddType.BasicTest2]::Add2(3, 4) } | Should Not Throw + } } From 63f55427ece8828987227ac39bb1427f3310b05a Mon Sep 17 00:00:00 2001 From: "James Truher [MSFT]" Date: Tue, 31 Oct 2017 15:40:23 -0700 Subject: [PATCH 065/617] fix sparse-checkout list (#5263) * fix sparse-checkout list * Run powershell.exe in OpenCover since it will be in the path. * If there's an error in Start-CodeCoverageRun be sure to log as much as possible * Make the directory removal code common --- .../Start-CodeCoverageRun.ps1 | 37 ++++++++++++------- test/tools/OpenCover/OpenCover.psm1 | 4 +- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/test/tools/CodeCoverageAutomation/Start-CodeCoverageRun.ps1 b/test/tools/CodeCoverageAutomation/Start-CodeCoverageRun.ps1 index 5f231278e11..086b92ac116 100644 --- a/test/tools/CodeCoverageAutomation/Start-CodeCoverageRun.ps1 +++ b/test/tools/CodeCoverageAutomation/Start-CodeCoverageRun.ps1 @@ -143,6 +143,9 @@ $jsonFile = "$outputBaseFolder\CC.json" try { + # first thing to do is to be sure that no processes are running which will cause us issues + Get-Process pwsh | Stop-Process -Force -ErrorAction Stop + ## This is required so we do not keep on merging coverage reports. if(Test-Path $outputLog) { @@ -248,19 +251,19 @@ try # operations relative to where the test location is. # some tests rely on source files being available in $outputBaseFolder/test Push-Location $outputBaseFolder + # clean up partial repo clone before starting - if ( Test-Path "$outputBaseFolder/.git" ) - { - Remove-Item -Force -Recurse "${outputBaseFolder}/.git" - } - if ( Test-Path "$outputBaseFolder/src" ) - { - Remove-Item -Force -Recurse "${outputBaseFolder}/src" - } - if ( Test-Path "$outputBaseFolder/assests" ) + $cleanupDirectories = "${outputBaseFolder}/.git", + "${outputBaseFolder}/src", + "${outputBaseFolder}/assets" + foreach($directory in $cleanupDirectories) { - Remove-Item -Force -Recurse "${outputBaseFolder}/assets" + if ( Test-Path "$directory" ) + { + Remove-Item -Force -Recurse "$directory" + } } + Write-LogPassThru -Message "initializing repo in $outputBaseFolder" & $gitexe init Write-LogPassThru -Message "git operation 'init' returned $LASTEXITCODE" @@ -274,8 +277,8 @@ try Write-LogPassThru -Message "git operation 'set sparse-checkout' returned $LASTEXITCODE" Write-LogPassThru -Message "pulling sparse repo" - "src" | Out-File -Encoding ascii .git\info\sparse-checkout -Force - "assets" | Out-File -Encoding ascii .git\info\sparse-checkout -Append + "/src" | Out-File -Encoding ascii .git\info\sparse-checkout -Force + "/assets" | Out-File -Encoding ascii .git\info\sparse-checkout -Append & $gitexe pull origin master Write-LogPassThru -Message "git operation 'pull' returned $LASTEXITCODE" @@ -291,8 +294,14 @@ try $openCoverParams | Out-String | Write-LogPassThru Write-LogPassThru -Message "Starting test run." - # now invoke opencover - Invoke-OpenCover @openCoverParams + try { + # now invoke opencover + Invoke-OpenCover @openCoverParams | Out-String | Write-LogPassThru + } + catch { + ("ERROR: " + $_.ScriptStackTrace) | Write-LogPassThru + $_ 2>&1 | out-string -Stream | %{ "ERROR: $_" } | Write-LogPassThru + } if(Test-Path $outputLog) { diff --git a/test/tools/OpenCover/OpenCover.psm1 b/test/tools/OpenCover/OpenCover.psm1 index ba2e52167ea..7822bd23001 100644 --- a/test/tools/OpenCover/OpenCover.psm1 +++ b/test/tools/OpenCover/OpenCover.psm1 @@ -702,12 +702,12 @@ function Invoke-OpenCover # '&' invoke caused issues with cmdline parameters for opencover.console.exe $elevatedFile = "$env:temp\elevated.ps1" "$OpenCoverBin $cmdlineElevated" | Out-File -FilePath $elevatedFile -force - pwsh.exe -file $elevatedFile + powershell.exe -file $elevatedFile # invoke OpenCover unelevated and poll for completion $unelevatedFile = "$env:temp\unelevated.ps1" "$openCoverBin $cmdlineUnelevated" | Out-File -FilePath $unelevatedFile -Force - runas.exe /trustlevel:0x20000 "pwsh.exe -file $unelevatedFile" + runas.exe /trustlevel:0x20000 "powershell.exe -file $unelevatedFile" # poll for process exit every 60 seconds # timeout of 6 hours # Runs currently take about 2.5 - 3 hours, we picked 6 hours to be substantially larger. From 73c6a73752c828f4e5cb9e322c05ccfae295d3ef Mon Sep 17 00:00:00 2001 From: Dongbo Wang Date: Tue, 31 Oct 2017 16:31:41 -0700 Subject: [PATCH 066/617] Fix line endings with LF (#5288) --- .../Operators/RangeOperator.Tests.ps1 | 194 +++++++++--------- 1 file changed, 97 insertions(+), 97 deletions(-) diff --git a/test/powershell/Language/Operators/RangeOperator.Tests.ps1 b/test/powershell/Language/Operators/RangeOperator.Tests.ps1 index 0f15ebdcb5a..055de78d572 100644 --- a/test/powershell/Language/Operators/RangeOperator.Tests.ps1 +++ b/test/powershell/Language/Operators/RangeOperator.Tests.ps1 @@ -1,97 +1,97 @@ -Describe "Range Operator" -Tags CI { - Context "Range integer operations" { - It "Range operator generates arrays of integers" { - $Range = 5..8 - $Range.count | Should Be 4 - $Range[0] | Should BeOfType [int] - $Range[1] | Should BeOfType [int] - $Range[2] | Should BeOfType [int] - $Range[3] | Should BeOfType [int] - - $Range[0] | Should Be 5 - $Range[1] | Should Be 6 - $Range[2] | Should Be 7 - $Range[3] | Should Be 8 - } - - It "Range operator accepts negative integer values" { - $Range = -8..-5 - $Range.count | Should Be 4 - $Range[0] | Should Be -8 - $Range[1] | Should Be -7 - $Range[2] | Should Be -6 - $Range[3] | Should Be -5 - } - - It "Range operator support single-item sequences" { - $Range = 0..0 - $Range.count | Should Be 1 - $Range[0] | Should BeOfType [int] - $Range[0] | Should Be 0 - } - - It "Range operator works in descending order" { - $Range = 4..3 - $Range.count | Should Be 2 - $Range[0] | Should Be 4 - $Range[1] | Should Be 3 - } - - It "Range operator works for sequences of both negative and positive numbers" { - $Range = -2..2 - $Range.count | Should Be 5 - $Range[0] | Should Be -2 - $Range[1] | Should Be -1 - $Range[2] | Should Be 0 - $Range[3] | Should Be 1 - $Range[4] | Should Be 2 - } - } - - Context "Character expansion" { - It "Range operator generates an array of [char] from single-character string operands" { - $CharRange = 'A'..'E' - $CharRange.count | Should Be 5 - $CharRange[0] | Should BeOfType [char] - $CharRange[1] | Should BeOfType [char] - $CharRange[2] | Should BeOfType [char] - $CharRange[3] | Should BeOfType [char] - $CharRange[4] | Should BeOfType [char] - } - - It "Range operator works in ascending and descending order" { - $CharRange = 'a'..'b' - $CharRange.count | Should Be 2 - $CharRange[0] | Should Be ([char]'a') - $CharRange[1] | Should Be ([char]'b') - - $CharRange = 'b'..'a' - $CharRange.count | Should Be 2 - $CharRange[0] | Should Be ([char]'b') - $CharRange[1] | Should Be ([char]'a') - } - - It "Range operator works with 16-bit unicode characters" { - $UnicodeRange = "`u{0110}".."`u{0114}" - $UnicodeRange.count | Should Be 5 - $UnicodeRange[0] | Should Be "`u{0110}"[0] - $UnicodeRange[1] | Should Be "`u{0111}"[0] - $UnicodeRange[2] | Should Be "`u{0112}"[0] - $UnicodeRange[3] | Should Be "`u{0113}"[0] - $UnicodeRange[4] | Should Be "`u{0114}"[0] - $UnicodeRange.Where({$_ -is [char]}).count | Should Be 5 - } - } - - Context "Range operator operand types" { - It "Range operator works on [decimal]" { - $Range = 1.1d..3.9d - $Range.count | Should Be 4 - $Range[0] | Should Be 1 - $Range[1] | Should Be 2 - $Range[2] | Should Be 3 - $Range[3] | Should Be 4 - $Range.Where({$_ -is [int]}).count | Should Be 4 - } - } -} +Describe "Range Operator" -Tags CI { + Context "Range integer operations" { + It "Range operator generates arrays of integers" { + $Range = 5..8 + $Range.count | Should Be 4 + $Range[0] | Should BeOfType [int] + $Range[1] | Should BeOfType [int] + $Range[2] | Should BeOfType [int] + $Range[3] | Should BeOfType [int] + + $Range[0] | Should Be 5 + $Range[1] | Should Be 6 + $Range[2] | Should Be 7 + $Range[3] | Should Be 8 + } + + It "Range operator accepts negative integer values" { + $Range = -8..-5 + $Range.count | Should Be 4 + $Range[0] | Should Be -8 + $Range[1] | Should Be -7 + $Range[2] | Should Be -6 + $Range[3] | Should Be -5 + } + + It "Range operator support single-item sequences" { + $Range = 0..0 + $Range.count | Should Be 1 + $Range[0] | Should BeOfType [int] + $Range[0] | Should Be 0 + } + + It "Range operator works in descending order" { + $Range = 4..3 + $Range.count | Should Be 2 + $Range[0] | Should Be 4 + $Range[1] | Should Be 3 + } + + It "Range operator works for sequences of both negative and positive numbers" { + $Range = -2..2 + $Range.count | Should Be 5 + $Range[0] | Should Be -2 + $Range[1] | Should Be -1 + $Range[2] | Should Be 0 + $Range[3] | Should Be 1 + $Range[4] | Should Be 2 + } + } + + Context "Character expansion" { + It "Range operator generates an array of [char] from single-character string operands" { + $CharRange = 'A'..'E' + $CharRange.count | Should Be 5 + $CharRange[0] | Should BeOfType [char] + $CharRange[1] | Should BeOfType [char] + $CharRange[2] | Should BeOfType [char] + $CharRange[3] | Should BeOfType [char] + $CharRange[4] | Should BeOfType [char] + } + + It "Range operator works in ascending and descending order" { + $CharRange = 'a'..'b' + $CharRange.count | Should Be 2 + $CharRange[0] | Should Be ([char]'a') + $CharRange[1] | Should Be ([char]'b') + + $CharRange = 'b'..'a' + $CharRange.count | Should Be 2 + $CharRange[0] | Should Be ([char]'b') + $CharRange[1] | Should Be ([char]'a') + } + + It "Range operator works with 16-bit unicode characters" { + $UnicodeRange = "`u{0110}".."`u{0114}" + $UnicodeRange.count | Should Be 5 + $UnicodeRange[0] | Should Be "`u{0110}"[0] + $UnicodeRange[1] | Should Be "`u{0111}"[0] + $UnicodeRange[2] | Should Be "`u{0112}"[0] + $UnicodeRange[3] | Should Be "`u{0113}"[0] + $UnicodeRange[4] | Should Be "`u{0114}"[0] + $UnicodeRange.Where({$_ -is [char]}).count | Should Be 5 + } + } + + Context "Range operator operand types" { + It "Range operator works on [decimal]" { + $Range = 1.1d..3.9d + $Range.count | Should Be 4 + $Range[0] | Should Be 1 + $Range[1] | Should Be 2 + $Range[2] | Should Be 3 + $Range[3] | Should Be 4 + $Range.Where({$_ -is [int]}).count | Should Be 4 + } + } +} From dc01301cea6f9babfe9b8586347974015440fa1d Mon Sep 17 00:00:00 2001 From: Mark Kraus Date: Wed, 1 Nov 2017 01:22:18 -0500 Subject: [PATCH 067/617] Fix PSUserAgent Generation Exception on Windows 7 (#5256) * Use Regex to Capture Windows Version --- .../commands/utility/WebCmdlet/PSUserAgent.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/PSUserAgent.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/PSUserAgent.cs index 3b2b5792390..7fd144c3e34 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/PSUserAgent.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/PSUserAgent.cs @@ -6,6 +6,7 @@ using System.Management.Automation; using System.Runtime.InteropServices; using System.Globalization; +using System.Text.RegularExpressions; namespace Microsoft.PowerShell.Commands { @@ -131,7 +132,8 @@ internal static string PlatformName // only generate the windows user agent once if(s_windowsUserAgent == null){ // find the version in the windows operating system description - string versionText = OS.Substring(OS.LastIndexOf(" ") +1); + Regex pattern = new Regex(@"\d+(\.\d+)+"); + string versionText = pattern.Match(OS).Value; Version windowsPlatformversion = new Version(versionText); s_windowsUserAgent = $"Windows NT {windowsPlatformversion.Major}.{windowsPlatformversion.Minor}"; } From aa2f6fbc2d109ca31b1d08dbf1fb5fedcd60419a Mon Sep 17 00:00:00 2001 From: Jason Shirk Date: Fri, 20 Oct 2017 19:28:02 -0700 Subject: [PATCH 068/617] Use Ast for context in parameter binding Previously we used IScriptPosition for context (e.g. error reporting) during parameter binding, but in some cases we want more information, so we'll use the Ast instead. This change just adds the Ast, it doesn't make explicit use of it. --- .../FormatAndOutput/common/BaseCommand.cs | 4 +- .../engine/CmdletParameterBinderController.cs | 34 +++++----- .../engine/CommandParameter.cs | 67 +++++++++++-------- .../engine/CommandProcessorBase.cs | 8 +-- .../MinishellParameterBinderController.cs | 30 ++++----- .../engine/ParameterBinderController.cs | 31 +++++---- .../engine/hostifaces/Parameter.cs | 13 ++-- .../engine/parser/Compiler.cs | 10 +-- .../engine/runtime/Operations/MiscOps.cs | 38 +++++------ .../engine/runtime/ScriptBlockToPowerShell.cs | 2 +- 10 files changed, 121 insertions(+), 116 deletions(-) diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/BaseCommand.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/BaseCommand.cs index 70e9c13c0da..736f5339997 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/BaseCommand.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/BaseCommand.cs @@ -62,8 +62,8 @@ internal void AddNamedParameter(string parameterName, object parameterValue) { _commandParameterList.Add( CommandParameterInternal.CreateParameterWithArgument( - PositionUtilities.EmptyExtent, parameterName, null, - PositionUtilities.EmptyExtent, parameterValue, + /*parameterAst*/null, parameterName, null, + /*argumentAst*/null, parameterValue, false)); } diff --git a/src/System.Management.Automation/engine/CmdletParameterBinderController.cs b/src/System.Management.Automation/engine/CmdletParameterBinderController.cs index b6ce8447185..6fd6062c966 100644 --- a/src/System.Management.Automation/engine/CmdletParameterBinderController.cs +++ b/src/System.Management.Automation/engine/CmdletParameterBinderController.cs @@ -450,8 +450,8 @@ private bool BindDefaultParameters(uint validParameterSetFlag, Dictionary + /// The ast of the parameter, if one was specified. + /// + internal Ast ParameterAst + { + get => _parameter?.ast; + } + /// /// The extent of the parameter, if one was specified. /// internal IScriptExtent ParameterExtent { - get { return _parameter != null ? _parameter.extent : PositionUtilities.EmptyExtent; } + get => ParameterAst?.Extent ?? PositionUtilities.EmptyExtent; + } + + /// + /// The ast of the optional argument, if one was specified. + /// + internal Ast ArgumentAst + { + get => _argument?.ast; } /// @@ -78,7 +94,7 @@ internal IScriptExtent ParameterExtent /// internal IScriptExtent ArgumentExtent { - get { return _argument != null ? _argument.extent : PositionUtilities.EmptyExtent; } + get => ArgumentAst?.Extent ?? PositionUtilities.EmptyExtent; } /// @@ -108,18 +124,16 @@ internal bool ArrayIsSingleArgumentForNativeCommand } /// - /// Set the argument value and extent. + /// Set the argument value and ast. /// - internal void SetArgumentValue(IScriptExtent extent, object value) + internal void SetArgumentValue(Ast ast, object value) { - Diagnostics.Assert(extent != null, "Caller to verify extent argument"); - if (_argument == null) { _argument = new Argument(); } _argument.value = value; - _argument.extent = extent; + _argument.ast = ast; } /// @@ -130,9 +144,8 @@ internal IScriptExtent ErrorExtent { get { - return _argument != null && _argument.extent != PositionUtilities.EmptyExtent - ? _argument.extent - : _parameter != null ? _parameter.extent : PositionUtilities.EmptyExtent; + var argExtent = ArgumentExtent; + return argExtent != PositionUtilities.EmptyExtent ? argExtent : ParameterExtent; } } @@ -141,42 +154,40 @@ internal IScriptExtent ErrorExtent /// /// Create a parameter when no argument has been specified. /// - /// The extent in script of the parameter. + /// The ast in script of the parameter. /// The parameter name (with no leading dash). /// The text of the parameter, as it did, or would, appear in script. internal static CommandParameterInternal CreateParameter( - IScriptExtent extent, string parameterName, - string parameterText) + string parameterText, + Ast ast = null) { - Diagnostics.Assert(extent != null, "Caller to verify extent argument"); return new CommandParameterInternal { _parameter = - new Parameter { extent = extent, parameterName = parameterName, parameterText = parameterText } + new Parameter { ast = ast, parameterName = parameterName, parameterText = parameterText } }; } /// /// Create a positional argument to a command. /// - /// The extent of the argument value in the script. /// The argument value. + /// The ast of the argument value in the script. /// True if the argument value is to be splatted, false otherwise. /// If the command is native, pass the string with commas instead of multiple arguments internal static CommandParameterInternal CreateArgument( - IScriptExtent extent, object value, + Ast ast = null, bool splatted = false, bool arrayIsSingleArgumentForNativeCommand = false) { - Diagnostics.Assert(extent != null, "Caller to verify extent argument"); return new CommandParameterInternal { _argument = new Argument { - extent = extent, value = value, + ast = ast, splatted = splatted, arrayIsSingleArgumentForNativeCommand = arrayIsSingleArgumentForNativeCommand } @@ -193,28 +204,26 @@ internal static CommandParameterInternal CreateArgument( /// * In the parameter binder when it resolves a positional argument /// * Other random places that manually construct command processors and know their arguments. /// - /// The extent in script of the parameter. + /// The ast in script of the parameter. /// The parameter name (with no leading dash). /// The text of the parameter, as it did, or would, appear in script. - /// The extent of the argument value in the script. + /// The ast of the argument value in the script. /// The argument value. /// Used in native commands to correctly handle -foo:bar vs. -foo: bar /// If the command is native, pass the string with commas instead of multiple arguments internal static CommandParameterInternal CreateParameterWithArgument( - IScriptExtent parameterExtent, + Ast parameterAst, string parameterName, string parameterText, - IScriptExtent argumentExtent, + Ast argumentAst, object value, bool spaceAfterParameter, bool arrayIsSingleArgumentForNativeCommand = false) { - Diagnostics.Assert(parameterExtent != null, "Caller to verify parameterExtent argument"); - Diagnostics.Assert(argumentExtent != null, "Caller to verify argumentExtent argument"); return new CommandParameterInternal { - _parameter = new Parameter { extent = parameterExtent, parameterName = parameterName, parameterText = parameterText }, - _argument = new Argument { extent = argumentExtent, value = value, arrayIsSingleArgumentForNativeCommand = arrayIsSingleArgumentForNativeCommand }, + _parameter = new Parameter { ast = parameterAst, parameterName = parameterName, parameterText = parameterText }, + _argument = new Argument { ast = argumentAst, value = value, arrayIsSingleArgumentForNativeCommand = arrayIsSingleArgumentForNativeCommand }, _spaceAfterParameter = spaceAfterParameter }; } diff --git a/src/System.Management.Automation/engine/CommandProcessorBase.cs b/src/System.Management.Automation/engine/CommandProcessorBase.cs index 924d1e858b2..f691b6d73e8 100644 --- a/src/System.Management.Automation/engine/CommandProcessorBase.cs +++ b/src/System.Management.Automation/engine/CommandProcessorBase.cs @@ -265,13 +265,13 @@ internal static CommandProcessorBase CreateGetHelpCommandProcessor( CommandProcessorBase helpCommandProcessor = context.CreateCommand("get-help", false); var cpi = CommandParameterInternal.CreateParameterWithArgument( - PositionUtilities.EmptyExtent, "Name", "-Name:", - PositionUtilities.EmptyExtent, helpTarget, + /*parameterAst*/null, "Name", "-Name:", + /*argumentAst*/null, helpTarget, false); helpCommandProcessor.AddParameter(cpi); cpi = CommandParameterInternal.CreateParameterWithArgument( - PositionUtilities.EmptyExtent, "Category", "-Category:", - PositionUtilities.EmptyExtent, helpCategory.ToString(), + /*parameterAst*/null, "Category", "-Category:", + /*argumentAst*/null, helpCategory.ToString(), false); helpCommandProcessor.AddParameter(cpi); return helpCommandProcessor; diff --git a/src/System.Management.Automation/engine/MinishellParameterBinderController.cs b/src/System.Management.Automation/engine/MinishellParameterBinderController.cs index ca06e2c6d07..5dd0e1f5ba4 100644 --- a/src/System.Management.Automation/engine/MinishellParameterBinderController.cs +++ b/src/System.Management.Automation/engine/MinishellParameterBinderController.cs @@ -136,9 +136,9 @@ internal Collection BindParameters(Collection - parameters[i - 1] = CommandParameterInternal.CreateParameter(parameter.ParameterExtent, EncodedCommandParameter, "-" + EncodedCommandParameter); + parameters[i - 1] = CommandParameterInternal.CreateParameter(EncodedCommandParameter, "-" + EncodedCommandParameter, parameter.ParameterAst); string encodedScript = StringToBase64Converter.StringToBase64String(argumentValue.ToString()); - parameters[i] = CommandParameterInternal.CreateArgument(scriptBlockArgument.ArgumentExtent, encodedScript); + parameters[i] = CommandParameterInternal.CreateArgument(encodedScript, scriptBlockArgument.ArgumentAst); } else if (InputFormatParameter.StartsWith(parameterName, StringComparison.OrdinalIgnoreCase)) { @@ -157,8 +157,8 @@ internal Collection BindParameters(Collection BindParameters(Collection BindParameters(Collection BindParameters(Collection string encodedScript = StringToBase64Converter.StringToBase64String(argumentValue.ToString()); parameters[i] = CommandParameterInternal.CreateParameterWithArgument( - parameter.ArgumentExtent, EncodedCommandParameter, "-" + EncodedCommandParameter, - parameter.ArgumentExtent, encodedScript, + parameter.ArgumentAst, EncodedCommandParameter, "-" + EncodedCommandParameter, + parameter.ArgumentAst, encodedScript, spaceAfterParameter: true, arrayIsSingleArgumentForNativeCommand: false); } } @@ -223,8 +223,8 @@ internal Collection BindParameters(Collection BindParameters(Collection BindParameters(Collection boundParameter in boundParameters) { CommandParameterInternal param = CommandParameterInternal.CreateParameterWithArgument( - PositionUtilities.EmptyExtent, boundParameter.Key, boundParameter.Key, - PositionUtilities.EmptyExtent, boundParameter.Value, false); + /*parameterAst*/null, boundParameter.Key, boundParameter.Key, + /*argumentAst*/null, boundParameter.Value, false); commandProcessor.AddParameter(param); } } @@ -358,28 +358,27 @@ internal static void AddArgumentsToCommandProcessor(CommandProcessorBase command if (colonIndex != -1 && colonIndex != paramText.Length - 1) { param = CommandParameterInternal.CreateParameterWithArgument( - PositionUtilities.EmptyExtent, paramText.Substring(1, colonIndex - 1), paramText, - PositionUtilities.EmptyExtent, paramText.Substring(colonIndex + 1).Trim(), + /*parameterAst*/null, paramText.Substring(1, colonIndex - 1), paramText, + /*argumentAst*/null, paramText.Substring(colonIndex + 1).Trim(), false); } else if (argIndex == arguments.Length - 1 || paramText[paramText.Length - 1] != ':') { param = CommandParameterInternal.CreateParameter( - PositionUtilities.EmptyExtent, paramText.Substring(1), paramText); + paramText.Substring(1), paramText); } else { param = CommandParameterInternal.CreateParameterWithArgument( - PositionUtilities.EmptyExtent, paramText.Substring(1, paramText.Length - 2), paramText, - PositionUtilities.EmptyExtent, arguments[argIndex + 1], + /*parameterAst*/null, paramText.Substring(1, paramText.Length - 2), paramText, + /*argumentAst*/null, arguments[argIndex + 1], false); argIndex++; } } else { - param = CommandParameterInternal.CreateArgument( - PositionUtilities.EmptyExtent, arguments[argIndex]); + param = CommandParameterInternal.CreateArgument(arguments[argIndex]); } commandProcessor.AddParameter(param); } @@ -841,8 +840,8 @@ out ParameterBindingException bindingException { CommandParameterInternal bindableArgument = CommandParameterInternal.CreateParameterWithArgument( - PositionUtilities.EmptyExtent, parameterName, "-" + parameterName + ":", - argument.ArgumentExtent, argument.ArgumentValue, + /*parameterAst*/null, parameterName, "-" + parameterName + ":", + argument.ArgumentAst, argument.ArgumentValue, false); bindResult = @@ -1173,8 +1172,8 @@ internal void BindUnboundScriptParameterWithDefaultValue(MergedCompiledCommandPa object result = spb.GetDefaultScriptParameterValue(runtimeDefinedParameter, implicitUsingParameters); SaveDefaultScriptParameterValue(parameter.Parameter.Name, result); CommandParameterInternal argument = CommandParameterInternal.CreateParameterWithArgument( - PositionUtilities.EmptyExtent, parameter.Parameter.Name, "-" + parameter.Parameter.Name + ":", - PositionUtilities.EmptyExtent, result, + /*parameterAst*/null, parameter.Parameter.Name, "-" + parameter.Parameter.Name + ":", + /*argumentAst*/null, result, false); ParameterBindingFlags flags = ParameterBindingFlags.IsDefaultValue; // Only coerce explicit values. We default to null, which isn't always convertible. diff --git a/src/System.Management.Automation/engine/hostifaces/Parameter.cs b/src/System.Management.Automation/engine/hostifaces/Parameter.cs index 49ab6cd7919..9818cb5ac19 100644 --- a/src/System.Management.Automation/engine/hostifaces/Parameter.cs +++ b/src/System.Management.Automation/engine/hostifaces/Parameter.cs @@ -134,7 +134,7 @@ internal static CommandParameterInternal ToCommandParameterInternal(CommandParam if (name == null) { - return CommandParameterInternal.CreateArgument(PositionUtilities.EmptyExtent, value); + return CommandParameterInternal.CreateArgument(value); } string parameterText; @@ -142,8 +142,8 @@ internal static CommandParameterInternal ToCommandParameterInternal(CommandParam { parameterText = forNativeCommand ? name : "-" + name; return CommandParameterInternal.CreateParameterWithArgument( - PositionUtilities.EmptyExtent, name, parameterText, - PositionUtilities.EmptyExtent, value, + /*parameterAst*/null, name, parameterText, + /*argumentAst*/null, value, true); } @@ -177,14 +177,13 @@ internal static CommandParameterInternal ToCommandParameterInternal(CommandParam if (!hasColon && value == null) { // just a name - return CommandParameterInternal.CreateParameter( - PositionUtilities.EmptyExtent, parameterName, parameterText); + return CommandParameterInternal.CreateParameter(parameterName, parameterText); } // name+value pair return CommandParameterInternal.CreateParameterWithArgument( - PositionUtilities.EmptyExtent, parameterName, parameterText, - PositionUtilities.EmptyExtent, value, + /*parameterAst*/null, parameterName, parameterText, + /*argumentAst*/null, value, spaceAfterParameter); } diff --git a/src/System.Management.Automation/engine/parser/Compiler.cs b/src/System.Management.Automation/engine/parser/Compiler.cs index a33f9ea7bb1..e782a38220e 100644 --- a/src/System.Management.Automation/engine/parser/Compiler.cs +++ b/src/System.Management.Automation/engine/parser/Compiler.cs @@ -3446,8 +3446,8 @@ public object VisitCommand(CommandAst commandAst) bool arrayIsSingleArgumentForNativeCommand = ArgumentIsNotReallyArrayIfCommandIsNative(element); elementExprs[i] = Expression.Call(CachedReflectionInfo.CommandParameterInternal_CreateArgument, - Expression.Constant(element.Extent), Expression.Convert(GetCommandArgumentExpression(element), typeof(object)), + Expression.Constant(element), ExpressionCache.Constant(splatted), ExpressionCache.Constant(arrayIsSingleArgumentForNativeCommand)); } @@ -3554,19 +3554,19 @@ public object VisitCommandParameter(CommandParameterAst commandParameterAst) errorPos.EndColumnNumber != arg.Extent.StartColumnNumber); bool arrayIsSingleArgumentForNativeCommand = ArgumentIsNotReallyArrayIfCommandIsNative(arg); return Expression.Call(CachedReflectionInfo.CommandParameterInternal_CreateParameterWithArgument, - Expression.Constant(errorPos), + Expression.Constant(commandParameterAst), Expression.Constant(commandParameterAst.ParameterName), Expression.Constant(errorPos.Text), - Expression.Constant(arg.Extent), + Expression.Constant(arg), Expression.Convert(GetCommandArgumentExpression(arg), typeof(object)), ExpressionCache.Constant(spaceAfterParameter), ExpressionCache.Constant(arrayIsSingleArgumentForNativeCommand)); } return Expression.Call(CachedReflectionInfo.CommandParameterInternal_CreateParameter, - Expression.Constant(errorPos), Expression.Constant(commandParameterAst.ParameterName), - Expression.Constant(errorPos.Text)); + Expression.Constant(errorPos.Text), + Expression.Constant(commandParameterAst)); } internal static Expression ThrowRuntimeError(string errorID, string resourceString, params Expression[] exceptionArgs) diff --git a/src/System.Management.Automation/engine/runtime/Operations/MiscOps.cs b/src/System.Management.Automation/engine/runtime/Operations/MiscOps.cs index 0e669eebfd9..df5fc5f837d 100644 --- a/src/System.Management.Automation/engine/runtime/Operations/MiscOps.cs +++ b/src/System.Management.Automation/engine/runtime/Operations/MiscOps.cs @@ -162,7 +162,7 @@ private static CommandProcessorBase AddCommand(PipelineProcessor pipe, if (cpi.ArgumentSplatted) { - foreach (var splattedCpi in Splat(cpi.ArgumentValue, cpi.ArgumentExtent)) + foreach (var splattedCpi in Splat(cpi.ArgumentValue, cpi.ArgumentAst)) { commandProcessor.AddParameter(splattedCpi); } @@ -293,7 +293,7 @@ private static CommandProcessorBase AddCommand(PipelineProcessor pipe, return commandProcessor; } - internal static IEnumerable Splat(object splattedValue, IScriptExtent splatExtent) + internal static IEnumerable Splat(object splattedValue, Ast splatAst) { splattedValue = PSObject.Base(splattedValue); IDictionary splattedTable = splattedValue as IDictionary; @@ -306,8 +306,8 @@ internal static IEnumerable Splat(object splattedValue string parameterText = GetParameterText(parameterName); yield return CommandParameterInternal.CreateParameterWithArgument( - splatExtent, parameterName, parameterText, - splatExtent, parameterValue, false); + splatAst, parameterName, parameterText, + splatAst, parameterValue, false); } } else @@ -317,17 +317,17 @@ internal static IEnumerable Splat(object splattedValue { foreach (object obj in enumerableValue) { - yield return SplatEnumerableElement(obj, splatExtent); + yield return SplatEnumerableElement(obj, splatAst); } } else { - yield return SplatEnumerableElement(splattedValue, splatExtent); + yield return SplatEnumerableElement(splattedValue, splatAst); } } } - private static CommandParameterInternal SplatEnumerableElement(object splattedArgument, IScriptExtent splatExtent) + private static CommandParameterInternal SplatEnumerableElement(object splattedArgument, Ast splatAst) { var psObject = splattedArgument as PSObject; if (psObject != null) @@ -336,11 +336,11 @@ private static CommandParameterInternal SplatEnumerableElement(object splattedAr var baseObj = psObject.BaseObject; if (prop != null && prop.Value is string && baseObj is string) { - return CommandParameterInternal.CreateParameter(splatExtent, (string)prop.Value, (string)baseObj); + return CommandParameterInternal.CreateParameter((string)prop.Value, (string)baseObj, splatAst); } } - return CommandParameterInternal.CreateArgument(splatExtent, splattedArgument); + return CommandParameterInternal.CreateArgument(splattedArgument, splatAst); } private static string GetParameterText(string parameterName) @@ -519,8 +519,8 @@ internal static void InvokePipelineInBackground( commandProcessor = context.CommandDiscovery.LookupCommandProcessor( commandInfo, CommandOrigin.Internal, false, context.EngineSessionState); var parameter = CommandParameterInternal.CreateParameterWithArgument( - pipelineAst.Extent, "ScriptBlock", null, - pipelineAst.Extent, sb, + /*parameterAst*/pipelineAst, "ScriptBlock", null, + /*argumentAst*/pipelineAst, sb, false); commandProcessor.AddParameter(parameter); pipelineProcessor.Add(commandProcessor); @@ -646,7 +646,7 @@ internal static SteppablePipeline GetSteppablePipeline(PipelineAst pipelineAst, var exprAst = (ExpressionAst)commandElement; var argument = Compiler.GetExpressionValue(exprAst, isTrusted, context); var splatting = (exprAst is VariableExpressionAst && ((VariableExpressionAst)exprAst).Splatted); - commandParameters.Add(CommandParameterInternal.CreateArgument(exprAst.Extent, argument, splatting)); + commandParameters.Add(CommandParameterInternal.CreateArgument(argument, exprAst, splatting)); } var redirections = new List(); @@ -709,14 +709,14 @@ private static CommandParameterInternal GetCommandParameter(CommandParameterAst if (argumentAst == null) { - return CommandParameterInternal.CreateParameter(errorPos, commandParameterAst.ParameterName, errorPos.Text); + return CommandParameterInternal.CreateParameter(commandParameterAst.ParameterName, errorPos.Text, commandParameterAst); } object argumentValue = Compiler.GetExpressionValue(argumentAst, isTrusted, context); bool spaceAfterParameter = (errorPos.EndLineNumber != argumentAst.Extent.StartLineNumber || errorPos.EndColumnNumber != argumentAst.Extent.StartColumnNumber); - return CommandParameterInternal.CreateParameterWithArgument(errorPos, commandParameterAst.ParameterName, - errorPos.Text, argumentAst.Extent, argumentValue, + return CommandParameterInternal.CreateParameterWithArgument(commandParameterAst, commandParameterAst.ParameterName, + errorPos.Text, argumentAst, argumentValue, spaceAfterParameter); } @@ -1115,16 +1115,16 @@ internal Pipe GetRedirectionPipe(ExecutionContext context, PipelineProcessor par // Unicode is still the default, but now may be overridden var cpi = CommandParameterInternal.CreateParameterWithArgument( - PositionUtilities.EmptyExtent, "Filepath", "-Filepath:", - PositionUtilities.EmptyExtent, File, + /*parameterAst*/null, "Filepath", "-Filepath:", + /*argumentAst*/null, File, false); commandProcessor.AddParameter(cpi); if (this.Appending) { cpi = CommandParameterInternal.CreateParameterWithArgument( - PositionUtilities.EmptyExtent, "Append", "-Append:", - PositionUtilities.EmptyExtent, true, + /*parameterAst*/null, "Append", "-Append:", + /*argumentAst*/null, true, false); commandProcessor.AddParameter(cpi); } diff --git a/src/System.Management.Automation/engine/runtime/ScriptBlockToPowerShell.cs b/src/System.Management.Automation/engine/runtime/ScriptBlockToPowerShell.cs index d86a8e9cada..774dfc834f7 100644 --- a/src/System.Management.Automation/engine/runtime/ScriptBlockToPowerShell.cs +++ b/src/System.Management.Automation/engine/runtime/ScriptBlockToPowerShell.cs @@ -742,7 +742,7 @@ private void GetSplattedVariable(VariableExpressionAst variableAst) // If it's an enumerable, then distribute the values as $args and finally // if it's a scalar, then the effect is equivalent to $var object splattedValue = _context.GetVariableValue(variableAst.VariablePath); - foreach (var splattedParameter in PipelineOps.Splat(splattedValue, variableAst.Extent)) + foreach (var splattedParameter in PipelineOps.Splat(splattedValue, variableAst)) { CommandParameter publicParameter = CommandParameter.FromCommandParameterInternal(splattedParameter); _powershell.AddParameter(publicParameter.Name, publicParameter.Value); From 6cbcf5dd3e32099b8ca0eea13a3a6cfe8577d4f9 Mon Sep 17 00:00:00 2001 From: Jason Shirk Date: Sat, 21 Oct 2017 17:25:31 -0700 Subject: [PATCH 069/617] Glob native command args only when not quoted Also fix some minor issues with exceptions being raised when resolving the path - falling back to no glob. Fix: #3931 #4971 --- .../engine/NativeCommandParameterBinder.cs | 204 ++++++++++-------- .../NativeUnixGlobbing.Tests.ps1 | 72 ++++++- 2 files changed, 181 insertions(+), 95 deletions(-) diff --git a/src/System.Management.Automation/engine/NativeCommandParameterBinder.cs b/src/System.Management.Automation/engine/NativeCommandParameterBinder.cs index 8df70f33b3e..e35e37316fa 100644 --- a/src/System.Management.Automation/engine/NativeCommandParameterBinder.cs +++ b/src/System.Management.Automation/engine/NativeCommandParameterBinder.cs @@ -2,13 +2,18 @@ Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ +using Microsoft.PowerShell.Commands; using System.Collections; using System.Collections.ObjectModel; +using System.IO; +using System.Linq; using System.Management.Automation.Internal; using System.Text; namespace System.Management.Automation { + using Language; + /// /// The parameter binder for native commands. /// @@ -79,7 +84,7 @@ internal void BindParameters(Collection parameters) if (parameter.ParameterNameSpecified) { Diagnostics.Assert(parameter.ParameterText.IndexOf(' ') == -1, "Parameters cannot have whitespace"); - _arguments.Append(parameter.ParameterText); + PossiblyGlobArg(parameter.ParameterText, usedQuotes: false); if (parameter.SpaceAfterParameter) { @@ -105,9 +110,23 @@ internal void BindParameters(Collection parameters) // windbg -k com:port=\\devbox\pipe\debug,pipe,resets=0,reconnect // The parser produced an array of strings but marked the parameter so we // can properly reconstruct the correct command line. + bool usedQuotes = false; + var pAst = parameter.ArgumentAst; + if (pAst != null) + { + if (pAst is StringConstantExpressionAst sce) + { + usedQuotes = sce.StringConstantType != StringConstantType.BareWord; + } + else if (pAst is ExpandableStringExpressionAst ese) + { + usedQuotes = ese.StringConstantType != StringConstantType.BareWord; + } + } appendOneNativeArgument(Context, argValue, parameter.ArrayIsSingleArgumentForNativeCommand ? ',' : ' ', - sawVerbatimArgumentMarker); + sawVerbatimArgumentMarker, + usedQuotes); } } } @@ -141,7 +160,8 @@ internal String Arguments /// The object to append /// A space or comma used when obj is enumerable /// true if the argument occurs after --% - private void appendOneNativeArgument(ExecutionContext context, object obj, char separator, bool sawVerbatimArgumentMarker) + /// True if the argument was a quoted string (single or double) + private void appendOneNativeArgument(ExecutionContext context, object obj, char separator, bool sawVerbatimArgumentMarker, bool usedQuotes) { IEnumerator list = LanguagePrimitives.GetEnumerator(obj); bool needSeparator = false; @@ -207,105 +227,103 @@ private void appendOneNativeArgument(ExecutionContext context, object obj, char } else { + PossiblyGlobArg(arg, usedQuotes); + } + } + } + } while (list != null); + } + + /// + /// On Windows, just append . + /// On Unix, do globbing as appropriate, otherwise just append . + /// + /// The argument that possibly needs expansion + /// True if the argument was a quoted string (single or double) + private void PossiblyGlobArg(string arg, bool usedQuotes) + { + var argExpanded = false; + #if UNIX - // On UNIX systems, we expand arguments containing wildcard expressions against - // the file system just like bash, etc. - if (System.Management.Automation.WildcardPattern.ContainsWildcardCharacters(arg)) - { - // See if the current working directory is a filesystem provider location - // We won't do the expansion if it isn't since native commands can only access the file system. - var cwdinfo = Context.EngineSessionState.CurrentLocation; + // On UNIX systems, we expand arguments containing wildcard expressions against + // the file system just like bash, etc. + if (!usedQuotes && WildcardPattern.ContainsWildcardCharacters(arg)) + { + // See if the current working directory is a filesystem provider location + // We won't do the expansion if it isn't since native commands can only access the file system. + var cwdinfo = Context.EngineSessionState.CurrentLocation; + + // If it's a filesystem location then expand the wildcards + if (cwdinfo.Provider.Name.Equals(FileSystemProvider.ProviderName, StringComparison.OrdinalIgnoreCase)) + { + // On UNIX, paths starting with ~ are not normalized + bool normalizePath = arg.Length == 0 || arg[0] != '~'; - // If it's a filesystem location then expand the wildcards - if (string.Equals(cwdinfo.Provider.Name, Microsoft.PowerShell.Commands.FileSystemProvider.ProviderName, - StringComparison.OrdinalIgnoreCase)) - { - bool normalizePath = true; - // On UNIX, paths starting with ~ are not normalized - if (arg.Length > 0 && arg[0] == '~') - { - normalizePath = false; - } + // See if there are any matching paths otherwise just add the pattern as the argument + Collection paths = null; + try + { + paths = Context.EngineSessionState.InvokeProvider.ChildItem.Get(arg, false); + } + catch + { + // Fallthrough will append the pattern unchanged. + } - // See if there are any matching paths otherwise just add the pattern as the argument - var paths = Context.EngineSessionState.InvokeProvider.ChildItem.Get(arg, false); - if (paths.Count > 0) - { - bool first = true; - foreach (var path in paths) - { - object pbo = path.BaseObject; - if (! first) - { - _arguments.Append(" "); - } - else - { - if (! (pbo is System.IO.FileSystemInfo)) - { - // If the object is not a filesystem object, then just append - // the pattern unchanged - _arguments.Append(arg); - break; - } - first = false; - } - var expandedPath = (pbo as System.IO.FileSystemInfo).FullName; - if (normalizePath) - { - expandedPath = Context.SessionState.Path.NormalizeRelativePath(expandedPath, cwdinfo.ProviderPath); - } - // If the path contains spaces, then add quotes around it. - if (NeedQuotes(expandedPath)) - { - _arguments.Append("\""); - _arguments.Append(expandedPath); - _arguments.Append("\""); - } - else - { - _arguments.Append(expandedPath); - } - } - } - else - { - _arguments.Append(arg); - } - } - else - { - _arguments.Append(arg); - } + // Expand paths, but only from the file system. + if (paths?.Count > 0 && paths.All(p => p.BaseObject is FileSystemInfo)) + { + var sep = ""; + foreach (var path in paths) + { + _arguments.Append(sep); + sep = " "; + var expandedPath = (path.BaseObject as FileSystemInfo).FullName; + if (normalizePath) + { + expandedPath = + Context.SessionState.Path.NormalizeRelativePath(expandedPath, cwdinfo.ProviderPath); + } + // If the path contains spaces, then add quotes around it. + if (NeedQuotes(expandedPath)) + { + _arguments.Append("\""); + _arguments.Append(expandedPath); + _arguments.Append("\""); } else { - // Even if there are no wildcards, we still need to possibly - // expand ~ into the filesystem provider home directory path - ProviderInfo fileSystemProvider = Context.EngineSessionState.GetSingleProvider( - Microsoft.PowerShell.Commands.FileSystemProvider.ProviderName); - string home = fileSystemProvider.Home; - if (string.Equals(arg, "~")) - { - _arguments.Append(home); - } - else if (arg.StartsWith("~/", StringComparison.OrdinalIgnoreCase)) - { - var replacementString = home + arg.Substring(1); - _arguments.Append(replacementString); - } - else - { - _arguments.Append(arg); - } + _arguments.Append(expandedPath); } -#else - _arguments.Append(arg); -#endif + argExpanded = true; } } } - } while (list != null); + } + else if (!usedQuotes) + { + // Even if there are no wildcards, we still need to possibly + // expand ~ into the filesystem provider home directory path + ProviderInfo fileSystemProvider = Context.EngineSessionState.GetSingleProvider(FileSystemProvider.ProviderName); + string home = fileSystemProvider.Home; + if (string.Equals(arg, "~")) + { + _arguments.Append(home); + argExpanded = true; + } + else if (arg.StartsWith("~/", StringComparison.OrdinalIgnoreCase)) + { + var replacementString = home + arg.Substring(1); + _arguments.Append(replacementString); + argExpanded = true; + } + } +#endif // UNIX + + if (!argExpanded) + { + _arguments.Append(arg); + } } /// @@ -336,6 +354,6 @@ internal static bool NeedQuotes(string stringToCheck) /// The native command to bind to /// private NativeCommand _nativeCommand; - #endregion private members +#endregion private members } } // namespace System.Management.Automation diff --git a/test/powershell/Language/Scripting/NativeExecution/NativeUnixGlobbing.Tests.ps1 b/test/powershell/Language/Scripting/NativeExecution/NativeUnixGlobbing.Tests.ps1 index c18d75c4645..1adeba86040 100644 --- a/test/powershell/Language/Scripting/NativeExecution/NativeUnixGlobbing.Tests.ps1 +++ b/test/powershell/Language/Scripting/NativeExecution/NativeUnixGlobbing.Tests.ps1 @@ -35,8 +35,70 @@ Describe 'Native UNIX globbing tests' -tags "CI" { It 'Globbing [cde]b?.* should return one file name "cbb.txt"' { /bin/ls $TESTDRIVE/[cde]b?.* | Should Match "cbb.txt" } - It 'Should return the original pattern if there are no matches' { - /bin/echo $TESTDRIVE/*.nosuchfile | Should Match "\*\.nosuchfile$" + # Test globbing with expressions + It 'Globbing should work with unquoted expressions' { + $v = "$TESTDRIVE/abc*" + /bin/ls $v | Should Match "abc.txt" + + $h = [pscustomobject]@{P=$v} + /bin/ls $h.P | Should Match "abc.txt" + + $a = $v,$v + /bin/ls $a[1] | Should Match "abc.txt" + } + It 'Globbing should not happen with quoted expressions' { + $v = "$TESTDRIVE/abc*" + /bin/echo "$v" | Should BeExactly $v + /bin/echo '$v' | Should BeExactly '$v' + } + It 'Should return the original pattern () if there are no matches' -TestCases @( + @{arg = '/nOSuCH*file'}, # No matching file + @{arg = '/bin/nOSuCHdir/*'}, # Directory doesn't exist + @{arg = '-NosUch*fIle'}, # Parameter syntax but could be file + @{arg = '-nOsuCh*drive:nosUch*fIle'}, # Parameter w/ arg syntax, could specify drive + @{arg = '-nOs[u]ChdrIve:nosUch*fIle'}, # Parameter w/ arg syntax, could specify drive + @{arg = '-nOsuChdRive:nosUch*fIle'}, # Parameter w/ arg syntax, could specify drive + @{arg = '-nOsuChdRive: nosUch*fIle'}, # Parameter w/ arg syntax, could specify drive + @{arg = '/no[suchFilE'}, # Invalid wildcard (no closing ']') + @{arg = '[]'} # Invalid wildcard + ) { + param($arg) + /bin/echo $arg | Should BeExactly $arg + } + $quoteTests = @( + @{arg = '"*"'}, + @{arg = "'*'"} + ) + It 'Should not expand quoted strings: ' -TestCases $quoteTests { + param($arg) + Invoke-Expression "/bin/echo $arg" | Should BeExactly '*' + } + # Splat tests are skipped because they should work, but don't. + # Supporting this scenario would require adding a NoteProperty + # to each quoted string argument - maybe not worth it, and maybe + # an argument for another way to suppress globbing. + It 'Should not expand quoted strings via splat array: ' -TestCases $quoteTests -Skip { + param($arg) + + function Invoke-Echo + { + /bin/echo @args + } + Invoke-Expression "Invoke-Echo $arg" | Should BeExactly '*' + } + It 'Should not expand quoted strings via splat hash: ' -TestCases $quoteTests -Skip { + param($arg) + + function Invoke-Echo($quotedArg) + { + /bin/echo @PSBoundParameters + } + Invoke-Expression "Invoke-Echo -quotedArg:$arg" | Should BeExactly "-quotedArg:*" + + # When specifing a space after the parameter, the space is removed when splatting. + # This behavior is debatable, but it's worth adding this test anyway to detect + # a change in behavior. + Invoke-Expression "Invoke-Echo -quotedArg: $arg" | Should BeExactly "-quotedArg:*" } # Test the behavior in non-filesystem drives It 'Should not expand patterns on non-filesystem drives' { @@ -56,4 +118,10 @@ Describe 'Native UNIX globbing tests' -tags "CI" { It '~/foo should be replaced by the /foo' { /bin/echo ~/foo | Should BeExactly "$($executioncontext.SessionState.Provider.Get("FileSystem").Home)/foo" } + It '~ should not be replaced when quoted' { + /bin/echo '~' | Should BeExactly '~' + /bin/echo "~" | Should BeExactly '~' + /bin/echo '~/foo' | Should BeExactly '~/foo' + /bin/echo "~/foo" | Should BeExactly '~/foo' + } } From d43b2cf958805ab12906c682f5d75ba01641cb47 Mon Sep 17 00:00:00 2001 From: "James Truher [MSFT]" Date: Wed, 1 Nov 2017 10:59:41 -0700 Subject: [PATCH 070/617] Remove DCOM support from *-Computer cmdlets (#5277) Since DCOM is not supported in corefx there was a great deal of dead code in the computer cmdlets. This PR removes all vestiges of DCOM support from: - Rename-Computer - Restart-Computer - Stop-Computer removing about 4500 lines of dead code. Also, tests are updated to provide more complete coverage. I also removed test-connection completely to make way for @iSazonov upcoming PR to improve coverage in tests, I created some test hook code which will test the cmdlet code without actually calling the WMI method to restart/rename/stop the system --- .../commands/management/Computer.cs | 7088 +++-------------- .../resources/ComputerResources.resx | 30 - .../Microsoft.PowerShell.Management.psd1 | 1 - .../engine/Utils.cs | 10 +- .../Rename-Computer.Tests.ps1 | 79 + .../Restart-Computer.Tests.ps1 | 99 + .../Stop-Computer.Tests.ps1 | 58 + .../Test-Connection.Tests.ps1 | 39 - .../Unimplemented-Cmdlet.Tests.ps1 | 2 - .../engine/Basic/DefaultCommands.Tests.ps1 | 1 - .../Modules/HelpersCommon/HelpersCommon.psd1 | 2 +- .../Modules/HelpersCommon/HelpersCommon.psm1 | 55 + 12 files changed, 1489 insertions(+), 5975 deletions(-) create mode 100644 test/powershell/Modules/Microsoft.PowerShell.Management/Rename-Computer.Tests.ps1 create mode 100644 test/powershell/Modules/Microsoft.PowerShell.Management/Restart-Computer.Tests.ps1 create mode 100644 test/powershell/Modules/Microsoft.PowerShell.Management/Stop-Computer.Tests.ps1 delete mode 100644 test/powershell/Modules/Microsoft.PowerShell.Management/Test-Connection.Tests.ps1 diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/Computer.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/Computer.cs index 87da21820d6..744849d3d99 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/Computer.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/Computer.cs @@ -27,15 +27,7 @@ using Microsoft.Management.Infrastructure.Options; using System.Linq; using Dbg = System.Management.Automation; - -#if CORECLR using Microsoft.PowerShell.CoreClr.Stubs; -#else -//TODO:CORECLR System.DirectoryServices is not available on CORE CLR -using System.DirectoryServices; -using System.Management; // We are not porting the library to CoreCLR -using Microsoft.WSMan.Management; -#endif // FxCop suppressions for resource strings: [module: SuppressMessage("Microsoft.Naming", "CA1703:ResourceStringsShouldBeSpelledCorrectly", Scope = "resource", Target = "ComputerResources.resources", MessageId = "unjoined")] @@ -43,118 +35,181 @@ namespace Microsoft.PowerShell.Commands { -#region Test-Connection +#region Restart-Computer /// - /// This cmdlet is used to test whether a particular host is reachable across an - /// IP network. It works by sending ICMP "echo request" packets to the target - /// host and listening for ICMP "echo response" replies. This cmdlet prints a - /// statistical summary when finished. + /// This exception is thrown when the timeout expires before a computer finishes restarting /// - [Cmdlet(VerbsDiagnostic.Test, "Connection", DefaultParameterSetName = RegularParameterSet, - HelpUri = "https://go.microsoft.com/fwlink/?LinkID=135266", RemotingCapability = RemotingCapability.OwnedByCommand)] - [OutputType(typeof(Boolean))] - [OutputType(@"System.Management.ManagementObject#root\cimv2\Win32_PingStatus")] - public class TestConnectionCommand : PSCmdlet + [Serializable] + public sealed class RestartComputerTimeoutException : RuntimeException { -#region "Parameters" + /// + /// Name of the computer that is restarting + /// + public string ComputerName { get; private set; } + + /// + /// The timeout value specified by the user. It indicates the seconds to wait before timeout. + /// + public int Timeout { get; private set; } + + /// + /// Construct a RestartComputerTimeoutException. + /// + /// + /// + /// + /// + internal RestartComputerTimeoutException(string computerName, int timeout, string message, string errorId) + : base(message) + { + SetErrorId(errorId); + SetErrorCategory(ErrorCategory.OperationTimeout); + ComputerName = computerName; + Timeout = timeout; + } - private const string RegularParameterSet = "Default"; - private const string QuietParameterSet = "Quiet"; - private const string SourceParameterSet = "Source"; + /// + /// Construct a RestartComputerTimeoutException + /// + public RestartComputerTimeoutException() : base() { } /// + /// Constructs a RestartComputerTimeoutException + /// /// + /// + /// The message used in the exception. + /// + public RestartComputerTimeoutException(string message) : base(message) { } + + /// + /// Constructs a RestartComputerTimeoutException /// - [Parameter(ParameterSetName = SourceParameterSet)] - [Parameter(ParameterSetName = RegularParameterSet)] - public SwitchParameter AsJob { get; set; } = false; + /// + /// + /// The message used in the exception. + /// + /// + /// + /// An exception that led to this exception. + /// + public RestartComputerTimeoutException(string message, Exception innerException) : base(message, innerException) { } +#region Serialization /// - /// The following is the definition of the input parameter "DcomAuthentication". - /// Specifies the authentication level to be used with WMI connection. Valid - /// values are: + /// Serialization constructor for class RestartComputerTimeoutException + /// + /// + /// + /// serialization information + /// /// - /// Unchanged = -1, - /// Default = 0, - /// None = 1, - /// Connect = 2, - /// Call = 3, - /// Packet = 4, - /// PacketIntegrity = 5, - /// PacketPrivacy = 6. + /// + /// streaming context + /// + private RestartComputerTimeoutException(SerializationInfo info, StreamingContext context) + : base(info, context) + { + if (info == null) + { + throw new PSArgumentNullException("info"); + } + + ComputerName = info.GetString("ComputerName"); + Timeout = info.GetInt32("Timeout"); + } + + /// + /// Serializes the RestartComputerTimeoutException. /// + /// + /// + /// serialization information + /// + /// + /// + /// streaming context + /// + [SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)] + public override void GetObjectData(SerializationInfo info, StreamingContext context) + { + if (info == null) + { + throw new PSArgumentNullException("info"); + } - [Parameter] - [Alias("Authentication")] - public AuthenticationLevel DcomAuthentication { get; set; } = AuthenticationLevel.Packet; + base.GetObjectData(info, context); + info.AddValue("ComputerName", ComputerName); + info.AddValue("Timeout", Timeout); + } +#endregion Serialization + } + /// + /// Defines the services that Restart-Computer can wait on + /// + [SuppressMessage("Microsoft.Design", "CA1027:MarkEnumsWithFlags")] + public enum WaitForServiceTypes + { /// - /// The authentication options for CIM_WSMan connection + /// Wait for the WMI service to be ready /// - [Parameter] - [ValidateSet( - "Default", - "Basic", - "Negotiate", // can be used with and without credential (without -> PSRP mapped to NegotiateWithImplicitCredential) - "CredSSP", - "Digest", - "Kerberos")] // can be used with and without credential (not sure about implications) - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly")] - public string WsmanAuthentication { get; set; } = "Default"; + Wmi = 0x0, /// - /// Specify the protocol to use + /// Wait for the WinRM service to be ready /// - [Parameter] - [ValidateSet(ComputerWMIHelper.DcomProtocol, ComputerWMIHelper.WsmanProtocol)] - public string Protocol { get; set; } = -#if CORECLR - //CoreClr does not support DCOM protocol - // This change makes sure that the the command works seamlessly if user did not explicitly entered the protocol - ComputerWMIHelper.WsmanProtocol; -#else - ComputerWMIHelper.DcomProtocol; -#endif + WinRM = 0x1, /// - /// The following is the definition of the input parameter "BufferSize". - /// Buffer size sent with the this command. The default value is 32. + /// Wait for the PowerShell to be ready /// - [Parameter] - [Alias("Size", "Bytes", "BS")] - [ValidateRange((int)0, (int)65500)] - public Int32 BufferSize { get; set; } = 32; + PowerShell = 0x2, + } + + /// + /// Restarts the computer + /// + [Cmdlet(VerbsLifecycle.Restart, "Computer", SupportsShouldProcess = true, DefaultParameterSetName = DefaultParameterSet, + HelpUri = "https://go.microsoft.com/fwlink/?LinkID=135253", RemotingCapability = RemotingCapability.OwnedByCommand)] + public class RestartComputerCommand : PSCmdlet, IDisposable + { +#region "Parameters and PrivateData" + + private const string DefaultParameterSet = "DefaultSet"; + private const int forcedReboot = 6; // see https://msdn.microsoft.com/en-us/library/aa394058(v=vs.85).aspx /// - /// The following is the definition of the input parameter "TimeOut". - /// Time-out value in milliseconds. If a response is not received in this time, no response is assumed. The default is 1000 milliseconds. + /// The authentication options for CIM_WSMan connection /// - [Parameter] - [ValidateRange((int)1, Int32.MaxValue)] - public Int32 TimeOut { get; set; } = 1000; + [Parameter(ParameterSetName = DefaultParameterSet)] + [ValidateSet( + "Default", + "Basic", + "Negotiate", // can be used with and without credential (without -> PSRP mapped to NegotiateWithImplicitCredential) + "CredSSP", + "Digest", + "Kerberos")] // can be used with explicit or implicit credential + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly")] + public string WsmanAuthentication { get; set; } /// - /// The following is the definition of the input parameter "ComputerName". - /// Value of the address requested. The form of the value can be either the - /// computer name ("wxyz1234"), IPv4 address ("192.168.177.124"), or IPv6 - /// address ("2010:836B:4179::836B:4179"). + /// Specifies the computer (s)Name on which this command is executed. + /// When this parameter is omitted, this cmdlet restarts the local computer. + /// Type the NETBIOS name, IP address, or fully-qualified domain name of one + /// or more computers in a comma-separated list. To specify the local computer, type the computername or "localhost". /// - [Parameter(Mandatory = true, - Position = 0, + [Parameter(Position = 0, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true)] [ValidateNotNullOrEmpty] [SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays")] - [Alias("CN", "IPAddress", "__SERVER", "Server", "Destination")] - public String[] ComputerName { get; set; } + [Alias("CN", "__SERVER", "Server", "IPAddress")] + public String[] ComputerName { get; set; } = new string[] { "." }; - /// - /// The following is the definition of the input parameter "Count". - /// Number of echo requests to send. - /// - [Parameter] - [ValidateRange(1, UInt32.MaxValue)] - public Int32 Count { get; set; } = 4; + private List _validatedComputerNames = new List(); + private readonly List _waitOnComputers = new List(); + private readonly HashSet _uniqueComputerNames = new HashSet(StringComparer.OrdinalIgnoreCase); /// /// The following is the definition of the input parameter "Credential". @@ -162,539 +217,156 @@ public class TestConnectionCommand : PSCmdlet /// user-name, such as "User01" or "Domain01\User01", or enter a PSCredential /// object, such as one from the Get-Credential cmdlet /// - [Parameter(ParameterSetName = SourceParameterSet, Mandatory = false)] + [Parameter(Position = 1)] [ValidateNotNullOrEmpty] [Credential] public PSCredential Credential { get; set; } /// - /// The following is the definition of the input parameter "FromComputerName". - /// Specifies the Computer names where the ping request is originated from. + /// Using Force in conjunction with Reboot on a + /// remote computer immediately reboots the remote computer. /// - [Parameter(Position = 1, ParameterSetName = SourceParameterSet, Mandatory = true)] - [ValidateNotNullOrEmpty] - [SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays")] - [Alias("FCN", "SRC")] - public String[] Source { get; set; } = new string[] { "." }; + [Parameter] + [Alias("f")] + public SwitchParameter Force { get; set; } /// - /// The following is the definition of the input parameter "Impersonation". - /// Specifies the impersonation level to use when calling the WMI method. Valid - /// values are: - /// - /// Default = 0, - /// Anonymous = 1, - /// Identify = 2, - /// Impersonate = 3, - /// Delegate = 4. + /// Specify the Wait parameter. Prompt will be blocked is the Timeout is not 0 /// - [Parameter] - public ImpersonationLevel Impersonation { get; set; } = ImpersonationLevel.Impersonate; + [Parameter(ParameterSetName = DefaultParameterSet)] + public SwitchParameter Wait { get; set; } /// - /// The following is the definition of the input parameter "ThrottleLimit". - /// The number of concurrent computers on which the command will be allowed to - /// execute + /// Specify the Timeout parameter. + /// Negative value indicates wait infinitely. + /// Positive value indicates the seconds to wait before timeout. /// - [Parameter(ParameterSetName = SourceParameterSet)] - [Parameter(ParameterSetName = RegularParameterSet)] - [ValidateRange(int.MinValue, (int)1000)] - public Int32 ThrottleLimit + [Parameter(ParameterSetName = DefaultParameterSet)] + [Alias("TimeoutSec")] + [ValidateRange(-1, int.MaxValue)] + public int Timeout { - get { return throttlelimit; } + get { return _timeout; } set { - throttlelimit = value; - if (throttlelimit <= 0) - throttlelimit = 32; + _timeout = value; + _timeoutSpecified = true; } } - private Int32 throttlelimit = 32; + private int _timeout = -1; + private bool _timeoutSpecified = false; /// - /// The following is the definition of the input parameter "TimeToLive". - /// Life span of the packet in seconds. The value is treated as an upper limit. - /// All routers must decrement this value by 1 (one). When this value becomes 0 - /// (zero), the packet is dropped by the router. The default value is 80 - /// seconds. The hops between routers rarely take this amount of time. + /// Specify the For parameter. + /// Wait for the specific service before unblocking the prompt. /// - [Parameter] - [ValidateRange(1, (int)255)] - [Alias("TTL")] - public Int32 TimeToLive { get; set; } = 80; + [Parameter(ParameterSetName = DefaultParameterSet)] + public WaitForServiceTypes For + { + get { return _waitFor; } + set + { + _waitFor = value; + _waitForSpecified = true; + } + } + private WaitForServiceTypes _waitFor = WaitForServiceTypes.PowerShell; + private bool _waitForSpecified = false; /// - /// delay parameter + /// Specify the Delay parameter. + /// The specific time interval (in second) to wait between network pings or service queries. /// - [Parameter] - [ValidateRange(1, 60)] - public Int32 Delay { get; set; } = 1; + [Parameter(ParameterSetName = DefaultParameterSet)] + [ValidateRange(1, Int16.MaxValue)] + public Int16 Delay + { + get { return (Int16)_delay; } + set + { + _delay = value; + _delaySpecified = true; + } + } + private int _delay = 5; + private bool _delaySpecified = false; /// - /// quiet parameter + /// Script to test if the PowerShell is ready /// - [Parameter(ParameterSetName = QuietParameterSet)] - public SwitchParameter Quiet - { - get { return quiet; } - set { quiet = value; } - } - private bool quiet = false; + private const string TestPowershellScript = @" +$array = @($input) +$result = @{} +foreach ($computerName in $array[1]) +{ + $ret = $null + $arguments = @{ + ComputerName = $computerName + ScriptBlock = { $true } + SessionOption = NewPSSessionOption -NoMachineProfile + ErrorAction = 'SilentlyContinue' + } + if ( $null -ne $array[0] ) + { + $arguments['Credential'] = $array[0] + } + $result[$computerName] = (Invoke-Command @arguments) -as [bool] +} +$result +"; -#endregion "parameters" -#region "Overrides" + /// + /// The indicator to use when show progress + /// + private string[] _indicator = { "|", "/", "-", "\\" }; -#if !CORECLR - ///// - ///// To Store the output for each ping reply - ///// - private ManagementObjectSearcher searcher; + /// + /// The activity id + /// + private int _activityId; -#endif - private TransportProtocol _transportProtocol = TransportProtocol.DCOM; - private readonly CancellationTokenSource cancel = new CancellationTokenSource(); - private Dictionary quietResults = new Dictionary(); /// - /// To begin processing Test-connection + /// After call 'Shutdown' on the target computer, wait a few + /// seconds for the restart to begin. /// - protected override void BeginProcessing() - { - base.BeginProcessing(); - // Verify parameter set + private const int SecondsToWaitForRestartToBegin = 25; - bool haveProtocolParam = this.MyInvocation.BoundParameters.ContainsKey("Protocol"); - bool haveWsmanAuthenticationParam = this.MyInvocation.BoundParameters.ContainsKey("WsmanAuthentication"); - bool haveDcomAuthenticationParam = this.MyInvocation.BoundParameters.ContainsKey("DcomAuthentication"); - bool haveDcomImpersonation = this.MyInvocation.BoundParameters.ContainsKey("Impersonation"); - _transportProtocol = (this.Protocol.Equals(ComputerWMIHelper.WsmanProtocol, StringComparison.OrdinalIgnoreCase) || (haveWsmanAuthenticationParam && !haveProtocolParam)) ? - TransportProtocol.WSMan : TransportProtocol.DCOM; + /// + /// Actual time out in seconds + /// + private int _timeoutInMilliseconds; - if (haveWsmanAuthenticationParam && (haveDcomAuthenticationParam || haveDcomImpersonation)) - { - string errMsg = StringUtil.Format(ComputerResources.StopCommandParamWSManAuthConflict, ComputerResources.StopCommandParamMessage); - ThrowTerminatingError( - new ErrorRecord( - new PSArgumentException(errMsg), - "InvalidParameter", - ErrorCategory.InvalidArgument, - this)); - } - - if ((_transportProtocol == TransportProtocol.DCOM) && haveWsmanAuthenticationParam) - { - string errMsg = StringUtil.Format(ComputerResources.StopCommandWSManAuthProtocolConflict, ComputerResources.StopCommandParamMessage); - ThrowTerminatingError( - new ErrorRecord( - new PSArgumentException(errMsg), - "InvalidParameter", - ErrorCategory.InvalidArgument, - this)); - } - - if ((_transportProtocol == TransportProtocol.WSMan) && (haveDcomAuthenticationParam || haveDcomImpersonation)) - { - string errMsg = StringUtil.Format(ComputerResources.StopCommandAuthProtocolConflict, ComputerResources.StopCommandParamMessage); - ThrowTerminatingError( - new ErrorRecord( - new PSArgumentException(errMsg), - "InvalidParameter", - ErrorCategory.InvalidArgument, - this)); - } - -#if CORECLR - if (this.MyInvocation.BoundParameters.ContainsKey("DcomAuthentication")) - { - string errMsg = StringUtil.Format(ComputerResources.InvalidParameterForCoreClr, "DcomAuthentication"); - PSArgumentException ex = new PSArgumentException(errMsg, ComputerResources.InvalidParameterForCoreClr); - ThrowTerminatingError(new ErrorRecord(ex, "InvalidParameterForCoreClr", ErrorCategory.InvalidArgument, null)); - } - - if (this.MyInvocation.BoundParameters.ContainsKey("Impersonation")) - { - string errMsg = StringUtil.Format(ComputerResources.InvalidParameterForCoreClr, "Impersonation"); - PSArgumentException ex = new PSArgumentException(errMsg, ComputerResources.InvalidParameterForCoreClr); - ThrowTerminatingError(new ErrorRecord(ex, "InvalidParameterForCoreClr", ErrorCategory.InvalidArgument, null)); - } - - if(this.Protocol.Equals(ComputerWMIHelper.DcomProtocol , StringComparison.OrdinalIgnoreCase)) - { - InvalidOperationException ex = new InvalidOperationException(ComputerResources.InvalidParameterDCOMNotSupported); - ThrowTerminatingError(new ErrorRecord(ex, "InvalidParameterDCOMNotSupported", ErrorCategory.InvalidOperation, null)); - } -#endif - - - //testing - } /// - /// Process Record + /// Indicate to exit /// - protected override void ProcessRecord() - { - switch (_transportProtocol) - { -#if !CORECLR - case TransportProtocol.DCOM: - processDCOMProtocolForTestConnection(); - break; -#endif + private bool _exit, _timeUp; + private readonly CancellationTokenSource _cancel = new CancellationTokenSource(); - case TransportProtocol.WSMan: - ProcessWSManProtocolForTestConnection(); - break; - } - } /// - /// to implement ^C + /// A waithandler to wait on. Current thread will wait on it during the delay interval. /// - protected override void StopProcessing() - { -#if !CORECLR - ManagementObjectSearcher stopSearcher = searcher; - if (stopSearcher != null) - { - try - { - stopSearcher.Dispose(); - } - catch (ObjectDisposedException) { } - } -#endif - try - { - cancel.Cancel(); - } - catch (ObjectDisposedException) { } - catch (AggregateException) { } - } -#endregion - -#region "Private Methods " - private string QueryString(string[] machinenames, bool escaperequired, bool selectrequired) - { - StringBuilder FilterString = new StringBuilder(); - if (selectrequired) - { - FilterString.Append("Select * from "); - FilterString.Append(ComputerWMIHelper.WMI_Class_PingStatus); - FilterString.Append(" where "); - } - FilterString.Append("(("); - for (int i = 0; i <= machinenames.Length - 1; i++) - { - FilterString.Append("Address='"); - string EscapeComp = machinenames[i].ToString(); - if (EscapeComp.Equals(".", StringComparison.CurrentCultureIgnoreCase)) - EscapeComp = "localhost"; - if (escaperequired) - { - EscapeComp = EscapeComp.Replace("\\", "\\\\'").ToString(); - EscapeComp = EscapeComp.Replace("'", "\\'").ToString(); - } - FilterString.Append(EscapeComp.ToString()); - FilterString.Append("'"); - if (i < machinenames.Length - 1) - { - FilterString.Append(" Or "); - } - } - FilterString.Append(")"); - FilterString.Append(" And "); - FilterString.Append("TimeToLive="); - FilterString.Append(TimeToLive); - FilterString.Append(" And "); - FilterString.Append("BufferSize="); - FilterString.Append(BufferSize); - FilterString.Append(" And "); - FilterString.Append("TimeOut="); - FilterString.Append(TimeOut); - FilterString.Append(")"); - return FilterString.ToString(); - } - private void ProcessPingStatus(Object pingStatusObj) - { - Dbg.Diagnostics.Assert(pingStatusObj != null, "Caller should verify that pingStatus != null"); - //Dbg.Diagnostics.Assert(pingStatusObj.ClassPath.ClassName.Equals("Win32_PingStatus"), "Caller should verify that pingStatus is a Win32_PingStatus object"); - string destinationAddress = null; - UInt32 primaryAddressResolutionStatus; - UInt32 statusCode; -#if !CORECLR - if (_transportProtocol == TransportProtocol.DCOM) - { - ManagementBaseObject pingStatus = (ManagementBaseObject)pingStatusObj; - - destinationAddress = (string)LanguagePrimitives.ConvertTo( - pingStatus.GetPropertyValue("Address"), - typeof(string), - CultureInfo.InvariantCulture); - - primaryAddressResolutionStatus = (UInt32)LanguagePrimitives.ConvertTo( - pingStatus.GetPropertyValue("PrimaryAddressResolutionStatus"), - typeof(UInt32), - CultureInfo.InvariantCulture); - statusCode = (UInt32)LanguagePrimitives.ConvertTo( - pingStatus.GetPropertyValue("StatusCode"), - typeof(UInt32), - CultureInfo.InvariantCulture); - } - else - { -#endif - CimInstance pingStatus = (CimInstance)pingStatusObj; - destinationAddress = (string)LanguagePrimitives.ConvertTo( - pingStatus.CimInstanceProperties["Address"].Value.ToString(), - typeof(string), - CultureInfo.InvariantCulture); - primaryAddressResolutionStatus = (UInt32)LanguagePrimitives.ConvertTo( - pingStatus.CimInstanceProperties["PrimaryAddressResolutionStatus"].Value, - typeof(UInt32), - CultureInfo.InvariantCulture); - statusCode = (UInt32)LanguagePrimitives.ConvertTo( - pingStatus.CimInstanceProperties["StatusCode"].Value, - typeof(UInt32), - CultureInfo.InvariantCulture); - -#if !CORECLR - } -#endif - if (primaryAddressResolutionStatus != 0) - { - if (!quiet) - { - Win32Exception win32Exception = new Win32Exception(unchecked((int)primaryAddressResolutionStatus)); - string message = StringUtil.Format(ComputerResources.NoPingResult, destinationAddress, win32Exception.Message); - Exception pingException = new System.Net.NetworkInformation.PingException(message, win32Exception); - ErrorRecord errorRecord = new ErrorRecord(pingException, "TestConnectionException", ErrorCategory.ResourceUnavailable, destinationAddress); - WriteError(errorRecord); - } - } - else - { - if (statusCode != 0) - { - if (!quiet) - { - Win32Exception win32Exception = new Win32Exception(unchecked((int)statusCode)); - string message = StringUtil.Format(ComputerResources.NoPingResult, destinationAddress, win32Exception.Message); - Exception pingException = new System.Net.NetworkInformation.PingException(message, win32Exception); - ErrorRecord errorRecord = new ErrorRecord(pingException, "TestConnectionException", ErrorCategory.ResourceUnavailable, destinationAddress); - WriteError(errorRecord); - } - } - else - { - this.quietResults[destinationAddress] = true; - if (!quiet) - { - WriteObject(pingStatusObj); - } - } - } - } - -#if !CORECLR - private void processDCOMProtocolForTestConnection() - { - ConnectionOptions options = ComputerWMIHelper.GetConnectionOptions(DcomAuthentication, this.Impersonation, this.Credential); - if (AsJob) - { - string filter = QueryString(ComputerName, true, false); - GetWmiObjectCommand WMICmd = new GetWmiObjectCommand(); - WMICmd.Filter = filter.ToString(); - WMICmd.Class = ComputerWMIHelper.WMI_Class_PingStatus; - WMICmd.ComputerName = Source; - WMICmd.Authentication = DcomAuthentication; - WMICmd.Impersonation = Impersonation; - WMICmd.ThrottleLimit = throttlelimit; - PSWmiJob wmiJob = new PSWmiJob(WMICmd, Source, throttlelimit, this.MyInvocation.MyCommand.Name, Count); - this.JobRepository.Add(wmiJob); - WriteObject(wmiJob); - } - else - { - int sourceCount = 0; - foreach (string fromcomp in Source) - { - try - { - sourceCount++; - EnumerationOptions enumOptions = new EnumerationOptions(); - enumOptions.UseAmendedQualifiers = true; - enumOptions.DirectRead = true; - - int destCount = 0; - foreach (var tocomp in ComputerName) - { - destCount++; - string querystring = QueryString(new string[] { tocomp }, true, true); - ObjectQuery query = new ObjectQuery(querystring); - ManagementScope scope = new ManagementScope(ComputerWMIHelper.GetScopeString(fromcomp, ComputerWMIHelper.WMI_Path_CIM), options); - scope.Options.EnablePrivileges = true; - scope.Connect(); - - using (searcher = new ManagementObjectSearcher(scope, query, enumOptions)) - { - for (int j = 0; j <= Count - 1; j++) - { - using (ManagementObjectCollection mobj = searcher.Get()) - { - int mobjCount = 0; - foreach (ManagementBaseObject obj in mobj) - { - using (obj) - { - mobjCount++; - - ProcessPingStatus(obj); - - // to delay the request, if case to avoid the delay for the last pingrequest - if (mobjCount < mobj.Count || j < Count - 1 || sourceCount < Source.Length || destCount < ComputerName.Length) - Thread.Sleep(Delay * 1000); - } - } - } - } - } - } - searcher = null; - } - catch (ManagementException e) - { - ErrorRecord errorRecord = new ErrorRecord(e, "TestConnectionException", ErrorCategory.InvalidOperation, null); - WriteError(errorRecord); - continue; - } - catch (System.Runtime.InteropServices.COMException e) - { - ErrorRecord errorRecord = new ErrorRecord(e, "TestConnectionException", ErrorCategory.InvalidOperation, null); - WriteError(errorRecord); - continue; - } - } - } - - if (quiet) - { - foreach (string destinationAddress in this.ComputerName) - { - bool destinationResult = false; - this.quietResults.TryGetValue(destinationAddress, out destinationResult); - WriteObject(destinationResult); - } - } - } -#endif - private void ProcessWSManProtocolForTestConnection() - { - if (AsJob) - { - // TODO: Need job for MI.Net WSMan protocol - // Early return of job object. - throw new PSNotSupportedException(); - } - - var operationOptions = new CimOperationOptions - { - Timeout = TimeSpan.FromMilliseconds(2000), - CancellationToken = cancel.Token - }; - int destCount = 0; - int sourceCount = 0; - foreach (string sourceComp in Source) - { - try - { - sourceCount++; - string sourceMachine; - if ((sourceComp.Equals("localhost", StringComparison.CurrentCultureIgnoreCase)) || (sourceComp.Equals(".", StringComparison.OrdinalIgnoreCase))) - { - sourceMachine = Dns.GetHostName(); - } - else - { - sourceMachine = sourceComp; - } - foreach (var tocomp in ComputerName) - { - destCount++; - string querystring = QueryString(new string[] { tocomp }, true, true); + private readonly ManualResetEventSlim _waitHandler = new ManualResetEventSlim(false); + private readonly Dictionary _computerInfos = new Dictionary(StringComparer.OrdinalIgnoreCase); - using (CimSession cimSession = RemoteDiscoveryHelper.CreateCimSession(sourceComp, this.Credential, WsmanAuthentication, cancel.Token, this)) - { - WriteVerbose(String.Format("WMI query {0} sent to {1}", querystring, sourceComp)); - for (int echoRequestCount = 0; echoRequestCount < Count; echoRequestCount++) - { - IEnumerable mCollection = cimSession.QueryInstances( - ComputerWMIHelper.CimOperatingSystemNamespace, - ComputerWMIHelper.CimQueryDialect, - querystring, - operationOptions); - int total = mCollection.ToList().Count; - int cimInsCount = 1; - foreach (CimInstance obj in mCollection) - { - ProcessPingStatus(obj); - cimInsCount++; - // to delay the request, if case to avoid the delay for the last pingrequest - if (cimInsCount < total || echoRequestCount < Count - 1 || sourceCount < Source.Length || destCount < ComputerName.Length) - Thread.Sleep(Delay * 1000); - } - } - } - } - } - catch (CimException ex) - { - ErrorRecord errorRecord = new ErrorRecord(ex, "TestConnectionException", ErrorCategory.InvalidOperation, null); - WriteError(errorRecord); - continue; - } - catch (System.Runtime.InteropServices.COMException e) - { - ErrorRecord errorRecord = new ErrorRecord(e, "TestConnectionException", ErrorCategory.InvalidOperation, null); - WriteError(errorRecord); - continue; - } - } + // CLR 4.0 Port note - use https://msdn.microsoft.com/en-us/library/system.net.networkinformation.ipglobalproperties.hostname(v=vs.110).aspx + private readonly string _shortLocalMachineName = Dns.GetHostName(); - if (quiet) - { - foreach (string destinationAddress in this.ComputerName) - { - bool destinationResult = false; - this.quietResults.TryGetValue(destinationAddress, out destinationResult); - WriteObject(destinationResult); - } - } - } + // And for this, use PsUtils.GetHostname() + private readonly string _fullLocalMachineName = Dns.GetHostEntryAsync("").Result.HostName; -#endregion "Private Methods " - } -#endregion Test-Connection -#if !CORECLR + private int _percent; + private string _status; + private string _activity; + private Timer _timer; + private System.Management.Automation.PowerShell _powershell; -#region Enable-ComputerRestore + private const string StageVerification = "VerifyStage"; + private const string WmiConnectionTest = "WMI"; + private const string WinrmConnectionTest = "WinRM"; + private const string PowerShellConnectionTest = "PowerShell"; - /// - /// Cmdlet for Enable-ComputerRestore - /// - [Cmdlet(VerbsLifecycle.Enable, "ComputerRestore", SupportsShouldProcess = true, HelpUri = "https://go.microsoft.com/fwlink/?LinkID=135209")] - public sealed class EnableComputerRestoreCommand : PSCmdlet, IDisposable - { -#region Parameters - /// - /// Specifies the Drive on which the system restore will be enabled. - /// The drive string should be of the form "C:\". - /// - [Parameter(Position = 0, Mandatory = true)] - [ValidateNotNullOrEmpty] - [SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays")] - public string[] Drive { get; set; } +#endregion "parameters and PrivateData" - #endregion Parameters - private const string ErrorBase = "ComputerResources"; - private ManagementClass WMIClass; #region "IDisposable Members" /// @@ -716,5561 +388,1212 @@ public void Dispose(bool disposing) { if (disposing) { - if (WMIClass != null) + if (_timer != null) + { + _timer.Dispose(); + } + + _waitHandler.Dispose(); + _cancel.Dispose(); + if (_powershell != null) { - WMIClass.Dispose(); + _powershell.Dispose(); } } } #endregion "IDisposable Members" -#region Overrides +#region "Private Methods" /// - /// To Enable the Restore Point of the drives + /// Validate parameters for 'DefaultSet' + /// 1. When the Wait is specified, the computername cannot contain the local machine + /// 2. If the local machine is present, make sure it is at the end of the list (so the remote ones get restarted before the local machine reboot). /// - protected override void BeginProcessing() + private void ValidateComputerNames() { - // system restore APIs are not supported on ARM platform - if (ComputerWMIHelper.SkipSystemRestoreOperationForARMPlatform(this)) - { - return; - } - - ManagementScope scope = new ManagementScope(ComputerWMIHelper.WMI_Path_Default); - scope.Connect(); - WMIClass = new ManagementClass(ComputerWMIHelper.WMI_Class_SystemRestore); - WMIClass.Scope = scope; - int retValue; - //get the system drive - string sysdrive = System.Environment.ExpandEnvironmentVariables("%SystemDrive%"); - sysdrive = String.Concat(new string[] { sysdrive, "\\" }); - + bool containLocalhost = false; + _validatedComputerNames.Clear(); - if (ComputerWMIHelper.ContainsSystemDrive(Drive, sysdrive)) + foreach (string name in ComputerName) { - object[] input = { sysdrive }; - try + ErrorRecord error = null; + string targetComputerName = ComputerWMIHelper.ValidateComputerName(name, _shortLocalMachineName, _fullLocalMachineName, ref error); + if (targetComputerName == null) { - retValue = Convert.ToInt32(WMIClass.InvokeMethod("Enable", input), System.Globalization.CultureInfo.CurrentCulture); - //if success (return value is 0 or if already enabled (error code is 1056 in XP and 0 in vista) - if ((retValue.Equals(0)) || (retValue.Equals(ComputerWMIHelper.ErrorCode_Service))) - { - string driveNew; - foreach (string drive in Drive) //for each input drive - { - if (!ShouldProcess(drive)) - { - continue; - } - if (!drive.EndsWith("\\", StringComparison.CurrentCultureIgnoreCase)) - { - driveNew = String.Concat(drive, "\\"); - } - else - driveNew = drive; - if (!ComputerWMIHelper.IsValidDrive(driveNew))//if not valid drive,throw error - { - Exception Ex = new ArgumentException(StringUtil.Format(ComputerResources.InvalidDrive, drive)); - WriteError(new ErrorRecord(Ex, "EnableComputerRestoreInvalidDrive", ErrorCategory.InvalidData, null)); - continue; - } - //parameter for Enable method - //if the input drive is not system drive - if (!driveNew.Equals(sysdrive, StringComparison.OrdinalIgnoreCase)) - { - object[] inputDrive = { driveNew }; - retValue = Convert.ToInt32(WMIClass.InvokeMethod("Enable", inputDrive), System.Globalization.CultureInfo.CurrentCulture); - - //if not enabled, retry again - if (retValue.Equals(ComputerWMIHelper.ErrorCode_Interface)) - { - retValue = Convert.ToInt32(WMIClass.InvokeMethod("Enable", inputDrive), System.Globalization.CultureInfo.CurrentCulture); - } - } - //if not success and if it is not already enabled (error code is 1056 in XP) - // Error 1717 - The interface is unknown. Even though this comes sometimes . The Drive is getting enabled. - if (!(retValue.Equals(0)) && !(retValue.Equals(ComputerWMIHelper.ErrorCode_Service)) && !(retValue.Equals(ComputerWMIHelper.ErrorCode_Interface))) - { - Exception Ex = new ArgumentException(StringUtil.Format(ComputerResources.NotEnabled, drive)); - WriteError(new ErrorRecord(Ex, "EnableComputerRestoreNotEnabled", ErrorCategory.InvalidOperation, null)); - continue; - } - } - } - else + if (error != null) { - ArgumentException Ex = new ArgumentException(StringUtil.Format(ComputerResources.NotEnabled, sysdrive)); - WriteError(new ErrorRecord(Ex, "EnableComputerRestoreNotEnabled", ErrorCategory.InvalidOperation, null)); + WriteError(error); } + continue; } - catch (ManagementException e) + + if (targetComputerName.Equals(ComputerWMIHelper.localhostStr, StringComparison.OrdinalIgnoreCase)) { - if ((e.ErrorCode.Equals(ManagementStatus.NotFound)) || (e.ErrorCode.Equals(ManagementStatus.InvalidClass))) - { - ErrorRecord er = new ErrorRecord(new ArgumentException(StringUtil.Format(ComputerResources.NotSupported)), null, ErrorCategory.InvalidOperation, null); - WriteError(er); - } - else - { - ErrorRecord errorRecord = new ErrorRecord(e, "GetWMIManagementException", ErrorCategory.InvalidOperation, null); - WriteError(errorRecord); - } + containLocalhost = true; } - catch (COMException e) + else if (!_uniqueComputerNames.Contains(targetComputerName)) { - if (string.IsNullOrEmpty(e.Message)) - { - Exception Ex = new ArgumentException(StringUtil.Format(ComputerResources.SystemRestoreServiceDisabled)); - WriteError(new ErrorRecord(Ex, "ServiceDisabled", ErrorCategory.InvalidOperation, null)); - } - else - { - ErrorRecord errorRecord = new ErrorRecord(e, "COMException", ErrorCategory.InvalidOperation, null); - WriteError(errorRecord); - } + _validatedComputerNames.Add(targetComputerName); + _uniqueComputerNames.Add(targetComputerName); } } - else + + // Force wait with a test hook even if we're on the local computer + if (! InternalTestHooks.TestWaitStopComputer && Wait && containLocalhost) { - ArgumentException Ex = new ArgumentException(StringUtil.Format(ComputerResources.NoSystemDrive)); - WriteError(new ErrorRecord(Ex, "EnableComputerNoSystemDrive", ErrorCategory.InvalidArgument, null)); + // The local machine will be ignored, and an error will be emitted. + InvalidOperationException ex = new InvalidOperationException(ComputerResources.CannotWaitLocalComputer); + WriteError(new ErrorRecord(ex, "CannotWaitLocalComputer", ErrorCategory.InvalidOperation, null)); + containLocalhost = false; } - }//end of BeginProcessing - /// - /// to implement ^C - /// - protected override void StopProcessing() - { - if (WMIClass != null) + // Add the localhost to the end of the list, so we will restart remote machines + // before we restart the local one. + if (containLocalhost) { - WMIClass.Dispose(); + _validatedComputerNames.Add(ComputerWMIHelper.localhostStr); } } -#endregion Overrides - }//end of class -#endregion - -#region Disable-ComputerRestore - - /// - /// This cmdlet is to Disable Computer Restore points. - /// - [Cmdlet(VerbsLifecycle.Disable, "ComputerRestore", SupportsShouldProcess = true, HelpUri = "https://go.microsoft.com/fwlink/?LinkID=135207")] - public sealed class DisableComputerRestoreCommand : PSCmdlet, IDisposable - { -#region Parameters - /// - /// Specifies the Drive on which the system restore will be enabled. - /// The drive string should be of the form "C:\". - /// - [Parameter(Position = 0, Mandatory = true)] - [ValidateNotNullOrEmpty] - [SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays")] - public string[] Drive { get; set; } - - #endregion Parameters - - private ManagementClass WMIClass; - private const string ErrorBase = "ComputerResources"; -#region "IDisposable Members" - /// - /// Dispose Method + /// Write out progress /// - public void Dispose() + /// + /// + /// + /// + private void WriteProgress(string activity, string status, int percent, ProgressRecordType progressRecordType) { - this.Dispose(true); - // Use SuppressFinalize in case a subclass - // of this type implements a finalizer. - GC.SuppressFinalize(this); + ProgressRecord progress = new ProgressRecord(_activityId, activity, status); + progress.PercentComplete = percent; + progress.RecordType = progressRecordType; + WriteProgress(progress); } /// - /// Dispose Method. + /// Calculate the progress percentage /// - /// - public void Dispose(bool disposing) + /// + /// + private int CalculateProgressPercentage(string currentStage) { - if (disposing) + switch (currentStage) { - if (WMIClass != null) - { - WMIClass.Dispose(); - } + case StageVerification: + return _waitFor.Equals(WaitForServiceTypes.Wmi) || _waitFor.Equals(WaitForServiceTypes.WinRM) + ? 33 + : 20; + case WmiConnectionTest: + return _waitFor.Equals(WaitForServiceTypes.Wmi) ? 66 : 40; + case WinrmConnectionTest: + return _waitFor.Equals(WaitForServiceTypes.WinRM) ? 66 : 60; + case PowerShellConnectionTest: + return 80; + default: + break; } - } - -#endregion "IDisposable Members" -#region Overrides + Dbg.Diagnostics.Assert(false, "CalculateProgressPercentage should never hit the default case"); + return 0; + } /// - /// To Disable the Restore Point of the drives + /// Event handler for the timer /// - protected override void BeginProcessing() + /// + private void OnTimedEvent(object s) { - // system restore APIs are not supported on ARM platform - if (ComputerWMIHelper.SkipSystemRestoreOperationForARMPlatform(this)) - { - return; - } + _exit = _timeUp = true; + _cancel.Cancel(); + _waitHandler.Set(); - ManagementScope scope = new ManagementScope(ComputerWMIHelper.WMI_Path_Default); - scope.Connect(); - WMIClass = new ManagementClass(ComputerWMIHelper.WMI_Class_SystemRestore); - WMIClass.Scope = scope; - string driveNew; - foreach (string drive in Drive) + if (_powershell != null) { - if (!ShouldProcess(drive)) - { - continue; - } - - if (!drive.EndsWith("\\", StringComparison.CurrentCultureIgnoreCase)) - { - driveNew = String.Concat(drive, "\\"); - } - else - driveNew = drive; + _powershell.Stop(); + _powershell.Dispose(); + } + } + private class ComputerInfo + { + internal string LastBootUpTime; + internal bool RebootComplete; + } - if (!ComputerWMIHelper.IsValidDrive(driveNew)) - { - ErrorRecord er = new ErrorRecord(new ArgumentException(StringUtil.Format(ComputerResources.NotValidDrive, drive)), null, ErrorCategory.InvalidData, null); - WriteError(er); - continue; - } - else + private List TestRestartStageUsingWsman(IEnumerable computerNames, List nextTestList, CancellationToken token) + { + var restartStageTestList = new List(); + var operationOptions = new CimOperationOptions + { + Timeout = TimeSpan.FromMilliseconds(2000), + CancellationToken = token + }; + foreach (var computer in computerNames) + { + try { - try - { - object[] input = { driveNew }; - int retValue = Convert.ToInt32(WMIClass.InvokeMethod("Disable", input), System.Globalization.CultureInfo.CurrentCulture); - // Error 1717 - The interface is unknown. Even though this comes sometimes . The Drive is getting disabled. - if (!(retValue.Equals(0)) && !(retValue.Equals(ComputerWMIHelper.ErrorCode_Interface))) - { - ErrorRecord er = new ErrorRecord(new ArgumentException(StringUtil.Format(ComputerResources.NotDisabled, drive)), null, ErrorCategory.InvalidOperation, null); - WriteError(er); - continue; - } - } - catch (ManagementException e) + if (token.IsCancellationRequested) { break; } + using (CimSession cimSession = RemoteDiscoveryHelper.CreateCimSession(computer, Credential, WsmanAuthentication, token, this)) { - if ((e.ErrorCode.Equals(ManagementStatus.NotFound)) || (e.ErrorCode.Equals(ManagementStatus.InvalidClass))) + bool itemRetrieved = false; + IEnumerable mCollection = cimSession.QueryInstances( + ComputerWMIHelper.CimOperatingSystemNamespace, + ComputerWMIHelper.CimQueryDialect, + "Select * from " + ComputerWMIHelper.WMI_Class_OperatingSystem, + operationOptions); + foreach (CimInstance os in mCollection) { - ErrorRecord er = new ErrorRecord(new ArgumentException(StringUtil.Format(ComputerResources.NotSupported)), null, ErrorCategory.InvalidOperation, null); - WriteError(er); + itemRetrieved = true; + string newLastBootUpTime = os.CimInstanceProperties["LastBootUpTime"].Value.ToString(); + string oldLastBootUpTime = _computerInfos[computer].LastBootUpTime; + + if (string.Compare(newLastBootUpTime, oldLastBootUpTime, StringComparison.OrdinalIgnoreCase) != 0) + { + _computerInfos[computer].RebootComplete = true; + nextTestList.Add(computer); + } + else + { + restartStageTestList.Add(computer); + } } - else + + if (!itemRetrieved) { - ErrorRecord errorRecord = new ErrorRecord(e, "GetWMIManagementException", ErrorCategory.InvalidOperation, null); - WriteError(errorRecord); + restartStageTestList.Add(computer); } } - catch (COMException e) + } + catch (CimException) + { + restartStageTestList.Add(computer); + } + catch (Exception) + { + restartStageTestList.Add(computer); + } + } + + return restartStageTestList; + } + + private List SetUpComputerInfoUsingWsman(IEnumerable computerNames, CancellationToken token) + { + var validComputerNameList = new List(); + var operationOptions = new CimOperationOptions + { + Timeout = TimeSpan.FromMilliseconds(2000), + CancellationToken = token + }; + foreach (var computer in computerNames) + { + try + { + using (CimSession cimSession = RemoteDiscoveryHelper.CreateCimSession(computer, Credential, WsmanAuthentication, token, this)) { - if (string.IsNullOrEmpty(e.Message)) + bool itemRetrieved = false; + IEnumerable mCollection = cimSession.QueryInstances( + ComputerWMIHelper.CimOperatingSystemNamespace, + ComputerWMIHelper.CimQueryDialect, + "Select * from " + ComputerWMIHelper.WMI_Class_OperatingSystem, + operationOptions); + foreach (CimInstance os in mCollection) { - Exception Ex = new ArgumentException(StringUtil.Format(ComputerResources.SystemRestoreServiceDisabled)); - WriteError(new ErrorRecord(Ex, "ServiceDisabled", ErrorCategory.InvalidOperation, null)); + itemRetrieved = true; + if (!_computerInfos.ContainsKey(computer)) + { + var info = new ComputerInfo + { + LastBootUpTime = os.CimInstanceProperties["LastBootUpTime"].Value.ToString(), + RebootComplete = false + }; + _computerInfos.Add(computer, info); + validComputerNameList.Add(computer); + } } - else + + if (!itemRetrieved) { - ErrorRecord errorRecord = new ErrorRecord(e, "COMException", ErrorCategory.InvalidOperation, null); - WriteError(errorRecord); + string errMsg = StringUtil.Format(ComputerResources.RestartComputerSkipped, computer, ComputerResources.CannotGetOperatingSystemObject); + var error = new ErrorRecord(new InvalidOperationException(errMsg), "RestartComputerSkipped", + ErrorCategory.OperationStopped, computer); + this.WriteError(error); } } } + catch (CimException ex) + { + string errMsg = StringUtil.Format(ComputerResources.RestartComputerSkipped, computer, ex.Message); + var error = new ErrorRecord(new InvalidOperationException(errMsg), "RestartComputerSkipped", + ErrorCategory.OperationStopped, computer); + this.WriteError(error); + } + catch (Exception ex) + { + string errMsg = StringUtil.Format(ComputerResources.RestartComputerSkipped, computer, ex.Message); + var error = new ErrorRecord(new InvalidOperationException(errMsg), "RestartComputerSkipped", + ErrorCategory.OperationStopped, computer); + this.WriteError(error); + } } - } - /// - /// to implement ^C - /// - protected override void StopProcessing() - { - if (WMIClass != null) - { - WMIClass.Dispose(); - } + return validComputerNameList; } -#endregion Overrides - }//end of class -#endregion Disable-ComputerRestore - -#region Checkpoint-Computer - - /// - /// Creates the Restore Point for the Local computer - /// - - [Cmdlet(VerbsData.Checkpoint, "Computer", HelpUri = "https://go.microsoft.com/fwlink/?LinkID=135197")] - public class CheckpointComputerCommand : PSCmdlet, IDisposable - { -#region Parameters - - /// - /// The description to be displayed so the user can easily identify a restore point. - /// - [Parameter(Position = 0, Mandatory = true)] - [ValidateNotNullOrEmpty] - public string Description { get; set; } - - - /// - /// The type of restore point. - /// - [Parameter(Position = 1)] - [Alias("RPT")] - [ValidateSetAttribute(new string[] { "APPLICATION_INSTALL", "APPLICATION_UNINSTALL", "DEVICE_DRIVER_INSTALL", "MODIFY_SETTINGS", "CANCELLED_OPERATION" })] - [ValidateNotNullOrEmpty] - public string RestorePointType + private void WriteOutTimeoutError(IEnumerable computerNames) { - get { return _restorepointtype; } - set + const string errorId = "RestartComputerTimeout"; + foreach (string computer in computerNames) { - // null check is not needed (because of ValidateNotNullOrEmpty), - // but we have to include it to silence OACR - if (value == null) - { - throw PSTraceSource.NewArgumentNullException("value"); + string errorMsg = StringUtil.Format(ComputerResources.RestartcomputerFailed, computer, ComputerResources.TimeoutError); + var exception = new RestartComputerTimeoutException(computer, Timeout, errorMsg, errorId); + var error = new ErrorRecord(exception, errorId, ErrorCategory.OperationTimeout, computer); + if (! InternalTestHooks.TestWaitStopComputer ) { + WriteError(error); } - - _restorepointtype = value; - if (_restorepointtype.Equals("APPLICATION_INSTALL", StringComparison.OrdinalIgnoreCase)) - intRestorePoint = 0; - else if (_restorepointtype.Equals("APPLICATION_UNINSTALL", StringComparison.OrdinalIgnoreCase)) - intRestorePoint = 1; - else if (_restorepointtype.Equals("DEVICE_DRIVER_INSTALL", StringComparison.OrdinalIgnoreCase)) - intRestorePoint = 10; - else if (_restorepointtype.Equals("MODIFY_SETTINGS", StringComparison.OrdinalIgnoreCase)) - intRestorePoint = 12; - else if (_restorepointtype.Equals("CANCELLED_OPERATION", StringComparison.OrdinalIgnoreCase)) - intRestorePoint = 13; } } - private string _restorepointtype = "APPLICATION_INSTALL"; -#endregion Parameters -#region private +#endregion "Private Methods" - private DateTime lastTimeProgressWasWritten = DateTime.UtcNow; - private int intRestorePoint = 0; - private int ret = int.MaxValue; - /// - /// Shared Exception. Used when exception thrown from the Restore point thread. - /// - private static Exception exceptionfromnewthread = null; +#region "Internal Methods" - private void WriteProgress(string statusDescription, int? percentComplete) + internal static List TestWmiConnectionUsingWsman(List computerNames, List nextTestList, CancellationToken token, PSCredential credential, string wsmanAuthentication, PSCmdlet cmdlet) { - ProgressRecordType recordType; - if (percentComplete.HasValue && percentComplete.Value == 100) - { - recordType = ProgressRecordType.Completed; - } - else + // Check if the WMI service "Winmgmt" is started + const string wmiServiceQuery = "Select * from " + ComputerWMIHelper.WMI_Class_Service + " Where name = 'Winmgmt'"; + var wmiTestList = new List(); + var operationOptions = new CimOperationOptions { - recordType = ProgressRecordType.Processing; - } - - if (recordType == ProgressRecordType.Processing) - { - TimeSpan timeSinceProgressWasWrittenLast = DateTime.UtcNow - lastTimeProgressWasWritten; - if (timeSinceProgressWasWrittenLast < TimeSpan.FromMilliseconds(200)) - { - return; - } - } - lastTimeProgressWasWritten = DateTime.UtcNow; - - string activityDescription = StringUtil.Format(ComputerResources.ProgressActivity); - ProgressRecord progressRecord = new ProgressRecord( - 1905347723, // unique id - activityDescription, - statusDescription); - - if (percentComplete.HasValue) - { - progressRecord.PercentComplete = percentComplete.Value; - } - - progressRecord.RecordType = recordType; - this.WriteProgress(progressRecord); - } - - private void WriteProgress(DateTime starttime) - { - int percentageCompleted = ProgressRecord.GetPercentageComplete(starttime, TimeSpan.FromSeconds(90)); - if (percentageCompleted < 100) - { - WriteProgress(StringUtil.Format(ComputerResources.ProgressStatusCreatingRestorePoint, percentageCompleted), percentageCompleted); - } - } - - private DateTime startUtcTime, startLocalTime; - private void WriteProgress() - { - while (true) + Timeout = TimeSpan.FromMilliseconds(2000), + CancellationToken = token + }; + foreach (var computer in computerNames) { - WriteProgress(this.startUtcTime); - System.Threading.Thread.Sleep(1000); - if (exceptionfromnewthread == null) + try { - if (ret == 0) + if (token.IsCancellationRequested) { break; } + using (CimSession cimSession = RemoteDiscoveryHelper.CreateCimSession(computer, credential, wsmanAuthentication, token, cmdlet)) { - if (this.IsRestorePointCreated(Description, this.startLocalTime)) + bool itemRetrieved = false; + IEnumerable mCollection = cimSession.QueryInstances( + ComputerWMIHelper.CimOperatingSystemNamespace, + ComputerWMIHelper.CimQueryDialect, + wmiServiceQuery, + operationOptions); + foreach (CimInstance service in mCollection) { - break; + itemRetrieved = true; + if (LanguagePrimitives.IsTrue(service.CimInstanceProperties["Started"].Value)) + { + nextTestList.Add(computer); + } + else + { + wmiTestList.Add(computer); + } + } + + if (!itemRetrieved) + { + wmiTestList.Add(computer); } - } - else if (ret != int.MaxValue) - { - // Invocation is complete with error - break; } } - else + catch (CimException) { - // Exception is thrown, breaking the loop - break; + wmiTestList.Add(computer); + } + catch (Exception) + { + wmiTestList.Add(computer); } } - WriteProgress(StringUtil.Format(ComputerResources.ProgressStatusCompleted), 100); + return wmiTestList; } - private void CreateRestorePoint() + /// + /// Test the PowerShell state for the restarting computer + /// + /// + /// + /// + /// + /// + internal static List TestPowerShell(List computerNames, List nextTestList, System.Management.Automation.PowerShell powershell, PSCredential credential) { - ManagementClass WMIClass = null; + List psList = new List(); + try { - ManagementScope scope = new ManagementScope(ComputerWMIHelper.WMI_Path_Default); - scope.Connect(); - WMIClass = new ManagementClass(ComputerWMIHelper.WMI_Class_SystemRestore); - WMIClass.Scope = scope; - - //create restore point - ManagementBaseObject inParams = WMIClass.GetMethodParameters("CreateRestorePoint"); - object[] param = { Description, intRestorePoint, 100 }; // the event type will be always 100,Begin_System_Change - ret = Convert.ToInt32(WMIClass.InvokeMethod("CreateRestorePoint", param), System.Globalization.CultureInfo.CurrentCulture); + Collection psObjectCollection = powershell.Invoke(new object[] { credential, computerNames.ToArray() }); + if (psObjectCollection == null) + { + Dbg.Diagnostics.Assert(false, "This should never happen. Invoke should never return null."); + } + + // If ^C or timeout happens when we are in powershell.Invoke(), the psObjectCollection might be empty + if (psObjectCollection.Count == 0) + { + return computerNames; + } + + object result = PSObject.Base(psObjectCollection[0]); + Hashtable data = result as Hashtable; + + Dbg.Diagnostics.Assert(data != null, "data should never be null"); + Dbg.Diagnostics.Assert(data.Count == computerNames.Count, "data should contain results for all computers in computerNames"); + + foreach (string computer in computerNames) + { + if (LanguagePrimitives.IsTrue(data[computer])) + { + nextTestList.Add(computer); + } + else + { + psList.Add(computer); + } + } } - catch (Exception ex) + catch (PipelineStoppedException) { - // We catch all exceptions because we don't want the exception to be thrown from a separate worker thread - exceptionfromnewthread = ex; + // powershell.Stop() is invoked because timeout expires, or Ctrl+C is pressed } - finally + catch (ObjectDisposedException) { - if (WMIClass != null) - { - WMIClass.Dispose(); - } + // powershell.dispose() is invoked because timeout expires, or Ctrl+C is pressed } - } - -#endregion -#region "IDisposable Members" - - /// - /// Dispose Method - /// - public void Dispose() - { - // Use SuppressFinalize in case a subclass - // of this type implements a finalizer. - GC.SuppressFinalize(this); + return psList; } -#endregion "IDisposable Members" +#endregion "Internal Methods" + +#region "Overrides" /// /// BeginProcessing method. /// protected override void BeginProcessing() { - // system restore APIs are not supported on ARM platform - if (ComputerWMIHelper.SkipSystemRestoreOperationForARMPlatform(this)) - { - return; - } - - //Setting Exception from the new thread always to null - exceptionfromnewthread = null; - - //on vista, CANCELLED_OPERATION restorepointtype does not work - if ((Environment.OSVersion.Version.Major >= 6) && (intRestorePoint == 13)) + // Timeout, For, Delay, Progress cannot be present if Wait is not present + if ((_timeoutSpecified || _waitForSpecified || _delaySpecified) && !Wait) { - ErrorRecord er = new ErrorRecord(new InvalidOperationException(StringUtil.Format(ComputerResources.NotSupported)), null, ErrorCategory.InvalidOperation, null); - ThrowTerminatingError(er); + InvalidOperationException ex = new InvalidOperationException(ComputerResources.RestartComputerInvalidParameter); + ThrowTerminatingError(new ErrorRecord(ex, "RestartComputerInvalidParameter", ErrorCategory.InvalidOperation, null)); } - if (!CanCreateNewRestorePoint(DateTime.Now)) { return; } - - this.startUtcTime = DateTime.UtcNow; - this.startLocalTime = DateTime.Now; - ThreadStart start = new ThreadStart(this.CreateRestorePoint); - Thread thread = new Thread(start); - thread.Start(); - WriteProgress(); - if (exceptionfromnewthread == null) - { - if (ret.Equals(1058)) - { - Exception Ex = new ArgumentException(StringUtil.Format(ComputerResources.ServiceDisabled)); - WriteError(new ErrorRecord(Ex, "CheckpointComputerServiceDisabled", ErrorCategory.InvalidOperation, null)); - } - else if (!(ret.Equals(0)) && !(ret.Equals(1058))) - { - Exception Ex = new ArgumentException(StringUtil.Format(ComputerResources.RestorePointNotCreated)); - WriteError(new ErrorRecord(Ex, "CheckpointComputerPointNotCreated", ErrorCategory.InvalidOperation, null)); - } - } - else + if (Wait) { - if (exceptionfromnewthread is System.Runtime.InteropServices.COMException) + _activityId = (new Random()).Next(); + if (_timeout == -1 || _timeout >= int.MaxValue / 1000) { - if (string.IsNullOrEmpty(exceptionfromnewthread.Message)) - { - Exception e = new ArgumentException(StringUtil.Format(ComputerResources.SystemRestoreServiceDisabled)); - WriteError(new ErrorRecord(e, "ServiceDisabled", ErrorCategory.InvalidOperation, null)); - } - else - { - ErrorRecord errorRecord = new ErrorRecord(exceptionfromnewthread, "COMException", ErrorCategory.InvalidOperation, null); - WriteError(errorRecord); - } + _timeoutInMilliseconds = int.MaxValue; } - else if (exceptionfromnewthread is ManagementException) + else { - if (((ManagementException)exceptionfromnewthread).ErrorCode.Equals(ManagementStatus.NotFound) || ((ManagementException)exceptionfromnewthread).ErrorCode.Equals(ManagementStatus.InvalidClass)) - { - Exception e = new ArgumentException(StringUtil.Format(ComputerResources.NotSupported)); - WriteError(new ErrorRecord(e, "CheckpointComputerNotSupported", ErrorCategory.InvalidOperation, null)); - } - else - { - ErrorRecord errorRecord = new ErrorRecord(exceptionfromnewthread, "GetWMIManagementException", ErrorCategory.InvalidOperation, null); - WriteError(errorRecord); - } + _timeoutInMilliseconds = _timeout * 1000; } - else + + // We don't support combined service types for now + switch (_waitFor) { - // For other exception we caught from the worker thread, we throw it out here - throw exceptionfromnewthread; + case WaitForServiceTypes.Wmi: + case WaitForServiceTypes.WinRM: + break; + case WaitForServiceTypes.PowerShell: + _powershell = System.Management.Automation.PowerShell.Create(); + _powershell.AddScript(TestPowershellScript); + break; + default: + InvalidOperationException ex = new InvalidOperationException(ComputerResources.NoSupportForCombinedServiceType); + ErrorRecord error = new ErrorRecord(ex, "NoSupportForCombinedServiceType", ErrorCategory.InvalidOperation, (int)_waitFor); + ThrowTerminatingError(error); + break; } } - }//End BeginProcessing() + } - private bool CanCreateNewRestorePoint(DateTime startTime) + /// + /// ProcessRecord method. + /// + [SuppressMessage("Microsoft.Maintainability", "CA1506:AvoidExcessiveClassCoupling")] + protected override void ProcessRecord() { - const string srRegistryKeyPath = @"Software\Microsoft\Windows NT\CurrentVersion\SystemRestore"; - const string srFrequencyKeyName = "SystemRestorePointCreationFrequency"; - Version osVersion = Environment.OSVersion.Version; - int timeInterval = 1440; // Default value: 24 hours * 60 min/hr - bool canCreate = true; - - // From Win8+, the default frequency of restore point creation is 24 hours, but the user - // can create the DWORD value SystemRestorePointCreationFrequency under the registry key - // HKLM\Software\Microsoft\Windows NT\CurrentVersion\SystemRestore, and the value of it - // can change the frequency of restore point creation. There are three cases here: - // 1. Such registry key doesn't exist. We use the default setting: 24 hours. - // 2. Registry key value is 0. No frequency limitation, new restore point can be created anytime. - // 3. Registry key value is integer N, the time interval is N minutes. - if ((osVersion.Major > 6) || (osVersion.Major == 6 && osVersion.Minor >= 2)) + // Validate parameters + ValidateComputerNames(); + + object[] flags = new object[] { 2, 0 }; + if (Force) flags[0] = forcedReboot; + + if (ParameterSetName.Equals(DefaultParameterSet, StringComparison.OrdinalIgnoreCase)) { - using (RegistryKey key = Registry.LocalMachine.OpenSubKey(srRegistryKeyPath)) + if (Wait && _timeout != 0) { - if (key != null) - { - object value = key.GetValue(srFrequencyKeyName); - if (value is int) { timeInterval = (int)value; } - } + _validatedComputerNames = + SetUpComputerInfoUsingWsman(_validatedComputerNames, _cancel.Token); } - var objectQuery = new ObjectQuery { QueryString = "select * from " + ComputerWMIHelper.WMI_Class_SystemRestore }; - var scope = new ManagementScope(ComputerWMIHelper.WMI_Path_Default); - scope.Connect(); - - try + foreach (string computer in _validatedComputerNames) { - DateTime lastCreationTime = DateTime.MinValue; - using (var searcher = new ManagementObjectSearcher(scope, objectQuery)) - { - foreach (ManagementObject obj in searcher.Get()) - { - using (obj) - { - DateTime creationTime = - ManagementDateTimeConverter.ToDateTime(obj.Properties["CreationTime"].Value.ToString()); - if (creationTime > lastCreationTime) - { - lastCreationTime = creationTime; - } - } - } - } + bool isLocal = false; + string compname; - TimeSpan span = startTime.Subtract(lastCreationTime); - canCreate = (span.TotalMinutes >= timeInterval); - } - catch (Exception ex) - { - // Fail to retrieve restore points - if (ex is ManagementException || ex is COMException) + if (computer.Equals("localhost", StringComparison.CurrentCultureIgnoreCase)) { - // Something is wrong with System Restore (it may not be supported). We continue to let the - // call to "CreateRestorePoint" happen, and will handle the exception generated by that call. - canCreate = true; + compname = _shortLocalMachineName; + isLocal = true; } else { - // Not sure what happened, so we'd better terminate the execution and report the error. - string errorMsg = StringUtil.Format(ComputerResources.FailToRetrieveLastRestorePoint, ex.Message); - ThrowTerminatingError( - new ErrorRecord(new InvalidOperationException(errorMsg), - "FailToRetrieveLastRestorePoint", - ErrorCategory.InvalidOperation, null)); + compname = computer; } - } - } - if (!canCreate) - { - // A new restore point cannot be created yet, so we write out warning message. - WriteWarning(StringUtil.Format(ComputerResources.CannotCreateRestorePointWarning, timeInterval)); - } + // Generate target and action strings + string action = + StringUtil.Format( + ComputerResources.RestartComputerAction, + isLocal ? ComputerResources.LocalShutdownPrivilege : ComputerResources.RemoteShutdownPrivilege); + string target = + isLocal ? StringUtil.Format(ComputerResources.DoubleComputerName, "localhost", compname) : compname; - return canCreate; - } + if (!ShouldProcess(target, action)) + { + continue; + } - private bool IsRestorePointCreated(string description, DateTime starttime) - { - bool foundrestorepoint = false; - ManagementScope scope = new ManagementScope(ComputerWMIHelper.WMI_Path_Default); - scope.Connect(); - - ObjectQuery objquery = new ObjectQuery(); - StringBuilder sb = new StringBuilder("select * from "); - sb.Append(ComputerWMIHelper.WMI_Class_SystemRestore); - sb.Append(" where description = '"); - sb.Append(description.Replace("'", "\\'")); - sb.Append("'"); - objquery.QueryString = sb.ToString(); + bool isSuccess = + ComputerWMIHelper.InvokeWin32ShutdownUsingWsman(this, isLocal, compname, flags, Credential, WsmanAuthentication, ComputerResources.RestartcomputerFailed, "RestartcomputerFailed", _cancel.Token); - try - { - using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, objquery)) - { - if (searcher.Get().Count > 0) + if (isSuccess && Wait && _timeout != 0) { - foreach (ManagementObject obj in searcher.Get()) - { - using (obj) - { - // we are adding 1 second to creationTime to account for the fact that milliseconds - // are not reported in CreationTime property - it is possible to have - // startTime = 2009-07-20 9:35:18.123 - // creationTime = 2009-07-20 9:35:18 - // which would indicate creationTime < startTime - DateTime creationTime = ManagementDateTimeConverter.ToDateTime(obj.Properties["CreationTime"].Value.ToString()); - if (creationTime.AddSeconds(1.0) >= starttime) - { - foundrestorepoint = true; - } - } - } + _waitOnComputers.Add(computer); } - } - } - catch (ManagementException) - { - foundrestorepoint = true; - } - catch (COMException) - { - foundrestorepoint = true; - } - return foundrestorepoint; - } - } -#endregion - -#region Get-ComputerRestorePoint + }//end foreach - /// - /// This cmdlet is to Get Computer Restore points. - /// - [Cmdlet(VerbsCommon.Get, "ComputerRestorePoint", DefaultParameterSetName = "ID", HelpUri = "https://go.microsoft.com/fwlink/?LinkID=135215")] - [OutputType(@"System.Management.ManagementObject#root\default\SystemRestore")] - public sealed class GetComputerRestorePointCommand : PSCmdlet, IDisposable - { -#region Parameters - - /// - /// This cmdlet is to get Computer Restore points. - /// - [Parameter(Position = 0, ParameterSetName = "ID")] - [ValidateNotNullOrEmpty] - [ValidateRangeAttribute((int)1, int.MaxValue)] - [SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays")] - public int[] RestorePoint { get; set; } - - /// - /// This cmdlet is to get Computer Restore points. - /// - [Parameter(ParameterSetName = "LastStatus", Mandatory = true)] - [ValidateNotNull] - public SwitchParameter LastStatus { get; set; } - - #endregion - - private ManagementClass WMIClass; - -#region "IDisposable Members" - - /// - /// Dispose Method - /// - public void Dispose() - { - this.Dispose(true); - // Use SuppressFinalize in case a subclass - // of this type implements a finalizer. - GC.SuppressFinalize(this); - } - - /// - /// Dispose Method. - /// - /// - public void Dispose(bool disposing) - { - if (disposing) - { - if (WMIClass != null) - { - WMIClass.Dispose(); - } - } - } - -#endregion "IDisposable Members" - -#region overrides - /// - /// Gets the list of Computer Restore point. - /// ID parameter id used to refer the sequence no. When given searched with particular - /// sequence no. and returns the restore point - /// - protected override void BeginProcessing() - { - // system restore APIs are not supported on ARM platform - if (ComputerWMIHelper.SkipSystemRestoreOperationForARMPlatform(this)) - { - return; - } - - try - { - ManagementScope scope = new ManagementScope(ComputerWMIHelper.WMI_Path_Default); - scope.Connect(); - WMIClass = new ManagementClass(ComputerWMIHelper.WMI_Class_SystemRestore); - WMIClass.Scope = scope; - - if (ParameterSetName.Equals("LastStatus")) - { - int restoreStatus = Convert.ToInt32(WMIClass.InvokeMethod("GetLastRestoreStatus", null), System.Globalization.CultureInfo.CurrentCulture); - - if (restoreStatus.Equals(0)) - WriteObject(ComputerResources.RestoreFailed); - else if (restoreStatus.Equals(1)) - WriteObject(ComputerResources.RestoreSuccess); - else if (restoreStatus.Equals(2)) - WriteObject(ComputerResources.RestoreInterrupted); - } - Dictionary sequenceList = new Dictionary(); - if (ParameterSetName.Equals("ID")) - { - ObjectQuery objquery = new ObjectQuery(); - // Dictionary sequenceList = new Dictionary(); - if (RestorePoint == null) - { - objquery.QueryString = "select * from " + ComputerWMIHelper.WMI_Class_SystemRestore; - } - else - { - // sequenceList = new List(); - StringBuilder sb = new StringBuilder("select * from "); - sb.Append(ComputerWMIHelper.WMI_Class_SystemRestore); - sb.Append(" where SequenceNumber = "); - for (int i = 0; i <= RestorePoint.Length - 1; i++) - { - sb.Append(RestorePoint[i]); - if (i < RestorePoint.Length - 1) - sb.Append(" OR SequenceNumber = "); - if (!sequenceList.ContainsKey(RestorePoint[i])) - sequenceList.Add(RestorePoint[i], "true"); - } - objquery.QueryString = sb.ToString(); - } - - using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, objquery)) - { - foreach (ManagementObject obj in searcher.Get()) - { - using (obj) - { - WriteObject(obj); - if (RestorePoint != null) - { - int sequenceNo = Convert.ToInt32(obj.Properties["SequenceNumber"].Value, System.Globalization.CultureInfo.CurrentCulture); - sequenceList.Remove(sequenceNo); - } - } - } - } - - if (sequenceList != null) - { - if (sequenceList.Count > 0) - { - foreach (int id in sequenceList.Keys) - { - string message = StringUtil.Format(ComputerResources.NoRestorePoint, id); - ArgumentException e = new ArgumentException(message); - ErrorRecord errorrecord = new ErrorRecord(e, "NoRestorePoint", ErrorCategory.InvalidArgument, null); - WriteError(errorrecord); - } - } - } - } - } - catch (ManagementException e) - { - if ((e.ErrorCode.Equals(ManagementStatus.NotFound)) || (e.ErrorCode.Equals(ManagementStatus.InvalidClass))) - { - Exception Ex = new ArgumentException(StringUtil.Format(ComputerResources.NotSupported)); - WriteError(new ErrorRecord(Ex, "GetComputerRestorePointNotSupported", ErrorCategory.InvalidOperation, null)); - } - else - { - ErrorRecord errorRecord = new ErrorRecord(e, "GetWMIManagementException", ErrorCategory.InvalidOperation, null); - WriteError(errorRecord); - } - } - catch (COMException e) - { - if (string.IsNullOrEmpty(e.Message)) - { - Exception Ex = new ArgumentException(StringUtil.Format(ComputerResources.SystemRestoreServiceDisabled)); - WriteError(new ErrorRecord(Ex, "ServiceDisabled", ErrorCategory.InvalidOperation, null)); - } - else - { - ErrorRecord errorRecord = new ErrorRecord(e, "COMException", ErrorCategory.InvalidOperation, null); - WriteError(errorRecord); - } - } - } - - /// - /// to implement ^C - /// - protected override void StopProcessing() - { - if (WMIClass != null) - { - WMIClass.Dispose(); - } - } - -#endregion overrides - } - -#endregion - -#endif - -#region Restart-Computer - - /// - /// This exception is thrown when the timeout expires before a computer finishes restarting - /// - [Serializable] - public sealed class RestartComputerTimeoutException : RuntimeException - { - /// - /// Name of the computer that is restarting - /// - public string ComputerName { get; private set; } - - /// - /// The timeout value specified by the user. It indicates the seconds to wait before timeout. - /// - public int Timeout { get; private set; } - - /// - /// Construct a RestartComputerTimeoutException. - /// - /// - /// - /// - /// - internal RestartComputerTimeoutException(string computerName, int timeout, string message, string errorId) - : base(message) - { - SetErrorId(errorId); - SetErrorCategory(ErrorCategory.OperationTimeout); - ComputerName = computerName; - Timeout = timeout; - } - - /// - /// Construct a RestartComputerTimeoutException - /// - public RestartComputerTimeoutException() : base() { } - - /// - /// Constructs a RestartComputerTimeoutException - /// - /// - /// - /// The message used in the exception. - /// - public RestartComputerTimeoutException(string message) : base(message) { } - - /// - /// Constructs a RestartComputerTimeoutException - /// - /// - /// - /// The message used in the exception. - /// - /// - /// - /// An exception that led to this exception. - /// - public RestartComputerTimeoutException(string message, Exception innerException) : base(message, innerException) { } - -#region Serialization - /// - /// Serialization constructor for class RestartComputerTimeoutException - /// - /// - /// - /// serialization information - /// - /// - /// - /// streaming context - /// - private RestartComputerTimeoutException(SerializationInfo info, StreamingContext context) - : base(info, context) - { - if (info == null) - { - throw new PSArgumentNullException("info"); - } - - ComputerName = info.GetString("ComputerName"); - Timeout = info.GetInt32("Timeout"); - } - - /// - /// Serializes the RestartComputerTimeoutException. - /// - /// - /// - /// serialization information - /// - /// - /// - /// streaming context - /// - [SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)] - public override void GetObjectData(SerializationInfo info, StreamingContext context) - { - if (info == null) - { - throw new PSArgumentNullException("info"); - } - - base.GetObjectData(info, context); - info.AddValue("ComputerName", ComputerName); - info.AddValue("Timeout", Timeout); - } -#endregion Serialization - } - - /// - /// Defines the services that Restart-Computer can wait on - /// - [SuppressMessage("Microsoft.Design", "CA1027:MarkEnumsWithFlags")] - public enum WaitForServiceTypes - { - /// - /// Wait for the WMI service to be ready - /// - Wmi = 0x0, - - /// - /// Wait for the WinRM service to be ready - /// - WinRM = 0x1, - - /// - /// Wait for the PowerShell to be ready - /// - PowerShell = 0x2, - } - - /// - /// Restarts the computer - /// - [Cmdlet(VerbsLifecycle.Restart, "Computer", SupportsShouldProcess = true, DefaultParameterSetName = DefaultParameterSet, - HelpUri = "https://go.microsoft.com/fwlink/?LinkID=135253", RemotingCapability = RemotingCapability.OwnedByCommand)] - public class RestartComputerCommand : PSCmdlet, IDisposable - { -#region "Parameters and PrivateData" - - private const string DefaultParameterSet = "DefaultSet"; - private const string AsJobParameterSet = "AsJobSet"; - - /// - /// Used to start a command remotely as a Job. The Job results are collected - /// and stored in the global cache on the client machine. - /// - [Parameter(ParameterSetName = AsJobParameterSet)] - public SwitchParameter AsJob { get; set; } = false; - - /// - /// The following is the definition of the input parameter "Authentication". - /// Specifies the authentication level to be used with WMI connection. Valid - /// values are: - /// - /// Unchanged = -1, - /// Default = 0, - /// None = 1, - /// Connect = 2, - /// Call = 3, - /// Packet = 4, - /// PacketIntegrity = 5, - /// PacketPrivacy = 6. - /// - [Parameter] - [Alias("Authentication")] - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly")] - public AuthenticationLevel DcomAuthentication - { - get { return _dcomAuthentication; } - set - { - _dcomAuthentication = value; - _isDcomAuthenticationSpecified = true; - } - } - private AuthenticationLevel _dcomAuthentication = AuthenticationLevel.Packet; - private bool _isDcomAuthenticationSpecified = false; - - /// - /// The following is the definition of the input parameter "Impersonation". - /// Specifies the impersonation level to use when calling the WMI method. Valid - /// values are: - /// - /// Default = 0, - /// Anonymous = 1, - /// Identify = 2, - /// Impersonate = 3, - /// Delegate = 4. - /// - [Parameter] - public ImpersonationLevel Impersonation - { - get { return _impersonation; } - set - { - _impersonation = value; - _isImpersonationSpecified = true; - } - } - private ImpersonationLevel _impersonation = ImpersonationLevel.Impersonate; - private bool _isImpersonationSpecified = false; - - /// - /// The authentication options for CIM_WSMan connection - /// - [Parameter(ParameterSetName = DefaultParameterSet)] - [ValidateSet( - "Default", - "Basic", - "Negotiate", // can be used with and without credential (without -> PSRP mapped to NegotiateWithImplicitCredential) - "CredSSP", - "Digest", - "Kerberos")] // can be used with and without credential (not sure about implications) - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly")] - public string WsmanAuthentication { get; set; } - - /// - /// Specify the protocol to use - /// - [Parameter(ParameterSetName = DefaultParameterSet)] - [ValidateSet(ComputerWMIHelper.DcomProtocol, ComputerWMIHelper.WsmanProtocol)] - public string Protocol - { - get { return _protocol; } - set - { - _protocol = value; - _isProtocolSpecified = true; - } - } - - //CoreClr does not support DCOM protocol - // This change makes sure that the the command works seamlessly if user did not explicitly entered the protocol -#if CORECLR - private string _protocol = ComputerWMIHelper.WsmanProtocol; -#else - private string _protocol = ComputerWMIHelper.DcomProtocol; -#endif - private bool _isProtocolSpecified = false; - - /// - /// Specifies the computer (s)Name on which this command is executed. - /// When this parameter is omitted, this cmdlet restarts the local computer. - /// Type the NETBIOS name, IP address, or fully-qualified domain name of one - /// or more computers in a comma-separated list. To specify the local computer, type the computername or "localhost". - /// - [Parameter(Position = 0, ValueFromPipeline = true, - ValueFromPipelineByPropertyName = true)] - [ValidateNotNullOrEmpty] - [SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays")] - [Alias("CN", "__SERVER", "Server", "IPAddress")] - public String[] ComputerName { get; set; } = new string[] { "." }; - - private List _validatedComputerNames = new List(); - private readonly List _waitOnComputers = new List(); - private readonly HashSet _uniqueComputerNames = new HashSet(StringComparer.OrdinalIgnoreCase); - - /// - /// The following is the definition of the input parameter "Credential". - /// Specifies a user account that has permission to perform this action. Type a - /// user-name, such as "User01" or "Domain01\User01", or enter a PSCredential - /// object, such as one from the Get-Credential cmdlet - /// - [Parameter(Position = 1)] - [ValidateNotNullOrEmpty] - [Credential] - public PSCredential Credential { get; set; } - - /// - /// Using Force in conjunction with Reboot on a - /// remote computer immediately reboots the remote computer. - /// - [Parameter] - [Alias("f")] - public SwitchParameter Force { get; set; } - - /// - /// Allows the user of the cmdlet to specify a throttling value - /// for throttling the number of remote operations that can - /// be executed simultaneously. - /// - [Parameter(ParameterSetName = AsJobParameterSet)] - [ValidateRange(int.MinValue, (int)1000)] - public Int32 ThrottleLimit - { - get { return _throttlelimit; } - set - { - _throttlelimit = value; - if (_throttlelimit <= 0) - _throttlelimit = 32; - } - } - private Int32 _throttlelimit = 32; - - /// - /// Specify the Wait parameter. Prompt will be blocked is the Timeout is not 0 - /// - [Parameter(ParameterSetName = DefaultParameterSet)] - public SwitchParameter Wait { get; set; } - - /// - /// Specify the Timeout parameter. - /// Negative value indicates wait infinitely. - /// Positive value indicates the seconds to wait before timeout. - /// - [Parameter(ParameterSetName = DefaultParameterSet)] - [Alias("TimeoutSec")] - [ValidateRange(-1, int.MaxValue)] - public int Timeout - { - get { return _timeout; } - set - { - _timeout = value; - _timeoutSpecified = true; - } - } - private int _timeout = -1; - private bool _timeoutSpecified = false; - - /// - /// Specify the For parameter. - /// Wait for the specific service before unblocking the prompt. - /// - [Parameter(ParameterSetName = DefaultParameterSet)] - public WaitForServiceTypes For - { - get { return _waitFor; } - set - { - _waitFor = value; - _waitForSpecified = true; - } - } - private WaitForServiceTypes _waitFor = WaitForServiceTypes.PowerShell; - private bool _waitForSpecified = false; - - /// - /// Specify the Delay parameter. - /// The specific time interval (in second) to wait between network pings or service queries. - /// - [Parameter(ParameterSetName = DefaultParameterSet)] - [ValidateRange(1, Int16.MaxValue)] - public Int16 Delay - { - get { return (Int16)_delay; } - set - { - _delay = value; - _delaySpecified = true; - } - } - private int _delay = 5; - private bool _delaySpecified = false; - - /// - /// Script to test if the PowerShell is ready - /// - private const string TestPowershellScript = @" -$array = @($input) -$result = @{} -foreach ($computerName in $array[1]) -{ - $ret = $null - if ($null -eq array[0]) - { - $ret = Invoke-Command -ComputerName $computerName {$true} -SessionOption (New-PSSessionOption -NoMachineProfile) -ErrorAction SilentlyContinue - } - else - { - $ret = Invoke-Command -ComputerName $computerName {$true} -SessionOption (New-PSSessionOption -NoMachineProfile) -ErrorAction SilentlyContinue -Credential $array[0] - } - - if ($ret -eq $true) - { - $result[$computerName] = $true - } - else - { - $result[$computerName] = $false - } -} -$result -"; - - /// - /// The indicator to use when show progress - /// - private string[] _indicator = { "|", "/", "-", "\\" }; - - /// - /// The activity id - /// - private int _activityId; - - /// - /// After call 'Shutdown' on the target computer, wait a few - /// seconds for the restart to begin. - /// - private const int SecondsToWaitForRestartToBegin = 25; - - /// - /// Actual time out in seconds - /// - private int _timeoutInMilliseconds; - - /// - /// Indicate to exit - /// - private bool _exit, _timeUp; - private readonly CancellationTokenSource _cancel = new CancellationTokenSource(); - - /// - /// A waithandler to wait on. Current thread will wait on it during the delay interval. - /// - private readonly ManualResetEventSlim _waitHandler = new ManualResetEventSlim(false); - private readonly Dictionary _computerInfos = new Dictionary(StringComparer.OrdinalIgnoreCase); - - // CLR 4.0 Port note - use https://msdn.microsoft.com/en-us/library/system.net.networkinformation.ipglobalproperties.hostname(v=vs.110).aspx - private readonly string _shortLocalMachineName = Dns.GetHostName(); - - // And for this, use PsUtils.GetHostname() - private readonly string _fullLocalMachineName = Dns.GetHostEntryAsync("").Result.HostName; - - private int _percent; - private string _status; - private string _activity; - private Timer _timer; - private System.Management.Automation.PowerShell _powershell; - - private const string StageVerification = "VerifyStage"; - private const string WmiConnectionTest = "WMI"; - private const string WinrmConnectionTest = "WinRM"; - private const string PowerShellConnectionTest = "PowerShell"; - -#endregion "parameters and PrivateData" - -#region "IDisposable Members" - - /// - /// Dispose Method - /// - public void Dispose() - { - this.Dispose(true); - // Use SuppressFinalize in case a subclass - // of this type implements a finalizer. - GC.SuppressFinalize(this); - } - - /// - /// Dispose Method. - /// - /// - public void Dispose(bool disposing) - { - if (disposing) - { - if (_timer != null) - { - _timer.Dispose(); - } - - _waitHandler.Dispose(); - _cancel.Dispose(); - if (_powershell != null) - { - _powershell.Dispose(); - } - } - } - -#endregion "IDisposable Members" - -#region "Private Methods" - - /// - /// Validate parameters for 'DefaultSet' - /// 1. When the Wait is specified, the computername cannot contain the local machine - /// 2. If the local machine is present, make sure it is at the end of the list (so the remote ones get restarted before the local machine reboot). - /// - private void ValidateComputerNames() - { - bool containLocalhost = false; - _validatedComputerNames.Clear(); - - foreach (string name in ComputerName) - { - ErrorRecord error = null; - string targetComputerName = ComputerWMIHelper.ValidateComputerName(name, _shortLocalMachineName, _fullLocalMachineName, ref error); - if (targetComputerName == null) - { - if (error != null) - { - WriteError(error); - } - continue; - } - - if (targetComputerName.Equals(ComputerWMIHelper.localhostStr, StringComparison.OrdinalIgnoreCase)) - { - containLocalhost = true; - } - else if (!_uniqueComputerNames.Contains(targetComputerName)) - { - _validatedComputerNames.Add(targetComputerName); - _uniqueComputerNames.Add(targetComputerName); - } - } - - if (Wait && containLocalhost) - { - // The local machine will be ignored, and an error will be emitted. - InvalidOperationException ex = new InvalidOperationException(ComputerResources.CannotWaitLocalComputer); - WriteError(new ErrorRecord(ex, "CannotWaitLocalComputer", ErrorCategory.InvalidOperation, null)); - containLocalhost = false; - } - - // Add the localhost to the end of the list, so we will restart remote machines - // before we restart the local one. - if (containLocalhost) - { - _validatedComputerNames.Add(ComputerWMIHelper.localhostStr); - } - } - - /// - /// Write out progress - /// - /// - /// - /// - /// - private void WriteProgress(string activity, string status, int percent, ProgressRecordType progressRecordType) - { - ProgressRecord progress = new ProgressRecord(_activityId, activity, status); - progress.PercentComplete = percent; - progress.RecordType = progressRecordType; - WriteProgress(progress); - } - - /// - /// Calculate the progress percentage - /// - /// - /// - private int CalculateProgressPercentage(string currentStage) - { - switch (currentStage) - { - case StageVerification: - return _waitFor.Equals(WaitForServiceTypes.Wmi) || _waitFor.Equals(WaitForServiceTypes.WinRM) - ? 33 - : 20; - case WmiConnectionTest: - return _waitFor.Equals(WaitForServiceTypes.Wmi) ? 66 : 40; - case WinrmConnectionTest: - return _waitFor.Equals(WaitForServiceTypes.WinRM) ? 66 : 60; - case PowerShellConnectionTest: - return 80; - default: - break; - } - - Dbg.Diagnostics.Assert(false, "CalculateProgressPercentage should never hit the default case"); - return 0; - } - - /// - /// Event handler for the timer - /// - /// - private void OnTimedEvent(object s) - { - _exit = _timeUp = true; - _cancel.Cancel(); - _waitHandler.Set(); - - if (_powershell != null) - { - _powershell.Stop(); - _powershell.Dispose(); - } - } - - private class ComputerInfo - { - internal string LastBootUpTime; - internal bool RebootComplete; - } - -#if !CORECLR - private List TestRestartStageUsingDcom(IEnumerable computerNames, List nextTestList, CancellationToken token, ConnectionOptions options) - { - var restartStageTestList = new List(); - var query = new ObjectQuery("Select * from " + ComputerWMIHelper.WMI_Class_OperatingSystem); - var enumOptions = new EnumerationOptions { UseAmendedQualifiers = true, DirectRead = true }; - - foreach (var computer in computerNames) - { - try - { - if (token.IsCancellationRequested) { break; } - var scope = new ManagementScope(ComputerWMIHelper.GetScopeString(computer, ComputerWMIHelper.WMI_Path_CIM), options); - using (var searcher = new ManagementObjectSearcher(scope, query, enumOptions)) - { - if (token.IsCancellationRequested) { break; } - - using (var mCollection = searcher.Get()) - { - if (mCollection.Count > 0) - { - foreach (ManagementBaseObject os in mCollection) - { - using (os) - { - string newLastBootUpTime = os.Properties["LastBootUpTime"].Value.ToString(); - string oldLastBootUpTime = _computerInfos[computer].LastBootUpTime; - - if (string.Compare(newLastBootUpTime, oldLastBootUpTime, StringComparison.OrdinalIgnoreCase) != 0) - { - _computerInfos[computer].RebootComplete = true; - nextTestList.Add(computer); - } - else - { - restartStageTestList.Add(computer); - } - } - } - } - else - { - restartStageTestList.Add(computer); - } - } - } - } - catch (ManagementException) - { - restartStageTestList.Add(computer); - } - catch (COMException) - { - restartStageTestList.Add(computer); - } - catch (UnauthorizedAccessException) - { - restartStageTestList.Add(computer); - } - } - - return restartStageTestList; - } -#endif - - private List TestRestartStageUsingWsman(IEnumerable computerNames, List nextTestList, CancellationToken token) - { - var restartStageTestList = new List(); - var operationOptions = new CimOperationOptions - { - Timeout = TimeSpan.FromMilliseconds(2000), - CancellationToken = token - }; - foreach (var computer in computerNames) - { - try - { - if (token.IsCancellationRequested) { break; } - using (CimSession cimSession = RemoteDiscoveryHelper.CreateCimSession(computer, Credential, WsmanAuthentication, token, this)) - { - bool itemRetrieved = false; - IEnumerable mCollection = cimSession.QueryInstances( - ComputerWMIHelper.CimOperatingSystemNamespace, - ComputerWMIHelper.CimQueryDialect, - "Select * from " + ComputerWMIHelper.WMI_Class_OperatingSystem, - operationOptions); - foreach (CimInstance os in mCollection) - { - itemRetrieved = true; - string newLastBootUpTime = os.CimInstanceProperties["LastBootUpTime"].Value.ToString(); - string oldLastBootUpTime = _computerInfos[computer].LastBootUpTime; - - if (string.Compare(newLastBootUpTime, oldLastBootUpTime, StringComparison.OrdinalIgnoreCase) != 0) - { - _computerInfos[computer].RebootComplete = true; - nextTestList.Add(computer); - } - else - { - restartStageTestList.Add(computer); - } - } - - if (!itemRetrieved) - { - restartStageTestList.Add(computer); - } - } - } - catch (CimException) - { - restartStageTestList.Add(computer); - } - catch (Exception) - { - restartStageTestList.Add(computer); - } - } - - return restartStageTestList; - } - -#if !CORECLR - private List SetUpComputerInfoUsingDcom(IEnumerable computerNames, ConnectionOptions options) - { - var validComputerNameList = new List(); - var query = new ObjectQuery("Select * From " + ComputerWMIHelper.WMI_Class_OperatingSystem); - var enumOptions = new EnumerationOptions { UseAmendedQualifiers = true, DirectRead = true }; - - foreach (var computer in computerNames) - { - try - { - var scope = new ManagementScope(ComputerWMIHelper.GetScopeString(computer, ComputerWMIHelper.WMI_Path_CIM), options); - using (var searcher = new ManagementObjectSearcher(scope, query, enumOptions)) - { - using (var mCollection = searcher.Get()) - { - if (mCollection.Count > 0) - { - foreach (ManagementBaseObject os in mCollection) - { - using (os) - { - if (!_computerInfos.ContainsKey(computer)) - { - var info = new ComputerInfo - { - LastBootUpTime = os.Properties["LastBootUpTime"].Value.ToString(), - RebootComplete = false - }; - _computerInfos.Add(computer, info); - validComputerNameList.Add(computer); - } - } - } - } - else - { - string errMsg = StringUtil.Format(ComputerResources.RestartComputerSkipped, computer, ComputerResources.CannotGetOperatingSystemObject); - var error = new ErrorRecord(new InvalidOperationException(errMsg), "RestartComputerSkipped", - ErrorCategory.OperationStopped, computer); - this.WriteError(error); - } - } - } - } - catch (ManagementException ex) - { - string errMsg = StringUtil.Format(ComputerResources.RestartComputerSkipped, computer, ex.Message); - var error = new ErrorRecord(new InvalidOperationException(errMsg), "RestartComputerSkipped", - ErrorCategory.OperationStopped, computer); - this.WriteError(error); - } - catch (COMException ex) - { - string errMsg = StringUtil.Format(ComputerResources.RestartComputerSkipped, computer, ex.Message); - var error = new ErrorRecord(new InvalidOperationException(errMsg), "RestartComputerSkipped", - ErrorCategory.OperationStopped, computer); - this.WriteError(error); - } - catch (UnauthorizedAccessException ex) - { - string errMsg = StringUtil.Format(ComputerResources.RestartComputerSkipped, computer, ex.Message); - var error = new ErrorRecord(new InvalidOperationException(errMsg), "RestartComputerSkipped", - ErrorCategory.OperationStopped, computer); - this.WriteError(error); - } - } - - return validComputerNameList; - } -#endif - - private List SetUpComputerInfoUsingWsman(IEnumerable computerNames, CancellationToken token) - { - var validComputerNameList = new List(); - var operationOptions = new CimOperationOptions - { - Timeout = TimeSpan.FromMilliseconds(2000), - CancellationToken = token - }; - foreach (var computer in computerNames) - { - try - { - using (CimSession cimSession = RemoteDiscoveryHelper.CreateCimSession(computer, Credential, WsmanAuthentication, token, this)) - { - bool itemRetrieved = false; - IEnumerable mCollection = cimSession.QueryInstances( - ComputerWMIHelper.CimOperatingSystemNamespace, - ComputerWMIHelper.CimQueryDialect, - "Select * from " + ComputerWMIHelper.WMI_Class_OperatingSystem, - operationOptions); - foreach (CimInstance os in mCollection) - { - itemRetrieved = true; - if (!_computerInfos.ContainsKey(computer)) - { - var info = new ComputerInfo - { - LastBootUpTime = os.CimInstanceProperties["LastBootUpTime"].Value.ToString(), - RebootComplete = false - }; - _computerInfos.Add(computer, info); - validComputerNameList.Add(computer); - } - } - - if (!itemRetrieved) - { - string errMsg = StringUtil.Format(ComputerResources.RestartComputerSkipped, computer, ComputerResources.CannotGetOperatingSystemObject); - var error = new ErrorRecord(new InvalidOperationException(errMsg), "RestartComputerSkipped", - ErrorCategory.OperationStopped, computer); - this.WriteError(error); - } - } - } - catch (CimException ex) - { - string errMsg = StringUtil.Format(ComputerResources.RestartComputerSkipped, computer, ex.Message); - var error = new ErrorRecord(new InvalidOperationException(errMsg), "RestartComputerSkipped", - ErrorCategory.OperationStopped, computer); - this.WriteError(error); - } - catch (Exception ex) - { - string errMsg = StringUtil.Format(ComputerResources.RestartComputerSkipped, computer, ex.Message); - var error = new ErrorRecord(new InvalidOperationException(errMsg), "RestartComputerSkipped", - ErrorCategory.OperationStopped, computer); - this.WriteError(error); - } - } - - return validComputerNameList; - } - - private void WriteOutTimeoutError(IEnumerable computerNames) - { - const string errorId = "RestartComputerTimeout"; - foreach (string computer in computerNames) - { - string errorMsg = StringUtil.Format(ComputerResources.RestartcomputerFailed, computer, ComputerResources.TimeoutError); - var exception = new RestartComputerTimeoutException(computer, Timeout, errorMsg, errorId); - var error = new ErrorRecord(exception, errorId, ErrorCategory.OperationTimeout, computer); - WriteError(error); - } - } - -#endregion "Private Methods" - -#region "Internal Methods" - - internal static List TestWmiConnectionUsingWsman(List computerNames, List nextTestList, CancellationToken token, PSCredential credential, string wsmanAuthentication, PSCmdlet cmdlet) - { - // Check if the WMI service "Winmgmt" is started - const string wmiServiceQuery = "Select * from " + ComputerWMIHelper.WMI_Class_Service + " Where name = 'Winmgmt'"; - var wmiTestList = new List(); - var operationOptions = new CimOperationOptions - { - Timeout = TimeSpan.FromMilliseconds(2000), - CancellationToken = token - }; - foreach (var computer in computerNames) - { - try - { - if (token.IsCancellationRequested) { break; } - using (CimSession cimSession = RemoteDiscoveryHelper.CreateCimSession(computer, credential, wsmanAuthentication, token, cmdlet)) - { - bool itemRetrieved = false; - IEnumerable mCollection = cimSession.QueryInstances( - ComputerWMIHelper.CimOperatingSystemNamespace, - ComputerWMIHelper.CimQueryDialect, - wmiServiceQuery, - operationOptions); - foreach (CimInstance service in mCollection) - { - itemRetrieved = true; - if (LanguagePrimitives.IsTrue(service.CimInstanceProperties["Started"].Value)) - { - nextTestList.Add(computer); - } - else - { - wmiTestList.Add(computer); - } - } - - if (!itemRetrieved) - { - wmiTestList.Add(computer); - } - } - } - catch (CimException) - { - wmiTestList.Add(computer); - } - catch (Exception) - { - wmiTestList.Add(computer); - } - } - - return wmiTestList; - } - -#if !CORECLR - /// - /// Test WinRM connectivity for the restarting machine - /// - /// - /// - /// - /// - internal static List TestWinrmConnection(List computerNames, List nextTestList, CancellationToken token) - { - List winrmTestList = new List(); - IWSManEx wsmanObject = (IWSManEx)new WSManClass(); - int sessionFlags = (int)WSManSessionFlags.WSManFlagUseNoAuthentication | (int)WSManSessionFlags.WSManFlagUtf8; - IWSManConnectionOptionsEx2 connObject = (IWSManConnectionOptionsEx2)wsmanObject.CreateConnectionOptions(); - - foreach (string computerName in computerNames) - { - try - { - if (token.IsCancellationRequested) { break; } - IWSManSession sessionObj = (IWSManSession)wsmanObject.CreateSession(computerName, sessionFlags, connObject); - if (token.IsCancellationRequested) { break; } - sessionObj.Timeout = 1500; - sessionObj.Identify(0); - nextTestList.Add(computerName); - } - catch (COMException) - { - winrmTestList.Add(computerName); - } - catch (Exception) - { - winrmTestList.Add(computerName); - } - } - return winrmTestList; - } -#endif - - /// - /// Test the PowerShell state for the restarting computer - /// - /// - /// - /// - /// - /// - internal static List TestPowerShell(List computerNames, List nextTestList, System.Management.Automation.PowerShell powershell, PSCredential credential) - { - List psList = new List(); - - try - { - Collection psObjectCollection = powershell.Invoke(new object[] { credential, computerNames.ToArray() }); - if (psObjectCollection == null) - { - Dbg.Diagnostics.Assert(false, "This should never happen. Invoke should never return null."); - } - - // If ^C or timeout happens when we are in powershell.Invoke(), the psObjectCollection might be empty - if (psObjectCollection.Count == 0) - { - return computerNames; - } - - object result = PSObject.Base(psObjectCollection[0]); - Hashtable data = result as Hashtable; - - Dbg.Diagnostics.Assert(data != null, "data should never be null"); - Dbg.Diagnostics.Assert(data.Count == computerNames.Count, "data should contain results for all computers in computerNames"); - - foreach (string computer in computerNames) - { - if (LanguagePrimitives.IsTrue(data[computer])) - { - nextTestList.Add(computer); - } - else - { - psList.Add(computer); - } - } - } - catch (PipelineStoppedException) - { - // powershell.Stop() is invoked because timeout expires, or Ctrl+C is pressed - } - catch (ObjectDisposedException) - { - // powershell.dispose() is invoked because timeout expires, or Ctrl+C is pressed - } - - return psList; - } - -#if !CORECLR - /// - /// Restart one computer - /// - /// - /// - /// - /// - /// - /// - /// True if the restart was successful - /// False otherwise - /// - internal static bool RestartOneComputerUsingDcom(PSCmdlet cmdlet, bool isLocalhost, string computerName, object[] flags, ConnectionOptions options) - { - bool isSuccess = false; - PlatformInvokes.TOKEN_PRIVILEGE currentPrivilegeState = new PlatformInvokes.TOKEN_PRIVILEGE(); - - try - { - if (!(isLocalhost && PlatformInvokes.EnableTokenPrivilege(ComputerWMIHelper.SE_SHUTDOWN_NAME, ref currentPrivilegeState)) && - !(!isLocalhost && PlatformInvokes.EnableTokenPrivilege(ComputerWMIHelper.SE_REMOTE_SHUTDOWN_NAME, ref currentPrivilegeState))) - { - string message = - StringUtil.Format(ComputerResources.PrivilegeNotEnabled, computerName, - isLocalhost ? ComputerWMIHelper.SE_SHUTDOWN_NAME : ComputerWMIHelper.SE_REMOTE_SHUTDOWN_NAME); - ErrorRecord errorRecord = new ErrorRecord(new InvalidOperationException(message), "PrivilegeNotEnabled", ErrorCategory.InvalidOperation, null); - cmdlet.WriteError(errorRecord); - return false; - } - - ManagementScope scope = new ManagementScope(ComputerWMIHelper.GetScopeString(isLocalhost ? "localhost" : computerName, ComputerWMIHelper.WMI_Path_CIM), options); - EnumerationOptions enumOptions = new EnumerationOptions { UseAmendedQualifiers = true, DirectRead = true }; - ObjectQuery query = new ObjectQuery("select * from " + ComputerWMIHelper.WMI_Class_OperatingSystem); - using (var searcher = new ManagementObjectSearcher(scope, query, enumOptions)) - { - foreach (ManagementObject operatingSystem in searcher.Get()) - { - using (operatingSystem) - { - object result = operatingSystem.InvokeMethod("Win32shutdown", flags); - int retVal = Convert.ToInt32(result.ToString(), CultureInfo.CurrentCulture); - if (retVal != 0) - { - var ex = new Win32Exception(retVal); - string errMsg = StringUtil.Format(ComputerResources.RestartcomputerFailed, computerName, ex.Message); - ErrorRecord error = new ErrorRecord( - new InvalidOperationException(errMsg), "RestartcomputerFailed", ErrorCategory.OperationStopped, computerName); - cmdlet.WriteError(error); - } - else - { - isSuccess = true; - } - } - } - } - } - catch (ManagementException ex) - { - string errMsg = StringUtil.Format(ComputerResources.RestartcomputerFailed, computerName, ex.Message); - ErrorRecord error = new ErrorRecord(new InvalidOperationException(errMsg), "RestartcomputerFailed", - ErrorCategory.OperationStopped, computerName); - cmdlet.WriteError(error); - } - catch (COMException ex) - { - string errMsg = StringUtil.Format(ComputerResources.RestartcomputerFailed, computerName, ex.Message); - ErrorRecord error = new ErrorRecord(new InvalidOperationException(errMsg), "RestartcomputerFailed", - ErrorCategory.OperationStopped, computerName); - cmdlet.WriteError(error); - } - catch (UnauthorizedAccessException ex) - { - string errMsg = StringUtil.Format(ComputerResources.RestartcomputerFailed, computerName, ex.Message); - ErrorRecord error = new ErrorRecord(new InvalidOperationException(errMsg), "RestartcomputerFailed", - ErrorCategory.OperationStopped, computerName); - cmdlet.WriteError(error); - } - finally - { - // Restore the previous privilege state if something unexpected happened - PlatformInvokes.RestoreTokenPrivilege( - isLocalhost ? ComputerWMIHelper.SE_SHUTDOWN_NAME : ComputerWMIHelper.SE_REMOTE_SHUTDOWN_NAME, ref currentPrivilegeState); - } - - return isSuccess; - } -#endif - -#endregion "Internal Methods" - -#region "Overrides" - - /// - /// BeginProcessing method. - /// - protected override void BeginProcessing() - { - if (ParameterSetName.Equals(DefaultParameterSet, StringComparison.OrdinalIgnoreCase)) - { - if (WsmanAuthentication != null && (_isDcomAuthenticationSpecified || _isImpersonationSpecified)) - { - string errorMsg = StringUtil.Format(ComputerResources.ParameterConfliction, - ComputerResources.ParameterUsage); - InvalidOperationException ex = new InvalidOperationException(errorMsg); - ThrowTerminatingError(new ErrorRecord(ex, "ParameterConfliction", ErrorCategory.InvalidOperation, null)); - } - - bool usingDcom = Protocol.Equals(ComputerWMIHelper.DcomProtocol, StringComparison.OrdinalIgnoreCase); - bool usingWsman = Protocol.Equals(ComputerWMIHelper.WsmanProtocol, StringComparison.OrdinalIgnoreCase); - - if (_isProtocolSpecified && usingDcom && WsmanAuthentication != null) - { - string errorMsg = StringUtil.Format(ComputerResources.InvalidParameterForDCOM, - ComputerResources.ParameterUsage); - InvalidOperationException ex = new InvalidOperationException(errorMsg); - ThrowTerminatingError(new ErrorRecord(ex, "InvalidParameterForDCOM", ErrorCategory.InvalidOperation, null)); - } - - if (_isProtocolSpecified && usingWsman && (_isDcomAuthenticationSpecified || _isImpersonationSpecified)) - { - string errorMsg = StringUtil.Format(ComputerResources.InvalidParameterForWSMan, - ComputerResources.ParameterUsage); - InvalidOperationException ex = new InvalidOperationException(errorMsg); - ThrowTerminatingError(new ErrorRecord(ex, "InvalidParameterForWSMan", ErrorCategory.InvalidOperation, null)); - } - - if (!_isProtocolSpecified && WsmanAuthentication != null) - { - // Change the protocol to be WSMan if the WsmanAuthentication is specified - Protocol = ComputerWMIHelper.WsmanProtocol; - } - } - -#if CORECLR - if (this.MyInvocation.BoundParameters.ContainsKey("DcomAuthentication")) - { - string errMsg = StringUtil.Format(ComputerResources.InvalidParameterForCoreClr, "DcomAuthentication"); - PSArgumentException ex = new PSArgumentException(errMsg, ComputerResources.InvalidParameterForCoreClr); - ThrowTerminatingError(new ErrorRecord(ex, "InvalidParameterForCoreClr", ErrorCategory.InvalidArgument, null)); - } - - if (this.MyInvocation.BoundParameters.ContainsKey("Impersonation")) - { - string errMsg = StringUtil.Format(ComputerResources.InvalidParameterForCoreClr, "Impersonation"); - PSArgumentException ex = new PSArgumentException(errMsg, ComputerResources.InvalidParameterForCoreClr); - ThrowTerminatingError(new ErrorRecord(ex, "InvalidParameterForCoreClr", ErrorCategory.InvalidArgument, null)); - } - - // DCOM Authentication is not supported for CoreCLR. Throw an error - // and request that the user specify WSMan Authentication. - if (_isDcomAuthenticationSpecified || - Protocol.Equals(ComputerWMIHelper.DcomProtocol, StringComparison.OrdinalIgnoreCase)) - { - InvalidOperationException ex = new InvalidOperationException(ComputerResources.InvalidParameterDCOMNotSupported); - ThrowTerminatingError(new ErrorRecord(ex, "InvalidParameterDCOMNotSupported", ErrorCategory.InvalidOperation, null)); - } - - // TODO:CORECLR This should be re-visited if we decide to add double hop remoting to CoreCLR (outgoing connections) - if (ParameterSetName.Equals(AsJobParameterSet, StringComparison.OrdinalIgnoreCase)) - { - InvalidOperationException ex = new InvalidOperationException(ComputerResources.InvalidParameterSetAsJob); - ThrowTerminatingError(new ErrorRecord(ex, "InvalidParameterSetAsJob", ErrorCategory.InvalidOperation, null)); - } -#endif - - // Timeout, For, Delay, Progress cannot be present if Wait is not present - if ((_timeoutSpecified || _waitForSpecified || _delaySpecified) && !Wait) - { - InvalidOperationException ex = new InvalidOperationException(ComputerResources.RestartComputerInvalidParameter); - ThrowTerminatingError(new ErrorRecord(ex, "RestartComputerInvalidParameter", ErrorCategory.InvalidOperation, null)); - } - - if (Wait) - { - _activityId = (new Random()).Next(); - if (_timeout == -1 || _timeout >= int.MaxValue / 1000) - { - _timeoutInMilliseconds = int.MaxValue; - } - else - { - _timeoutInMilliseconds = _timeout * 1000; - } - - // We don't support combined service types for now - switch (_waitFor) - { - case WaitForServiceTypes.Wmi: - case WaitForServiceTypes.WinRM: - break; - case WaitForServiceTypes.PowerShell: - _powershell = System.Management.Automation.PowerShell.Create(); - _powershell.AddScript(TestPowershellScript); - break; - default: - InvalidOperationException ex = new InvalidOperationException(ComputerResources.NoSupportForCombinedServiceType); - ErrorRecord error = new ErrorRecord(ex, "NoSupportForCombinedServiceType", ErrorCategory.InvalidOperation, (int)_waitFor); - ThrowTerminatingError(error); - break; - } - } - } - - /// - /// ProcessRecord method. - /// - [SuppressMessage("Microsoft.Maintainability", "CA1506:AvoidExcessiveClassCoupling")] - protected override void ProcessRecord() - { - // Validate parameters - ValidateComputerNames(); - - object[] flags = new object[] { 2, 0 }; - if (Force) flags[0] = 6; - -#if CORECLR - if (ParameterSetName.Equals(DefaultParameterSet, StringComparison.OrdinalIgnoreCase)) - { -#else // TODO:CORECLR Revisit if or when jobs are supported - if (ParameterSetName.Equals(AsJobParameterSet, StringComparison.OrdinalIgnoreCase)) - { - string[] names = _validatedComputerNames.ToArray(); - string strComputers = ComputerWMIHelper.GetMachineNames(names); - if (!ShouldProcess(strComputers)) - return; - - InvokeWmiMethod WmiInvokeCmd = new InvokeWmiMethod(); - WmiInvokeCmd.Path = ComputerWMIHelper.WMI_Class_OperatingSystem + "=@"; - WmiInvokeCmd.ComputerName = names; - WmiInvokeCmd.Authentication = DcomAuthentication; - WmiInvokeCmd.Impersonation = Impersonation; - WmiInvokeCmd.Credential = Credential; - WmiInvokeCmd.ThrottleLimit = ThrottleLimit; - WmiInvokeCmd.Name = "Win32Shutdown"; - WmiInvokeCmd.EnableAllPrivileges = SwitchParameter.Present; - WmiInvokeCmd.ArgumentList = flags; - PSWmiJob wmiJob = new PSWmiJob(WmiInvokeCmd, names, ThrottleLimit, Job.GetCommandTextFromInvocationInfo(this.MyInvocation)); - this.JobRepository.Add(wmiJob); - WriteObject(wmiJob); - } - else if (ParameterSetName.Equals(DefaultParameterSet, StringComparison.OrdinalIgnoreCase)) - { - // CoreCLR does not support DCOM, so there is no point checking - // it here. It was already validated in BeginProcessing(). - - bool dcomInUse = Protocol.Equals(ComputerWMIHelper.DcomProtocol, StringComparison.OrdinalIgnoreCase); - ConnectionOptions options = ComputerWMIHelper.GetConnectionOptions(this.DcomAuthentication, this.Impersonation, this.Credential); -#endif - if (Wait && _timeout != 0) - { - _validatedComputerNames = -#if !CORECLR - dcomInUse ? SetUpComputerInfoUsingDcom(_validatedComputerNames, options) : -#endif - SetUpComputerInfoUsingWsman(_validatedComputerNames, _cancel.Token); - } - - foreach (string computer in _validatedComputerNames) - { - bool isLocal = false; - string compname; - - if (computer.Equals("localhost", StringComparison.CurrentCultureIgnoreCase)) - { - compname = _shortLocalMachineName; - isLocal = true; - -#if !CORECLR - if (dcomInUse) - { - // The local machine will always at the end of the list. If the current target - // computer is the local machine, it's safe to set Username and Password to null. - options.Username = null; - options.SecurePassword = null; - } -#endif - } - else - { - compname = computer; - } - - // Generate target and action strings - string action = - StringUtil.Format( - ComputerResources.RestartComputerAction, - isLocal ? ComputerResources.LocalShutdownPrivilege : ComputerResources.RemoteShutdownPrivilege); - string target = - isLocal ? StringUtil.Format(ComputerResources.DoubleComputerName, "localhost", compname) : compname; - - if (!ShouldProcess(target, action)) - { - continue; - } - - bool isSuccess = -#if !CORECLR - dcomInUse ? RestartOneComputerUsingDcom(this, isLocal, compname, flags, options) : -#endif - ComputerWMIHelper.InvokeWin32ShutdownUsingWsman(this, isLocal, compname, flags, Credential, WsmanAuthentication, ComputerResources.RestartcomputerFailed, "RestartcomputerFailed", _cancel.Token); - - if (isSuccess && Wait && _timeout != 0) - { - _waitOnComputers.Add(computer); - } - }//end foreach - - if (_waitOnComputers.Count > 0) - { - var restartStageTestList = new List(_waitOnComputers); - var wmiTestList = new List(); - var winrmTestList = new List(); - var psTestList = new List(); - var allDoneList = new List(); - - bool isForWmi = _waitFor.Equals(WaitForServiceTypes.Wmi); - bool isForWinRm = _waitFor.Equals(WaitForServiceTypes.WinRM); - bool isForPowershell = _waitFor.Equals(WaitForServiceTypes.PowerShell); - - int indicatorIndex = 0; - int machineCompleteRestart = 0; - int actualDelay = SecondsToWaitForRestartToBegin; - bool first = true; - bool waitComplete = false; - - _percent = 0; - _status = ComputerResources.WaitForRestartToBegin; - _activity = _waitOnComputers.Count == 1 ? - StringUtil.Format(ComputerResources.RestartSingleComputerActivity, _waitOnComputers[0]) : - ComputerResources.RestartMultipleComputersActivity; - - _timer = new Timer(OnTimedEvent, null, _timeoutInMilliseconds, System.Threading.Timeout.Infinite); - - while (true) - { - int loopCount = actualDelay * 4; // (delay * 1000)/250ms - while (loopCount > 0) - { - WriteProgress(_indicator[(indicatorIndex++) % 4] + _activity, _status, _percent, ProgressRecordType.Processing); - - loopCount--; - _waitHandler.Wait(250); - if (_exit) { break; } - } - - if (first) - { - actualDelay = _delay; - first = false; - - if (_waitOnComputers.Count > 1) - { - _status = StringUtil.Format(ComputerResources.WaitForMultipleComputers, machineCompleteRestart, _waitOnComputers.Count); - WriteProgress(_indicator[(indicatorIndex++) % 4] + _activity, _status, _percent, ProgressRecordType.Processing); - } - } - - do - { - // Test restart stage. - // We check if the target machine has already rebooted by querying the LastBootUpTime from the Win32_OperatingSystem object. - // So after this step, we are sure that both the Network and the WMI or WinRM service have already come up. - if (_exit) { break; } - if (restartStageTestList.Count > 0) - { - if (_waitOnComputers.Count == 1) - { - _status = ComputerResources.VerifyRebootStage; - _percent = CalculateProgressPercentage(StageVerification); - WriteProgress(_indicator[(indicatorIndex++) % 4] + _activity, _status, _percent, ProgressRecordType.Processing); - } - List nextTestList = (isForWmi || isForPowershell) ? wmiTestList : winrmTestList; - restartStageTestList = -#if !CORECLR - dcomInUse ? TestRestartStageUsingDcom(restartStageTestList, nextTestList, _cancel.Token, options) : -#endif - TestRestartStageUsingWsman(restartStageTestList, nextTestList, _cancel.Token); - } - - // Test WMI service - if (_exit) { break; } - if (wmiTestList.Count > 0) - { -#if !CORECLR - if (dcomInUse) - { - // CIM-DCOM is in use. In this case, restart stage checking is done by using WMIv1, - // so the WMI service on the target machine is already up at this point. - winrmTestList.AddRange(wmiTestList); - wmiTestList.Clear(); - - if (_waitOnComputers.Count == 1) - { - // This is to simulate the test for WMI service - _status = ComputerResources.WaitForWMI; - _percent = CalculateProgressPercentage(WmiConnectionTest); - - loopCount = actualDelay * 4; // (delay * 1000)/250ms - while (loopCount > 0) - { - WriteProgress(_indicator[(indicatorIndex++) % 4] + _activity, _status, _percent, ProgressRecordType.Processing); - - loopCount--; - _waitHandler.Wait(250); - if (_exit) { break; } - } - } - } - else -#endif - // This statement block executes for both CLRs. - // In the "full" CLR, it serves as the else case. - { - if (_waitOnComputers.Count == 1) - { - _status = ComputerResources.WaitForWMI; - _percent = CalculateProgressPercentage(WmiConnectionTest); - WriteProgress(_indicator[(indicatorIndex++) % 4] + _activity, _status, _percent, ProgressRecordType.Processing); - } - wmiTestList = TestWmiConnectionUsingWsman(wmiTestList, winrmTestList, _cancel.Token, Credential, WsmanAuthentication, this); - } - } - if (isForWmi) { break; } - - // Test WinRM service - if (_exit) { break; } - if (winrmTestList.Count > 0) - { -#if !CORECLR - if (dcomInUse) - { - if (_waitOnComputers.Count == 1) - { - _status = ComputerResources.WaitForWinRM; - _percent = CalculateProgressPercentage(WinrmConnectionTest); - WriteProgress(_indicator[(indicatorIndex++) % 4] + _activity, _status, _percent, ProgressRecordType.Processing); - } - winrmTestList = TestWinrmConnection(winrmTestList, psTestList, _cancel.Token); - } - else -#endif - // This statement block executes for both CLRs. - // In the "full" CLR, it serves as the else case. - { - // CIM-WSMan in use. In this case, restart stage checking is done by using WMIv2, - // so the WinRM service on the target machine is already up at this point. - psTestList.AddRange(winrmTestList); - winrmTestList.Clear(); - - if (_waitOnComputers.Count == 1) - { - // This is to simulate the test for WinRM service - _status = ComputerResources.WaitForWinRM; - _percent = CalculateProgressPercentage(WinrmConnectionTest); - - loopCount = actualDelay * 4; // (delay * 1000)/250ms - while (loopCount > 0) - { - WriteProgress(_indicator[(indicatorIndex++) % 4] + _activity, _status, _percent, ProgressRecordType.Processing); - - loopCount--; - _waitHandler.Wait(250); - if (_exit) { break; } - } - } - } - } - if (isForWinRm) { break; } - - // Test PowerShell - if (_exit) { break; } - if (psTestList.Count > 0) - { - if (_waitOnComputers.Count == 1) - { - _status = ComputerResources.WaitForPowerShell; - _percent = CalculateProgressPercentage(PowerShellConnectionTest); - WriteProgress(_indicator[(indicatorIndex++) % 4] + _activity, _status, _percent, ProgressRecordType.Processing); - } - psTestList = TestPowerShell(psTestList, allDoneList, _powershell, this.Credential); - } - } while (false); - - // if time is up or Ctrl+c is typed, break out - if (_exit) { break; } - - // Check if the restart completes - switch (_waitFor) - { - case WaitForServiceTypes.Wmi: - waitComplete = (winrmTestList.Count == _waitOnComputers.Count); - machineCompleteRestart = winrmTestList.Count; - break; - case WaitForServiceTypes.WinRM: - waitComplete = (psTestList.Count == _waitOnComputers.Count); - machineCompleteRestart = psTestList.Count; - break; - case WaitForServiceTypes.PowerShell: - waitComplete = (allDoneList.Count == _waitOnComputers.Count); - machineCompleteRestart = allDoneList.Count; - break; - } - - // Wait is done or time is up - if (waitComplete || _exit) - { - if (waitComplete) - { - _status = ComputerResources.RestartComplete; - WriteProgress(_indicator[indicatorIndex % 4] + _activity, _status, 100, ProgressRecordType.Completed); - _timer.Change(System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite); - } - break; - } - - if (_waitOnComputers.Count > 1) - { - _status = StringUtil.Format(ComputerResources.WaitForMultipleComputers, machineCompleteRestart, _waitOnComputers.Count); - _percent = machineCompleteRestart * 100 / _waitOnComputers.Count; - } - }// end while(true) - - if (_timeUp) - { - // The timeout expires. Write out timeout error messages for the computers that haven't finished restarting - do - { - if (restartStageTestList.Count > 0) { WriteOutTimeoutError(restartStageTestList); } - if (wmiTestList.Count > 0) { WriteOutTimeoutError(wmiTestList); } - // Wait for WMI. All computers that finished restarting are put in "winrmTestList" - if (isForWmi) { break; } - - // Wait for WinRM. All computers that finished restarting are put in "psTestList" - if (winrmTestList.Count > 0) { WriteOutTimeoutError(winrmTestList); } - if (isForWinRm) { break; } - - if (psTestList.Count > 0) { WriteOutTimeoutError(psTestList); } - // Wait for PowerShell. All computers that finished restarting are put in "allDoneList" - } while (false); - } - }// end if(waitOnComputer.Count > 0) - }//end DefaultParameter - }//End Processrecord - - /// - /// to implement ^C - /// - protected override void StopProcessing() - { - _exit = true; - _cancel.Cancel(); - _waitHandler.Set(); - - if (_timer != null) - { - _timer.Change(System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite); - } - - if (_powershell != null) - { - _powershell.Stop(); - _powershell.Dispose(); - } - } - -#endregion "Overrides" - } - -#endregion Restart-Computer - -#region Stop-Computer - - /// - /// cmdlet to stop computer - /// - [Cmdlet(VerbsLifecycle.Stop, "Computer", SupportsShouldProcess = true, - HelpUri = "https://go.microsoft.com/fwlink/?LinkID=135263", RemotingCapability = RemotingCapability.SupportedByCommand)] - public sealed class StopComputerCommand : PSCmdlet, IDisposable - { -#region Private Members - -#if !CORECLR - private ManagementObjectSearcher _searcher; -#endif - private readonly CancellationTokenSource _cancel = new CancellationTokenSource(); - private TransportProtocol _transportProtocol = TransportProtocol.DCOM; - -#endregion - -#region "Parameters" - - /// - /// parameter - /// - [Parameter] - public SwitchParameter AsJob { get; set; } = false; - - /// - /// The following is the definition of the input parameter "DcomAuthentication". - /// Specifies the authentication level to be used with WMI connection. Valid - /// values are: - /// - /// Unchanged = -1, - /// Default = 0, - /// None = 1, - /// Connect = 2, - /// Call = 3, - /// Packet = 4, - /// PacketIntegrity = 5, - /// PacketPrivacy = 6. - /// - [Parameter] - [Alias("Authentication")] - public AuthenticationLevel DcomAuthentication { get; set; } = AuthenticationLevel.Packet; - - /// - /// The authentication options for CIM_WSMan connection - /// - [Parameter] - [ValidateSet( - "Default", - "Basic", - "Negotiate", // can be used with and without credential (without -> PSRP mapped to NegotiateWithImplicitCredential) - "CredSSP", - "Digest", - "Kerberos")] // can be used with and without credential (not sure about implications) - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly")] - public string WsmanAuthentication { get; set; } = "Default"; - - /// - /// Specify the protocol to use - /// - [Parameter] - [ValidateSet(ComputerWMIHelper.DcomProtocol, ComputerWMIHelper.WsmanProtocol)] - public string Protocol { get; set; } = -#if CORECLR - //CoreClr does not support DCOM protocol - // This change makes sure that the the command works seamlessly if user did not explicitly entered the protocol - ComputerWMIHelper.WsmanProtocol; -#else - ComputerWMIHelper.DcomProtocol; -#endif - - /// - /// The following is the definition of the input parameter "ComputerName". - /// Value of the address requested. The form of the value can be either the - /// computer name ("wxyz1234"), IPv4 address ("192.168.177.124"), or IPv6 - /// address ("2010:836B:4179::836B:4179"). - /// - [Parameter(Position = 0, ValueFromPipelineByPropertyName = true)] - [ValidateNotNullOrEmpty] - [SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays")] - [Alias("CN", "__SERVER", "Server", "IPAddress")] - public String[] ComputerName { get; set; } = new string[] { "." }; - - - /// - /// The following is the definition of the input parameter "Credential". - /// Specifies a user account that has permission to perform this action. Type a - /// user-name, such as "User01" or "Domain01\User01", or enter a PSCredential - /// object, such as one from the Get-Credential cmdlet - /// - [Parameter(Position = 1)] - [ValidateNotNullOrEmpty] - [Credential] - public PSCredential Credential { get; set; } - - /// - /// The following is the definition of the input parameter "Impersonation". - /// Specifies the impersonation level to use when calling the WMI method. Valid - /// values are: - /// - /// Default = 0, - /// Anonymous = 1, - /// Identify = 2, - /// Impersonate = 3, - /// Delegate = 4. - /// - [Parameter] - public ImpersonationLevel Impersonation { get; set; } = ImpersonationLevel.Impersonate; - - /// - /// The following is the definition of the input parameter "ThrottleLimit". - /// The number of concurrent computers on which the command will be allowed to - /// execute - /// - [Parameter] - [ValidateRange(int.MinValue, (int)1000)] - public Int32 ThrottleLimit - { - get { return _throttlelimit; } - set - { - _throttlelimit = value; - if (_throttlelimit <= 0) - _throttlelimit = 32; - } - } - private Int32 _throttlelimit = 32; - - /// - /// The following is the definition of the input parameter "ThrottleLimit". - /// The number of concurrent computers on which the command will be allowed to - /// execute - /// - [Parameter] - public SwitchParameter Force { get; set; } = false; - - #endregion "parameters" - -#region "IDisposable Members" - - /// - /// Dispose Method - /// - public void Dispose() - { - try - { - _cancel.Dispose(); - } - catch (ObjectDisposedException) { } - } - -#endregion "IDisposable Members" - -#region "Overrides" - - /// - /// BeginProcessing - /// - protected override void BeginProcessing() - { - base.BeginProcessing(); - - // Verify parameter set - bool haveProtocolParam = this.MyInvocation.BoundParameters.ContainsKey("Protocol"); - bool haveWsmanAuthenticationParam = this.MyInvocation.BoundParameters.ContainsKey("WsmanAuthentication"); - bool haveDcomAuthenticationParam = this.MyInvocation.BoundParameters.ContainsKey("DcomAuthentication"); - bool haveDcomImpersonation = this.MyInvocation.BoundParameters.ContainsKey("Impersonation"); - _transportProtocol = (this.Protocol.Equals(ComputerWMIHelper.WsmanProtocol, StringComparison.OrdinalIgnoreCase) || (haveWsmanAuthenticationParam && !haveProtocolParam)) ? - TransportProtocol.WSMan : TransportProtocol.DCOM; - - if (haveWsmanAuthenticationParam && (haveDcomAuthenticationParam || haveDcomImpersonation)) - { - string errMsg = StringUtil.Format(ComputerResources.StopCommandParamWSManAuthConflict, ComputerResources.StopCommandParamMessage); - ThrowTerminatingError( - new ErrorRecord( - new PSArgumentException(errMsg), - "InvalidParameter", - ErrorCategory.InvalidArgument, - this)); - } - - if ((_transportProtocol == TransportProtocol.DCOM) && haveWsmanAuthenticationParam) - { - string errMsg = StringUtil.Format(ComputerResources.StopCommandWSManAuthProtocolConflict, ComputerResources.StopCommandParamMessage); - ThrowTerminatingError( - new ErrorRecord( - new PSArgumentException(errMsg), - "InvalidParameter", - ErrorCategory.InvalidArgument, - this)); - } - - if ((_transportProtocol == TransportProtocol.WSMan) && (haveDcomAuthenticationParam || haveDcomImpersonation)) - { - string errMsg = StringUtil.Format(ComputerResources.StopCommandAuthProtocolConflict, ComputerResources.StopCommandParamMessage); - ThrowTerminatingError( - new ErrorRecord( - new PSArgumentException(errMsg), - "InvalidParameter", - ErrorCategory.InvalidArgument, - this)); - } - -#if CORECLR - if (this.MyInvocation.BoundParameters.ContainsKey("DcomAuthentication")) - { - string errMsg = StringUtil.Format(ComputerResources.InvalidParameterForCoreClr, "DcomAuthentication"); - PSArgumentException ex = new PSArgumentException(errMsg, ComputerResources.InvalidParameterForCoreClr); - ThrowTerminatingError(new ErrorRecord(ex, "InvalidParameterForCoreClr", ErrorCategory.InvalidArgument, null)); - } - - if (this.MyInvocation.BoundParameters.ContainsKey("Impersonation")) - { - string errMsg = StringUtil.Format(ComputerResources.InvalidParameterForCoreClr, "Impersonation"); - PSArgumentException ex = new PSArgumentException(errMsg, ComputerResources.InvalidParameterForCoreClr); - ThrowTerminatingError(new ErrorRecord(ex, "InvalidParameterForCoreClr", ErrorCategory.InvalidArgument, null)); - } - - if(this.Protocol.Equals(ComputerWMIHelper.DcomProtocol , StringComparison.OrdinalIgnoreCase)) - { - InvalidOperationException ex = new InvalidOperationException(ComputerResources.InvalidParameterDCOMNotSupported); - ThrowTerminatingError(new ErrorRecord(ex, "InvalidParameterDCOMNotSupported", ErrorCategory.InvalidOperation, null)); - } -#endif - } - - /// - /// ProcessRecord - /// - [SuppressMessage("Microsoft.Maintainability", "CA1506:AvoidExcessiveClassCoupling")] - protected override void ProcessRecord() - { - object[] flags = new object[] { 1, 0 }; - if (Force.IsPresent) - flags[0] = 5; - - switch (_transportProtocol) - { -#if !CORECLR - case TransportProtocol.DCOM: - ProcessDCOMProtocol(flags); - break; -#endif - - case TransportProtocol.WSMan: - ProcessWSManProtocol(flags); - break; - } - }//End Processrecord - - /// - /// to implement ^C - /// - protected override void StopProcessing() - { -#if !CORECLR - ManagementObjectSearcher searcher = _searcher; - if (searcher != null) - { - try - { - searcher.Dispose(); - } - catch (ObjectDisposedException) { } - } -#endif - - try - { - _cancel.Cancel(); - } - catch (ObjectDisposedException) { } - catch (AggregateException) { } - } - -#endregion "Overrides" - -#region Private Methods - -#if !CORECLR - private void ProcessDCOMProtocol(object[] flags) - { - if (AsJob.IsPresent) - { - string strComputers = ComputerWMIHelper.GetMachineNames(ComputerName); - if (!ShouldProcess(strComputers)) - return; - InvokeWmiMethod WmiInvokeCmd = new InvokeWmiMethod(); - WmiInvokeCmd.Path = ComputerWMIHelper.WMI_Class_OperatingSystem + "=@"; - WmiInvokeCmd.ComputerName = ComputerName; - WmiInvokeCmd.Authentication = DcomAuthentication; - WmiInvokeCmd.Impersonation = Impersonation; - WmiInvokeCmd.Credential = Credential; - WmiInvokeCmd.ThrottleLimit = _throttlelimit; - WmiInvokeCmd.Name = "Win32Shutdown"; - WmiInvokeCmd.EnableAllPrivileges = SwitchParameter.Present; - WmiInvokeCmd.ArgumentList = flags; - PSWmiJob wmiJob = new PSWmiJob(WmiInvokeCmd, ComputerName, _throttlelimit, Job.GetCommandTextFromInvocationInfo(this.MyInvocation)); - this.JobRepository.Add(wmiJob); - WriteObject(wmiJob); - } - else - { - string compname = string.Empty; - string strLocal = string.Empty; - - foreach (string computer in ComputerName) - { - if ((computer.Equals("localhost", StringComparison.CurrentCultureIgnoreCase)) || (computer.Equals(".", StringComparison.OrdinalIgnoreCase))) - { - compname = Dns.GetHostName(); - strLocal = "localhost"; - } - else - { - compname = computer; - } - - if (!ShouldProcess(StringUtil.Format(ComputerResources.DoubleComputerName, strLocal, compname))) - { - continue; - } - else - { - try - { - ConnectionOptions options = ComputerWMIHelper.GetConnectionOptions(DcomAuthentication, this.Impersonation, this.Credential); - ManagementScope scope = new ManagementScope(ComputerWMIHelper.GetScopeString(computer, ComputerWMIHelper.WMI_Path_CIM), options); - EnumerationOptions enumOptions = new EnumerationOptions(); - enumOptions.UseAmendedQualifiers = true; - enumOptions.DirectRead = true; - ObjectQuery query = new ObjectQuery("select * from " + ComputerWMIHelper.WMI_Class_OperatingSystem); - using (_searcher = new ManagementObjectSearcher(scope, query, enumOptions)) - { - foreach (ManagementObject obj in _searcher.Get()) - { - using (obj) - { - object result = obj.InvokeMethod("Win32shutdown", flags); - int retVal = Convert.ToInt32(result.ToString(), CultureInfo.CurrentCulture); - if (retVal != 0) - { - ComputerWMIHelper.WriteNonTerminatingError(retVal, this, compname); - } - } - } - } - _searcher = null; - } - catch (ManagementException e) - { - ErrorRecord errorRecord = new ErrorRecord(e, "StopComputerException", ErrorCategory.InvalidOperation, compname); - WriteError(errorRecord); - continue; - } - catch (System.Runtime.InteropServices.COMException e) - { - ErrorRecord errorRecord = new ErrorRecord(e, "StopComputerException", ErrorCategory.InvalidOperation, compname); - WriteError(errorRecord); - continue; - } - } - } - } - } -#endif - - private void ProcessWSManProtocol(object[] flags) - { - if (AsJob.IsPresent) - { - // TODO: Need job for MI.Net WSMan protocol - // Early return of job object. - throw new PSNotSupportedException(); - } - - foreach (string computer in ComputerName) - { - string compname = string.Empty; - string strLocal = string.Empty; - bool isLocalHost = false; - - if (_cancel.Token.IsCancellationRequested) { break; } - - if ((computer.Equals("localhost", StringComparison.CurrentCultureIgnoreCase)) || (computer.Equals(".", StringComparison.OrdinalIgnoreCase))) - { - compname = Dns.GetHostName(); - strLocal = "localhost"; - isLocalHost = true; - } - else - { - compname = computer; - } - - if (!ShouldProcess(StringUtil.Format(ComputerResources.DoubleComputerName, strLocal, compname))) - { - continue; - } - else - { - ComputerWMIHelper.InvokeWin32ShutdownUsingWsman( - this, - isLocalHost, - compname, - flags, - Credential, - WsmanAuthentication, - ComputerResources.StopcomputerFailed, - "StopComputerException", - _cancel.Token); - } - } - } - -#endregion - } - -#endregion - -#if !CORECLR // TODO:CORECLR Enable once moved to MI .Net - -#region Restore-Computer - - /// - /// This cmdlet is to Restore Computer - /// - [Cmdlet(VerbsData.Restore, "Computer", SupportsShouldProcess = true, HelpUri = "https://go.microsoft.com/fwlink/?LinkID=135254")] - public sealed class RestoreComputerCommand : PSCmdlet, IDisposable - { -#region Parameters - /// - /// Restorepoint parameter - /// - - [Parameter(Position = 0, Mandatory = true)] - [ValidateNotNull] - [ValidateRangeAttribute((int)1, int.MaxValue)] - [Alias("SequenceNumber", "SN", "RP")] - public int RestorePoint { get; set; } - - #endregion - - private ManagementClass WMIClass; - -#region "IDisposable Members" - - /// - /// Dispose Method - /// - public void Dispose() - { - this.Dispose(true); - // Use SuppressFinalize in case a subclass - // of this type implements a finalizer. - GC.SuppressFinalize(this); - } - - /// - /// Dispose Method. - /// - /// - public void Dispose(bool disposing) - { - if (disposing) - { - if (WMIClass != null) - { - WMIClass.Dispose(); - } - } - } - -#endregion "IDisposable Members" - -#region overrides - /// - /// Restores the computer with - /// - protected override void BeginProcessing() - { - // system restore APIs are not supported on ARM platform - if (ComputerWMIHelper.SkipSystemRestoreOperationForARMPlatform(this)) - { - return; - } - - try - { - ConnectionOptions conn = ComputerWMIHelper.GetConnectionOptions(AuthenticationLevel.Packet, ImpersonationLevel.Impersonate, null); - ManagementPath mPath = new ManagementPath(); - mPath.Path = ComputerWMIHelper.WMI_Path_Default; - ManagementScope scope = new ManagementScope(mPath, conn); - scope.Connect(); - WMIClass = new ManagementClass(ComputerWMIHelper.WMI_Class_SystemRestore); - WMIClass.Scope = scope; - - //query to get the list of restore points - ObjectQuery oquery = new ObjectQuery("select * from " + ComputerWMIHelper.WMI_Class_SystemRestore + " where SequenceNumber = " + RestorePoint); - using (ManagementObjectSearcher R_results = new ManagementObjectSearcher(scope, oquery)) - { - //check if the entered restore point is a valid one - if (R_results.Get().Count == 0) - { - string message = StringUtil.Format(ComputerResources.InvalidRestorePoint, RestorePoint); - ArgumentException e = new ArgumentException(message); - ErrorRecord errorrecord = new ErrorRecord(e, "InvalidRestorePoint", ErrorCategory.InvalidArgument, null); - WriteError(errorrecord); - return; - } - } - //confirm with the user before restoring - string computerName = Environment.MachineName; - if (!ShouldProcess(computerName)) - { - return; - } - else - { - //add the restorepoint parameter and invoke th emethod - Object[] arr = new Object[] { RestorePoint }; - WMIClass.InvokeMethod("Restore", arr); - //Restore requires a Reboot and while reboot only the restore actually happens - //code to restart computer - mPath.Path = ComputerWMIHelper.WMI_Path_CIM; - scope.Path = mPath; - ManagementClass OsWMIClass = new ManagementClass(ComputerWMIHelper.WMI_Class_OperatingSystem); - OsWMIClass.Scope = scope; - ObjectQuery objQuery = new ObjectQuery("Select * from " + ComputerWMIHelper.WMI_Class_OperatingSystem); - using (ManagementObjectSearcher results = new ManagementObjectSearcher(scope, objQuery)) - { - foreach (ManagementObject mobj in results.Get()) - { - using (mobj) - { - string[] param = { "" }; - mobj.InvokeMethod("Reboot", param); - } - } - } - } - } - catch (ManagementException e) - { - if (e.ErrorCode.ToString().Equals("NotFound") || e.ErrorCode.ToString().Equals("InvalidClass")) - { - Exception Ex = new ArgumentException(StringUtil.Format(ComputerResources.NotSupported)); - WriteError(new ErrorRecord(Ex, "RestoreComputerNotSupported", ErrorCategory.InvalidOperation, null)); - } - else - { - ErrorRecord errorRecord = new ErrorRecord(e, "GetWMIManagementException", ErrorCategory.InvalidOperation, null); - WriteError(errorRecord); - } - } - catch (COMException e) - { - if (string.IsNullOrEmpty(e.Message)) - { - Exception Ex = new ArgumentException(StringUtil.Format(ComputerResources.SystemRestoreServiceDisabled)); - WriteError(new ErrorRecord(Ex, "ServiceDisabled", ErrorCategory.InvalidOperation, null)); - } - else - { - ErrorRecord errorRecord = new ErrorRecord(e, "COMException", ErrorCategory.InvalidOperation, null); - WriteError(errorRecord); - } - } - } - - /// - /// to implement ^C - /// - protected override void StopProcessing() - { - if (WMIClass != null) - { - WMIClass.Dispose(); - } - } - -#endregion overrides - } -#endregion - -#region Add-Computer - - /// - /// Options for joining a computer to a domain - /// - [Flags] - public enum JoinOptions - { - /// - /// Create account on the domain - /// - AccountCreate = 0x2, - - /// - /// Join operation is part of an upgrade - /// - Win9XUpgrade = 0x10, - - /// - /// Perform an unsecure join - /// - UnsecuredJoin = 0x40, - - /// - /// Indicate that the password passed to the join operation is the local machine account password, not a user password. - /// It's valid only for unsecure join - /// - PasswordPass = 0x80, - - /// - /// Writing SPN and DNSHostName attributes on the computer object should be deferred until the rename operation that - /// follows the join operation - /// - DeferSPNSet = 0x100, - - /// - /// Join the target machine with a new name queried from the registry. This options is used if the rename has been called prior - /// to rebooting the machine - /// - JoinWithNewName = 0x400, - - /// - /// Use a readonly domain controller - /// - JoinReadOnly = 0x800, - - /// - /// Invoke during install - /// - InstallInvoke = 0x40000 - } - - /// - /// Adds the specified computer(s) to the Domain or Work Group. If the account - /// does not already exist on the domain, it also creates one (see notes for - /// implementation details). - /// If the computer is already joined to a domain, it can be moved to a new - /// domain (see notes for implementation details). - /// - [SuppressMessage("Microsoft.PowerShell", "PS1004AcceptForceParameterWhenCallingShouldContinue")] - [Cmdlet(VerbsCommon.Add, "Computer", SupportsShouldProcess = true, DefaultParameterSetName = DomainParameterSet, - HelpUri = "https://go.microsoft.com/fwlink/?LinkID=135194", RemotingCapability = RemotingCapability.SupportedByCommand)] - [OutputType(typeof(ComputerChangeInfo))] - public class AddComputerCommand : PSCmdlet - { -#region parameter - - private const string DomainParameterSet = "Domain"; - private const string WorkgroupParameterSet = "Workgroup"; - - /// - /// Target computer names - /// - [Parameter(ValueFromPipeline = true, ValueFromPipelineByPropertyName = true)] - [ValidateNotNullOrEmpty] - [SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays")] - public string[] ComputerName { get; set; } = { "localhost" }; - - /// - /// The local admin credential to the target computer - /// - [Parameter] - [Credential] - [ValidateNotNullOrEmpty] - public PSCredential LocalCredential { get; set; } - - /// - /// The domain credential used to unjoin a domain - /// - [Parameter(ParameterSetName = DomainParameterSet)] - [Credential] - [ValidateNotNullOrEmpty] - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly")] - public PSCredential UnjoinDomainCredential { get; set; } - - /// - /// The domain credential. - /// In DomainParameterSet, it is for the domain to join to. - /// In WorkgroupParameterSet, it is for the domain to disjoin from. - /// - [Parameter(ParameterSetName = DomainParameterSet, Mandatory = true)] - [Parameter(ParameterSetName = WorkgroupParameterSet)] - [Alias("DomainCredential")] - [Credential] - [ValidateNotNullOrEmpty] - public PSCredential Credential { get; set; } - - /// - /// Name of the domain to join - /// - [Parameter(Position = 0, Mandatory = true, ParameterSetName = DomainParameterSet)] - [Alias("DN", "Domain")] - [ValidateNotNullOrEmpty] - public String DomainName { get; set; } - - /// - /// The organization unit (OU). It's the path on the AD under which the new account will - /// be created - /// - [Parameter(ParameterSetName = DomainParameterSet)] - [Alias("OU")] - [ValidateNotNullOrEmpty] - public string OUPath { get; set; } - - /// - /// The name of a domain controller that performs the add. - /// - [Parameter(ParameterSetName = DomainParameterSet)] - [Alias("DC")] - [ValidateNotNullOrEmpty] - public string Server { get; set; } - - /// - /// Perform an unsecure join. - /// - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly")] - [Parameter(ParameterSetName = DomainParameterSet)] - public SwitchParameter Unsecure { get; set; } - - /// - /// Additional options for the "join domain" operation - /// - [Parameter(ParameterSetName = DomainParameterSet)] - public JoinOptions Options { get; set; } = JoinOptions.AccountCreate; - - /// - /// Name of the workgroup to join in. - /// - [SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly", MessageId = "WorkGroup")] - [Parameter(Position = 0, Mandatory = true, ParameterSetName = WorkgroupParameterSet)] - [Alias("WGN")] - [ValidateNotNullOrEmpty] - public string WorkgroupName { get; set; } - - /// - /// Restart the target computer - /// - [Parameter] - public SwitchParameter Restart { get; set; } = false; - - /// - /// Emit the output. - /// - [Parameter] - public SwitchParameter PassThru { get; set; } - - /// - /// New names for the target computers - /// - [Parameter(ValueFromPipelineByPropertyName = true)] - [ValidateNotNullOrEmpty] - public string NewName { get; set; } - - /// - /// To suppress ShouldContinue - /// - [Parameter] - public SwitchParameter Force - { - get { return _force; } - set { _force = value; } - } - private bool _force; - - private int _joinDomainflags = 1; - private bool _containsLocalHost = false; - private string _newNameForLocalHost = null; - - private readonly string _shortLocalMachineName = Dns.GetHostName(); - private readonly string _fullLocalMachineName = Dns.GetHostEntry("").HostName; - -#endregion parameter - -#region private - - /// - /// Unjoin the computer from its current domain - /// - /// In the DomainParameterSet, the UnjoinDomainCredential is our first choice to unjoin a domain. - /// But if the UnjoinDomainCredential is not specified, the DomainCredential will be our second - /// choice. This is to keep the backward compatibility. In Win7, we can do: - /// Add-Computer -DomainName domain1 -Credential $credForDomain1AndDomain2 - /// to switch the local machine that is currently in domain2 to domain1. - /// - /// Since DomainCredential has an alias "Credential", the same command should still work for the - /// new Add-Computer cmdlet. - /// - /// In the WorkgroupParameterSet, the UnjoinDomainCredential is the only choice. - /// - /// - /// - /// - /// - /// - /// - /// - private int UnjoinDomain(ManagementObject computerSystem, string computerName, string curDomainName, string dUserName, string dPassword) - { - ManagementBaseObject unjoinDomainParameter = computerSystem.GetMethodParameters("UnjoinDomainOrWorkgroup"); - unjoinDomainParameter.SetPropertyValue("UserName", dUserName); - unjoinDomainParameter.SetPropertyValue("Password", dPassword); - unjoinDomainParameter.SetPropertyValue("FUnjoinOptions", 4); // default option, disable the active directory - - ManagementBaseObject result = computerSystem.InvokeMethod("UnjoinDomainOrWorkgroup", unjoinDomainParameter, null); - Dbg.Diagnostics.Assert(result != null, "result cannot be null if the Unjoin method is invoked"); - int returnCode = Convert.ToInt32(result["ReturnValue"], CultureInfo.CurrentCulture); - if (returnCode != 0) - { - var ex = new Win32Exception(returnCode); - WriteErrorHelper(ComputerResources.FailToUnjoinDomain, "FailToUnjoinDomain", computerName, - ErrorCategory.OperationStopped, false, computerName, curDomainName, ex.Message); - } - return returnCode; - } - - /// - /// Join a domain from a workgroup - /// - /// - /// If a computer is already in a domain, we first unjoin it from its current domain, and - /// then do the join operation to the new domain. So when this method is invoked, we are - /// currently in a workgroup - /// - /// - /// - /// - /// - /// - private int JoinDomain(ManagementObject computerSystem, string computerName, string oldDomainName, string curWorkgroupName) - { - string joinDomainUserName = Credential != null ? Credential.UserName : null; - string joinDomainPassword = Credential != null ? Utils.GetStringFromSecureString(Credential.Password) : null; - - ManagementBaseObject joinDomainParameter = computerSystem.GetMethodParameters("JoinDomainOrWorkgroup"); - joinDomainParameter.SetPropertyValue("Name", DomainName); - joinDomainParameter.SetPropertyValue("UserName", joinDomainUserName); - joinDomainParameter.SetPropertyValue("Password", joinDomainPassword); - joinDomainParameter.SetPropertyValue("AccountOU", OUPath); - joinDomainParameter.SetPropertyValue("FJoinOptions", _joinDomainflags); - - ManagementBaseObject result = computerSystem.InvokeMethod("JoinDomainOrWorkgroup", joinDomainParameter, null); - Dbg.Diagnostics.Assert(result != null, "result cannot be null if the Join method is invoked"); - int returnCode = Convert.ToInt32(result["ReturnValue"], CultureInfo.CurrentCulture); - if (returnCode != 0) - { - var ex = new Win32Exception(returnCode); - string errMsg; - string errorId; - if (oldDomainName != null) - { - errMsg = StringUtil.Format(ComputerResources.FailToJoinNewDomainAfterUnjoinOldDomain, - computerName, oldDomainName, DomainName, ex.Message); - errorId = "FailToJoinNewDomainAfterUnjoinOldDomain"; - } - else - { - errMsg = StringUtil.Format(ComputerResources.FailToJoinDomainFromWorkgroup, computerName, - DomainName, curWorkgroupName, ex.Message); - errorId = "FailToJoinDomainFromWorkgroup"; - } - - WriteErrorHelper(errMsg, errorId, computerName, ErrorCategory.OperationStopped, false); - } - return returnCode; - } - - /// - /// Join in a new workgroup from the current workgroup - /// - /// - /// - /// - /// - private int JoinWorkgroup(ManagementObject computerSystem, string computerName, string oldDomainName) - { - ManagementBaseObject joinWorkgroupParam = computerSystem.GetMethodParameters("JoinDomainOrWorkgroup"); - joinWorkgroupParam.SetPropertyValue("Name", WorkgroupName); - joinWorkgroupParam.SetPropertyValue("UserName", null); - joinWorkgroupParam.SetPropertyValue("Password", null); - joinWorkgroupParam.SetPropertyValue("FJoinOptions", 0); // join a workgroup - - ManagementBaseObject result = computerSystem.InvokeMethod("JoinDomainOrWorkgroup", joinWorkgroupParam, null); - Dbg.Diagnostics.Assert(result != null, "result cannot be null if the Join method is invoked"); - int returnCode = Convert.ToInt32(result["ReturnValue"], CultureInfo.CurrentCulture); - if (returnCode != 0) - { - var ex = new Win32Exception(returnCode); - string errMsg; - if (oldDomainName != null) - { - errMsg = - StringUtil.Format(ComputerResources.FailToSwitchFromDomainToWorkgroup, computerName, - oldDomainName, WorkgroupName, ex.Message); - } - else - { - errMsg = StringUtil.Format(ComputerResources.FailToJoinWorkGroup, computerName, WorkgroupName, - ex.Message); - } - - WriteErrorHelper(errMsg, "FailToJoinWorkGroup", computerName, ErrorCategory.OperationStopped, false); - } - return returnCode; - } - - /// - /// Rename the computer in workgroup - /// - /// - /// - /// - /// - private int RenameComputer(ManagementObject computerSystem, string computerName, string newName) - { - string domainUserName = null; - string domainPassword = null; - - if (DomainName != null && Credential != null) - { - // The rename operation happens after the computer is joined to the new domain, so we should provide - // the domain user name and password to the rename operation - domainUserName = Credential.UserName; - domainPassword = Utils.GetStringFromSecureString(Credential.Password); - } - - ManagementBaseObject renameParameter = computerSystem.GetMethodParameters("Rename"); - renameParameter.SetPropertyValue("Name", newName); - renameParameter.SetPropertyValue("UserName", domainUserName); - renameParameter.SetPropertyValue("Password", domainPassword); - - ManagementBaseObject result = computerSystem.InvokeMethod("Rename", renameParameter, null); - Dbg.Diagnostics.Assert(result != null, "result cannot be null if the Rename method is invoked"); - int returnCode = Convert.ToInt32(result["ReturnValue"], CultureInfo.CurrentCulture); - if (returnCode != 0) - { - var ex = new Win32Exception(returnCode); - string errMsg; - string errorId; - if (WorkgroupName != null) - { - errMsg = StringUtil.Format(ComputerResources.FailToRenameAfterJoinWorkgroup, computerName, - WorkgroupName, newName, ex.Message); - errorId = "FailToRenameAfterJoinWorkgroup"; - } - else - { - errMsg = StringUtil.Format(ComputerResources.FailToRenameAfterJoinDomain, computerName, DomainName, - newName, ex.Message); - errorId = "FailToRenameAfterJoinDomain"; - } - - WriteErrorHelper(errMsg, errorId, computerName, ErrorCategory.OperationStopped, false); - } - return returnCode; - } - - /// - /// Helper method to write out non-terminating errors - /// - /// - /// - /// - /// - /// - /// - private void WriteErrorHelper(string resourceString, string errorId, object targetObj, ErrorCategory category, bool terminating, params object[] args) - { - string errMsg; - if (null == args || 0 == args.Length) - { - // Don't format in case the string contains literal curly braces - errMsg = resourceString; - } - else - { - errMsg = StringUtil.Format(resourceString, args); - } - - if (String.IsNullOrEmpty(errMsg)) - { - Dbg.Diagnostics.Assert(false, "Could not load text for error record '" + errorId + "'"); - } - - ErrorRecord error = new ErrorRecord(new InvalidOperationException(errMsg), errorId, - category, targetObj); - if (terminating) - { - ThrowTerminatingError(error); - } - else - { - WriteError(error); - } - } - - private void DoAddComputerAction(string computer, string newName, bool isLocalhost, ConnectionOptions options, EnumerationOptions enumOptions, ObjectQuery computerSystemQuery) - { - int returnCode = 0; - bool success = false; - string computerName = isLocalhost ? _shortLocalMachineName : computer; - - if (ParameterSetName == DomainParameterSet) - { - string action = StringUtil.Format(ComputerResources.AddComputerActionDomain, DomainName); - if (!ShouldProcess(computerName, action)) - { - return; - } - } - else - { - string action = StringUtil.Format(ComputerResources.AddComputerActionWorkgroup, WorkgroupName); - if (!ShouldProcess(computerName, action)) - { - return; - } - } - - // Check the length of the new name - if (newName != null && newName.Length > ComputerWMIHelper.NetBIOSNameMaxLength) - { - string truncatedName = newName.Substring(0, ComputerWMIHelper.NetBIOSNameMaxLength); - string query = StringUtil.Format(ComputerResources.TruncateNetBIOSName, truncatedName); - string caption = ComputerResources.TruncateNetBIOSNameCaption; - if (!Force && !ShouldContinue(query, caption)) - { - return; - } - } - - // If LocalCred is given, use the local credential for WMI connection. Otherwise, use - // the current caller's context (Username = null, Password = null) - if (LocalCredential != null) - { - options.SecurePassword = LocalCredential.Password; - options.Username = ComputerWMIHelper.GetLocalAdminUserName(computerName, LocalCredential); - } - - // The local machine will always be processed in the very end. If the - // current target computer is the local machine, it's the last one to - // be processed, so we can safely set the Username and Password to be - // null. We cannot use a user credential when connecting to the local - // machine. - if (isLocalhost) - { - options.Username = null; - options.SecurePassword = null; - } - - ManagementScope scope = new ManagementScope(ComputerWMIHelper.GetScopeString(computer, ComputerWMIHelper.WMI_Path_CIM), options); - - try - { - using (var searcher = new ManagementObjectSearcher(scope, computerSystemQuery, enumOptions)) - { - foreach (ManagementObject computerSystem in searcher.Get()) - { - using (computerSystem) - { - // If we are not using the new computer name, check the length of the target machine name - string hostName = (string)computerSystem["DNSHostName"]; - if (newName == null && hostName.Length > ComputerWMIHelper.NetBIOSNameMaxLength) - { - string truncatedName = hostName.Substring(0, ComputerWMIHelper.NetBIOSNameMaxLength); - string query = StringUtil.Format(ComputerResources.TruncateNetBIOSName, truncatedName); - string caption = ComputerResources.TruncateNetBIOSNameCaption; - if (!Force && !ShouldContinue(query, caption)) - { - continue; - } - } - - if (newName != null && hostName.Equals(newName, StringComparison.OrdinalIgnoreCase)) - { - WriteErrorHelper( - ComputerResources.NewNameIsOldName, - "NewNameIsOldName", - newName, - ErrorCategory.InvalidArgument, - false, - computerName, newName); - continue; - } - - if (ParameterSetName == DomainParameterSet) - { - if ((bool)computerSystem["PartOfDomain"]) - { - string curDomainName = (string)LanguagePrimitives.ConvertTo(computerSystem["Domain"], typeof(string), CultureInfo.InvariantCulture); - string shortDomainName = ""; - if (curDomainName.Contains(".")) - { - int dotIndex = curDomainName.IndexOf(".", StringComparison.OrdinalIgnoreCase); - shortDomainName = curDomainName.Substring(0, dotIndex); - } - - // If the target computer is already in the specified domain, throw an error - if (curDomainName.Equals(DomainName, StringComparison.OrdinalIgnoreCase) || shortDomainName.Equals(DomainName, StringComparison.OrdinalIgnoreCase)) - { - WriteErrorHelper(ComputerResources.AddComputerToSameDomain, - "AddComputerToSameDomain", computerName, - ErrorCategory.InvalidOperation, false, computerName, DomainName); - continue; - } - - // Switch between domains - // If the UnjoinDomainCredential is not specified, we assume the DomainCredential can be used for both removing - // the computer from its current domain, and adding the computer to the new domain. This behavior is supported on - // Win7, we don't want to break it. - PSCredential credTobeUsed = UnjoinDomainCredential ?? Credential; - string unjoinDomainUserName = credTobeUsed != null ? credTobeUsed.UserName : null; - string unjoinDomainPassword = credTobeUsed != null ? Utils.GetStringFromSecureString(credTobeUsed.Password) : null; - - // Leave the current domain - returnCode = UnjoinDomain(computerSystem, computerName, curDomainName, unjoinDomainUserName, unjoinDomainPassword); - if (returnCode == 0) - { - // Successfully unjoin the old domain, join the computer to the new domain - returnCode = JoinDomain(computerSystem, computerName, curDomainName, null); - - if (returnCode == 0 && newName != null) - { - // Rename the computer in the new domain - returnCode = RenameComputer(computerSystem, computerName, newName); - } - } - - success = returnCode == 0; - } - else - { - // Add a workgroup computer to domain - string curWorkgroupName = (string)LanguagePrimitives.ConvertTo(computerSystem["Domain"], typeof(string), CultureInfo.InvariantCulture); - returnCode = JoinDomain(computerSystem, computerName, null, curWorkgroupName); - - if (returnCode == 0 && newName != null) - { - returnCode = RenameComputer(computerSystem, computerName, newName); - } - - success = returnCode == 0; - } - } - else // WorkgroupParameterSet - { - if ((bool)computerSystem["PartOfDomain"]) - { - // Remind the user to have local admin credential only if the computer is domain joined - string shouldContinueMsg = ComputerResources.RemoveComputerConfirm; - if (!Force && !ShouldContinue(shouldContinueMsg, null /* null = default caption */ )) - { - continue; - } - - // Leave the current domain - string curDomainName = (string)LanguagePrimitives.ConvertTo(computerSystem["Domain"], typeof(string), CultureInfo.InvariantCulture); - string dUserName = Credential != null ? Credential.UserName : null; - string dPassword = Credential != null ? Utils.GetStringFromSecureString(Credential.Password) : null; - - returnCode = UnjoinDomain(computerSystem, computerName, curDomainName, dUserName, dPassword); - if (returnCode == 0) - { - // Join the specified workgroup - returnCode = JoinWorkgroup(computerSystem, computerName, curDomainName); - if (returnCode == 0 && newName != null) - { - // Rename the computer - returnCode = RenameComputer(computerSystem, computerName, newName); - } - } - - success = returnCode == 0; - } - else // in workgroup - { - string curWorkgroup = (string)LanguagePrimitives.ConvertTo(computerSystem["Domain"], typeof(string), CultureInfo.InvariantCulture); - if (curWorkgroup.Equals(WorkgroupName, StringComparison.OrdinalIgnoreCase)) - { - WriteErrorHelper(ComputerResources.AddComputerToSameWorkgroup, - "AddComputerToSameWorkgroup", computerName, - ErrorCategory.InvalidOperation, false, computerName, WorkgroupName); - continue; - } - - // Join to another workgroup - returnCode = JoinWorkgroup(computerSystem, computerName, null); - if (returnCode == 0 && newName != null) - { - returnCode = RenameComputer(computerSystem, computerName, newName); - } - - success = returnCode == 0; - } - }// end of else -- WorkgroupParameterSet - - if (PassThru) - { - WriteObject(ComputerWMIHelper.GetComputerStatusObject(returnCode, computerName)); - } - } - }// end of foreach - - // If successful and the Restart parameter is specified, restart the computer - if (success && Restart) - { - object[] flags = new object[] { 6, 0 }; - RestartComputerCommand.RestartOneComputerUsingDcom(this, isLocalhost, computerName, flags, options); - } - - // If successful and the Restart parameter is not specified, write out warning - if (success && !Restart) - { - WriteWarning(StringUtil.Format(ComputerResources.RestartNeeded, null, computerName)); - } - } - } // end of try - catch (ManagementException ex) - { - WriteErrorHelper(ComputerResources.FailToConnectToComputer, "AddComputerException", computerName, - ErrorCategory.OperationStopped, false, computerName, ex.Message); - } - catch (COMException ex) - { - WriteErrorHelper(ComputerResources.FailToConnectToComputer, "AddComputerException", computerName, - ErrorCategory.OperationStopped, false, computerName, ex.Message); - } - catch (UnauthorizedAccessException ex) - { - WriteErrorHelper(ComputerResources.FailToConnectToComputer, "AddComputerException", computerName, - ErrorCategory.OperationStopped, false, computerName, ex.Message); - } - } - - private string ValidateComputerName(string computer, bool validateNewName) - { - ErrorRecord error = null; - string targetComputer = ComputerWMIHelper.ValidateComputerName(computer, _shortLocalMachineName, _fullLocalMachineName, ref error); - if (targetComputer == null) - { - if (error != null) - { - WriteError(error); - } - return null; - } - - bool isLocalhost = targetComputer.Equals(ComputerWMIHelper.localhostStr, StringComparison.OrdinalIgnoreCase); - - if (validateNewName && NewName != null) - { - if (!ComputerWMIHelper.IsComputerNameValid(NewName)) - { - WriteErrorHelper( - ComputerResources.InvalidNewName, - "InvalidNewName", - NewName, - ErrorCategory.InvalidArgument, - false, - isLocalhost ? _shortLocalMachineName : targetComputer, NewName); - - return null; - } - } - - return targetComputer; - } - -#endregion private - -#region override - - /// - /// BeginProcessing method - /// - protected override void BeginProcessing() - { - if (ParameterSetName == DomainParameterSet) - { - if ((Options & JoinOptions.PasswordPass) != 0 && (Options & JoinOptions.UnsecuredJoin) == 0) - { - WriteErrorHelper(ComputerResources.InvalidJoinOptions, "InvalidJoinOptions", Options, - ErrorCategory.InvalidArgument, true, JoinOptions.PasswordPass.ToString(), - JoinOptions.UnsecuredJoin.ToString()); - } - - if ((Options & JoinOptions.AccountCreate) != 0) - { - _joinDomainflags |= (int)JoinOptions.AccountCreate; - } - if ((Options & JoinOptions.Win9XUpgrade) != 0) - { - _joinDomainflags |= (int)JoinOptions.Win9XUpgrade; - } - if ((Options & JoinOptions.UnsecuredJoin) != 0) - { - _joinDomainflags |= (int)JoinOptions.UnsecuredJoin; - } - if ((Options & JoinOptions.PasswordPass) != 0) - { - _joinDomainflags |= (int)JoinOptions.PasswordPass; - } - if ((Options & JoinOptions.DeferSPNSet) != 0) - { - _joinDomainflags |= (int)JoinOptions.DeferSPNSet; - } - if ((Options & JoinOptions.JoinWithNewName) != 0) - { - _joinDomainflags |= (int)JoinOptions.JoinWithNewName; - } - if ((Options & JoinOptions.JoinReadOnly) != 0) - { - _joinDomainflags |= (int)JoinOptions.JoinReadOnly; - } - if ((Options & JoinOptions.InstallInvoke) != 0) - { - _joinDomainflags |= (int)JoinOptions.InstallInvoke; - } - - if (Unsecure) - { - _joinDomainflags |= (int)(JoinOptions.UnsecuredJoin | JoinOptions.PasswordPass); - } - - if (Server != null) - { - // It's the name of a domain controller. We need to check if the specified domain controller actually exists - try - { - Dns.GetHostEntry(Server); - } - catch (Exception) - { - WriteErrorHelper(ComputerResources.CannotResolveServerName, "AddressResolutionException", - Server, ErrorCategory.InvalidArgument, true, Server); - } - DomainName = DomainName + "\\" + Server; - } - } - } - - /// - /// ProcessRecord method - /// - protected override void ProcessRecord() - { - if (NewName != null && ComputerName.Length != 1) - { - WriteErrorHelper(ComputerResources.CannotRenameMultipleComputers, "CannotRenameMultipleComputers", - NewName, ErrorCategory.InvalidArgument, false); - return; - } - - // If LocalCred is not provided, we use the current caller's context - ConnectionOptions options = new ConnectionOptions - { - Authentication = AuthenticationLevel.PacketPrivacy, - Impersonation = ImpersonationLevel.Impersonate, - EnablePrivileges = true - }; - - EnumerationOptions enumOptions = new EnumerationOptions { UseAmendedQualifiers = true, DirectRead = true }; - ObjectQuery computerSystemQuery = new ObjectQuery("select * from " + ComputerWMIHelper.WMI_Class_ComputerSystem); - - int oldJoinDomainFlags = _joinDomainflags; - if (NewName != null && ParameterSetName == DomainParameterSet) - { - // We rename the computer after it's joined to the target domain, so writing SPN and DNSHostName attributes - // on the computer object should be deferred until the rename operation that follows the join operation - _joinDomainflags |= (int)JoinOptions.DeferSPNSet; - } - - try - { - foreach (string computer in ComputerName) - { - string targetComputer = ValidateComputerName(computer, NewName != null); - if (targetComputer == null) - { - continue; - } - - bool isLocalhost = targetComputer.Equals("localhost", StringComparison.OrdinalIgnoreCase); - if (isLocalhost) - { - if (!_containsLocalHost) - _containsLocalHost = true; - _newNameForLocalHost = NewName; - - continue; - } - - DoAddComputerAction(targetComputer, NewName, false, options, enumOptions, computerSystemQuery); - }// end of foreach - } - finally - { - // Reverting the domainflags to previous status if DeferSPNSet is added to the domain flags. - if (NewName != null && ParameterSetName == DomainParameterSet) - { - _joinDomainflags = oldJoinDomainFlags; - } - } - }// end of ProcessRecord - - /// - /// EndProcessing method - /// - protected override void EndProcessing() - { - if (!_containsLocalHost) return; - - // If LocalCred is not provided, we use the current caller's context - ConnectionOptions options = new ConnectionOptions - { - Authentication = AuthenticationLevel.PacketPrivacy, - Impersonation = ImpersonationLevel.Impersonate, - EnablePrivileges = true - }; - - EnumerationOptions enumOptions = new EnumerationOptions { UseAmendedQualifiers = true, DirectRead = true }; - ObjectQuery computerSystemQuery = new ObjectQuery("select * from " + ComputerWMIHelper.WMI_Class_ComputerSystem); - - DoAddComputerAction("localhost", _newNameForLocalHost, true, options, enumOptions, computerSystemQuery); - } - -#endregion override - }//End Class - -#endregion Add-Computer - -#region RemoveComputer - - /// - /// Removes the Specified Computer(s) from the relevant Domain or Work Group - /// - - [Cmdlet(VerbsCommon.Remove, "Computer", SupportsShouldProcess = true, DefaultParameterSetName = LocalParameterSet, - HelpUri = "https://go.microsoft.com/fwlink/?LinkID=135246", RemotingCapability = RemotingCapability.SupportedByCommand)] - [OutputType(typeof(ComputerChangeInfo))] - public class RemoveComputerCommand : PSCmdlet - { -#region "Parameters and Private Data" - - private const string LocalParameterSet = "Local"; - private const string RemoteParameterSet = "Remote"; - - /// - /// The domain credential is used for authenticating to the domain controller. - /// - [Parameter(ParameterSetName = RemoteParameterSet, Mandatory = true)] - [Parameter(Position = 0, ParameterSetName = LocalParameterSet)] - [Alias("Credential")] - [ValidateNotNullOrEmpty] - [Credential] - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly")] - public PSCredential UnjoinDomainCredential { get; set; } - - /// - /// The local admin credential for authenticating to the target computer - /// - [Parameter(ParameterSetName = RemoteParameterSet)] - [ValidateNotNullOrEmpty] - [Credential] - public PSCredential LocalCredential { get; set; } - - /// - /// Restart parameter - /// - [Parameter] - public SwitchParameter Restart { get; set; } = false; - - /// - /// The target computer names to remove from the domain - /// - [Parameter(ParameterSetName = RemoteParameterSet, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true)] - [SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays")] - public string[] ComputerName { get; set; } = { "localhost" }; - - /// - /// Force parameter (to suppress the shouldprocess and shouldcontinue) - /// - [Parameter] - public SwitchParameter Force - { - get { return _force; } - set { _force = value; } - } - private bool _force; - - /// - /// Only emit if passthru is specified. One bool/string pair for each - /// computer that was joined. Bool = success/failure. String = ComputerName. - /// - [Parameter] - public SwitchParameter PassThru { get; set; } - - /// - /// Specify the workgroup name to join in if the target machine is removed from - /// the domain - /// - [Parameter] - [ValidateNotNullOrEmpty] - public string WorkgroupName { get; set; } = "WORKGROUP"; - - private bool _containsLocalHost = false; - private readonly string _shortLocalMachineName = Dns.GetHostName(); - private readonly string _fullLocalMachineName = Dns.GetHostEntry("").HostName; - -#endregion "Parameters and Private Data" - -#region "Private Methods" - - private void DoRemoveComputerAction(string computer, bool isLocalhost, ConnectionOptions options, EnumerationOptions enumOptions, ObjectQuery computerSystemQuery) - { - bool successful = false; - string computerName = isLocalhost ? _shortLocalMachineName : computer; - - if (!ShouldProcess(computerName)) - { - return; - } - - // If LocalCred is given, use the local credential for WMI connection - if (LocalCredential != null) - { - options.SecurePassword = LocalCredential.Password; - options.Username = ComputerWMIHelper.GetLocalAdminUserName(computerName, LocalCredential); - } - - // The local machine will always be processed in the very end. If the - // current target computer is the local machine, it's the last one to - // be processed, so we can safely set the Username and Password to be - // null. We cannot use a user credential when connecting to the local - // machine. - if (isLocalhost) - { - options.Username = null; - options.SecurePassword = null; - } - - ManagementScope scope = new ManagementScope(ComputerWMIHelper.GetScopeString(computer, ComputerWMIHelper.WMI_Path_CIM), options); - try - { - using (var searcher = new ManagementObjectSearcher(scope, computerSystemQuery, enumOptions)) - { - foreach (ManagementObject computerSystem in searcher.Get()) - { - using (computerSystem) - { - if (!(bool)computerSystem["PartOfDomain"]) - { - // Not in a domain, throw out non-terminating error - string errMsg = StringUtil.Format(ComputerResources.ComputerNotInDomain, computerName); - ErrorRecord error = new ErrorRecord(new InvalidOperationException(errMsg), "ComputerNotInDomain", ErrorCategory.InvalidOperation, computerName); - WriteError(error); - continue; - } - - // Remind the user to have local admin credential only if the computer is domain joined - string shouldContinueMsg = ComputerResources.RemoveComputerConfirm; - if (!Force && !ShouldContinue(shouldContinueMsg, null /* null = default caption */ )) - { - continue; - } - - int returnCode = 0; - string curDomainName = (string)LanguagePrimitives.ConvertTo(computerSystem["Domain"], typeof(string), CultureInfo.InvariantCulture); - string dUserName = UnjoinDomainCredential != null ? UnjoinDomainCredential.UserName : null; - string dPassword = UnjoinDomainCredential != null ? Utils.GetStringFromSecureString(UnjoinDomainCredential.Password) : null; - - ManagementBaseObject unjoinParameter = computerSystem.GetMethodParameters("UnjoinDomainOrWorkgroup"); - unjoinParameter.SetPropertyValue("UserName", dUserName); - unjoinParameter.SetPropertyValue("Password", dPassword); - unjoinParameter.SetPropertyValue("FUnjoinOptions", 4); // default option, disable the active directory account - - ManagementBaseObject result = computerSystem.InvokeMethod("UnjoinDomainOrWorkgroup", unjoinParameter, null); - Dbg.Diagnostics.Assert(result != null, "result cannot be null if the Unjoin method is invoked"); - returnCode = Convert.ToInt32(result["ReturnValue"], CultureInfo.CurrentCulture); - - // Error code 1355 - The specified domain either does not exist or could not be contacted. - // This might happen when the old domain is gone or unreachable. - // Error code 53 - The network path was not found. - // This might happen when the network is not available. - if ((returnCode == 1355 || returnCode == 53) && Force) - { - // When -Force is specified, we unjoin the domain without disable the AD account - unjoinParameter.SetPropertyValue("FUnjoinOptions", 0); - result = computerSystem.InvokeMethod("UnjoinDomainOrWorkgroup", unjoinParameter, null); - Dbg.Diagnostics.Assert(result != null, "result cannot be null if the Unjoin method is invoked"); - returnCode = Convert.ToInt32(result["ReturnValue"], CultureInfo.CurrentCulture); - } - - if (returnCode != 0) - { - var ex = new Win32Exception(returnCode); - string errMsg = StringUtil.Format(ComputerResources.FailToUnjoinDomain, computerName, curDomainName, ex.Message); - ErrorRecord error = new ErrorRecord(new InvalidOperationException(errMsg), "FailToUnjoinDomain", ErrorCategory.OperationStopped, computerName); - WriteError(error); - } - else - { - // Join into the specified workgroup if it's given - successful = true; - if (WorkgroupName != null) - { - ManagementBaseObject joinParameter = computerSystem.GetMethodParameters("JoinDomainOrWorkgroup"); - joinParameter.SetPropertyValue("Name", WorkgroupName); - joinParameter.SetPropertyValue("Password", null); - joinParameter.SetPropertyValue("UserName", null); - joinParameter.SetPropertyValue("FJoinOptions", 0); // Join in a workgroup - - result = computerSystem.InvokeMethod("JoinDomainOrWorkgroup", joinParameter, null); - Dbg.Diagnostics.Assert(result != null, "result cannot be null if the Join method is invoked"); - returnCode = Convert.ToInt32(result["ReturnValue"], CultureInfo.CurrentCulture); - if (returnCode != 0) - { - var ex = new Win32Exception(returnCode); - string errMsg = StringUtil.Format(ComputerResources.FailToSwitchFromDomainToWorkgroup, computerName, curDomainName, WorkgroupName, ex.Message); - ErrorRecord error = new ErrorRecord(new InvalidOperationException(errMsg), "FailToJoinWorkGroup", ErrorCategory.OperationStopped, computerName); - WriteError(error); - } - } - } - - if (PassThru) - { - WriteObject(ComputerWMIHelper.GetComputerStatusObject(returnCode, computerName)); - } - } - } - } - - // If successful and the Restart parameter is specified, restart the computer - if (successful && Restart) - { - object[] flags = new object[] { 6, 0 }; - RestartComputerCommand.RestartOneComputerUsingDcom(this, isLocalhost, computerName, flags, options); - } - - // If successful and the Restart parameter is not specified, write out warning - if (successful && !Restart) - { - WriteWarning(StringUtil.Format(ComputerResources.RestartNeeded, null, computerName)); - } - } - catch (ManagementException ex) - { - string errMsg = StringUtil.Format(ComputerResources.FailToConnectToComputer, computerName, ex.Message); - ErrorRecord error = new ErrorRecord(new InvalidOperationException(errMsg), "RemoveComputerException", ErrorCategory.OperationStopped, computerName); - WriteError(error); - } - catch (COMException ex) - { - string errMsg = StringUtil.Format(ComputerResources.FailToConnectToComputer, computerName, ex.Message); - ErrorRecord error = new ErrorRecord(new InvalidOperationException(errMsg), "RemoveComputerException", ErrorCategory.OperationStopped, computerName); - WriteError(error); - } - catch (UnauthorizedAccessException ex) - { - string errMsg = StringUtil.Format(ComputerResources.FailToConnectToComputer, computerName, ex.Message); - ErrorRecord error = new ErrorRecord(new InvalidOperationException(errMsg), "RemoveComputerException", ErrorCategory.OperationStopped, computerName); - WriteError(error); - } - } - - private string ValidateComputerName(string computer) - { - ErrorRecord error = null; - string targetComputer = ComputerWMIHelper.ValidateComputerName(computer, _shortLocalMachineName, _fullLocalMachineName, ref error); - if (targetComputer == null) - { - if (error != null) - { - WriteError(error); - } - return null; - } - - return targetComputer; - } - -#endregion "Private Methods" - -#region "Override Methods" - - /// - /// ProcessRecord method. - /// - protected override void ProcessRecord() - { - // If both LocalCred and DomainCred are not provided, we use the default options - ConnectionOptions options = new ConnectionOptions - { - Authentication = AuthenticationLevel.PacketPrivacy, - Impersonation = ImpersonationLevel.Impersonate, - EnablePrivileges = true - }; - - // For Remove-Computer, usually the domain credential is also the local admin credential - // for the target computer. So use the local credential if given, otherwise use the domain - // credential to connect to the target machine. - // If the LocalCred is not given but the DomainCred is available, use the DomainCred for WMI connection. - if (LocalCredential == null && UnjoinDomainCredential != null) - { - options.SecurePassword = UnjoinDomainCredential.Password; - options.Username = UnjoinDomainCredential.UserName; - } - - EnumerationOptions enumOptions = new EnumerationOptions { UseAmendedQualifiers = true, DirectRead = true }; - ObjectQuery computerSystemQuery = new ObjectQuery("select * from " + ComputerWMIHelper.WMI_Class_ComputerSystem); - - foreach (string computer in ComputerName) - { - string targetComputer = ValidateComputerName(computer); - if (targetComputer == null) - { - continue; - } - - bool isLocalhost = targetComputer.Equals("localhost", StringComparison.OrdinalIgnoreCase); - if (isLocalhost) - { - if (!_containsLocalHost) - _containsLocalHost = true; - - continue; - } - - DoRemoveComputerAction(computer, false, options, enumOptions, computerSystemQuery); - } - }//End ProcessRecord() - - /// - /// EndProcessing method: deal with the local computer in the end - /// - protected override void EndProcessing() - { - if (!_containsLocalHost) return; - - // If both LocalCred and DomainCred are not provided, we use the default options - ConnectionOptions options = new ConnectionOptions - { - Authentication = AuthenticationLevel.PacketPrivacy, - Impersonation = ImpersonationLevel.Impersonate, - EnablePrivileges = true - }; - - // For Remove-Computer, usually the domain credential is also the local admin credential - // for the target computer. So use the local credential if given, otherwise use the domain - // credential to connect to the target machine. - // If the LocalCred is not given but the DomainCred is available, use the DomainCred for WMI connection. - if (LocalCredential == null && UnjoinDomainCredential != null) - { - options.SecurePassword = UnjoinDomainCredential.Password; - options.Username = UnjoinDomainCredential.UserName; - } - - EnumerationOptions enumOptions = new EnumerationOptions { UseAmendedQualifiers = true, DirectRead = true }; - ObjectQuery computerSystemQuery = new ObjectQuery("select * from " + ComputerWMIHelper.WMI_Class_ComputerSystem); - - DoRemoveComputerAction("localhost", true, options, enumOptions, computerSystemQuery); - } - -#endregion "Override Methods" - }//End Class - -#endregion Remove-Computer - -#endif - -#region Rename-Computer - - /// - /// Renames a domain computer and its corresponding domain account or a - /// workgroup computer. Use this command to rename domain workstations and local - /// machines only. It cannot be used to rename Domain Controllers. - /// - - [Cmdlet(VerbsCommon.Rename, "Computer", SupportsShouldProcess = true, - HelpUri = "https://go.microsoft.com/fwlink/?LinkID=219990", RemotingCapability = RemotingCapability.SupportedByCommand)] - public class RenameComputerCommand : PSCmdlet - { -#region Private Members - - private bool _containsLocalHost = false; - private string _newNameForLocalHost = null; - - private TransportProtocol _transportProtocol = TransportProtocol.DCOM; - - private readonly string _shortLocalMachineName = Dns.GetHostName(); - private readonly string _fullLocalMachineName = Dns.GetHostEntryAsync("").Result.HostName; - -#endregion - -#region Parameters - - /// - /// Target computers to rename - /// - [Parameter(ValueFromPipelineByPropertyName = true)] - [ValidateNotNullOrEmpty] - public string ComputerName { get; set; } = "localhost"; - - /// - /// Emit the output. - /// - //[Alias("Restart")] - [Parameter] - public SwitchParameter PassThru { get; set; } - - /// - /// The domain credential of the domain the target computer joined - /// - [Parameter] - [ValidateNotNullOrEmpty] - [Credential] - public PSCredential DomainCredential { get; set; } - - /// - /// The administrator credential of the target computer - /// - [Parameter] - [ValidateNotNullOrEmpty] - [Credential] - public PSCredential LocalCredential { get; set; } - - /// - /// New names for the target computers - /// - [Parameter(Mandatory = true, Position = 0, ValueFromPipelineByPropertyName = true)] - [ValidateNotNullOrEmpty] - public string NewName { get; set; } - - /// - /// Suppress the ShouldContinue - /// - [Parameter] - public SwitchParameter Force - { - get { return _force; } - set { _force = value; } - } - private bool _force; - - /// - /// To restart the target computer after rename it - /// - [Parameter] - public SwitchParameter Restart - { - get { return _restart; } - set { _restart = value; } - } - private bool _restart; - - /// - /// The authentication options for CIM_WSMan connection - /// - [Parameter] - [ValidateSet( - "Default", - "Basic", - "Negotiate", // can be used with and without credential (without -> PSRP mapped to NegotiateWithImplicitCredential) - "CredSSP", - "Digest", - "Kerberos")] // can be used with and without credential (not sure about implications) - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly")] - public string WsmanAuthentication { get; set; } = "Default"; - - /// - /// Specify the protocol to use - /// - [Parameter] - [ValidateSet(ComputerWMIHelper.DcomProtocol, ComputerWMIHelper.WsmanProtocol)] - public string Protocol { get; set; } = -#if CORECLR - //CoreClr does not support DCOM protocol - // This change makes sure that the the command works seamlessly if user did not explicitly entered the protocol - ComputerWMIHelper.WsmanProtocol; -#else - ComputerWMIHelper.DcomProtocol; -#endif - -#endregion - -#region "Private Methods" - - /// - /// Check to see if the target computer is the local machine - /// - private string ValidateComputerName() - { - // Validate target name. - ErrorRecord targetError = null; - string targetComputer = ComputerWMIHelper.ValidateComputerName(ComputerName, _shortLocalMachineName, _fullLocalMachineName, ref targetError); - if (targetComputer == null) - { - if (targetError != null) - { - WriteError(targetError); - } - return null; - } - - // Validate *new* name. Validate the format of the new name. Check if the old name is the same as the - // new name later. - if (!ComputerWMIHelper.IsComputerNameValid(NewName)) - { - bool isLocalhost = targetComputer.Equals(ComputerWMIHelper.localhostStr, StringComparison.OrdinalIgnoreCase); - string errMsg = StringUtil.Format(ComputerResources.InvalidNewName, isLocalhost ? _shortLocalMachineName : targetComputer, NewName); - ErrorRecord error = new ErrorRecord( - new InvalidOperationException(errMsg), "InvalidNewName", - ErrorCategory.InvalidArgument, NewName); - WriteError(error); - return null; - } - - return targetComputer; - } - - private void DoRenameComputerAction(string computer, string newName, bool isLocalhost) - { - string computerName = isLocalhost ? _shortLocalMachineName : computer; - - if (!ShouldProcess(computerName)) - { - return; - } - - // Check the length of the new name - if (newName != null && newName.Length > ComputerWMIHelper.NetBIOSNameMaxLength) - { - string truncatedName = newName.Substring(0, ComputerWMIHelper.NetBIOSNameMaxLength); - string query = StringUtil.Format(ComputerResources.TruncateNetBIOSName, truncatedName); - string caption = ComputerResources.TruncateNetBIOSNameCaption; - if (!Force && !ShouldContinue(query, caption)) - { - return; - } - } - - switch (_transportProtocol) - { - case TransportProtocol.WSMan: - DoRenameComputerWsman(computer, computerName, newName, isLocalhost); - break; -#if !CORECLR - case TransportProtocol.DCOM: - DoRenameComputerDcom(computer, computerName, newName, isLocalhost); - break; -#endif - } - } - - private void DoRenameComputerWsman(string computer, string computerName, string newName, bool isLocalhost) - { - bool successful = false; - PSCredential credToUse = isLocalhost ? null : (LocalCredential ?? DomainCredential); - - try - { - using (CancellationTokenSource cancelTokenSource = new CancellationTokenSource()) - using (CimSession cimSession = RemoteDiscoveryHelper.CreateCimSession(computer, credToUse, WsmanAuthentication, cancelTokenSource.Token, this)) - { - var operationOptions = new CimOperationOptions - { - Timeout = TimeSpan.FromMilliseconds(10000), - CancellationToken = cancelTokenSource.Token, - //This prefix works against all versions of the WinRM server stack, both win8 and win7 - ResourceUriPrefix = new Uri(ComputerWMIHelper.CimUriPrefix) - }; - - IEnumerable mCollection = cimSession.QueryInstances( - ComputerWMIHelper.CimOperatingSystemNamespace, - ComputerWMIHelper.CimQueryDialect, - "Select * from " + ComputerWMIHelper.WMI_Class_ComputerSystem, - operationOptions); - - foreach (CimInstance cimInstance in mCollection) - { - var oldName = cimInstance.CimInstanceProperties["DNSHostName"].Value.ToString(); - if (oldName.Equals(newName, StringComparison.OrdinalIgnoreCase)) - { - string errMsg = StringUtil.Format(ComputerResources.NewNameIsOldName, computerName, newName); - ErrorRecord error = new ErrorRecord( - new InvalidOperationException(errMsg), "NewNameIsOldName", - ErrorCategory.InvalidArgument, newName); - WriteError(error); - - continue; - } - - // If the target computer is in a domain, always use the DomainCred. If the DomainCred is not given, - // use null for UserName and Password, so the context of the caller will be used. - // If the target computer is not in a domain, just use null for the UserName and Password - string dUserName = null; - string dPassword = null; - if (((bool)cimInstance.CimInstanceProperties["PartOfDomain"].Value) && (DomainCredential != null)) - { - dUserName = DomainCredential.UserName; - dPassword = Utils.GetStringFromSecureString(DomainCredential.Password); - } - - var methodParameters = new CimMethodParametersCollection(); - methodParameters.Add(CimMethodParameter.Create( - "Name", - newName, - Microsoft.Management.Infrastructure.CimType.String, - CimFlags.None)); - - methodParameters.Add(CimMethodParameter.Create( - "UserName", - dUserName, - Microsoft.Management.Infrastructure.CimType.String, - (dUserName == null) ? CimFlags.NullValue : CimFlags.None)); - - methodParameters.Add( - CimMethodParameter.Create( - "Password", - dPassword, - Microsoft.Management.Infrastructure.CimType.String, - (dPassword == null) ? CimFlags.NullValue : CimFlags.None)); - - CimMethodResult result = cimSession.InvokeMethod( - ComputerWMIHelper.CimOperatingSystemNamespace, - cimInstance, - "Rename", - methodParameters, - operationOptions); - - int retVal = Convert.ToInt32(result.ReturnValue.Value, CultureInfo.CurrentCulture); - if (retVal != 0) - { - var ex = new Win32Exception(retVal); - string errMsg = StringUtil.Format(ComputerResources.FailToRename, computerName, newName, ex.Message); - ErrorRecord error = new ErrorRecord(new InvalidOperationException(errMsg), "FailToRenameComputer", ErrorCategory.OperationStopped, computerName); - WriteError(error); - } - else - { - successful = true; - } - - if (PassThru) - { - WriteObject(ComputerWMIHelper.GetRenameComputerStatusObject(retVal, newName, computerName)); - } - - if (successful) - { - if (_restart) - { - // If successful and the Restart parameter is specified, restart the computer - object[] flags = new object[] { 6, 0 }; - ComputerWMIHelper.InvokeWin32ShutdownUsingWsman( - this, - isLocalhost, - computerName, - flags, - credToUse, - WsmanAuthentication, - ComputerResources.RestartcomputerFailed, - "RestartcomputerFailed", - cancelTokenSource.Token); - } - else - { - WriteWarning(StringUtil.Format(ComputerResources.RestartNeeded, null, computerName)); - } - } - } // end foreach - } // end using - } - catch (CimException ex) - { - string errMsg = StringUtil.Format(ComputerResources.FailToConnectToComputer, computerName, ex.Message); - ErrorRecord error = new ErrorRecord(new InvalidOperationException(errMsg), "RenameComputerException", - ErrorCategory.OperationStopped, computerName); - WriteError(error); - } - catch (Exception ex) - { - string errMsg = StringUtil.Format(ComputerResources.FailToConnectToComputer, computerName, ex.Message); - ErrorRecord error = new ErrorRecord(new InvalidOperationException(errMsg), "RenameComputerException", - ErrorCategory.OperationStopped, computerName); - WriteError(error); - } - } - -#if !CORECLR - private void DoRenameComputerDcom(string computer, string computerName, string newName, bool isLocalhost) - { - EnumerationOptions enumOptions = new EnumerationOptions { UseAmendedQualifiers = true, DirectRead = true }; - ObjectQuery computerSystemQuery = new ObjectQuery("select * from " + ComputerWMIHelper.WMI_Class_ComputerSystem); - - // If both LocalCred and DomainCred are not provided, we use the default options - ConnectionOptions options = new ConnectionOptions - { - Authentication = AuthenticationLevel.PacketPrivacy, - Impersonation = ImpersonationLevel.Impersonate, - EnablePrivileges = true - }; - - if (isLocalhost) - { - options.Username = null; - options.SecurePassword = null; - } - // If the LocalCred is not given but the DomainCred is available, use the DomainCred for WMI connection. - // If LocalCred is given, use the local credential for WMI connection - else if (LocalCredential != null) - { - options.SecurePassword = LocalCredential.Password; - options.Username = ComputerWMIHelper.GetLocalAdminUserName(computerName, LocalCredential); - } - else if (DomainCredential != null) - { - options.SecurePassword = DomainCredential.Password; - options.Username = DomainCredential.UserName; - } - - bool successful = false; - ManagementScope scope = new ManagementScope(ComputerWMIHelper.GetScopeString(computer, ComputerWMIHelper.WMI_Path_CIM), options); - try - { - using (var searcher = new ManagementObjectSearcher(scope, computerSystemQuery, enumOptions)) - { - foreach (ManagementObject computerSystem in searcher.Get()) - { - using (computerSystem) - { - string oldName = (string)computerSystem["DNSHostName"]; - if (oldName.Equals(newName, StringComparison.OrdinalIgnoreCase)) - { - string errMsg = StringUtil.Format(ComputerResources.NewNameIsOldName, computerName, newName); - ErrorRecord error = new ErrorRecord( - new InvalidOperationException(errMsg), "NewNameIsOldName", - ErrorCategory.InvalidArgument, newName); - WriteError(error); - continue; - } - - string dUserName = null; - string dPassword = null; - if ((bool)computerSystem["PartOfDomain"]) - { - // If the target computer is in a domain, always use the DomainCred. If the DomainCred is not given, - // use null for UserName and Password, so the context of the caller will be used. - dUserName = DomainCredential != null ? DomainCredential.UserName : null; - dPassword = DomainCredential != null ? Utils.GetStringFromSecureString(DomainCredential.Password) : null; - } - // If the target computer is not in a domain, just use null for the UserName and Password - - ManagementBaseObject renameParameter = computerSystem.GetMethodParameters("Rename"); - renameParameter.SetPropertyValue("Name", newName); - renameParameter.SetPropertyValue("UserName", dUserName); - renameParameter.SetPropertyValue("Password", dPassword); - - ManagementBaseObject result = computerSystem.InvokeMethod("Rename", renameParameter, null); - Dbg.Diagnostics.Assert(result != null, "result cannot be null if the Rename method is invoked"); - int retVal = Convert.ToInt32(result["ReturnValue"], CultureInfo.CurrentCulture); - if (retVal != 0) - { - var ex = new Win32Exception(retVal); - string errMsg = StringUtil.Format(ComputerResources.FailToRename, computerName, newName, ex.Message); - ErrorRecord error = new ErrorRecord(new InvalidOperationException(errMsg), "FailToRenameComputer", ErrorCategory.OperationStopped, computerName); - WriteError(error); - } - else - { - successful = true; - } - - if (PassThru) - { - WriteObject(ComputerWMIHelper.GetRenameComputerStatusObject(retVal, newName, computerName)); - } - } - } - } - - // If successful and the Restart parameter is specified, restart the computer - if (successful && _restart) - { - object[] flags = new object[] { 6, 0 }; - RestartComputerCommand.RestartOneComputerUsingDcom(this, isLocalhost, computerName, flags, options); - } - - // If successful and the Restart parameter is not specified, write out warning - if (successful && !_restart) + if (_waitOnComputers.Count > 0) { - WriteWarning(StringUtil.Format(ComputerResources.RestartNeeded, null, computerName)); - } - } - catch (ManagementException ex) - { - string errMsg = StringUtil.Format(ComputerResources.FailToConnectToComputer, computerName, ex.Message); - ErrorRecord error = new ErrorRecord(new InvalidOperationException(errMsg), "RenameComputerException", - ErrorCategory.OperationStopped, computerName); - WriteError(error); - } - catch (COMException ex) - { - string errMsg = StringUtil.Format(ComputerResources.FailToConnectToComputer, computerName, ex.Message); - ErrorRecord error = new ErrorRecord(new InvalidOperationException(errMsg), "RenameComputerException", - ErrorCategory.OperationStopped, computerName); - WriteError(error); - } - catch (UnauthorizedAccessException ex) - { - string errMsg = StringUtil.Format(ComputerResources.FailToConnectToComputer, computerName, ex.Message); - ErrorRecord error = new ErrorRecord(new InvalidOperationException(errMsg), "RenameComputerException", - ErrorCategory.OperationStopped, computerName); - WriteError(error); - } - } -#endif - -#endregion "Private Methods" - -#region "Override Methods" - - /// - /// Begin Processing - /// - protected override void BeginProcessing() - { - base.BeginProcessing(); - - bool haveWsmanAuthenticationParam = this.MyInvocation.BoundParameters.ContainsKey("WsmanAuthentication"); - bool haveProtocolParam = this.MyInvocation.BoundParameters.ContainsKey("Protocol"); - _transportProtocol = (this.Protocol.Equals(ComputerWMIHelper.WsmanProtocol, StringComparison.OrdinalIgnoreCase) || (haveWsmanAuthenticationParam && !haveProtocolParam)) ? - TransportProtocol.WSMan : TransportProtocol.DCOM; - - // Verify parameter set - if ((_transportProtocol == TransportProtocol.DCOM) && haveWsmanAuthenticationParam) - { - ThrowTerminatingError( - new ErrorRecord( - new PSArgumentException(ComputerResources.RenameCommandWsmanAuthParamConflict), - "InvalidParameter", - ErrorCategory.InvalidArgument, - this)); - } - -#if CORECLR - // DCOM Authentication is not supported for CoreCLR. Throw an error - // and request that the user specify WSMan Authentication. - if (_transportProtocol == TransportProtocol.DCOM) - { - PSArgumentException ex = new PSArgumentException(ComputerResources.InvalidParameterDCOMNotSupported); - ThrowTerminatingError(new ErrorRecord(ex, "InvalidParameterDCOMNotSupported", ErrorCategory.InvalidArgument, null)); - } -#endif - } - - /// - /// ProcessRecord method. - /// - protected override void ProcessRecord() - { - string targetComputer = ValidateComputerName(); - if (targetComputer == null) return; - - bool isLocalhost = targetComputer.Equals("localhost", StringComparison.OrdinalIgnoreCase); - if (isLocalhost) - { - if (!_containsLocalHost) - _containsLocalHost = true; - _newNameForLocalHost = NewName; - - return; - } - - DoRenameComputerAction(targetComputer, NewName, false); - } - - /// - /// EndProcessing method - /// - protected override void EndProcessing() - { - if (!_containsLocalHost) return; - - DoRenameComputerAction("localhost", _newNameForLocalHost, true); - } - -#endregion "Override Methods" - } - -#endregion Rename-Computer - -#if !CORECLR + var restartStageTestList = new List(_waitOnComputers); + var wmiTestList = new List(); + var winrmTestList = new List(); + var psTestList = new List(); + var allDoneList = new List(); -#region Test-ComputerSecureChannel + bool isForWmi = _waitFor.Equals(WaitForServiceTypes.Wmi); + bool isForWinRm = _waitFor.Equals(WaitForServiceTypes.WinRM); + bool isForPowershell = _waitFor.Equals(WaitForServiceTypes.PowerShell); + int indicatorIndex = 0; + int machineCompleteRestart = 0; + int actualDelay = SecondsToWaitForRestartToBegin; + bool first = true; + bool waitComplete = false; - /// - /// This cmdlet queries the status of trust relationships and will remove and - /// rebuild the trust if specified. - /// + _percent = 0; + _status = ComputerResources.WaitForRestartToBegin; + _activity = _waitOnComputers.Count == 1 ? + StringUtil.Format(ComputerResources.RestartSingleComputerActivity, _waitOnComputers[0]) : + ComputerResources.RestartMultipleComputersActivity; - [Cmdlet(VerbsDiagnostic.Test, "ComputerSecureChannel", SupportsShouldProcess = true, HelpUri = "https://go.microsoft.com/fwlink/?LinkID=137749")] - [OutputType(typeof(Boolean))] - public class TestComputerSecureChannelCommand : PSCmdlet - { -#region Parameters + _timer = new Timer(OnTimedEvent, null, _timeoutInMilliseconds, System.Threading.Timeout.Infinite); - /// - /// Repair the secure channel between the local machine with the domain, if it's broken - /// - [Parameter] - public SwitchParameter Repair { get; set; } + while (true) + { + int loopCount = actualDelay * 4; // (delay * 1000)/250ms + while (loopCount > 0) + { + WriteProgress(_indicator[(indicatorIndex++) % 4] + _activity, _status, _percent, ProgressRecordType.Processing); - /// - /// The trusted domain controller to operate "Repair" on. - /// - [Parameter, ValidateNotNullOrEmpty] - public string Server { get; set; } + loopCount--; + _waitHandler.Wait(250); + if (_exit) { break; } + } - /// - /// The domain credential for authenticating to the domain the local machine joined - /// - [Parameter, ValidateNotNullOrEmpty, Credential] - public PSCredential Credential { get; set; } + if (first) + { + actualDelay = _delay; + first = false; - private const uint NETLOGON_CONTROL_REDISCOVER = 5; - private const uint NETLOGON_CONTROL_TC_QUERY = 6; - private const uint NETLOGON_INFO_2 = 2; + if (_waitOnComputers.Count > 1) + { + _status = StringUtil.Format(ComputerResources.WaitForMultipleComputers, machineCompleteRestart, _waitOnComputers.Count); + WriteProgress(_indicator[(indicatorIndex++) % 4] + _activity, _status, _percent, ProgressRecordType.Processing); + } + } -#endregion Parameters + do + { + // Test restart stage. + // We check if the target machine has already rebooted by querying the LastBootUpTime from the Win32_OperatingSystem object. + // So after this step, we are sure that both the Network and the WMI or WinRM service have already come up. + if (_exit) { break; } + if (restartStageTestList.Count > 0) + { + if (_waitOnComputers.Count == 1) + { + _status = ComputerResources.VerifyRebootStage; + _percent = CalculateProgressPercentage(StageVerification); + WriteProgress(_indicator[(indicatorIndex++) % 4] + _activity, _status, _percent, ProgressRecordType.Processing); + } + List nextTestList = (isForWmi || isForPowershell) ? wmiTestList : winrmTestList; + restartStageTestList = TestRestartStageUsingWsman(restartStageTestList, nextTestList, _cancel.Token); + } -#region "Private Methods" + // Test WMI service + if (_exit) { break; } + if (wmiTestList.Count > 0) + { + // This statement block executes for both CLRs. + // In the "full" CLR, it serves as the else case. + { + if (_waitOnComputers.Count == 1) + { + _status = ComputerResources.WaitForWMI; + _percent = CalculateProgressPercentage(WmiConnectionTest); + WriteProgress(_indicator[(indicatorIndex++) % 4] + _activity, _status, _percent, ProgressRecordType.Processing); + } + wmiTestList = TestWmiConnectionUsingWsman(wmiTestList, winrmTestList, _cancel.Token, Credential, WsmanAuthentication, this); + } + } + if (isForWmi) { break; } - [SuppressMessage("Microsoft.Usage", "CA1806:DoNotIgnoreMethodResults", Justification = "Return results are used in debug asserts.")] - private bool VerifySecureChannel(string domain, string localMachineName) - { - IntPtr queryInfo = IntPtr.Zero; - IntPtr domainPtr = Marshal.StringToCoTaskMemAuto(domain); - bool scInGoodState = false; + // Test WinRM service + if (_exit) { break; } + if (winrmTestList.Count > 0) + { + // This statement block executes for both CLRs. + // In the "full" CLR, it serves as the else case. + { + // CIM-WSMan in use. In this case, restart stage checking is done by using WMIv2, + // so the WinRM service on the target machine is already up at this point. + psTestList.AddRange(winrmTestList); + winrmTestList.Clear(); - try - { - int errorCode = SAMAPI.I_NetLogonControl2(null, NETLOGON_CONTROL_TC_QUERY, NETLOGON_INFO_2, ref domainPtr, out queryInfo); + if (_waitOnComputers.Count == 1) + { + // This is to simulate the test for WinRM service + _status = ComputerResources.WaitForWinRM; + _percent = CalculateProgressPercentage(WinrmConnectionTest); - if (errorCode != 0) - { - var ex = new Win32Exception(errorCode); - string errMsg = StringUtil.Format(ComputerResources.FailToTestSecureChannel, ex.Message); - ErrorRecord error = new ErrorRecord(new InvalidOperationException(errMsg), "FailToTestSecureChannel", - ErrorCategory.OperationStopped, localMachineName); - ThrowTerminatingError(error); - } + loopCount = actualDelay * 4; // (delay * 1000)/250ms + while (loopCount > 0) + { + WriteProgress(_indicator[(indicatorIndex++) % 4] + _activity, _status, _percent, ProgressRecordType.Processing); - var infoData = (SAMAPI.NetLogonInfo2)Marshal.PtrToStructure(queryInfo, typeof(SAMAPI.NetLogonInfo2)); - scInGoodState = infoData.PdcConnectionStatus == 0; - } - finally - { - if (domainPtr != IntPtr.Zero) - { - Marshal.FreeCoTaskMem(domainPtr); - } - if (queryInfo != IntPtr.Zero) - { - int freeResult = SAMAPI.NetApiBufferFree(queryInfo); - Dbg.Diagnostics.Assert(freeResult == 0, "NetApiBufferFree returned non-zero value"); - } - } + loopCount--; + _waitHandler.Wait(250); + if (_exit) { break; } + } + } + } + } + if (isForWinRm) { break; } - return scInGoodState; - } + // Test PowerShell + if (_exit) { break; } + if (psTestList.Count > 0) + { + if (_waitOnComputers.Count == 1) + { + _status = ComputerResources.WaitForPowerShell; + _percent = CalculateProgressPercentage(PowerShellConnectionTest); + WriteProgress(_indicator[(indicatorIndex++) % 4] + _activity, _status, _percent, ProgressRecordType.Processing); + } + psTestList = TestPowerShell(psTestList, allDoneList, _powershell, this.Credential); + } + } while (false); - [SuppressMessage("Microsoft.Usage", "CA1806:DoNotIgnoreMethodResults", Justification = "Return results are used in debug asserts.")] - private bool ResetSecureChannel(string domain) - { - IntPtr queryInfo = IntPtr.Zero; - IntPtr domainPtr = Marshal.StringToCoTaskMemAuto(domain); - bool scInGoodState = false; + // if time is up or Ctrl+c is typed, break out + if (_exit) { break; } - try - { - int errorCode = SAMAPI.I_NetLogonControl2(null, NETLOGON_CONTROL_REDISCOVER, NETLOGON_INFO_2, ref domainPtr, out queryInfo); - if (errorCode == 0) - { - var infoData = (SAMAPI.NetLogonInfo2)Marshal.PtrToStructure(queryInfo, typeof(SAMAPI.NetLogonInfo2)); - scInGoodState = infoData.TrustedDcName != null; - } - } - finally - { - if (domainPtr != IntPtr.Zero) - { - Marshal.FreeCoTaskMem(domainPtr); - } - if (queryInfo != IntPtr.Zero) - { - int freeResult = SAMAPI.NetApiBufferFree(queryInfo); - Dbg.Diagnostics.Assert(freeResult == 0, "NetApiBufferFree returned non-zero value"); - } - } + // Check if the restart completes + switch (_waitFor) + { + case WaitForServiceTypes.Wmi: + waitComplete = (winrmTestList.Count == _waitOnComputers.Count); + machineCompleteRestart = winrmTestList.Count; + break; + case WaitForServiceTypes.WinRM: + waitComplete = (psTestList.Count == _waitOnComputers.Count); + machineCompleteRestart = psTestList.Count; + break; + case WaitForServiceTypes.PowerShell: + waitComplete = (allDoneList.Count == _waitOnComputers.Count); + machineCompleteRestart = allDoneList.Count; + break; + } - return scInGoodState; - } + // Wait is done or time is up + if (waitComplete || _exit) + { + if (waitComplete) + { + _status = ComputerResources.RestartComplete; + WriteProgress(_indicator[indicatorIndex % 4] + _activity, _status, 100, ProgressRecordType.Completed); + _timer.Change(System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite); + } + break; + } -#endregion "Private Methods" + if (_waitOnComputers.Count > 1) + { + _status = StringUtil.Format(ComputerResources.WaitForMultipleComputers, machineCompleteRestart, _waitOnComputers.Count); + _percent = machineCompleteRestart * 100 / _waitOnComputers.Count; + } + }// end while(true) -#region "Override Methods" - /// - /// BeginProcessing method - /// - protected override void BeginProcessing() - { - if (Server != null) - { - if (Server.Length == 1 && Server[0] == '.') - { - Server = "localhost"; - } + if (_timeUp) + { + // The timeout expires. Write out timeout error messages for the computers that haven't finished restarting + do + { + if (restartStageTestList.Count > 0) { WriteOutTimeoutError(restartStageTestList); } + if (wmiTestList.Count > 0) { WriteOutTimeoutError(wmiTestList); } + // Wait for WMI. All computers that finished restarting are put in "winrmTestList" + if (isForWmi) { break; } - try - { - string resolveFullName = Dns.GetHostEntry(Server).HostName; - } - catch (Exception exception) - { - string errMsg = StringUtil.Format(ComputerResources.CannotResolveComputerName, Server, exception.Message); - ErrorRecord error = new ErrorRecord(new InvalidOperationException(errMsg), "AddressResolutionException", ErrorCategory.InvalidArgument, Server); - ThrowTerminatingError(error); - } - } - } + // Wait for WinRM. All computers that finished restarting are put in "psTestList" + if (winrmTestList.Count > 0) { WriteOutTimeoutError(winrmTestList); } + if (isForWinRm) { break; } + if (psTestList.Count > 0) { WriteOutTimeoutError(psTestList); } + // Wait for PowerShell. All computers that finished restarting are put in "allDoneList" + } while (false); + } + }// end if(waitOnComputer.Count > 0) + }//end DefaultParameter + }//End Processrecord /// - /// ProcessRecord method. - /// Suppress the message about NetApiBufferFree. The retuned results are - /// actually used, but only in checked builds + /// to implement ^C /// - [SuppressMessage("Microsoft.Usage", "CA1806:DoNotIgnoreMethodResults")] - protected override void ProcessRecord() + protected override void StopProcessing() { - string localMachineName = Dns.GetHostName(); - string domain = null; - Exception exception = null; + _exit = true; + _cancel.Cancel(); + _waitHandler.Set(); - if (!ShouldProcess(localMachineName)) + if (_timer != null) { - return; + _timer.Change(System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite); } - try - { - ManagementObject computerSystemInstance = new ManagementObject("Win32_ComputerSystem.Name=\"" + localMachineName + "\""); - if (!(bool)computerSystemInstance["PartOfDomain"]) - { - string errMsg = ComputerResources.TestComputerNotInDomain; - ErrorRecord error = new ErrorRecord(new InvalidOperationException(errMsg), "ComputerNotInDomain", - ErrorCategory.InvalidOperation, localMachineName); - ThrowTerminatingError(error); - } - domain = (string)LanguagePrimitives.ConvertTo(computerSystemInstance["Domain"], typeof(string), CultureInfo.InvariantCulture); - } - catch (ManagementException ex) - { - exception = ex; - } - catch (COMException ex) - { - exception = ex; - } - catch (UnauthorizedAccessException ex) - { - exception = ex; - } - if (exception != null) + if (_powershell != null) { - string errMsg = StringUtil.Format(ComputerResources.FailToGetDomainInformation, exception.Message); - ErrorRecord error = new ErrorRecord(new InvalidOperationException(errMsg), "FailToGetDomainInformation", - ErrorCategory.OperationStopped, localMachineName); - ThrowTerminatingError(error); + _powershell.Stop(); + _powershell.Dispose(); } + } - Dbg.Diagnostics.Assert(domain != null, "domain should not be null at this point"); - bool scInGoodState = false; - string verboseMsg = null; - if (Repair) - { - ResetComputerMachinePasswordCommand. - ResetMachineAccountPassword(domain, localMachineName, Server, Credential, this); +#endregion "Overrides" + } - scInGoodState = ResetSecureChannel(domain); - verboseMsg = scInGoodState - ? StringUtil.Format(ComputerResources.RepairSecureChannelSucceed, domain) - : StringUtil.Format(ComputerResources.RepairSecureChannelFail, domain); - } - else - { - scInGoodState = VerifySecureChannel(domain, localMachineName); - verboseMsg = scInGoodState - ? StringUtil.Format(ComputerResources.SecureChannelAlive, domain) - : StringUtil.Format(ComputerResources.SecureChannelBroken, domain); - } +#endregion Restart-Computer - WriteObject(scInGoodState); - WriteVerbose(verboseMsg); - } +#region Stop-Computer -#endregion "Override Methods" - }//End Class + /// + /// cmdlet to stop computer + /// + [Cmdlet(VerbsLifecycle.Stop, "Computer", SupportsShouldProcess = true, + HelpUri = "https://go.microsoft.com/fwlink/?LinkID=135263", RemotingCapability = RemotingCapability.SupportedByCommand)] + public sealed class StopComputerCommand : PSCmdlet, IDisposable + { +#region Private Members + private readonly CancellationTokenSource _cancel = new CancellationTokenSource(); + private const int forcedShutdown = 5; // See https://msdn.microsoft.com/en-us/library/aa394058(v=vs.85).aspx #endregion -#region Reset-ComputerMachinePassword - /// - /// Resets the computer machine password used to authenticate with DCs. - /// +#region "Parameters" - [Cmdlet(VerbsCommon.Reset, "ComputerMachinePassword", - SupportsShouldProcess = true, HelpUri = "https://go.microsoft.com/fwlink/?LinkID=135252")] - public class ResetComputerMachinePasswordCommand : PSCmdlet - { -#region "Parameter and PrivateData" + /// + /// The authentication options for CIM_WSMan connection + /// + [Parameter] + [ValidateSet( + "Default", + "Basic", + "Negotiate", // can be used with and without credential (without -> PSRP mapped to NegotiateWithImplicitCredential) + "CredSSP", + "Digest", + "Kerberos")] // can be used with explicit or implicit credential + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly")] + public string WsmanAuthentication { get; set; } = "Default"; /// - /// The following is the definition of the input parameter "Server". - /// Specifies the name of the domain controller to use for setting the machine - /// account password. + /// The following is the definition of the input parameter "ComputerName". + /// Value of the address requested. The form of the value can be either the + /// computer name ("wxyz1234"), IPv4 address ("192.168.177.124"), or IPv6 + /// address ("2010:836B:4179::836B:4179"). /// - [Parameter] + [Parameter(Position = 0, ValueFromPipelineByPropertyName = true)] [ValidateNotNullOrEmpty] - public string Server { get; set; } + [SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays")] + [Alias("CN", "__SERVER", "Server", "IPAddress")] + public String[] ComputerName { get; set; } = new string[] { "." }; + /// - /// The domain credential for authenticating to the domain the local machine joined + /// The following is the definition of the input parameter "Credential". + /// Specifies a user account that has permission to perform this action. Type a + /// user-name, such as "User01" or "Domain01\User01", or enter a PSCredential + /// object, such as one from the Get-Credential cmdlet /// - [Parameter] + [Parameter(Position = 1)] [ValidateNotNullOrEmpty] [Credential] public PSCredential Credential { get; set; } - private const uint STATUS_ACCESS_DENIED = 0xc0000022; - private const uint STATUS_OBJECT_NAME_NOT_FOUND = 0xc0000034; - - private const uint SECRET_SET_VALUE = 0x00000001; - private const uint SECRET_QUERY_VALUE = 0x00000002; - - // This number comes from the GenerateRandomPassword implementation of NetDom.exe. - // There is a reason behind this number. - private const int PasswordLength = 120; - private const string SecretKey = "$MACHINE.ACC"; + /// + /// Force the operation to take place if possible + /// + [Parameter] + public SwitchParameter Force { get; set; } = false; -#endregion "Parameter and PrivateData" + #endregion "parameters" -#region "Private Methods" +#region "IDisposable Members" /// - /// Throw out terminating error for LSA function invocations + /// Dispose Method /// - /// - /// - private static void ThrowOutLsaError(uint ret, PSCmdlet cmdlet) + public void Dispose() { - var ex = new Win32Exception(SAMAPI.LsaNtStatusToWinError((int)ret)); - string errMsg = StringUtil.Format(ComputerResources.FailToResetPasswordOnLocalMachine, ex.Message); - ErrorRecord error = new ErrorRecord(new InvalidOperationException(errMsg), "FailToResetPasswordOnLocalMachine", - ErrorCategory.OperationStopped, Dns.GetHostName()); - cmdlet.ThrowTerminatingError(error); + try + { + _cancel.Dispose(); + } + catch (ObjectDisposedException) { } } -#endregion "Private Methods" +#endregion "IDisposable Members" -#region "Internal Methods" +#region "Overrides" /// - /// Reset machine account password + /// ProcessRecord /// - /// - /// - /// - /// - /// - [SuppressMessage("Microsoft.Usage", "CA1806:DoNotIgnoreMethodResults", Justification = "Return results are used in debug asserts.")] - internal static void ResetMachineAccountPassword(string domain, string localMachineName, string server, PSCredential credential, PSCmdlet cmdlet) + [SuppressMessage("Microsoft.Maintainability", "CA1506:AvoidExcessiveClassCoupling")] + protected override void ProcessRecord() { - // Get domain directory entry and reset the password on the machine account of the local machine - string newPassword = null; - string domainOrServerName = server ?? domain; + object[] flags = new object[] { 1, 0 }; + if (Force.IsPresent) + flags[0] = forcedShutdown; - try - { - string dUserName = credential != null ? credential.UserName : null; - string dPassword = credential != null ? Utils.GetStringFromSecureString(credential.Password) : null; - - using (var domainEntry = new DirectoryEntry( - "LDAP://" + domainOrServerName, - dUserName, - dPassword, - AuthenticationTypes.Secure)) - { - using (var searcher = new DirectorySearcher(domainEntry)) - { - searcher.Filter = "(&(objectClass=computer)(|(cn=" + localMachineName + ")(dn=" + localMachineName + ")))"; - SearchResult result = searcher.FindOne(); + ProcessWSManProtocol(flags); + }//End Processrecord - if (result == null) - { - string format = server != null - ? ComputerResources.CannotFindMachineAccountFromServer - : ComputerResources.CannotFindMachineAccountFromDomain; - string errMsg = StringUtil.Format(format, domainOrServerName); - ErrorRecord error = new ErrorRecord(new InvalidOperationException(errMsg), "CannotFindMachineAccount", - ErrorCategory.OperationStopped, localMachineName); - cmdlet.ThrowTerminatingError(error); - } - else - { - // Generate a random password of length 120, and reset the password on the machine account - using (var targetEntry = result.GetDirectoryEntry()) - { - newPassword = ComputerWMIHelper.GetRandomPassword(PasswordLength); - targetEntry.Invoke("SetPassword", new object[] { newPassword }); - targetEntry.Properties["LockOutTime"].Value = 0; - } - } - } - } - } - catch (DirectoryServicesCOMException ex) - { - string errMsg = StringUtil.Format(ComputerResources.FailToResetPasswordOnDomain, ex.Message); - ErrorRecord error = new ErrorRecord(new InvalidOperationException(errMsg), "FailToResetPasswordOnDomain", - ErrorCategory.OperationStopped, localMachineName); - cmdlet.ThrowTerminatingError(error); - } - catch (TargetInvocationException ex) - { - string errMsg = StringUtil.Format(ComputerResources.FailToResetPasswordOnDomain, ex.InnerException.Message); - ErrorRecord error = new ErrorRecord(new InvalidOperationException(errMsg), "FailToResetPasswordOnDomain", - ErrorCategory.OperationStopped, localMachineName); - cmdlet.ThrowTerminatingError(error); - } - catch (COMException ex) + /// + /// to implement ^C + /// + protected override void StopProcessing() + { + try { - string errMsg = StringUtil.Format(ComputerResources.FailToResetPasswordOnDomain, ex.Message); - ErrorRecord error = new ErrorRecord(new InvalidOperationException(errMsg), "FailToResetPasswordOnDomain", - ErrorCategory.OperationStopped, localMachineName); - cmdlet.ThrowTerminatingError(error); + _cancel.Cancel(); } + catch (ObjectDisposedException) { } + catch (AggregateException) { } + } - // Set the same password to the local machine - Dbg.Diagnostics.Assert(newPassword != null, "the newPassword should not be null at this point"); - - // A direct translation of function NetpManageMachineSecret2 in //depot/winmain/ds/netapi/netjoin/joinutl.c - // Initialize the LSA_OBJECT_ATTRIBUTES - var lsaAttr = new SAMAPI.LSA_OBJECT_ATTRIBUTES(); - lsaAttr.RootDirectory = IntPtr.Zero; - lsaAttr.ObjectName = IntPtr.Zero; - lsaAttr.Attributes = 0; - lsaAttr.SecurityDescriptor = IntPtr.Zero; - lsaAttr.SecurityQualityOfService = IntPtr.Zero; - lsaAttr.Length = Marshal.SizeOf(typeof(SAMAPI.LSA_OBJECT_ATTRIBUTES)); - - // Initialize the policy handle and secret handle - IntPtr policyHandle = IntPtr.Zero; - IntPtr secretHandle = IntPtr.Zero; - - // Initialize variables for LsaQuerySecret call - IntPtr currentPassword = IntPtr.Zero; - - // Declare the key, newData and currentData - var key = new SAMAPI.LSA_UNICODE_STRING { Buffer = IntPtr.Zero }; - var newData = new SAMAPI.LSA_UNICODE_STRING { Buffer = IntPtr.Zero }; +#endregion "Overrides" - // Initialize the systemName for the localhost - var localhost = new SAMAPI.LSA_UNICODE_STRING(); - localhost.Buffer = IntPtr.Zero; - localhost.Length = 0; - localhost.MaximumLength = 0; +#region Private Methods - try + private void ProcessWSManProtocol(object[] flags) + { + foreach (string computer in ComputerName) { - // Open the LSA policy - uint ret = SAMAPI.LsaOpenPolicy(ref localhost, ref lsaAttr, (int)SAMAPI.LSA_ACCESS.AllAccess, out policyHandle); - if (ret == STATUS_ACCESS_DENIED) - { - string errMsg = ComputerResources.NeedAdminPrivilegeToResetPassword; - ErrorRecord error = new ErrorRecord(new InvalidOperationException(errMsg), "UnauthorizedAccessException", - ErrorCategory.InvalidOperation, localMachineName); - cmdlet.ThrowTerminatingError(error); - } - if (ret != 0) - { - ThrowOutLsaError(ret, cmdlet); - } + string compname = string.Empty; + string strLocal = string.Empty; + bool isLocalHost = false; - // Initialize secret key, new secret - SAMAPI.InitLsaString(SecretKey, ref key); - SAMAPI.InitLsaString(newPassword, ref newData); - bool secretCreated = false; + if (_cancel.Token.IsCancellationRequested) { break; } - // Open the secret. If the secret is not found, create the secret - ret = SAMAPI.LsaOpenSecret(policyHandle, ref key, SECRET_SET_VALUE | SECRET_QUERY_VALUE, out secretHandle); - if (ret == STATUS_OBJECT_NAME_NOT_FOUND) + if ((computer.Equals("localhost", StringComparison.CurrentCultureIgnoreCase)) || (computer.Equals(".", StringComparison.OrdinalIgnoreCase))) { - ret = SAMAPI.LsaCreateSecret(policyHandle, ref key, SECRET_SET_VALUE, out secretHandle); - secretCreated = true; + compname = Dns.GetHostName(); + strLocal = "localhost"; + isLocalHost = true; } - if (ret != 0) + else { - ThrowOutLsaError(ret, cmdlet); + compname = computer; } - SAMAPI.LSA_UNICODE_STRING currentData; - // Get the current password - if (secretCreated) + if (!ShouldProcess(StringUtil.Format(ComputerResources.DoubleComputerName, strLocal, compname))) { - // Use the new password as the current one - currentData = newData; + continue; } else { - // Query for the current password - ret = SAMAPI.LsaQuerySecret(secretHandle, out currentPassword, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero); - if (ret != 0) - { - ThrowOutLsaError(ret, cmdlet); - } - - currentData = (SAMAPI.LSA_UNICODE_STRING)Marshal.PtrToStructure(currentPassword, typeof(SAMAPI.LSA_UNICODE_STRING)); - } - - ret = SAMAPI.LsaSetSecret(secretHandle, ref newData, ref currentData); - if (ret != 0) - { - ThrowOutLsaError(ret, cmdlet); + ComputerWMIHelper.InvokeWin32ShutdownUsingWsman( + this, + isLocalHost, + compname, + flags, + Credential, + WsmanAuthentication, + ComputerResources.StopcomputerFailed, + "StopComputerException", + _cancel.Token); } } - finally - { - // Release pointers - if (currentPassword != IntPtr.Zero) - { - int releaseResult = SAMAPI.LsaFreeMemory(currentPassword); - Dbg.Diagnostics.Assert(releaseResult == 0, "LsaFreeMemory returned non-zero value"); - } + } - // Release handles - if (policyHandle != IntPtr.Zero) - { - int releaseResult = SAMAPI.LsaClose(policyHandle); - Dbg.Diagnostics.Assert(releaseResult == 0, "LsaClose returned non-zero value"); - } +#endregion + } - if (secretHandle != IntPtr.Zero) - { - int releaseResult = SAMAPI.LsaClose(secretHandle); - Dbg.Diagnostics.Assert(releaseResult == 0, "LsaClose returned non-zero value"); - } +#endregion - // Release LSA_UNICODE_STRING - SAMAPI.FreeLsaString(ref key); - SAMAPI.FreeLsaString(ref newData); - } +#region Rename-Computer + + /// + /// Renames a domain computer and its corresponding domain account or a + /// workgroup computer. Use this command to rename domain workstations and local + /// machines only. It cannot be used to rename Domain Controllers. + /// + + [Cmdlet(VerbsCommon.Rename, "Computer", SupportsShouldProcess = true, + HelpUri = "https://go.microsoft.com/fwlink/?LinkID=219990", RemotingCapability = RemotingCapability.SupportedByCommand)] + public class RenameComputerCommand : PSCmdlet + { +#region Private Members + + private bool _containsLocalHost = false; + private string _newNameForLocalHost = null; + + private readonly string _shortLocalMachineName = Dns.GetHostName(); + private readonly string _fullLocalMachineName = Dns.GetHostEntryAsync("").Result.HostName; + +#endregion + +#region Parameters + + /// + /// Target computers to rename + /// + [Parameter(ValueFromPipelineByPropertyName = true)] + [ValidateNotNullOrEmpty] + public string ComputerName { get; set; } = "localhost"; + + /// + /// Emit the output. + /// + //[Alias("Restart")] + [Parameter] + public SwitchParameter PassThru { get; set; } + + /// + /// The domain credential of the domain the target computer joined + /// + [Parameter] + [ValidateNotNullOrEmpty] + [Credential] + public PSCredential DomainCredential { get; set; } + + /// + /// The administrator credential of the target computer + /// + [Parameter] + [ValidateNotNullOrEmpty] + [Credential] + public PSCredential LocalCredential { get; set; } + + /// + /// New names for the target computers + /// + [Parameter(Mandatory = true, Position = 0, ValueFromPipelineByPropertyName = true)] + [ValidateNotNullOrEmpty] + public string NewName { get; set; } + + /// + /// Suppress the ShouldContinue + /// + [Parameter] + public SwitchParameter Force + { + get { return _force; } + set { _force = value; } } + private bool _force; -#endregion "Internal Methods" + /// + /// To restart the target computer after rename it + /// + [Parameter] + public SwitchParameter Restart + { + get { return _restart; } + set { _restart = value; } + } + private bool _restart; -#region "Override Methods" + /// + /// The authentication options for CIM_WSMan connection + /// + [Parameter] + [ValidateSet( + "Default", + "Basic", + "Negotiate", // can be used with and without credential (without -> PSRP mapped to NegotiateWithImplicitCredential) + "CredSSP", + "Digest", + "Kerberos")] // can be used with implicit or explicit credential + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly")] + public string WsmanAuthentication { get; set; } = "Default"; + +#endregion + +#region "Private Methods" /// - /// BeginProcessing method. + /// Check to see if the target computer is the local machine /// - protected override void BeginProcessing() + private string ValidateComputerName() { - if (Server != null) + // Validate target name. + ErrorRecord targetError = null; + string targetComputer = ComputerWMIHelper.ValidateComputerName(ComputerName, _shortLocalMachineName, _fullLocalMachineName, ref targetError); + if (targetComputer == null) { - if (Server.Length == 1 && Server[0] == '.') + if (targetError != null) { - Server = "localhost"; + WriteError(targetError); } + return null; + } - try - { - string resolveFullName = Dns.GetHostEntry(Server).HostName; - } - catch (Exception exception) - { - string errMsg = StringUtil.Format(ComputerResources.CannotResolveComputerName, Server, exception.Message); - ErrorRecord error = new ErrorRecord(new InvalidOperationException(errMsg), "AddressResolutionException", ErrorCategory.InvalidArgument, Server); - ThrowTerminatingError(error); - } + // Validate *new* name. Validate the format of the new name. Check if the old name is the same as the + // new name later. + if (!ComputerWMIHelper.IsComputerNameValid(NewName)) + { + bool isLocalhost = targetComputer.Equals(ComputerWMIHelper.localhostStr, StringComparison.OrdinalIgnoreCase); + string errMsg = StringUtil.Format(ComputerResources.InvalidNewName, isLocalhost ? _shortLocalMachineName : targetComputer, NewName); + ErrorRecord error = new ErrorRecord( + new InvalidOperationException(errMsg), "InvalidNewName", + ErrorCategory.InvalidArgument, NewName); + WriteError(error); + return null; } - }//End BeginProcessing() - /// - /// ProcessRecord method - /// Suppress the message about LsaFreeMemory and LsaClose. The retuned results are - /// actually used, but only in checked builds - /// - [SuppressMessage("Microsoft.Usage", "CA1806:DoNotIgnoreMethodResults")] - protected override void ProcessRecord() + return targetComputer; + } + + private void DoRenameComputerAction(string computer, string newName, bool isLocalhost) { - // Not to use Environment.MachineName to avoid the injection attack - string localMachineName = Dns.GetHostName(); - string domainName = null; - Exception exception = null; + string computerName = isLocalhost ? _shortLocalMachineName : computer; - if (!ShouldProcess(localMachineName)) + if (!ShouldProcess(computerName)) { return; } - try + // Check the length of the new name + if (newName != null && newName.Length > ComputerWMIHelper.NetBIOSNameMaxLength) { - ManagementObject computerSystemInstance = new ManagementObject("Win32_ComputerSystem.Name=\"" + localMachineName + "\""); - if (!(bool)computerSystemInstance["PartOfDomain"]) + string truncatedName = newName.Substring(0, ComputerWMIHelper.NetBIOSNameMaxLength); + string query = StringUtil.Format(ComputerResources.TruncateNetBIOSName, truncatedName); + string caption = ComputerResources.TruncateNetBIOSNameCaption; + if (!Force && !ShouldContinue(query, caption)) { - string errMsg = ComputerResources.ResetComputerNotInDomain; - ErrorRecord error = new ErrorRecord(new InvalidOperationException(errMsg), "ComputerNotInDomain", - ErrorCategory.InvalidOperation, localMachineName); - ThrowTerminatingError(error); + return; } - domainName = (string)LanguagePrimitives.ConvertTo(computerSystemInstance["Domain"], typeof(string), CultureInfo.InvariantCulture); - } - catch (ManagementException ex) - { - exception = ex; - } - catch (COMException ex) - { - exception = ex; - } - catch (UnauthorizedAccessException ex) - { - exception = ex; - } - if (exception != null) - { - string errMsg = StringUtil.Format(ComputerResources.FailToGetDomainInformation, exception.Message); - ErrorRecord error = new ErrorRecord(new InvalidOperationException(errMsg), "FailToGetDomainInformation", - ErrorCategory.OperationStopped, localMachineName); - ThrowTerminatingError(error); } - // Get domain directory entry and reset the password on the machine account of the local machine - Dbg.Diagnostics.Assert(domainName != null, "domainOrServerName should not be null at this point"); - ResetMachineAccountPassword(domainName, localMachineName, Server, Credential, this); + DoRenameComputerWsman(computer, computerName, newName, isLocalhost); } -#endregion "Override Methods" - }//End Class + private void DoRenameComputerWsman(string computer, string computerName, string newName, bool isLocalhost) + { + bool successful = false; + int retVal; + PSCredential credToUse = isLocalhost ? null : (LocalCredential ?? DomainCredential); -#endregion Reset-ComputerMachinePassword + try + { + using (CancellationTokenSource cancelTokenSource = new CancellationTokenSource()) + using (CimSession cimSession = RemoteDiscoveryHelper.CreateCimSession(computer, credToUse, WsmanAuthentication, cancelTokenSource.Token, this)) + { + var operationOptions = new CimOperationOptions + { + Timeout = TimeSpan.FromMilliseconds(10000), + CancellationToken = cancelTokenSource.Token, + //This prefix works against all versions of the WinRM server stack, both win8 and win7 + ResourceUriPrefix = new Uri(ComputerWMIHelper.CimUriPrefix) + }; -#region SAMCmdletsHelper + IEnumerable mCollection = cimSession.QueryInstances( + ComputerWMIHelper.CimOperatingSystemNamespace, + ComputerWMIHelper.CimQueryDialect, + "Select * from " + ComputerWMIHelper.WMI_Class_ComputerSystem, + operationOptions); - /// - /// the static class for calling the the NetJoinDomain function. - /// - internal static class SAMAPI - { - /// - /// Structure for the LSA unicode string - /// - [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] - internal struct LSA_UNICODE_STRING - { - internal ushort Length; - internal ushort MaximumLength; - [SuppressMessage("Microsoft.Reliability", "CA2006:UseSafeHandleToEncapsulateNativeResources")] - internal IntPtr Buffer; - } + foreach (CimInstance cimInstance in mCollection) + { + var oldName = cimInstance.CimInstanceProperties["DNSHostName"].Value.ToString(); + if (oldName.Equals(newName, StringComparison.OrdinalIgnoreCase)) + { + string errMsg = StringUtil.Format(ComputerResources.NewNameIsOldName, computerName, newName); + ErrorRecord error = new ErrorRecord( + new InvalidOperationException(errMsg), "NewNameIsOldName", + ErrorCategory.InvalidArgument, newName); + WriteError(error); - /// - /// Structure for the LSA object attributes - /// - [StructLayout(LayoutKind.Sequential)] - internal struct LSA_OBJECT_ATTRIBUTES - { - internal int Length; - internal IntPtr RootDirectory; - internal IntPtr ObjectName; - internal int Attributes; - internal IntPtr SecurityDescriptor; - internal IntPtr SecurityQualityOfService; - } + continue; + } - /// - /// The LSA access mask - /// - internal enum LSA_ACCESS - { - Read = 0x20006, - AllAccess = 0x00F0FFF, - Execute = 0X20801, - Write = 0X207F8 - } + // If the target computer is in a domain, always use the DomainCred. If the DomainCred is not given, + // use null for UserName and Password, so the context of the caller will be used. + // If the target computer is not in a domain, just use null for the UserName and Password + string dUserName = null; + string dPassword = null; + if (((bool)cimInstance.CimInstanceProperties["PartOfDomain"].Value) && (DomainCredential != null)) + { + dUserName = DomainCredential.UserName; + dPassword = Utils.GetStringFromSecureString(DomainCredential.Password); + } - /// - /// LsaOpenPolicy function - /// - /// - /// - /// - /// - /// - [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] - internal static extern uint LsaOpenPolicy( - ref LSA_UNICODE_STRING systemName, - ref LSA_OBJECT_ATTRIBUTES objectAttributes, - uint desiredAccess, - out IntPtr policyHandle); + var methodParameters = new CimMethodParametersCollection(); + methodParameters.Add(CimMethodParameter.Create( + "Name", + newName, + Microsoft.Management.Infrastructure.CimType.String, + CimFlags.None)); - /// - /// LsaOpenSecret function - /// - /// - /// - /// - /// - /// - [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] - internal static extern uint LsaOpenSecret( - IntPtr policyHandle, - ref LSA_UNICODE_STRING secretName, - uint accessMask, - out IntPtr secretHandle); + methodParameters.Add(CimMethodParameter.Create( + "UserName", + dUserName, + Microsoft.Management.Infrastructure.CimType.String, + (dUserName == null) ? CimFlags.NullValue : CimFlags.None)); - /// - /// LsaCreateSecret function - /// - /// - /// - /// - /// - /// - [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] - internal static extern uint LsaCreateSecret( - IntPtr policyHandle, - ref LSA_UNICODE_STRING secretName, - uint desiredAccess, - out IntPtr secretHandle); + methodParameters.Add( + CimMethodParameter.Create( + "Password", + dPassword, + Microsoft.Management.Infrastructure.CimType.String, + (dPassword == null) ? CimFlags.NullValue : CimFlags.None)); - /// - /// LsaQuerySecret function - /// - /// - /// - /// - /// - /// - /// - [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] - internal static extern uint LsaQuerySecret( - IntPtr secretHandle, - out IntPtr currentValue, - IntPtr currentValueSetTime, - IntPtr oldValue, - IntPtr oldValueSetTime); + if ( ! InternalTestHooks.TestRenameComputer ) + { + CimMethodResult result = cimSession.InvokeMethod( + ComputerWMIHelper.CimOperatingSystemNamespace, + cimInstance, + "Rename", + methodParameters, + operationOptions); + + retVal = Convert.ToInt32(result.ReturnValue.Value, CultureInfo.CurrentCulture); + } + else + { + retVal = InternalTestHooks.TestRenameComputerResults; + } - /// - /// LsaSetSecret function - /// - /// - /// - /// - /// - [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] - internal static extern uint LsaSetSecret( - IntPtr secretHandle, - ref LSA_UNICODE_STRING currentValue, - ref LSA_UNICODE_STRING oldValue); + if (retVal != 0) + { + var ex = new Win32Exception(retVal); + string errMsg = StringUtil.Format(ComputerResources.FailToRename, computerName, newName, ex.Message); + ErrorRecord error = new ErrorRecord(new InvalidOperationException(errMsg), "FailToRenameComputer", ErrorCategory.OperationStopped, computerName); + WriteError(error); + } + else + { + successful = true; + } - /// - /// LsaNtStatusToWinError function - /// - /// - /// - [DllImport("advapi32")] - internal static extern int LsaNtStatusToWinError(int ntStatus); + if (PassThru) + { + WriteObject(ComputerWMIHelper.GetRenameComputerStatusObject(retVal, newName, computerName)); + } - /// - /// LsaClose function - /// - /// - /// - [DllImport("advapi32")] - internal static extern int LsaClose(IntPtr policyHandle); + if (successful) + { + if (_restart) + { + // If successful and the Restart parameter is specified, restart the computer + object[] flags = new object[] { 6, 0 }; + ComputerWMIHelper.InvokeWin32ShutdownUsingWsman( + this, + isLocalhost, + computerName, + flags, + credToUse, + WsmanAuthentication, + ComputerResources.RestartcomputerFailed, + "RestartcomputerFailed", + cancelTokenSource.Token); + } + else + { + WriteWarning(StringUtil.Format(ComputerResources.RestartNeeded, null, computerName)); + } + } + } // end foreach + } // end using + } + catch (CimException ex) + { + string errMsg = StringUtil.Format(ComputerResources.FailToConnectToComputer, computerName, ex.Message); + ErrorRecord error = new ErrorRecord(new InvalidOperationException(errMsg), "RenameComputerException", + ErrorCategory.OperationStopped, computerName); + WriteError(error); + } + catch (Exception ex) + { + string errMsg = StringUtil.Format(ComputerResources.FailToConnectToComputer, computerName, ex.Message); + ErrorRecord error = new ErrorRecord(new InvalidOperationException(errMsg), "RenameComputerException", + ErrorCategory.OperationStopped, computerName); + WriteError(error); + } + } - /// - /// LsaFreeMemory function - /// - /// - /// - [DllImport("advapi32")] - internal static extern int LsaFreeMemory(IntPtr buffer); +#endregion "Private Methods" - /// - /// Initialize a LSA_UNICODE_STRING - /// - /// - /// - /// - internal static void InitLsaString(string s, ref LSA_UNICODE_STRING lus) - { - // Unicode strings max 32KB. The max value for MaximumLength should be ushort.MaxValue-1 - // because UnicodeEncoding.CharSize is 2. So the length of the string s should not be larger - // than (ushort.MaxValue - 1)/UnicodeEncoding.CharSize - 1, which is 0x7ffe (32766) - ushort maxLength = (ushort.MaxValue - 1) / UnicodeEncoding.CharSize - 1; - if (s.Length > maxLength) - throw new ArgumentException("String too long"); - lus.Buffer = Marshal.StringToHGlobalUni(s); - lus.Length = (ushort)(s.Length * UnicodeEncoding.CharSize); - lus.MaximumLength = (ushort)((s.Length + 1) * UnicodeEncoding.CharSize); - } +#region "Override Methods" /// - /// Free the LSA_UNICODE_STRING + /// ProcessRecord method. /// - /// - internal static void FreeLsaString(ref LSA_UNICODE_STRING s) + protected override void ProcessRecord() { - if (s.Buffer == IntPtr.Zero) return; + string targetComputer = ValidateComputerName(); + if (targetComputer == null) return; - Marshal.FreeHGlobal(s.Buffer); - s.Buffer = IntPtr.Zero; - } + bool isLocalhost = targetComputer.Equals("localhost", StringComparison.OrdinalIgnoreCase); + if (isLocalhost) + { + if (!_containsLocalHost) + _containsLocalHost = true; + _newNameForLocalHost = NewName; - /// - /// The NETLOGON_INFO_2 struct used for function I_NetLogonControl2 - /// - [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] - internal struct NetLogonInfo2 - { - internal uint Flags; - /// - /// Secure channel status with the primary domain controller - /// - internal uint PdcConnectionStatus; - /// - /// Name of the trusted domain controller - /// - internal string TrustedDcName; - /// - /// Secure channel status with the specified trusted domain controller - /// - internal uint TdcConnectionStatus; + return; + } + + DoRenameComputerAction(targetComputer, NewName, false); } /// - /// To Reset a password for a computer in domain. + /// EndProcessing method /// - [DllImport("netapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)] - internal static extern int I_NetLogonControl2( - [In] string lpServerName, - uint lpFunctionCode, - uint lpQueryLevel, - ref IntPtr lpInputData, - out IntPtr queryInformation); - + protected override void EndProcessing() + { + if (!_containsLocalHost) return; - [DllImport("Netapi32.dll", SetLastError = true)] - internal static extern int NetApiBufferFree(IntPtr Buffer); + DoRenameComputerAction("localhost", _newNameForLocalHost, true); + } - internal const int WorkGroupMachine = 2692; - internal const int MaxMachineNameLength = 15; +#endregion "Override Methods" } -#endregion - -#endif +#endregion Rename-Computer #region "Public API" /// @@ -6423,16 +1746,6 @@ internal static class ComputerWMIHelper /// internal const string SE_REMOTE_SHUTDOWN_NAME = "SeRemoteShutdownPrivilege"; - /// - /// DCOM protocol - /// - internal const string DcomProtocol = "DCOM"; - - /// - /// WSMan protocol - /// - internal const string WsmanProtocol = "WSMan"; - /// /// CimUriPrefix /// @@ -6513,31 +1826,6 @@ internal static string GetRandomPassword(int passwordLength) return new string(chars); } -#if !CORECLR // TODO:CORECLR Remove once ported to MI .Net - - /// - /// Get the Connection Options - /// - /// - /// - /// - /// - internal static ConnectionOptions GetConnectionOptions(AuthenticationLevel Authentication, ImpersonationLevel Impersonation, PSCredential Credential) - { - ConnectionOptions options = new ConnectionOptions(); - options.Authentication = Authentication; - options.EnablePrivileges = true; - options.Impersonation = Impersonation; - if (Credential != null) - { - options.Username = Credential.UserName; - options.SecurePassword = Credential.Password; - } - return options; - } - -#endif - /// /// Gets the Scope /// @@ -6806,6 +2094,7 @@ internal static bool InvokeWin32ShutdownUsingWsman( using (CimSession cimSession = RemoteDiscoveryHelper.CreateCimSession(targetMachine, credInUse, authInUse, cancelToken, cmdlet)) { var methodParameters = new CimMethodParametersCollection(); + int retVal; methodParameters.Add(CimMethodParameter.Create( "Flags", flags[0], @@ -6818,14 +2107,22 @@ internal static bool InvokeWin32ShutdownUsingWsman( Microsoft.Management.Infrastructure.CimType.SInt32, CimFlags.None)); - CimMethodResult result = cimSession.InvokeMethod( - ComputerWMIHelper.CimOperatingSystemNamespace, - ComputerWMIHelper.WMI_Class_OperatingSystem, - ComputerWMIHelper.CimOperatingSystemShutdownMethod, - methodParameters, - operationOptions); + if ( ! InternalTestHooks.TestStopComputer ) + { + CimMethodResult result = cimSession.InvokeMethod( + ComputerWMIHelper.CimOperatingSystemNamespace, + ComputerWMIHelper.WMI_Class_OperatingSystem, + ComputerWMIHelper.CimOperatingSystemShutdownMethod, + methodParameters, + operationOptions); + + retVal = Convert.ToInt32(result.ReturnValue.Value, CultureInfo.CurrentCulture); + } + else + { + retVal = InternalTestHooks.TestStopComputerResults; + } - int retVal = Convert.ToInt32(result.ReturnValue.Value, CultureInfo.CurrentCulture); if (retVal != 0) { var ex = new Win32Exception(retVal); @@ -6935,15 +2232,6 @@ internal static string ValidateComputerName( } #endregion Helper -#region Internal Enums - - internal enum TransportProtocol - { - DCOM = 1, - WSMan = 2 - } - -#endregion }//End namespace #endif diff --git a/src/Microsoft.PowerShell.Commands.Management/resources/ComputerResources.resx b/src/Microsoft.PowerShell.Commands.Management/resources/ComputerResources.resx index f295fed1f2e..87bc01c6da2 100644 --- a/src/Microsoft.PowerShell.Commands.Management/resources/ComputerResources.resx +++ b/src/Microsoft.PowerShell.Commands.Management/resources/ComputerResources.resx @@ -357,18 +357,6 @@ The computer {0} is skipped. Fail to retrieve its LastBootUpTime via the WMI service with the following error message: {1}. - - Parameter WsmanAuthentication should not be specified when the DCOM protocol is in use. {0} - - - Parameters DcomAuthentication and Impersonation should not be specified when the WSMan protocol is in use. {0} - - - Parameter WsmanAuthentication should not be specified with DcomAuthentication and Impersonation at the same time. {0} - - - Parameter WsmanAuthentication is valid only if the WSMan protocol is used. Parameters DcomAuthentication (Authentication) and Impersonation are valid only if the DCOM protocol is used. - Cannot verify the secure channel for the local computer. Operation failed with the following exception: {0}. @@ -396,24 +384,6 @@ Cannot validate the time interval for restore point creation. It failed to retrieve the last restore point with the following error message: {0}. - - Parameter WsmanAuthentication cannot be specified with the DCOM protocol. Parameter WSManAuthentication is valid only when the WSMan protocol is used. - - - Parameters DcomAuthentication and Impersonation cannot be specified with the WSMan protocol. {0} - - - Parameter WsmanAuthentication is valid only when the WSMan protocol is used. Parameters DcomAuthentication and Impersonation are valid only when the DCOM protocol is used. - - - Parameter WsmanAuthentication cannot be specified with DcomAuthentication or Impersonation parameters. {0} - - - Parameter WsmanAuthentication cannot be specified with the DCOM protocol. {0} - - - DcomAuthentication is not supported. Please use WsmanAuthentication instead. - The AsJob Parameter Set is not supported. diff --git a/src/Modules/Windows-Core/Microsoft.PowerShell.Management/Microsoft.PowerShell.Management.psd1 b/src/Modules/Windows-Core/Microsoft.PowerShell.Management/Microsoft.PowerShell.Management.psd1 index 3c74eb69c06..4c48be5e2a8 100644 --- a/src/Modules/Windows-Core/Microsoft.PowerShell.Management/Microsoft.PowerShell.Management.psd1 +++ b/src/Modules/Windows-Core/Microsoft.PowerShell.Management/Microsoft.PowerShell.Management.psd1 @@ -59,7 +59,6 @@ CmdletsToExport=@("Add-Content", "Remove-Service", "Set-Content", "Set-ItemProperty", - "Test-Connection", "Restart-Computer", "Stop-Computer", "Rename-Computer", diff --git a/src/System.Management.Automation/engine/Utils.cs b/src/System.Management.Automation/engine/Utils.cs index a408a7377fa..11798694ea0 100644 --- a/src/System.Management.Automation/engine/Utils.cs +++ b/src/System.Management.Automation/engine/Utils.cs @@ -1416,6 +1416,14 @@ public static class InternalTestHooks internal static bool UseDebugAmsiImplementation; internal static bool BypassAppLockerPolicyCaching; internal static bool BypassOnlineHelpRetrieval; + + // Stop/Restart/Rename Computer tests + internal static bool TestStopComputer; + internal static bool TestWaitStopComputer; + internal static bool TestRenameComputer; + internal static int TestStopComputerResults; + internal static int TestRenameComputerResults; + // It's useful to test that we don't depend on the ScriptBlock and AST objects and can use a re-parsed version. internal static bool IgnoreScriptBlockCache; // Simulate 'System.Diagnostics.Stopwatch.IsHighResolution is false' to test Get-Uptime throw @@ -1423,7 +1431,7 @@ public static class InternalTestHooks internal static bool DisableGACLoading; /// This member is used for internal test purposes. - public static void SetTestHook(string property, bool value) + public static void SetTestHook(string property, object value) { var fieldInfo = typeof(InternalTestHooks).GetField(property, BindingFlags.Static | BindingFlags.NonPublic); if (fieldInfo != null) diff --git a/test/powershell/Modules/Microsoft.PowerShell.Management/Rename-Computer.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Management/Rename-Computer.Tests.ps1 new file mode 100644 index 00000000000..91d167a43cc --- /dev/null +++ b/test/powershell/Modules/Microsoft.PowerShell.Management/Rename-Computer.Tests.ps1 @@ -0,0 +1,79 @@ +$RenameTesthook = "TestRenameComputer" +$RenameResultName = "TestRenameComputerResults" +$DefaultResultValue = 0 + +try +{ + # set up for testing + $PSDefaultParameterValues["it:skip"] = ! $IsWindows + Enable-Testhook -testhookName $RenameTesthook + # we also set TestStopComputer + Enable-Testhook -testhookName TestStopComputer + + # TEST START HERE + Describe "Rename-Computer" -Tag Feature { + # if we throw in BeforeEach, the test will fail and the stop will not be called + BeforeEach { + if ( ! (Test-TesthookIsSet -testhookName $RenameTesthook) ) { + throw "Testhook '${TesthookName}' is not set" + } + } + + AfterEach { + Set-TesthookResult -testhookName $RenameResultName -value $defaultResultValue + } + + It "Should rename the local computer" { + Set-TesthookResult -testhookName $RenameResultName -value $defaultResultValue + $newname = "mynewname" + $result = Rename-Computer -ErrorAction Stop -ComputerName . -NewName "$newname" -Pass -WarningAction SilentlyContinue + $result.HasSucceeded | should be $true + $result.NewComputerName | should be $newname + } + + # we can't really look for the string "reboot" as it will change + # when translated. We are guaranteed that the old computer name will + # be present, so we'll look for that + It "Should produce a reboot warning when renaming computer" { + Set-TesthookResult -testhookName $RenameResultName -value $defaultResultValue + $newname = "mynewname" + $result = Rename-Computer -ErrorAction Stop -ComputerName . -NewName "$newname" -Pass -WarningAction SilentlyContinue -WarningVariable WarnVar + $WarnVar.Message | should match $result.OldComputerName + } + + It "Should not produce a reboot warning when renaming a computer with the reboot flag" { + Set-TesthookResult -testhookName $RenameResultName -value $defaultResultValue + $newname = "mynewname" + $result = Rename-Computer -ErrorAction Stop -ComputerName . -NewName "$newname" -Pass -WarningAction SilentlyContinue -WarningVariable WarnVar -Restart + $result.HasSucceeded | should be $true + $result.NewComputerName | should be $newname + $WarnVar | should BeNullOrEmpty + } + + + Context "Rename-Computer Error Conditions" { + $testcases = + @{ OldName = "." ; NewName = "localhost" ; ExpectedError = "FailToRenameComputer,Microsoft.PowerShell.Commands.RenameComputerCommand" }, + @{ OldName = "." ; NewName = "." ; ExpectedError = "InvalidNewName,Microsoft.PowerShell.Commands.RenameComputerCommand" }, + @{ OldName = "." ; NewName = "::1" ; ExpectedError = "InvalidNewName,Microsoft.PowerShell.Commands.RenameComputerCommand" }, + @{ OldName = "." ; NewName = "127.0.0.1" ; ExpectedError = "InvalidNewName,Microsoft.PowerShell.Commands.RenameComputerCommand" }, + @{ OldName = "." ; NewName = ${env:ComputerName} ; ExpectedError = "NewNameIsOldName,Microsoft.PowerShell.Commands.RenameComputerCommand" }, + @{ OldName = "." ; NewName = ${env:ComputerName} + "." + ${env:USERDNSDOMAIN} ; ExpectedError = "InvalidNewName,Microsoft.PowerShell.Commands.RenameComputerCommand" }, + @{ OldName = ".\$#" ; NewName = "NewName"; ExpectedError = "AddressResolutionException,Microsoft.PowerShell.Commands.RenameComputerCommand" } + + It "Renaming '' to '' creates the right error" -testcase $testcases { + param ( $OldName, $NewName, $ExpectedError ) + Set-TesthookResult -testhookName $RenameResultName -value 0x1 + { Rename-Computer -ComputerName $OldName -NewName $NewName -ErrorAction Stop } | ShouldBeErrorId $ExpectedError + } + } + } + +} +finally +{ + $PSDefaultParameterValues.Remove("it:skip") + Disable-Testhook -testhookName $RenameTestHook + Disable-Testhook -testhookName TestStopComputer + Set-TesthookResult -testhookName $RenameResultName -value 0 +} diff --git a/test/powershell/Modules/Microsoft.PowerShell.Management/Restart-Computer.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Management/Restart-Computer.Tests.ps1 new file mode 100644 index 00000000000..44006051777 --- /dev/null +++ b/test/powershell/Modules/Microsoft.PowerShell.Management/Restart-Computer.Tests.ps1 @@ -0,0 +1,99 @@ +# the testhook for restart-computer is the same as for stop-computer +$restartTesthookName = "TestStopComputer" +$restartTesthookResultName = "TestStopComputerResults" +$DefaultResultValue = 0 + +try +{ + # set up for testing + $PSDefaultParameterValues["it:skip"] = ! $IsWindows + Enable-Testhook -testhookName $restartTesthookName + + Describe "Restart-Computer" -Tag Feature { + # if we throw in BeforeEach, the test will fail and the restart will not be called + BeforeEach { + if ( ! (Test-TesthookIsSet -testhookName $restartTesthookName) ) { + throw "Testhook '${restartTesthookName}' is not set" + } + } + + AfterEach { + Set-TesthookResult -testhookName $restartTesthookResultName -value $defaultResultValue + } + + It "Should restart the local computer" { + Set-TesthookResult -testhookName $restartTesthookResultName -value $defaultResultValue + Restart-Computer -ErrorAction Stop| Should BeNullOrEmpty + } + + It "Should support -computer parameter" { + Set-TesthookResult -testhookName $restartTesthookResultName -value $defaultResultValue + $computerNames = "localhost","${env:COMPUTERNAME}" + Restart-Computer -Computer $computerNames -ErrorAction Stop| Should BeNullOrEmpty + } + + It "Should support WsmanAuthentication types" { + $authChoices = "Default","Basic","Negotiate","CredSSP","Digest","Kerberos" + foreach ( $auth in $authChoices ) { + Restart-Computer -WsmanAuthentication $auth | Should BeNullOrEmpty + } + } + + # this requires setting a test hook, so we wrap the execution with try/finally of the + # set operation. Internally, we want to suppress the progress, so + # that is also wrapped in try/finally + It "Should wait for a remote system" { + try + { + Enable-Testhook -testhookname TestWaitStopComputer + $timeout = 3 + try + { + $pPref = $ProgressPreference + $ProgressPreference="SilentlyContinue" + $duration = Measure-Command { + Restart-Computer -computer localhost -Wait -Timeout $timeout -ErrorAction stop | Should BeNullOrEmpty + } + } + finally + { + $ProgressPreference=$pPref + } + $duration.TotalSeconds | Should BeGreaterThan $timeout + } + finally + { + Disable-Testhook -testhookname TestWaitStopComputer + } + } + + Context "Restart-Computer Error Conditions" { + It "Should return the proper error when it occurs" { + Set-TesthookResult -testhookName $restartTesthookResultName -value 0x300000 + Restart-Computer -ErrorVariable RestartError 2>$null + $RestartError.Exception.Message | Should match 0x300000 + } + + It "Should produce an error when 'Delay' is specified" { + { Restart-Computer -Delay 30 } | ShouldBeErrorId "RestartComputerInvalidParameter,Microsoft.PowerShell.Commands.RestartComputerCommand" + } + + It "Should not support timeout on localhost" { + Set-TesthookResult -testhookName $restartTesthookResultName -value $defaultResultValue + { Restart-Computer -timeout 3 -ErrorAction Stop } | ShouldBeErrorId "RestartComputerInvalidParameter,Microsoft.PowerShell.Commands.RestartComputerCommand" + } + + It "Should not support timeout on localhost" { + Set-TesthookResult -testhookName $restartTesthookResultName -value $defaultResultValue + { Restart-Computer -timeout 3 -ErrorAction Stop } | ShouldBeErrorId "RestartComputerInvalidParameter,Microsoft.PowerShell.Commands.RestartComputerCommand" + } + } + } + +} +finally +{ + $PSDefaultParameterValues.Remove("it:skip") + Disable-Testhook -testhookName $restartTesthookName + Set-TesthookResult -testhookName $restartTesthookResultName -value 0 +} diff --git a/test/powershell/Modules/Microsoft.PowerShell.Management/Stop-Computer.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Management/Stop-Computer.Tests.ps1 new file mode 100644 index 00000000000..5b9136337c1 --- /dev/null +++ b/test/powershell/Modules/Microsoft.PowerShell.Management/Stop-Computer.Tests.ps1 @@ -0,0 +1,58 @@ +# note these will manipulate private data in the PowerShell engine which will +# enable us to not actually stop the system, but return right before we do +$stopTesthook = "TestStopComputer" +$stopTesthookResultName = "TestStopComputerResults" +$DefaultResultValue = 0 + +try +{ + # set up for testing + $PSDefaultParameterValues["it:skip"] = ! $IsWindows + Enable-Testhook -testhookName $stopTesthook + + Describe "Stop-Computer" -Tag Feature { + # if we throw in BeforeEach, the test will fail and the stop will not be called + BeforeEach { + if ( ! (Test-TesthookIsSet -testhookName $stopTesthook) ) { + throw "Testhook '${stopTesthook}' is not set" + } + } + + AfterEach { + Set-TesthookResult -testhookName $stopTesthookResultName -Value $defaultResultValue + } + + It "Should stop the local computer" { + Set-TesthookResult -testhookName $stopTesthookResultName -Value $defaultResultValue + Stop-Computer -ErrorAction Stop| Should BeNullOrEmpty + } + + It "Should support -Computer parameter" { + Set-TesthookResult -testhookName $stopTesthookResultName -Value $defaultResultValue + $computerNames = "localhost","${env:COMPUTERNAME}" + Stop-Computer -Computer $computerNames -ErrorAction Stop| Should BeNullOrEmpty + } + + It "Should support WsmanAuthentication types" { + $authChoices = "Default","Basic","Negotiate","CredSSP","Digest","Kerberos" + foreach ( $auth in $authChoices ) { + Stop-Computer -WsmanAuthentication $auth | Should BeNullOrEmpty + } + } + + Context "Stop-Computer Error Conditions" { + It "Should return the proper error when it occurs" { + Set-TesthookResult -testhookName $stopTesthookResultName -Value 0x300000 + Stop-Computer -ErrorVariable StopError 2>$null + $StopError.Exception.Message | Should match 0x300000 + } + } + } + +} +finally +{ + $PSDefaultParameterValues.Remove("it:skip") + Disable-Testhook -testhookName $stopTesthook + Set-TesthookResult -testhookName $stopTesthookResultName -Value $DefaultResultValue +} diff --git a/test/powershell/Modules/Microsoft.PowerShell.Management/Test-Connection.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Management/Test-Connection.Tests.ps1 deleted file mode 100644 index 370c6c90f89..00000000000 --- a/test/powershell/Modules/Microsoft.PowerShell.Management/Test-Connection.Tests.ps1 +++ /dev/null @@ -1,39 +0,0 @@ -Describe "Test-Connection" -Tags "CI" { - BeforeAll { - $originalDefaultParameterValues = $PSDefaultParameterValues.Clone() - if ( ! $IsWindows ) - { - $PSDefaultParameterValues["it:skip"] = $true - } - else - { - $countCases = @( - @{count = 2} - @{count = 3} - ) - - $quietTests = @( - @{computerName = 'localhost'; message = 'online' ; result = $true} - @{computerName = '_fake_computer_namex'; message = 'offline' ; result = $false} - ) - } - } - AfterAll { - $global:PSDefaultParameterValues = $originalDefaultParameterValues - } - It "Gets the right IP Address" { - $localHost = Test-Connection -ComputerName localhost -Count 1 - $localHost.IPV4Address | Should Be '127.0.0.1' - $localhost.IPV6Address | Should Be '::1' - } - - It "The count parameter counting to " -TestCases $countCases { - param($count) - (Test-Connection -ComputerName localhost -Count $count).Count | Should Be $count - } - - It "The quiet parameter on a computer" -TestCases $quietTests { - param($computername, $result) - Test-Connection -ComputerName $computername -Count 1 -Quiet | Should Be $result - } -} diff --git a/test/powershell/Modules/Microsoft.PowerShell.Management/Unimplemented-Cmdlet.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Management/Unimplemented-Cmdlet.Tests.ps1 index 09a88ae71c6..9f4c7f58415 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Management/Unimplemented-Cmdlet.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Management/Unimplemented-Cmdlet.Tests.ps1 @@ -16,8 +16,6 @@ Describe "Unimplemented Management Cmdlet Tests" -Tags "CI" { "Get-ComputerInfo", - "Test-Connection", - "Set-TimeZone" ) diff --git a/test/powershell/engine/Basic/DefaultCommands.Tests.ps1 b/test/powershell/engine/Basic/DefaultCommands.Tests.ps1 index 4a9e837cc28..d0edc2aefe9 100644 --- a/test/powershell/engine/Basic/DefaultCommands.Tests.ps1 +++ b/test/powershell/engine/Basic/DefaultCommands.Tests.ps1 @@ -435,7 +435,6 @@ Describe "Verify approved aliases list" -Tags "CI" { "Cmdlet", "Suspend-Service", , $($FullCLR -or $CoreWindows ) "Cmdlet", "Tee-Object", , $($FullCLR -or $CoreWindows -or $CoreUnix) "Cmdlet", "Test-ComputerSecureChannel", , $($FullCLR ) -"Cmdlet", "Test-Connection", , $($FullCLR -or $CoreWindows ) "Cmdlet", "Test-FileCatalog", , $($FullCLR -or $CoreWindows ) "Cmdlet", "Test-ModuleManifest", , $($FullCLR -or $CoreWindows -or $CoreUnix) "Cmdlet", "Test-Path", , $($FullCLR -or $CoreWindows -or $CoreUnix) diff --git a/test/tools/Modules/HelpersCommon/HelpersCommon.psd1 b/test/tools/Modules/HelpersCommon/HelpersCommon.psd1 index c376c03d376..c9e3c61872d 100644 --- a/test/tools/Modules/HelpersCommon/HelpersCommon.psd1 +++ b/test/tools/Modules/HelpersCommon/HelpersCommon.psd1 @@ -16,5 +16,5 @@ Copyright = 'Copyright (c) Microsoft Corporation. All rights reserved.' Description = 'Temporary module contains functions for using in tests' -FunctionsToExport = 'Wait-UntilTrue', 'Test-IsElevated', 'ShouldBeErrorId', 'Wait-FileToBePresent', 'Get-RandomFileName' +FunctionsToExport = 'Wait-UntilTrue', 'Test-IsElevated', 'ShouldBeErrorId', 'Wait-FileToBePresent', 'Get-RandomFileName', 'Enable-Testhook', 'Disable-Testhook', 'Set-TesthookResult', 'Test-TesthookIsSet' } diff --git a/test/tools/Modules/HelpersCommon/HelpersCommon.psm1 b/test/tools/Modules/HelpersCommon/HelpersCommon.psm1 index c9619618ccf..17ac9e6a211 100644 --- a/test/tools/Modules/HelpersCommon/HelpersCommon.psm1 +++ b/test/tools/Modules/HelpersCommon/HelpersCommon.psm1 @@ -82,3 +82,58 @@ function Get-RandomFileName { [System.IO.Path]::GetFileNameWithoutExtension([IO.Path]::GetRandomFileName()) } + +# +# Testhook setting functions +# note these manipulate private data in the PowerShell engine which will +# enable us to not actually alter the system or mock returned data +# +$SCRIPT:TesthookType = [system.management.automation.internal.internaltesthooks] +function Test-TesthookIsSet +{ + param ( + [ValidateNotNullOrEmpty()] + [Parameter(Mandatory=$true)] + $testhookName + ) + try { + return ${Script:TesthookType}.GetField($testhookName, "NonPublic,Static").GetValue($null) + } + catch { + # fall through + } + return $false +} + +function Enable-Testhook +{ + param ( + [ValidateNotNullOrEmpty()] + [Parameter(Mandatory=$true)] + $testhookName + ) + ${Script:TesthookType}::SetTestHook($testhookName, $true) +} + +function Disable-Testhook +{ + param ( + [ValidateNotNullOrEmpty()] + [Parameter(Mandatory=$true)] + $testhookName + ) + ${Script:TesthookType}::SetTestHook($testhookName, $false) +} + +function Set-TesthookResult +{ + param ( + [ValidateNotNullOrEmpty()] + [Parameter(Mandatory=$true)] + $testhookName, + [ValidateNotNullOrEmpty()] + [Parameter(Mandatory=$true)] + $value + ) + ${Script:TesthookType}::SetTestHook($testhookName, $value) +} From c75357b192c5eb8e06abcda6db594de33b2ad6ea Mon Sep 17 00:00:00 2001 From: Jason Shirk Date: Wed, 1 Nov 2017 13:32:43 -0700 Subject: [PATCH 071/617] Minor perf tweaks (#5289) * Avoid creating scriptblocks unnecessarily in PSScriptProperty * Use string.IsNullOrWhiteSpace instead of Trim().Length --- .../commands/management/WebServiceProxy.cs | 2 +- src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHost.cs | 2 +- src/System.Management.Automation/engine/ErrorPackage.cs | 2 +- .../engine/InitialSessionState.cs | 4 ++-- src/System.Management.Automation/engine/MshMemberInfo.cs | 4 ++-- .../engine/hostifaces/Parameter.cs | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/WebServiceProxy.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/WebServiceProxy.cs index e1ee08b2fbb..7ddb52ec825 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/WebServiceProxy.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/WebServiceProxy.cs @@ -150,7 +150,7 @@ public SwitchParameter UseDefaultCredential /// protected override void BeginProcessing() { - if (_uri.ToString().Trim().Length == 0) + if (string.IsNullOrWhiteSpace(_uri.ToString())) { Exception ex = new ArgumentException(WebServiceResources.InvalidUri); ErrorRecord er = new ErrorRecord(ex, "ArgumentException", ErrorCategory.InvalidOperation, null); diff --git a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHost.cs b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHost.cs index 5a4c3768b29..ae01316a89b 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHost.cs +++ b/src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHost.cs @@ -2434,7 +2434,7 @@ internal void Run(bool inputLoopIsNested) continue; } - if (line.Trim().Length == 0) + if (string.IsNullOrWhiteSpace(line)) { if (inBlockMode) { diff --git a/src/System.Management.Automation/engine/ErrorPackage.cs b/src/System.Management.Automation/engine/ErrorPackage.cs index 1086e842668..44c275e6886 100644 --- a/src/System.Management.Automation/engine/ErrorPackage.cs +++ b/src/System.Management.Automation/engine/ErrorPackage.cs @@ -901,7 +901,7 @@ private string BuildMessage( string resourceId, params object[] args) { - if (String.IsNullOrEmpty(template) || 1 >= template.Trim().Length) + if (string.IsNullOrWhiteSpace(template)) { _textLookupError = PSTraceSource.NewInvalidOperationException( ErrorPackage.ErrorDetailsEmptyTemplate, diff --git a/src/System.Management.Automation/engine/InitialSessionState.cs b/src/System.Management.Automation/engine/InitialSessionState.cs index 6b57a8318de..e1743936035 100644 --- a/src/System.Management.Automation/engine/InitialSessionState.cs +++ b/src/System.Management.Automation/engine/InitialSessionState.cs @@ -195,7 +195,7 @@ public sealed class SessionStateTypeEntry : InitialSessionStateEntry public SessionStateTypeEntry(string fileName) : base(fileName) { - if (String.IsNullOrEmpty(fileName) || fileName.Trim().Length == 0) + if (string.IsNullOrWhiteSpace(fileName)) { throw PSTraceSource.NewArgumentException("fileName"); } @@ -300,7 +300,7 @@ public sealed class SessionStateFormatEntry : InitialSessionStateEntry public SessionStateFormatEntry(string fileName) : base("*") { - if (String.IsNullOrEmpty(fileName) || fileName.Trim().Length == 0) + if (string.IsNullOrWhiteSpace(fileName)) { throw PSTraceSource.NewArgumentException("fileName"); } diff --git a/src/System.Management.Automation/engine/MshMemberInfo.cs b/src/System.Management.Automation/engine/MshMemberInfo.cs index eb32b76fbe5..aeee875090e 100644 --- a/src/System.Management.Automation/engine/MshMemberInfo.cs +++ b/src/System.Management.Automation/engine/MshMemberInfo.cs @@ -1782,7 +1782,7 @@ public override bool IsSettable { get { - return this.SetterScript != null; + return this._setterScript != null || this._setterScriptText != null; } } @@ -1793,7 +1793,7 @@ public override bool IsGettable { get { - return this.GetterScript != null; + return this._getterScript != null || this._getterScriptText != null; } } diff --git a/src/System.Management.Automation/engine/hostifaces/Parameter.cs b/src/System.Management.Automation/engine/hostifaces/Parameter.cs index 9818cb5ac19..b87e14f8bc3 100644 --- a/src/System.Management.Automation/engine/hostifaces/Parameter.cs +++ b/src/System.Management.Automation/engine/hostifaces/Parameter.cs @@ -49,7 +49,7 @@ public CommandParameter(string name, object value) { if (name != null) { - if (name.Trim().Length == 0) + if (string.IsNullOrWhiteSpace(name)) { throw PSTraceSource.NewArgumentException("name"); } @@ -105,7 +105,7 @@ internal static CommandParameter FromCommandParameterInternal(CommandParameterIn Diagnostics.Assert(name != null, "'name' variable should be initialized at this point"); Diagnostics.Assert(name[0].IsDash(), "first character in parameter name must be a dash"); - Diagnostics.Assert(name.Trim().Length != 0, "Parameter name has to have some non-whitespace characters in it"); + Diagnostics.Assert(name.Trim().Length != 1, "Parameter name has to have some non-whitespace characters in it"); } if (internalParameter.ParameterAndArgumentSpecified) From 57f3c854692765748849c6cdf8e23e2ac8365a95 Mon Sep 17 00:00:00 2001 From: Mark Kraus Date: Wed, 1 Nov 2017 16:06:30 -0500 Subject: [PATCH 072/617] Add Multiple Link Header Support (#5265) --- .../CoreCLR/WebRequestPSCmdlet.CoreClr.cs | 19 +++++++++++-------- .../WebCmdlets.Tests.ps1 | 18 ++++++++++++++++++ 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebRequestPSCmdlet.CoreClr.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebRequestPSCmdlet.CoreClr.cs index 7dbe3146166..f5322ddc129 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebRequestPSCmdlet.CoreClr.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebRequestPSCmdlet.CoreClr.cs @@ -847,17 +847,20 @@ internal void ParseLinkHeader(HttpResponseMessage response, System.Uri requestUr IEnumerable links; if (response.Headers.TryGetValues("Link", out links)) { - foreach(string link in links.FirstOrDefault().Split(",")) + foreach (string linkHeader in links) { - Match match = Regex.Match(link, pattern); - if (match.Success) + foreach (string link in linkHeader.Split(",")) { - string url = match.Groups["url"].Value; - string rel = match.Groups["rel"].Value; - if (url != String.Empty && rel != String.Empty && !_relationLink.ContainsKey(rel)) + Match match = Regex.Match(link, pattern); + if (match.Success) { - Uri absoluteUri = new Uri(requestUri, url); - _relationLink.Add(rel, absoluteUri.AbsoluteUri.ToString()); + string url = match.Groups["url"].Value; + string rel = match.Groups["rel"].Value; + if (url != String.Empty && rel != String.Empty && !_relationLink.ContainsKey(rel)) + { + Uri absoluteUri = new Uri(requestUri, url); + _relationLink.Add(rel, absoluteUri.AbsoluteUri.ToString()); + } } } } diff --git a/test/powershell/Modules/Microsoft.PowerShell.Utility/WebCmdlets.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Utility/WebCmdlets.Tests.ps1 index 43e072bd25d..8dc1b1aaaef 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Utility/WebCmdlets.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Utility/WebCmdlets.Tests.ps1 @@ -803,6 +803,24 @@ Describe "Invoke-WebRequest tests" -Tags "Feature" { $result.Output.RelationLink["last"] | Should BeExactly "http://localhost:8080/PowerShell?test=linkheader&maxlinks=5&linknumber=5" } + # Test pending support for multiple header capable server on Linux/macOS see issue #4639 + It "Validate Invoke-WebRequest returns valid RelationLink property with absolute uris if Multiple Link Headers are present" -Pending:$(!$IsWindows){ + $headers = @{ + Link = + '; rel="self"', + '; rel="next"', + '; rel="last"' + } | ConvertTo-Json -Compress + $headers = [uri]::EscapeDataString($headers) + $uri = "http://localhost:8080/PowerShell?test=response&contenttype=text/plain&output=OK&headers=$headers" + $command = "Invoke-WebRequest -Uri '$uri'" + $result = ExecuteWebCommand -command $command + $result.Output.RelationLink.Count | Should BeExactly 3 + $result.Output.RelationLink["self"] | Should BeExactly "http://localhost:8080/PowerShell?test=linkheader&maxlinks=5&linknumber=1" + $result.Output.RelationLink["next"] | Should BeExactly "http://localhost:8080/PowerShell?test=linkheader&maxlinks=5&linknumber=2" + $result.Output.RelationLink["last"] | Should BeExactly "http://localhost:8080/PowerShell?test=linkheader&maxlinks=5&linknumber=5" + } + It "Validate Invoke-WebRequest quietly ignores invalid Link Headers in RelationLink property: " -TestCases @( @{ type = "noUrl" } @{ type = "malformed" } From beef5bc84ad36d48d616e799b8ac5b9b8889db2b Mon Sep 17 00:00:00 2001 From: Steve Lee Date: Wed, 1 Nov 2017 14:12:39 -0700 Subject: [PATCH 073/617] set requestedExecutionLevel to asInvoker for pwsh.exe on Windows (#5285) --- build.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.psm1 b/build.psm1 index 435fe63bbb1..99e00c228cb 100644 --- a/build.psm1 +++ b/build.psm1 @@ -1879,7 +1879,7 @@ function New-MSIPackage Start-NativeExecution { & "~/.rcedit/rcedit-x64.exe" (Get-PSOutput) --set-icon "$AssetsPath\Powershell_black.ico" ` --set-file-version $ProductVersion --set-product-version $ProductVersion --set-version-string "ProductName" "PowerShell Core 6" ` - --set-version-string "LegalCopyright" "(C) Microsoft Corporation. All Rights Reserved." } | Write-Verbose + --set-requested-execution-level "asInvoker" --set-version-string "LegalCopyright" "(C) Microsoft Corporation. All Rights Reserved." } | Write-Verbose ## AppVeyor base image might update the version for Wix. Hence, we should ## not hard code version numbers. From 9c75cea9ff8bcc3f43dd46913b03168a5fc88f48 Mon Sep 17 00:00:00 2001 From: Travis Plunk Date: Wed, 1 Nov 2017 14:35:58 -0700 Subject: [PATCH 074/617] use context rules instead of file or file and context rules because path to file can vary. (#5297) --- tools/terms/PowerShell-Terms-Rules.mdb | Bin 393216 -> 393216 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/tools/terms/PowerShell-Terms-Rules.mdb b/tools/terms/PowerShell-Terms-Rules.mdb index b9dd40cf6f0ea06047ab1a759978264fc816098d..91251e061a9631228c0ea45eeab417a2a3ed398c 100644 GIT binary patch delta 22387 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 delta 8438 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 From 532044f27ae42f2c4cf3fb178b4f88bbf126e5c1 Mon Sep 17 00:00:00 2001 From: Dongbo Wang Date: Wed, 1 Nov 2017 15:55:46 -0700 Subject: [PATCH 075/617] Add documentation about how to create libpsl and psrp.windows packages (#5278) - Add document about creating libpsl and psrp.windows nuget packages - Clean up and update the existing building docs. --- .spelling | 4 + docs/building/internals.md | 117 +++++++++++++++++++++++- docs/building/linux.md | 106 +++------------------ docs/building/macos.md | 8 +- docs/building/windows-core.md | 46 ++++------ test/common/markdown/markdown.tests.ps1 | 1 + 6 files changed, 149 insertions(+), 133 deletions(-) diff --git a/.spelling b/.spelling index 6ad047837fd..3926b6f90e3 100644 --- a/.spelling +++ b/.spelling @@ -490,8 +490,12 @@ nanoserver-insider-powershell #region docs/building/internals.md Overrides - docs/building/internals.md Catalog +flavor +libpsl MSBuild +plugin powershell-unix +psrp.windows src #endregion diff --git a/docs/building/internals.md b/docs/building/internals.md index c05e267cffe..8c80654e89c 100644 --- a/docs/building/internals.md +++ b/docs/building/internals.md @@ -44,11 +44,10 @@ dotnet run Running the program does everything else: -- for each project, given a `resources` folder - - creates a `gen` folder - - for each `*.resx` file - - fills in a strongly typed C# class - - writes it out to the corresponding `*.cs` file +- For each project, given a `resources` folder, create a `gen` folder. +- For each `*.resx` file from the `resources` folder, + fill in a strongly typed C# class, + and write it out to the corresponding `*.cs` file in the `gen` folder. These files are *not* automatically updated on each build, as the project lacks the ability to detect changes. @@ -97,3 +96,111 @@ which generates a source file `CorePsTypeCatalog.cs` for the `Microsoft.PowerShe The error `The name 'InitializeTypeCatalog' does not exist in the current context` indicates that the `CorePsTypeCatalog.cs` source file does not exist, so follow the steps to generate it. + +## Native Components + +On Windows, PowerShell Core depends on the WinRM plugin `pwrshplugin.dll` to enable remoting over WinRM. +On Linux/macOS, PowerShell Core depends on the binary `libpsl-native.so/libpsl-native.dylib` to provide some necessary supports. + +Building those native components requires setting up additional dependencies, +which could be a burden to those who don't seek to make changes to the native components. +At the meantime, the native component code seldom changes, +so it doesn't make sense to always build them with `Start-PSBuild`. +Therefore, we decided to wrap the native components into NuGet packages, +so that we only need to build them once when changes are made, +and then reuse the produced binaries for many builds subsequently. + +The NuGet package for `pwrshplugin.dll` is `psrp.windows`, +and the NuGet package for `libpsl-native` is `libpsl`. + +### psrp.windows + +To build `pwrshplugin.dll`, you need to install Visual Studio 2015 and run `Start-PSBootstrap -BuildWindowsNative` to install the prerequisites. +Then run `Start-BuildNativeWindowsBinaries` to build the binary. +For example, the following builds the release flavor of the binary targeting x64 architecture. + +```powershell +Start-BuildNativeWindowsBinaries -Configuration Release -Arch x64 +``` + +After that, the binary `pwrshplugin.dll` and its PDB file will be placed under 'src/powershell-win-core'. +The script file `Install-PowerShellRemoting.ps1` will also be placed in the same folder, +which is supposed to be used to set up remoting configurations for PowerShell Core. + +To create a new NuGet package for `pwrshplugin.dll`, first you need to get the `psrp.windows.nuspec` from an existing `psrp.windows` package. +You can find it at `~/.nuget/packages/psrp.windows` on your windows machine if you have recently built PowerShell on it. +Or you can download the existing package from [powershell-core feed](https://powershell.myget.org/feed/powershell-core/package/nuget/psrp.windows). +Once you get `psrp.windows.nuspec`, copy it to an empty folder. + +Then you need to build `pwrshplugin.dll` targeting both `win-x64` and `win-x86` on Windows 10. +After building successfully, copy the produced files to the same folder, +and create the same layout of files as in the existing package. +The layout of files should look like this: + +```none ++---contentFiles +| \---any +| \---any +| Install-PowerShellRemoting.ps1 +| +\---runtimes + +---win-x64 + | \---native + | pwrshplugin.dll + | pwrshplugin.pdb + | + \---win-x86 + \---native + pwrshplugin.dll + pwrshplugin.pdb +``` + +Lastly, run `nuget pack .` from within the folder. Note that you may need the latest `nuget.exe`. + +### libpsl + +For `linux-arm`, you need to run `Start-PSBootstrap -BuildLinuxArm` to install additional prerequisites to build `libpsl-native`. +Note that currently you can build `linux-arm` only on a Ubuntu machine. + +For `linux-x64` and macOS, the initial run of `Start-PSBootstrap` would be enough -- no additional prerequisite required. + +After making sure the prerequisites are met, run `Start-BuildNativeUnixBinaries` to build the binary: + +```powershell +## Build targeting linux-x64 or macOS +Start-BuildNativeUnixBinaries + +## Build targeting linux-arm +Start-BuildNativeUnixBinaries -BuildLinuxArm +``` + +After the build succeeds, the binary `libpsl-native.so` (`libpsl-native.dylib` on macOS) will be placed under `src/powershell-unix`. + +To create a new NuGet package for `libpsl-native`, first you need to get the `libpsl.nuspec` from an existing `libpsl` package. +You can find it at `~/.nuget/packages/libpsl` on your Linux or macOS machine if you have recently built PowerShell on it. +Or you can download the existing package from [powershell-core feed](https://powershell.myget.org/feed/powershell-core/package/nuget/libpsl). +Once you get `psrp.windows.nuspec`, copy it to an empty folder on your Windows machine. + +Then you need to build three binaries of `libpsl-native` targeting `linux-x64`, `linux-arm` and `osx` respectively. +**Please note that, in order for the `linux-x64` binary `libpsl-native.so` to be portable to all other Linux distributions, +the `linux-x64` binary needs to be built on CentOS 7** +(.NET Core Linux native binaries are also built on CentOS 7 to ensure that they don't depend on newer `glibc`). + +After building successfully, copy those three binaries to the same folder, +and create the same layout of files as in the existing package. +The layout of files should look like this: + +```none +└── runtimes + ├── linux-arm + │   └── native + │   └── libpsl-native.so + ├── linux-x64 + │   └── native + │   └── libpsl-native.so + └── osx + └── native + └── libpsl-native.dylib +``` + +Lastly, run `nuget pack .` from within the folder. Note that you may need the latest `nuget.exe`. diff --git a/docs/building/linux.md b/docs/building/linux.md index ef449d7e4b2..9b8ebb8a2c7 100644 --- a/docs/building/linux.md +++ b/docs/building/linux.md @@ -1,17 +1,14 @@ -Build PowerShell on Linux -========================= +# Build PowerShell on Linux This guide will walk you through building PowerShell on Linux. We'll start by showing how to set up your environment from scratch. -Environment -=========== +## Environment These instructions are written assuming the Ubuntu 14.04 LTS, since that's the distro the team uses. The build module works on a best-effort basis for other distributions. -Git Setup ---------- +### Git Setup Using Git requires it to be set up correctly; refer to the [Working with the PowerShell Repository](../git/README.md), @@ -19,21 +16,10 @@ refer to the [Working with the PowerShell Repository](../git/README.md), **This guide assumes that you have recursively cloned the PowerShell repository and `cd`ed into it.** -Toolchain Setup ---------------- +### Toolchain Setup We use the [.NET Command-Line Interface][dotnet-cli] (`dotnet`) to build the managed components, and [CMake][] to build the native components. -Install the following packages for the toolchain: - -- `dotnet`: Must be installed from the `Start-PSBootstrap` module as described below. -- `cmake` -- `make` -- `g++` - -Unfortunately, the `apt-get` feed for `dotnet` has been deprecated, -and the latest version is only distributed in the form of three separate packages, -which require manual dependency resolution. Installing the toolchain is as easy as running `Start-PSBootstrap` in PowerShell. Of course, this requires a self-hosted copy of PowerShell on Linux. @@ -44,12 +30,12 @@ The `./tools/download.sh` script will also install the PowerShell package. In Bash: ```sh -./tools/download.sh +./tools/install-powershell.sh -powershell +pwsh ``` -You should now be in a `powershell` console host that is installed separately from any development copy you're about to build. +You should now be in a PowerShell console host that is installed. Just import our module, bootstrap the dependencies, and build! In PowerShell: @@ -64,94 +50,28 @@ The `Start-PSBootstrap` function does the following: - Adds the LLVM package feed - Installs our dependencies combined with the dependencies of the .NET CLI toolchain via `apt-get` - Uninstalls any prior versions of .NET CLI -- Downloads and installs the latest .NET Core SDK 1.0.1 to `~/.dotnet` +- Downloads and installs the .NET Core SDK 2.0.0 to `~/.dotnet` If you want to use `dotnet` outside of `Start-PSBuild`, add `~/.dotnet` to your `PATH` environment variable. [dotnet-cli]: https://github.com/dotnet/cli [CMake]: https://cmake.org/cmake/help/v2.8.12/cmake.html -.NET CLI --------- - -If you have any problems installing `dotnet`, please see their [documentation][cli-docs]. - -The version of .NET CLI is very important; the version we are currently using is `1.0.1`. - -Previous installations of DNX, `dnvm`, or older installations of .NET CLI can cause odd failures when running. -Please check your version and uninstall prior any prior versions. - -[cli-docs]: https://www.microsoft.com/net/core - -Build using our module -====================== +## Build using our module We maintain a [PowerShell module](../../build.psm1) with the function `Start-PSBuild` to build PowerShell. Since this is PowerShell code, it requires self-hosting. -If you have followed the toolchain setup section above, you should have `powershell` installed. - -> If you cannot or do not want to self-host, `Start-PSBuild` is just a -> convenience; you can execute each step of the build process yourself -> in Bash; see [Build manually](#build-manually) below. +If you have followed the toolchain setup section above, you should have PowerShell Core installed. ```powershell Import-Module ./build.psm1 Start-PSBuild ``` + Congratulations! If everything went right, PowerShell is now built. The `Start-PSBuild` script will output the location of the executable: -`./src/powershell-unix/bin/Linux/netcoreapp1.1/ubuntu.14.04-x64/powershell`. +`./src/powershell-unix/bin/Linux/netcoreapp2.0/linux-x64/publish/pwsh`. -You should now be running the `powershell` that you just built, if your run the above executable. +You should now be running the PowerShell Core that you just built, if your run the above executable. You can run our cross-platform Pester tests with `Start-PSPester`, and our xUnit tests with `Start-PSxUnit`. - -Build manually -============== - -The following goes into detail about what `Start-PSBuild` does. - -There are two preliminary steps that apply to all operating systems, -the [ResGen](internals.md#resgen) and [type catalog generation](internals.md#type-catalog), -documented in [internals of build process](internals.md#preliminary-steps). - -Build the native library ------------------------- - -The `libpsl-native.so` library consists of native functions that `CorePsPlatform.cs` P/Invokes. - -```sh -pushd src/libpsl-native -cmake -DCMAKE_BUILD_TYPE=Debug . -make -j -make test -popd -``` - -This library will be emitted in the `src/powershell-unix` project, -where `dotnet` consumes it as "content" and thus automatically deploys it. - -Build the managed projects --------------------------- - -The `powershell` project is the .NET Core PowerShell host. -It is the top level project, so `dotnet build` transitively builds all its dependencies, and emits a `powershell` executable. -The `--configuration Linux` flag is necessary to ensure that the preprocessor definition `LINUX` is defined (see [issue #673][]). - -```sh -dotnet restore -cd src/powershell-unix -dotnet build --configuration Linux -``` - -The executable will be in `./bin/[configuration]/[framework]/[rid]/publish/[binary name]`, -where our configuration is `Linux`, framework is `netcoreapp2.0`, -runtime identifier is `linux-x64`, and binary name is `powershell`. -The function `Get-PSOutput` will return the path to the executable; -thus you can execute the development copy via `& (Get-PSOutput)`. - -For deploying PowerShell, `dotnet publish` will emit a `publish` directory that contains a flat list of every dependency required for -PowerShell. -This can be copied to, for example, `/usr/local/share/powershell` or packaged. - -[issue #673]: https://github.com/PowerShell/PowerShell/issues/673 diff --git a/docs/building/macos.md b/docs/building/macos.md index 980c622548e..f4760018a0f 100644 --- a/docs/building/macos.md +++ b/docs/building/macos.md @@ -10,7 +10,7 @@ building on macOS is almost identical. You will want [Homebrew](http://brew.sh/), the missing package manager for macOS. Once installed, follow the same instructions to download and install a self-hosted copy of PowerShell on your macOS machine, -and use`Start-PSBootstrap` to install the dependencies. +and use `Start-PSBootstrap` to install the dependencies. The `Start-PSBootstrap` function does the following: @@ -34,9 +34,7 @@ We cannot do this for you in the build module due to #[847][]. ## Build using our module -Instead of installing the Ubuntu package of PowerShell, -download the `pkg` from our GitHub releases page using your browser, complete the wizard, -start a `powershell` session, and use `Start-PSBuild` from the module. +Start a PowerShell session by running `pwsh`, and then use `Start-PSBuild` from the module. After building, PowerShell will be at `./src/powershell-unix/bin/Linux/netcoreapp2.0/osx.10.12-x64/publish/powershell`. -Note that configuration is still `Linux` because it would be silly to make yet another separate configuration when it's used solely to work-around a CLI issue. +Note that configuration is still `Linux`. diff --git a/docs/building/windows-core.md b/docs/building/windows-core.md index 76c8ae583b8..a4fcdc5ad75 100644 --- a/docs/building/windows-core.md +++ b/docs/building/windows-core.md @@ -1,17 +1,14 @@ -Build PowerShell on Windows for .NET Core -========================================= +# Build PowerShell on Windows for .NET Core This guide will walk you through building PowerShell on Windows, targeting .NET Core. We'll start by showing how to set up your environment from scratch. -Environment -=========== +## Environment These instructions are tested on Windows 10 and Windows Server 2012 R2, though they should work anywhere the dependencies work. -Git Setup ---------- +### Git Setup Using Git requires it to be setup correctly; refer to the [README](../../README.md) and @@ -19,17 +16,15 @@ Using Git requires it to be setup correctly; refer to the This guide assumes that you have recursively cloned the PowerShell repository and `cd`ed into it. -Visual Studio ----------------- +### Visual Studio You will need to install an edition of Visual Studio 2015 (Community, Enterprise, or Professional) with the optional feature 'Common Tools for Visual C++' installed. The free Community edition of Visual Studio 2015 can be downloaded [here](https://www.visualstudio.com/visual-studio-community-vs/). -.NET CLI --------- +### .NET CLI We use the [.NET Command Line Interface][dotnet-cli] (`dotnet`) to build PowerShell. -The version we are currently using is `2.0.0-preview2-006502`. +The version we are currently using is `2.0.0`. The `Start-PSBootstrap` function will automatically install it and add it to your path: ```powershell @@ -37,26 +32,19 @@ Import-Module ./build.psm1 Start-PSBootstrap ``` -The `Start-PSBootstrap` function calls `Install-Dotnet`: +Or you can call `Install-Dotnet` directly: ```powershell -Install-Dotnet -Channel preview -Version 2.0.0-preview2-006502 -``` - -It removes the previously installed version of .NET CLI from `$env:LOCALAPPDATA\Microsoft\dotnet` and then does exactly this: - -```powershell -Invoke-WebRequest -Uri https://raw.githubusercontent.com/dotnet/cli/master/scripts/obtain/dotnet-install.ps1 -OutFile dotnet-install.ps1 -./dotnet-install.ps1 -Channel preview -Version 2.0.0-preview2-006502 +Install-Dotnet ``` +It removes the previously installed version of .NET CLI and install the version that PowerShell Core depends on. If you have any problems installing `dotnet`, please see their [documentation][cli-docs]. [dotnet-cli]: https://github.com/dotnet/cli [cli-docs]: https://www.microsoft.com/net/core#windowscmd -Build using our module -====================== +## Build using our module We maintain a [PowerShell module](../../build.psm1) with the function `Start-PSBuild` to build PowerShell. @@ -65,24 +53,22 @@ Import-Module ./build.psm1 Start-PSBuild ``` -Congratulations! If everything went right, PowerShell is now built and executable as `./src/powershell-win-core/bin/Debug/netcoreapp2.0/win10-x64/powershell`. +Congratulations! If everything went right, PowerShell is now built and executable as `./src/powershell-win-core/bin/Debug/netcoreapp2.0/win7-x64/publish/pwsh`. -This location is of the form `./[project]/bin/[configuration]/[framework]/[rid]/[binary name]`, +This location is of the form `./[project]/bin/[configuration]/[framework]/[rid]/publish/[binary name]`, and our project is `powershell`, configuration is `Debug` by default, -framework is `netcoreapp2.0`, runtime identifier is **probably** `win10-x64` -(but will depend on your operating system; -don't worry, `dotnet --info` will tell you what it was), and binary name is `powershell`. +framework is `netcoreapp2.0`, runtime identifier is `win7-x64` by default, +and binary name is `pwsh`. The function `Get-PSOutput` will return the path to the executable; thus you can execute the development copy via `& (Get-PSOutput)`. The `powershell` project is the .NET Core PowerShell host. It is the top level project, so `dotnet build` transitively builds all its dependencies, -and emits a `powershell` executable. +and emits a `pwsh` executable. The cross-platform host has built-in documentation via `--help`. You can run our cross-platform Pester tests with `Start-PSPester`. -Building in Visual Studio -------------------------- +## Building in Visual Studio We currently have the issue [#3400](https://github.com/PowerShell/PowerShell/issues/3400) tracking this task. diff --git a/test/common/markdown/markdown.tests.ps1 b/test/common/markdown/markdown.tests.ps1 index 2b9cedcd995..43a88444786 100644 --- a/test/common/markdown/markdown.tests.ps1 +++ b/test/common/markdown/markdown.tests.ps1 @@ -74,6 +74,7 @@ Describe 'Common Tests - Validate Markdown Files' -Tag 'CI' { $docsToTest = @( './*.md' './docs/*.md' + './docs/building/*.md' './docs/cmdlet-example/*.md' './docs/installation/*.md' './docs/maintainers/README.md' From 237ccbdf6dbfbe5a24064696d40059343d889934 Mon Sep 17 00:00:00 2001 From: Jason Shirk Date: Thu, 2 Nov 2017 07:56:24 -0700 Subject: [PATCH 076/617] Use wider columns for process id and user (#5303) I also moved all the formatting code higher up in the tree, it never felt like it belonged where it was. --- .../DefaultFormatters/Certificate_format_ps1xml.cs | 0 .../DefaultFormatters/Diagnostics_Format_ps1xml.cs | 0 .../DefaultFormatters/DotNetTypes_format_ps1xml.cs | 6 +++--- .../DefaultFormatters/Event_Format_ps1xml.cs | 0 .../DefaultFormatters/FileSystem_format_ps1xml.cs | 0 .../DefaultFormatters/HelpV3_format_ps1xml.cs | 0 .../DefaultFormatters/Help_format_ps1xml.cs | 0 .../DefaultFormatters/PowerShellCore_format_ps1xml.cs | 0 .../DefaultFormatters/PowerShellTrace_format_ps1xml.cs | 0 .../DefaultFormatters/Registry_format_ps1xml.cs | 0 .../DefaultFormatters/WSMan_Format_ps1xml.cs | 0 .../utility => }/FormatAndOutput/common/BaseCommand.cs | 0 .../FormatAndOutput/common/BaseFormattingCommand.cs | 0 .../common/BaseFormattingCommandParameters.cs | 0 .../FormatAndOutput/common/BaseOutputtingCommand.cs | 0 .../FormatAndOutput/common/ColumnWidthManager.cs | 0 .../utility => }/FormatAndOutput/common/ComplexWriter.cs | 0 .../FormatAndOutput/common/DisplayDatabase/FormatTable.cs | 0 .../FormatAndOutput/common/DisplayDatabase/XmlLoaderBase.cs | 0 .../FormatAndOutput/common/DisplayDatabase/commands.cs | 0 .../common/DisplayDatabase/displayDescriptionData.cs | 0 .../common/DisplayDatabase/displayDescriptionDataMethods.cs | 0 .../DisplayDatabase/displayDescriptionData_Complex.cs | 0 .../common/DisplayDatabase/displayDescriptionData_List.cs | 0 .../common/DisplayDatabase/displayDescriptionData_Misc.cs | 0 .../common/DisplayDatabase/displayDescriptionData_Table.cs | 0 .../common/DisplayDatabase/displayDescriptionData_Wide.cs | 0 .../common/DisplayDatabase/displayResourceManagerCache.cs | 0 .../common/DisplayDatabase/typeDataManager.cs | 0 .../FormatAndOutput/common/DisplayDatabase/typeDataQuery.cs | 0 .../common/DisplayDatabase/typeDataXmlLoader.cs | 0 .../common/DisplayDatabase/typeDataXmlLoader_Complex.cs | 0 .../common/DisplayDatabase/typeDataXmlLoader_List.cs | 0 .../common/DisplayDatabase/typeDataXmlLoader_Table.cs | 0 .../common/DisplayDatabase/typeDataXmlLoader_Views.cs | 0 .../common/DisplayDatabase/typeDataXmlLoader_Wide.cs | 0 .../FormatAndOutput/common/FormatGroupManager.cs | 0 .../FormatAndOutput/common/FormatMsgCtxManager.cs | 0 .../FormatAndOutput/common/FormatViewGenerator.cs | 0 .../FormatAndOutput/common/FormatViewGenerator_Complex.cs | 0 .../FormatAndOutput/common/FormatViewGenerator_List.cs | 0 .../FormatAndOutput/common/FormatViewGenerator_Table.cs | 0 .../FormatAndOutput/common/FormatViewGenerator_Wide.cs | 0 .../FormatAndOutput/common/FormatViewManager.cs | 0 .../utility => }/FormatAndOutput/common/FormatXMLWriter.cs | 0 .../FormatAndOutput/common/FormattingObjects.cs | 0 .../FormatAndOutput/common/FormattingObjectsDeserializer.cs | 0 .../utility => }/FormatAndOutput/common/ILineOutput.cs | 0 .../utility => }/FormatAndOutput/common/ListWriter.cs | 0 .../utility => }/FormatAndOutput/common/OutputManager.cs | 0 .../utility => }/FormatAndOutput/common/OutputQueue.cs | 0 .../utility => }/FormatAndOutput/common/TableWriter.cs | 0 .../FormatAndOutput/common/Utilities/MshObjectUtil.cs | 0 .../FormatAndOutput/common/Utilities/MshParameter.cs | 0 .../common/Utilities/MshParameterAssociation.cs | 0 .../FormatAndOutput/common/Utilities/Mshexpression.cs | 0 .../FormatAndOutput/format-default/format-default.cs | 0 .../FormatAndOutput/out-console/ConsoleLineOutput.cs | 0 .../utility => }/FormatAndOutput/out-console/OutConsole.cs | 0 .../FormatAndOutput/out-textInterface/OutTextInterface.cs | 0 60 files changed, 3 insertions(+), 3 deletions(-) rename src/System.Management.Automation/{commands/utility/FormatAndOutput/common => FormatAndOutput}/DefaultFormatters/Certificate_format_ps1xml.cs (100%) rename src/System.Management.Automation/{commands/utility/FormatAndOutput/common => FormatAndOutput}/DefaultFormatters/Diagnostics_Format_ps1xml.cs (100%) rename src/System.Management.Automation/{commands/utility/FormatAndOutput/common => FormatAndOutput}/DefaultFormatters/DotNetTypes_format_ps1xml.cs (99%) rename src/System.Management.Automation/{commands/utility/FormatAndOutput/common => FormatAndOutput}/DefaultFormatters/Event_Format_ps1xml.cs (100%) rename src/System.Management.Automation/{commands/utility/FormatAndOutput/common => FormatAndOutput}/DefaultFormatters/FileSystem_format_ps1xml.cs (100%) rename src/System.Management.Automation/{commands/utility/FormatAndOutput/common => FormatAndOutput}/DefaultFormatters/HelpV3_format_ps1xml.cs (100%) rename src/System.Management.Automation/{commands/utility/FormatAndOutput/common => FormatAndOutput}/DefaultFormatters/Help_format_ps1xml.cs (100%) rename src/System.Management.Automation/{commands/utility/FormatAndOutput/common => FormatAndOutput}/DefaultFormatters/PowerShellCore_format_ps1xml.cs (100%) rename src/System.Management.Automation/{commands/utility/FormatAndOutput/common => FormatAndOutput}/DefaultFormatters/PowerShellTrace_format_ps1xml.cs (100%) rename src/System.Management.Automation/{commands/utility/FormatAndOutput/common => FormatAndOutput}/DefaultFormatters/Registry_format_ps1xml.cs (100%) rename src/System.Management.Automation/{commands/utility/FormatAndOutput/common => FormatAndOutput}/DefaultFormatters/WSMan_Format_ps1xml.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/BaseCommand.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/BaseFormattingCommand.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/BaseFormattingCommandParameters.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/BaseOutputtingCommand.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/ColumnWidthManager.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/ComplexWriter.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/DisplayDatabase/FormatTable.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/DisplayDatabase/XmlLoaderBase.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/DisplayDatabase/commands.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/DisplayDatabase/displayDescriptionData.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/DisplayDatabase/displayDescriptionDataMethods.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_Complex.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_List.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_Misc.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_Table.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_Wide.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/DisplayDatabase/displayResourceManagerCache.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/DisplayDatabase/typeDataManager.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/DisplayDatabase/typeDataQuery.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_Complex.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_List.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_Table.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_Views.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_Wide.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/FormatGroupManager.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/FormatMsgCtxManager.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/FormatViewGenerator.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/FormatViewGenerator_Complex.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/FormatViewGenerator_List.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/FormatViewGenerator_Table.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/FormatViewGenerator_Wide.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/FormatViewManager.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/FormatXMLWriter.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/FormattingObjects.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/FormattingObjectsDeserializer.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/ILineOutput.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/ListWriter.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/OutputManager.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/OutputQueue.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/TableWriter.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/Utilities/MshObjectUtil.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/Utilities/MshParameter.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/Utilities/MshParameterAssociation.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/common/Utilities/Mshexpression.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/format-default/format-default.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/out-console/ConsoleLineOutput.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/out-console/OutConsole.cs (100%) rename src/System.Management.Automation/{commands/utility => }/FormatAndOutput/out-textInterface/OutTextInterface.cs (100%) diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/Certificate_format_ps1xml.cs b/src/System.Management.Automation/FormatAndOutput/DefaultFormatters/Certificate_format_ps1xml.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/Certificate_format_ps1xml.cs rename to src/System.Management.Automation/FormatAndOutput/DefaultFormatters/Certificate_format_ps1xml.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/Diagnostics_Format_ps1xml.cs b/src/System.Management.Automation/FormatAndOutput/DefaultFormatters/Diagnostics_Format_ps1xml.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/Diagnostics_Format_ps1xml.cs rename to src/System.Management.Automation/FormatAndOutput/DefaultFormatters/Diagnostics_Format_ps1xml.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/DotNetTypes_format_ps1xml.cs b/src/System.Management.Automation/FormatAndOutput/DefaultFormatters/DotNetTypes_format_ps1xml.cs similarity index 99% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/DotNetTypes_format_ps1xml.cs rename to src/System.Management.Automation/FormatAndOutput/DefaultFormatters/DotNetTypes_format_ps1xml.cs index c1be08d425e..b1dd1c8374d 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/DotNetTypes_format_ps1xml.cs +++ b/src/System.Management.Automation/FormatAndOutput/DefaultFormatters/DotNetTypes_format_ps1xml.cs @@ -537,7 +537,7 @@ private static IEnumerable ViewsOf_System_Diagnostics_Proc .AddHeader(Alignment.Right, label: "PM(M)", width: 8) .AddHeader(Alignment.Right, label: "WS(M)", width: 10) .AddHeader(Alignment.Right, label: "CPU(s)", width: 10) - .AddHeader(Alignment.Right, width: 6) + .AddHeader(Alignment.Right, width: 7) .AddHeader(Alignment.Right, width: 3) .AddHeader() .StartRowDefinition() @@ -587,8 +587,8 @@ private static IEnumerable ViewsOf_System_Diagnostics_Proc TableControl.Create() .AddHeader(Alignment.Right, label: "WS(M)", width: 10) .AddHeader(Alignment.Right, label: "CPU(s)", width: 8) - .AddHeader(Alignment.Right, width: 6) - .AddHeader(width: 22) + .AddHeader(Alignment.Right, width: 7) + .AddHeader(width: 30) .AddHeader() .StartRowDefinition() .AddScriptBlockColumn("\"{0:N2}\" -f [float]($_.WS / 1MB)") diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/Event_Format_ps1xml.cs b/src/System.Management.Automation/FormatAndOutput/DefaultFormatters/Event_Format_ps1xml.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/Event_Format_ps1xml.cs rename to src/System.Management.Automation/FormatAndOutput/DefaultFormatters/Event_Format_ps1xml.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/FileSystem_format_ps1xml.cs b/src/System.Management.Automation/FormatAndOutput/DefaultFormatters/FileSystem_format_ps1xml.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/FileSystem_format_ps1xml.cs rename to src/System.Management.Automation/FormatAndOutput/DefaultFormatters/FileSystem_format_ps1xml.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/HelpV3_format_ps1xml.cs b/src/System.Management.Automation/FormatAndOutput/DefaultFormatters/HelpV3_format_ps1xml.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/HelpV3_format_ps1xml.cs rename to src/System.Management.Automation/FormatAndOutput/DefaultFormatters/HelpV3_format_ps1xml.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/Help_format_ps1xml.cs b/src/System.Management.Automation/FormatAndOutput/DefaultFormatters/Help_format_ps1xml.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/Help_format_ps1xml.cs rename to src/System.Management.Automation/FormatAndOutput/DefaultFormatters/Help_format_ps1xml.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/PowerShellCore_format_ps1xml.cs b/src/System.Management.Automation/FormatAndOutput/DefaultFormatters/PowerShellCore_format_ps1xml.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/PowerShellCore_format_ps1xml.cs rename to src/System.Management.Automation/FormatAndOutput/DefaultFormatters/PowerShellCore_format_ps1xml.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/PowerShellTrace_format_ps1xml.cs b/src/System.Management.Automation/FormatAndOutput/DefaultFormatters/PowerShellTrace_format_ps1xml.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/PowerShellTrace_format_ps1xml.cs rename to src/System.Management.Automation/FormatAndOutput/DefaultFormatters/PowerShellTrace_format_ps1xml.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/Registry_format_ps1xml.cs b/src/System.Management.Automation/FormatAndOutput/DefaultFormatters/Registry_format_ps1xml.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/Registry_format_ps1xml.cs rename to src/System.Management.Automation/FormatAndOutput/DefaultFormatters/Registry_format_ps1xml.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/WSMan_Format_ps1xml.cs b/src/System.Management.Automation/FormatAndOutput/DefaultFormatters/WSMan_Format_ps1xml.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/DefaultFormatters/WSMan_Format_ps1xml.cs rename to src/System.Management.Automation/FormatAndOutput/DefaultFormatters/WSMan_Format_ps1xml.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/BaseCommand.cs b/src/System.Management.Automation/FormatAndOutput/common/BaseCommand.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/BaseCommand.cs rename to src/System.Management.Automation/FormatAndOutput/common/BaseCommand.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/BaseFormattingCommand.cs b/src/System.Management.Automation/FormatAndOutput/common/BaseFormattingCommand.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/BaseFormattingCommand.cs rename to src/System.Management.Automation/FormatAndOutput/common/BaseFormattingCommand.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/BaseFormattingCommandParameters.cs b/src/System.Management.Automation/FormatAndOutput/common/BaseFormattingCommandParameters.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/BaseFormattingCommandParameters.cs rename to src/System.Management.Automation/FormatAndOutput/common/BaseFormattingCommandParameters.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/BaseOutputtingCommand.cs b/src/System.Management.Automation/FormatAndOutput/common/BaseOutputtingCommand.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/BaseOutputtingCommand.cs rename to src/System.Management.Automation/FormatAndOutput/common/BaseOutputtingCommand.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/ColumnWidthManager.cs b/src/System.Management.Automation/FormatAndOutput/common/ColumnWidthManager.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/ColumnWidthManager.cs rename to src/System.Management.Automation/FormatAndOutput/common/ColumnWidthManager.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/ComplexWriter.cs b/src/System.Management.Automation/FormatAndOutput/common/ComplexWriter.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/ComplexWriter.cs rename to src/System.Management.Automation/FormatAndOutput/common/ComplexWriter.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/FormatTable.cs b/src/System.Management.Automation/FormatAndOutput/common/DisplayDatabase/FormatTable.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/FormatTable.cs rename to src/System.Management.Automation/FormatAndOutput/common/DisplayDatabase/FormatTable.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/XmlLoaderBase.cs b/src/System.Management.Automation/FormatAndOutput/common/DisplayDatabase/XmlLoaderBase.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/XmlLoaderBase.cs rename to src/System.Management.Automation/FormatAndOutput/common/DisplayDatabase/XmlLoaderBase.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/commands.cs b/src/System.Management.Automation/FormatAndOutput/common/DisplayDatabase/commands.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/commands.cs rename to src/System.Management.Automation/FormatAndOutput/common/DisplayDatabase/commands.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionData.cs b/src/System.Management.Automation/FormatAndOutput/common/DisplayDatabase/displayDescriptionData.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionData.cs rename to src/System.Management.Automation/FormatAndOutput/common/DisplayDatabase/displayDescriptionData.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionDataMethods.cs b/src/System.Management.Automation/FormatAndOutput/common/DisplayDatabase/displayDescriptionDataMethods.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionDataMethods.cs rename to src/System.Management.Automation/FormatAndOutput/common/DisplayDatabase/displayDescriptionDataMethods.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_Complex.cs b/src/System.Management.Automation/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_Complex.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_Complex.cs rename to src/System.Management.Automation/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_Complex.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_List.cs b/src/System.Management.Automation/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_List.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_List.cs rename to src/System.Management.Automation/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_List.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_Misc.cs b/src/System.Management.Automation/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_Misc.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_Misc.cs rename to src/System.Management.Automation/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_Misc.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_Table.cs b/src/System.Management.Automation/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_Table.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_Table.cs rename to src/System.Management.Automation/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_Table.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_Wide.cs b/src/System.Management.Automation/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_Wide.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_Wide.cs rename to src/System.Management.Automation/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_Wide.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayResourceManagerCache.cs b/src/System.Management.Automation/FormatAndOutput/common/DisplayDatabase/displayResourceManagerCache.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayResourceManagerCache.cs rename to src/System.Management.Automation/FormatAndOutput/common/DisplayDatabase/displayResourceManagerCache.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataManager.cs b/src/System.Management.Automation/FormatAndOutput/common/DisplayDatabase/typeDataManager.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataManager.cs rename to src/System.Management.Automation/FormatAndOutput/common/DisplayDatabase/typeDataManager.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataQuery.cs b/src/System.Management.Automation/FormatAndOutput/common/DisplayDatabase/typeDataQuery.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataQuery.cs rename to src/System.Management.Automation/FormatAndOutput/common/DisplayDatabase/typeDataQuery.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader.cs b/src/System.Management.Automation/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader.cs rename to src/System.Management.Automation/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_Complex.cs b/src/System.Management.Automation/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_Complex.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_Complex.cs rename to src/System.Management.Automation/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_Complex.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_List.cs b/src/System.Management.Automation/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_List.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_List.cs rename to src/System.Management.Automation/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_List.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_Table.cs b/src/System.Management.Automation/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_Table.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_Table.cs rename to src/System.Management.Automation/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_Table.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_Views.cs b/src/System.Management.Automation/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_Views.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_Views.cs rename to src/System.Management.Automation/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_Views.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_Wide.cs b/src/System.Management.Automation/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_Wide.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_Wide.cs rename to src/System.Management.Automation/FormatAndOutput/common/DisplayDatabase/typeDataXmlLoader_Wide.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatGroupManager.cs b/src/System.Management.Automation/FormatAndOutput/common/FormatGroupManager.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatGroupManager.cs rename to src/System.Management.Automation/FormatAndOutput/common/FormatGroupManager.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatMsgCtxManager.cs b/src/System.Management.Automation/FormatAndOutput/common/FormatMsgCtxManager.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatMsgCtxManager.cs rename to src/System.Management.Automation/FormatAndOutput/common/FormatMsgCtxManager.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatViewGenerator.cs b/src/System.Management.Automation/FormatAndOutput/common/FormatViewGenerator.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatViewGenerator.cs rename to src/System.Management.Automation/FormatAndOutput/common/FormatViewGenerator.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatViewGenerator_Complex.cs b/src/System.Management.Automation/FormatAndOutput/common/FormatViewGenerator_Complex.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatViewGenerator_Complex.cs rename to src/System.Management.Automation/FormatAndOutput/common/FormatViewGenerator_Complex.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatViewGenerator_List.cs b/src/System.Management.Automation/FormatAndOutput/common/FormatViewGenerator_List.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatViewGenerator_List.cs rename to src/System.Management.Automation/FormatAndOutput/common/FormatViewGenerator_List.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatViewGenerator_Table.cs b/src/System.Management.Automation/FormatAndOutput/common/FormatViewGenerator_Table.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatViewGenerator_Table.cs rename to src/System.Management.Automation/FormatAndOutput/common/FormatViewGenerator_Table.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatViewGenerator_Wide.cs b/src/System.Management.Automation/FormatAndOutput/common/FormatViewGenerator_Wide.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatViewGenerator_Wide.cs rename to src/System.Management.Automation/FormatAndOutput/common/FormatViewGenerator_Wide.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatViewManager.cs b/src/System.Management.Automation/FormatAndOutput/common/FormatViewManager.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatViewManager.cs rename to src/System.Management.Automation/FormatAndOutput/common/FormatViewManager.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatXMLWriter.cs b/src/System.Management.Automation/FormatAndOutput/common/FormatXMLWriter.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormatXMLWriter.cs rename to src/System.Management.Automation/FormatAndOutput/common/FormatXMLWriter.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormattingObjects.cs b/src/System.Management.Automation/FormatAndOutput/common/FormattingObjects.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormattingObjects.cs rename to src/System.Management.Automation/FormatAndOutput/common/FormattingObjects.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormattingObjectsDeserializer.cs b/src/System.Management.Automation/FormatAndOutput/common/FormattingObjectsDeserializer.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/FormattingObjectsDeserializer.cs rename to src/System.Management.Automation/FormatAndOutput/common/FormattingObjectsDeserializer.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/ILineOutput.cs b/src/System.Management.Automation/FormatAndOutput/common/ILineOutput.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/ILineOutput.cs rename to src/System.Management.Automation/FormatAndOutput/common/ILineOutput.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/ListWriter.cs b/src/System.Management.Automation/FormatAndOutput/common/ListWriter.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/ListWriter.cs rename to src/System.Management.Automation/FormatAndOutput/common/ListWriter.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/OutputManager.cs b/src/System.Management.Automation/FormatAndOutput/common/OutputManager.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/OutputManager.cs rename to src/System.Management.Automation/FormatAndOutput/common/OutputManager.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/OutputQueue.cs b/src/System.Management.Automation/FormatAndOutput/common/OutputQueue.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/OutputQueue.cs rename to src/System.Management.Automation/FormatAndOutput/common/OutputQueue.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/TableWriter.cs b/src/System.Management.Automation/FormatAndOutput/common/TableWriter.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/TableWriter.cs rename to src/System.Management.Automation/FormatAndOutput/common/TableWriter.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/Utilities/MshObjectUtil.cs b/src/System.Management.Automation/FormatAndOutput/common/Utilities/MshObjectUtil.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/Utilities/MshObjectUtil.cs rename to src/System.Management.Automation/FormatAndOutput/common/Utilities/MshObjectUtil.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/Utilities/MshParameter.cs b/src/System.Management.Automation/FormatAndOutput/common/Utilities/MshParameter.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/Utilities/MshParameter.cs rename to src/System.Management.Automation/FormatAndOutput/common/Utilities/MshParameter.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/Utilities/MshParameterAssociation.cs b/src/System.Management.Automation/FormatAndOutput/common/Utilities/MshParameterAssociation.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/Utilities/MshParameterAssociation.cs rename to src/System.Management.Automation/FormatAndOutput/common/Utilities/MshParameterAssociation.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/Utilities/Mshexpression.cs b/src/System.Management.Automation/FormatAndOutput/common/Utilities/Mshexpression.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/common/Utilities/Mshexpression.cs rename to src/System.Management.Automation/FormatAndOutput/common/Utilities/Mshexpression.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/format-default/format-default.cs b/src/System.Management.Automation/FormatAndOutput/format-default/format-default.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/format-default/format-default.cs rename to src/System.Management.Automation/FormatAndOutput/format-default/format-default.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/out-console/ConsoleLineOutput.cs b/src/System.Management.Automation/FormatAndOutput/out-console/ConsoleLineOutput.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/out-console/ConsoleLineOutput.cs rename to src/System.Management.Automation/FormatAndOutput/out-console/ConsoleLineOutput.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/out-console/OutConsole.cs b/src/System.Management.Automation/FormatAndOutput/out-console/OutConsole.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/out-console/OutConsole.cs rename to src/System.Management.Automation/FormatAndOutput/out-console/OutConsole.cs diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/out-textInterface/OutTextInterface.cs b/src/System.Management.Automation/FormatAndOutput/out-textInterface/OutTextInterface.cs similarity index 100% rename from src/System.Management.Automation/commands/utility/FormatAndOutput/out-textInterface/OutTextInterface.cs rename to src/System.Management.Automation/FormatAndOutput/out-textInterface/OutTextInterface.cs From 71d5439bbe02e8db3df4ea93eda96665c293463b Mon Sep 17 00:00:00 2001 From: Jason Shirk Date: Thu, 2 Nov 2017 10:29:10 -0700 Subject: [PATCH 077/617] Fix dynamic class assembly name (#5292) Using the assembly name to hint at the source of the classes was problematic in multiple ways. This change stores the actual filename in an attribute on the assembly. So for a given type, one can get the assembly this way: [SomeType].Assembly.GetCustomAttributes() | ? { $_ -is [System.Management.Automation.DynamicClassImplementationAssemblyAttribute] } | % { $_.ScriptFile } --- .../engine/Attributes.cs | 4 ++ .../engine/parser/PSType.cs | 45 ++++++++++++------- .../utils/ClrFacade.cs | 9 +--- .../Scripting.Classes.BasicParsing.Tests.ps1 | 8 ++++ 4 files changed, 42 insertions(+), 24 deletions(-) diff --git a/src/System.Management.Automation/engine/Attributes.cs b/src/System.Management.Automation/engine/Attributes.cs index f0022448c0c..876f428bde8 100644 --- a/src/System.Management.Automation/engine/Attributes.cs +++ b/src/System.Management.Automation/engine/Attributes.cs @@ -560,6 +560,10 @@ public string[] ParameterSetName [AttributeUsage(AttributeTargets.Assembly)] public class DynamicClassImplementationAssemblyAttribute : Attribute { + /// + /// The (possibly null) path to the file defining this class. + /// + public string ScriptFile { get; set; } } #endregion Misc Attributes diff --git a/src/System.Management.Automation/engine/parser/PSType.cs b/src/System.Management.Automation/engine/parser/PSType.cs index 1a5a15fc772..91ee67d9afa 100644 --- a/src/System.Management.Automation/engine/parser/PSType.cs +++ b/src/System.Management.Automation/engine/parser/PSType.cs @@ -16,10 +16,11 @@ namespace System.Management.Automation.Language { internal class TypeDefiner { + internal const string DynamicClassAssemblyName = "PowerShell Class Assembly"; + private static int s_globalCounter = 0; - private static readonly object[] s_emptyArgArray = Utils.EmptyArray(); private static readonly CustomAttributeBuilder s_hiddenCustomAttributeBuilder = - new CustomAttributeBuilder(typeof(HiddenAttribute).GetConstructor(Type.EmptyTypes), s_emptyArgArray); + new CustomAttributeBuilder(typeof(HiddenAttribute).GetConstructor(Type.EmptyTypes), Utils.EmptyArray()); private static readonly string s_sessionStateKeeperFieldName = "__sessionStateKeeper"; internal static readonly string SessionStateFieldName = "__sessionState"; @@ -1100,30 +1101,40 @@ internal void DefineEnum() } } - private static IEnumerable GetAssemblyAttributeBuilders() + private static IEnumerable GetAssemblyAttributeBuilders(string scriptFile) { - yield return new CustomAttributeBuilder(typeof(DynamicClassImplementationAssemblyAttribute).GetConstructor(Type.EmptyTypes), s_emptyArgArray); + var ctor = typeof(DynamicClassImplementationAssemblyAttribute).GetConstructor(Type.EmptyTypes); + var emptyArgs = Utils.EmptyArray(); + + if (string.IsNullOrEmpty(scriptFile)) { + yield return new CustomAttributeBuilder(ctor, emptyArgs); + yield break; + } + + var propertyInfo = new PropertyInfo[] { + typeof(DynamicClassImplementationAssemblyAttribute).GetProperty(nameof(DynamicClassImplementationAssemblyAttribute.ScriptFile)) }; + var propertyArgs = new object[] { scriptFile }; + + yield return new CustomAttributeBuilder(ctor, emptyArgs, + propertyInfo, propertyArgs, Utils.EmptyArray(), emptyArgs); + } + private static int counter = 0; internal static Assembly DefineTypes(Parser parser, Ast rootAst, TypeDefinitionAst[] typeDefinitions) { Diagnostics.Assert(rootAst.Parent == null, "Caller should only define types from the root ast"); var definedTypes = new HashSet(StringComparer.OrdinalIgnoreCase); - // First character is a special mark that allows us to cheaply ignore dynamic generated assemblies in ClrFacade.GetAssemblies() - // The replaces at the end are for not-allowed characters. They are replaced by similar-looking chars. - string assemblyName = ClrFacade.FIRST_CHAR_PSASSEMBLY_MARK + (string.IsNullOrWhiteSpace(rootAst.Extent.File) - ? "powershell" - : rootAst.Extent.File - .Replace('\\', (char)0x29f9) - .Replace('/', (char)0x29f9) - .Replace(',', (char)0x201a) - .Replace(':', (char)0x0589)); - - var assembly = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName(assemblyName), - AssemblyBuilderAccess.RunAndCollect, GetAssemblyAttributeBuilders()); - var module = assembly.DefineDynamicModule(assemblyName); + var assemblyName = new AssemblyName(DynamicClassAssemblyName) + { + // We could generate a unique name, but a unique version works too. + Version = new Version(1, 0, 0, Interlocked.Increment(ref counter)) + }; + var assembly = AssemblyBuilder.DefineDynamicAssembly(assemblyName, + AssemblyBuilderAccess.RunAndCollect, GetAssemblyAttributeBuilders(rootAst.Extent.File)); + var module = assembly.DefineDynamicModule(DynamicClassAssemblyName); var defineTypeHelpers = new List(); var defineEnumHelpers = new List(); diff --git a/src/System.Management.Automation/utils/ClrFacade.cs b/src/System.Management.Automation/utils/ClrFacade.cs index 9a3947c2c6b..1aca451d08c 100644 --- a/src/System.Management.Automation/utils/ClrFacade.cs +++ b/src/System.Management.Automation/utils/ClrFacade.cs @@ -41,12 +41,6 @@ static ClrFacade() } } - /// - /// We need it to avoid calling lookups inside dynamic assemblies with PS Types, so we exclude it from GetAssemblies(). - /// We use this convention for names to archive it. - /// - internal static readonly char FIRST_CHAR_PSASSEMBLY_MARK = (char)0x29f9; - #region Assembly internal static IEnumerable GetAssemblies(TypeResolutionState typeResolutionState, TypeName typeName) @@ -65,7 +59,8 @@ internal static IEnumerable GetAssemblies(TypeResolutionState typeReso internal static IEnumerable GetAssemblies(string namespaceQualifiedTypeName = null) { return PSAssemblyLoadContext.GetAssembly(namespaceQualifiedTypeName) ?? - AppDomain.CurrentDomain.GetAssemblies().Where(a => !(a.FullName.Length > 0 && a.FullName[0] == FIRST_CHAR_PSASSEMBLY_MARK)); + AppDomain.CurrentDomain.GetAssemblies().Where(a => + !TypeDefiner.DynamicClassAssemblyName.Equals(a.GetName().Name, StringComparison.Ordinal)); } /// diff --git a/test/powershell/Language/Classes/Scripting.Classes.BasicParsing.Tests.ps1 b/test/powershell/Language/Classes/Scripting.Classes.BasicParsing.Tests.ps1 index 88b7ea77a53..a06a38bceb6 100644 --- a/test/powershell/Language/Classes/Scripting.Classes.BasicParsing.Tests.ps1 +++ b/test/powershell/Language/Classes/Scripting.Classes.BasicParsing.Tests.ps1 @@ -688,6 +688,14 @@ Describe 'Type building' -Tags "CI" { ++$a::a | Should Be 2 } } + + It 'should get the script from a class type' { + class C {} + + $a = [C].Assembly.GetCustomAttributes($false).Where{ + $_ -is [System.Management.Automation.DynamicClassImplementationAssemblyAttribute]} + $a.ScriptFile | Should BeExactly $PSCommandPath + } } Describe 'RuntimeType created for TypeDefinitionAst' -Tags "CI" { From 8fcdc01827c2a7063e7511ae9cf25adc7fc0741c Mon Sep 17 00:00:00 2001 From: Travis Plunk Date: Thu, 2 Nov 2017 13:52:17 -0700 Subject: [PATCH 078/617] Refactor for signing (#5300) --- build.psm1 | 8 ++- tools/packaging/packaging.psm1 | 49 ++++++++++++++++--- .../PowerShellPackage.ps1 | 5 +- 3 files changed, 51 insertions(+), 11 deletions(-) diff --git a/build.psm1 b/build.psm1 index 99e00c228cb..c87fe1aeb2b 100644 --- a/build.psm1 +++ b/build.psm1 @@ -438,6 +438,7 @@ Fix steps: Configuration=$Configuration Verbose=$true SMAOnly=[bool]$SMAOnly + PSModuleRestore=$PSModuleRestore } $script:Options = New-PSOptions @OptionsArguments @@ -602,7 +603,9 @@ function New-PSOptions { [string]$Output, - [switch]$SMAOnly + [switch]$SMAOnly, + + [switch]$PSModuleRestore ) # Add .NET CLI tools to PATH @@ -716,7 +719,8 @@ function New-PSOptions { Framework = $Framework; Runtime = $Runtime; Output = $Output; - CrossGen = $CrossGen } + CrossGen = $CrossGen + PSModuleRestore = $PSModuleRestore } } # Get the Options of the last build diff --git a/tools/packaging/packaging.psm1 b/tools/packaging/packaging.psm1 index 8f9aed023a5..9604009042d 100644 --- a/tools/packaging/packaging.psm1 +++ b/tools/packaging/packaging.psm1 @@ -83,11 +83,19 @@ function Start-PSPackage { # crossgen doesn't support arm32 yet $crossGenCorrect = $true } - elseif(-not $IncludeSymbols.IsPresent -and $Script:Options.CrossGen) { + elseif($Script:Options.CrossGen) { $crossGenCorrect = $true } - elseif ($IncludeSymbols.IsPresent) { - $crossGenCorrect = $true + + $PSModuleRestoreCorrect = $false + + # Require PSModuleRestore for packaging without symbols + # But Disallow it when packaging with symbols + if (!$IncludeSymbols.IsPresent -and $Script:Options.PSModuleRestore) { + $PSModuleRestoreCorrect = $true + } + elseif ($IncludeSymbols.IsPresent -and !$Script:Options.PSModuleRestore) { + $PSModuleRestoreCorrect = $true } # Make sure the most recent build satisfies the package requirement @@ -108,10 +116,11 @@ function Start-PSPackage { # also ensure `Start-PSPackage` does what the user asks/expects, because once packages # are generated, it'll be hard to verify if they were built from the correct content. $params = @('-Clean') - if(-not $IncludeSymbols.IsPresent) - { - $params += '-CrossGen' + $params += '-CrossGen' + if (!$IncludeSymbols.IsPresent) { + $params += '-PSModuleRestore' } + $params += '-Runtime', $Runtime $params += '-Configuration', $Configuration @@ -140,9 +149,35 @@ function Start-PSPackage { # If building a symbols package, don't include the publish build. if ($IncludeSymbols.IsPresent) { + $publishSource = $Source $buildSource = Split-Path -Path $Source -Parent $Source = New-TempFolder - Get-ChildItem -Path $buildSource | Where-Object {$_.Name -ine 'Publish'} | Copy-Item -Destination $Source -Recurse + + # files not to include as individual files. These files will be included in publish.zip + $toExclude = @( + 'hostfxr.dll' + 'hostpolicy.dll' + 'libhostfxr.so' + 'libhostpolicy.so' + 'libhostfxr.dylib' + 'libhostpolicy.dylib' + 'Publish' + ) + Get-ChildItem -Path $buildSource | Where-Object {$toExclude -inotcontains $_.Name} | Copy-Item -Destination $Source -Recurse + + # Replace binaries with crossgen'ed binaires from publish folder. + Get-ChildItem -Recurse $Source | ForEach-Object { + $relativePath = $_.FullName -replace $Source, '' + $publishPath = Join-Path $publishSource -ChildPath $relativePath + if (Test-Path -Path $publishPath) + { + Copy-Item -Path $publishPath -Destination $_.FullName -Force + } + } + + $zipSource = Join-Path $publishSource -ChildPath '*' + $zipPath = Join-Path -Path $Source -ChildPath 'publish.zip' + Compress-Archive -Path $zipSource -DestinationPath $zipPath } log "Packaging Source: '$Source'" diff --git a/tools/releaseBuild/Images/microsoft_powershell_windowsservercore/PowerShellPackage.ps1 b/tools/releaseBuild/Images/microsoft_powershell_windowsservercore/PowerShellPackage.ps1 index eb41c6bf480..b8f9d9eb5b2 100644 --- a/tools/releaseBuild/Images/microsoft_powershell_windowsservercore/PowerShellPackage.ps1 +++ b/tools/releaseBuild/Images/microsoft_powershell_windowsservercore/PowerShellPackage.ps1 @@ -61,12 +61,13 @@ try{ Write-Verbose "Starting powershell build for RID: $Runtime and ReleaseTag: $ReleaseTag ..." -verbose $buildParams = @{} + $buildParams['CrossGen'] = $true if(!$Symbols.IsPresent) { - $buildParams['CrossGen'] = $true + $buildParams['PSModuleRestore'] = $true } - Start-PSBuild -Clean -PSModuleRestore -Runtime $Runtime -Configuration Release @releaseTagParam @buildParams + Start-PSBuild -Clean -Runtime $Runtime -Configuration Release @releaseTagParam @buildParams $pspackageParams = @{'Type'='msi'} if ($Runtime -ne 'win10-x64') From decdd1a828501dc4067ae579db9b22e31ac0eb75 Mon Sep 17 00:00:00 2001 From: Dongbo Wang Date: Thu, 2 Nov 2017 14:12:19 -0700 Subject: [PATCH 079/617] Update powershell to use 2.0.4-servicing dotnet core runtime (#5295) --- PowerShell.Common.props | 2 +- build.psm1 | 2 +- global.json | 2 +- test/Test.Common.props | 2 +- test/tools/TestExe/TestExe.csproj | 3 ++- test/tools/WebListener/WebListener.csproj | 3 ++- 6 files changed, 8 insertions(+), 6 deletions(-) diff --git a/PowerShell.Common.props b/PowerShell.Common.props index ccbbd1ea40f..9dd271b07e0 100644 --- a/PowerShell.Common.props +++ b/PowerShell.Common.props @@ -94,7 +94,7 @@ (c) Microsoft Corporation. All rights reserved. netcoreapp2.0 - 2.0.0 + 2.0.4-servicing-25831-01 true true diff --git a/build.psm1 b/build.psm1 index c87fe1aeb2b..2e0439f5309 100644 --- a/build.psm1 +++ b/build.psm1 @@ -3,7 +3,7 @@ $script:TestModulePathSeparator = [System.IO.Path]::PathSeparator $dotnetCLIChannel = "release" -$dotnetCLIRequiredVersion = "2.0.0" +$dotnetCLIRequiredVersion = "2.0.2" # Track if tags have been sync'ed $tagsUpToDate = $false diff --git a/global.json b/global.json index 110af6027d7..d427e5ce350 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "2.0.0" + "version": "2.0.2" } } diff --git a/test/Test.Common.props b/test/Test.Common.props index 79f0b8fbcf8..b1c1b203b64 100644 --- a/test/Test.Common.props +++ b/test/Test.Common.props @@ -5,7 +5,7 @@ (c) Microsoft Corporation. All rights reserved. netcoreapp2.0 - 2.0.0 + 2.0.4-servicing-25831-01 true true diff --git a/test/tools/TestExe/TestExe.csproj b/test/tools/TestExe/TestExe.csproj index a2ef5d89e5f..cc5bd30bb57 100644 --- a/test/tools/TestExe/TestExe.csproj +++ b/test/tools/TestExe/TestExe.csproj @@ -1,8 +1,9 @@  + + Very simple little console class that you can use to for testing PowerShell interaction with native commands - netcoreapp2.0 testexe Exe win7-x86;win7-x64;osx.10.12-x64;linux-x64 diff --git a/test/tools/WebListener/WebListener.csproj b/test/tools/WebListener/WebListener.csproj index d95182c68ce..9ee1d8298ac 100644 --- a/test/tools/WebListener/WebListener.csproj +++ b/test/tools/WebListener/WebListener.csproj @@ -1,8 +1,9 @@ + + A simple ASP.NET Core 2.0 MVC app to provide an HTTP and HTTPS server for testing. - netcoreapp2.0 From a954f9f98c7ab631e5dd8d0bcacbe6348f3799f4 Mon Sep 17 00:00:00 2001 From: Dongbo Wang Date: Thu, 2 Nov 2017 14:17:45 -0700 Subject: [PATCH 080/617] Change line ending in Rename-Computer.Tests.ps1 to LF (#5314) --- .../Rename-Computer.Tests.ps1 | 158 +++++++++--------- 1 file changed, 79 insertions(+), 79 deletions(-) diff --git a/test/powershell/Modules/Microsoft.PowerShell.Management/Rename-Computer.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Management/Rename-Computer.Tests.ps1 index 91d167a43cc..86c96add0b5 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Management/Rename-Computer.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Management/Rename-Computer.Tests.ps1 @@ -1,79 +1,79 @@ -$RenameTesthook = "TestRenameComputer" -$RenameResultName = "TestRenameComputerResults" -$DefaultResultValue = 0 - -try -{ - # set up for testing - $PSDefaultParameterValues["it:skip"] = ! $IsWindows - Enable-Testhook -testhookName $RenameTesthook - # we also set TestStopComputer - Enable-Testhook -testhookName TestStopComputer - - # TEST START HERE - Describe "Rename-Computer" -Tag Feature { - # if we throw in BeforeEach, the test will fail and the stop will not be called - BeforeEach { - if ( ! (Test-TesthookIsSet -testhookName $RenameTesthook) ) { - throw "Testhook '${TesthookName}' is not set" - } - } - - AfterEach { - Set-TesthookResult -testhookName $RenameResultName -value $defaultResultValue - } - - It "Should rename the local computer" { - Set-TesthookResult -testhookName $RenameResultName -value $defaultResultValue - $newname = "mynewname" - $result = Rename-Computer -ErrorAction Stop -ComputerName . -NewName "$newname" -Pass -WarningAction SilentlyContinue - $result.HasSucceeded | should be $true - $result.NewComputerName | should be $newname - } - - # we can't really look for the string "reboot" as it will change - # when translated. We are guaranteed that the old computer name will - # be present, so we'll look for that - It "Should produce a reboot warning when renaming computer" { - Set-TesthookResult -testhookName $RenameResultName -value $defaultResultValue - $newname = "mynewname" - $result = Rename-Computer -ErrorAction Stop -ComputerName . -NewName "$newname" -Pass -WarningAction SilentlyContinue -WarningVariable WarnVar - $WarnVar.Message | should match $result.OldComputerName - } - - It "Should not produce a reboot warning when renaming a computer with the reboot flag" { - Set-TesthookResult -testhookName $RenameResultName -value $defaultResultValue - $newname = "mynewname" - $result = Rename-Computer -ErrorAction Stop -ComputerName . -NewName "$newname" -Pass -WarningAction SilentlyContinue -WarningVariable WarnVar -Restart - $result.HasSucceeded | should be $true - $result.NewComputerName | should be $newname - $WarnVar | should BeNullOrEmpty - } - - - Context "Rename-Computer Error Conditions" { - $testcases = - @{ OldName = "." ; NewName = "localhost" ; ExpectedError = "FailToRenameComputer,Microsoft.PowerShell.Commands.RenameComputerCommand" }, - @{ OldName = "." ; NewName = "." ; ExpectedError = "InvalidNewName,Microsoft.PowerShell.Commands.RenameComputerCommand" }, - @{ OldName = "." ; NewName = "::1" ; ExpectedError = "InvalidNewName,Microsoft.PowerShell.Commands.RenameComputerCommand" }, - @{ OldName = "." ; NewName = "127.0.0.1" ; ExpectedError = "InvalidNewName,Microsoft.PowerShell.Commands.RenameComputerCommand" }, - @{ OldName = "." ; NewName = ${env:ComputerName} ; ExpectedError = "NewNameIsOldName,Microsoft.PowerShell.Commands.RenameComputerCommand" }, - @{ OldName = "." ; NewName = ${env:ComputerName} + "." + ${env:USERDNSDOMAIN} ; ExpectedError = "InvalidNewName,Microsoft.PowerShell.Commands.RenameComputerCommand" }, - @{ OldName = ".\$#" ; NewName = "NewName"; ExpectedError = "AddressResolutionException,Microsoft.PowerShell.Commands.RenameComputerCommand" } - - It "Renaming '' to '' creates the right error" -testcase $testcases { - param ( $OldName, $NewName, $ExpectedError ) - Set-TesthookResult -testhookName $RenameResultName -value 0x1 - { Rename-Computer -ComputerName $OldName -NewName $NewName -ErrorAction Stop } | ShouldBeErrorId $ExpectedError - } - } - } - -} -finally -{ - $PSDefaultParameterValues.Remove("it:skip") - Disable-Testhook -testhookName $RenameTestHook - Disable-Testhook -testhookName TestStopComputer - Set-TesthookResult -testhookName $RenameResultName -value 0 -} +$RenameTesthook = "TestRenameComputer" +$RenameResultName = "TestRenameComputerResults" +$DefaultResultValue = 0 + +try +{ + # set up for testing + $PSDefaultParameterValues["it:skip"] = ! $IsWindows + Enable-Testhook -testhookName $RenameTesthook + # we also set TestStopComputer + Enable-Testhook -testhookName TestStopComputer + + # TEST START HERE + Describe "Rename-Computer" -Tag Feature { + # if we throw in BeforeEach, the test will fail and the stop will not be called + BeforeEach { + if ( ! (Test-TesthookIsSet -testhookName $RenameTesthook) ) { + throw "Testhook '${TesthookName}' is not set" + } + } + + AfterEach { + Set-TesthookResult -testhookName $RenameResultName -value $defaultResultValue + } + + It "Should rename the local computer" { + Set-TesthookResult -testhookName $RenameResultName -value $defaultResultValue + $newname = "mynewname" + $result = Rename-Computer -ErrorAction Stop -ComputerName . -NewName "$newname" -Pass -WarningAction SilentlyContinue + $result.HasSucceeded | should be $true + $result.NewComputerName | should be $newname + } + + # we can't really look for the string "reboot" as it will change + # when translated. We are guaranteed that the old computer name will + # be present, so we'll look for that + It "Should produce a reboot warning when renaming computer" { + Set-TesthookResult -testhookName $RenameResultName -value $defaultResultValue + $newname = "mynewname" + $result = Rename-Computer -ErrorAction Stop -ComputerName . -NewName "$newname" -Pass -WarningAction SilentlyContinue -WarningVariable WarnVar + $WarnVar.Message | should match $result.OldComputerName + } + + It "Should not produce a reboot warning when renaming a computer with the reboot flag" { + Set-TesthookResult -testhookName $RenameResultName -value $defaultResultValue + $newname = "mynewname" + $result = Rename-Computer -ErrorAction Stop -ComputerName . -NewName "$newname" -Pass -WarningAction SilentlyContinue -WarningVariable WarnVar -Restart + $result.HasSucceeded | should be $true + $result.NewComputerName | should be $newname + $WarnVar | should BeNullOrEmpty + } + + + Context "Rename-Computer Error Conditions" { + $testcases = + @{ OldName = "." ; NewName = "localhost" ; ExpectedError = "FailToRenameComputer,Microsoft.PowerShell.Commands.RenameComputerCommand" }, + @{ OldName = "." ; NewName = "." ; ExpectedError = "InvalidNewName,Microsoft.PowerShell.Commands.RenameComputerCommand" }, + @{ OldName = "." ; NewName = "::1" ; ExpectedError = "InvalidNewName,Microsoft.PowerShell.Commands.RenameComputerCommand" }, + @{ OldName = "." ; NewName = "127.0.0.1" ; ExpectedError = "InvalidNewName,Microsoft.PowerShell.Commands.RenameComputerCommand" }, + @{ OldName = "." ; NewName = ${env:ComputerName} ; ExpectedError = "NewNameIsOldName,Microsoft.PowerShell.Commands.RenameComputerCommand" }, + @{ OldName = "." ; NewName = ${env:ComputerName} + "." + ${env:USERDNSDOMAIN} ; ExpectedError = "InvalidNewName,Microsoft.PowerShell.Commands.RenameComputerCommand" }, + @{ OldName = ".\$#" ; NewName = "NewName"; ExpectedError = "AddressResolutionException,Microsoft.PowerShell.Commands.RenameComputerCommand" } + + It "Renaming '' to '' creates the right error" -testcase $testcases { + param ( $OldName, $NewName, $ExpectedError ) + Set-TesthookResult -testhookName $RenameResultName -value 0x1 + { Rename-Computer -ComputerName $OldName -NewName $NewName -ErrorAction Stop } | ShouldBeErrorId $ExpectedError + } + } + } + +} +finally +{ + $PSDefaultParameterValues.Remove("it:skip") + Disable-Testhook -testhookName $RenameTestHook + Disable-Testhook -testhookName TestStopComputer + Set-TesthookResult -testhookName $RenameResultName -value 0 +} From 98244a89f91d57e0e3daf835785d5bc9aa7bea73 Mon Sep 17 00:00:00 2001 From: Travis Plunk Date: Thu, 2 Nov 2017 15:00:18 -0700 Subject: [PATCH 081/617] remove sync-tags for Linux. It is failing. (#5299) --- .../Images/GenericLinuxFiles/PowerShellPackage.ps1 | 3 --- 1 file changed, 3 deletions(-) diff --git a/tools/releaseBuild/Images/GenericLinuxFiles/PowerShellPackage.ps1 b/tools/releaseBuild/Images/GenericLinuxFiles/PowerShellPackage.ps1 index 68149609185..b5ef4f03081 100644 --- a/tools/releaseBuild/Images/GenericLinuxFiles/PowerShellPackage.ps1 +++ b/tools/releaseBuild/Images/GenericLinuxFiles/PowerShellPackage.ps1 @@ -28,9 +28,6 @@ try { Import-Module "$location/build.psm1" Import-Module "$location/tools/packaging" - Write-Verbose "Sync'ing Tags..." -verbose - Sync-PSTags - Start-PSBootstrap -Package -NoSudo Start-PSBuild -Crossgen -PSModuleRestore @releaseTagParam From 74ebde9d3cc061784709ae971cccb9c7dcd1011d Mon Sep 17 00:00:00 2001 From: Travis Plunk Date: Thu, 2 Nov 2017 16:05:56 -0700 Subject: [PATCH 082/617] Release build fixes (#5317) small fixes found while doing current work item -replace expects a regex when I wanted to do a literal replace. Have Sync-PSTags fix any issues it find --- tools/packaging/packaging.psm1 | 2 +- .../PowerShellPackage.ps1 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/packaging/packaging.psm1 b/tools/packaging/packaging.psm1 index 9604009042d..3aaee4e6ebb 100644 --- a/tools/packaging/packaging.psm1 +++ b/tools/packaging/packaging.psm1 @@ -167,7 +167,7 @@ function Start-PSPackage { # Replace binaries with crossgen'ed binaires from publish folder. Get-ChildItem -Recurse $Source | ForEach-Object { - $relativePath = $_.FullName -replace $Source, '' + $relativePath = $_.FullName.Replace($Source, '') $publishPath = Join-Path $publishSource -ChildPath $relativePath if (Test-Path -Path $publishPath) { diff --git a/tools/releaseBuild/Images/microsoft_powershell_windowsservercore/PowerShellPackage.ps1 b/tools/releaseBuild/Images/microsoft_powershell_windowsservercore/PowerShellPackage.ps1 index b8f9d9eb5b2..b0a27274af9 100644 --- a/tools/releaseBuild/Images/microsoft_powershell_windowsservercore/PowerShellPackage.ps1 +++ b/tools/releaseBuild/Images/microsoft_powershell_windowsservercore/PowerShellPackage.ps1 @@ -54,7 +54,7 @@ try{ $env:platform = $null Write-Verbose "Sync'ing Tags..." -verbose - Sync-PSTags + Sync-PSTags -AddRemoteIfMissing Write-Verbose "Bootstrapping powershell build..." -verbose Start-PSBootstrap -Force -Package From 2ae776ae1fee4ebdc84afcc137525b5e92258569 Mon Sep 17 00:00:00 2001 From: Chunqing Chen Date: Thu, 2 Nov 2017 17:13:02 -0700 Subject: [PATCH 083/617] Fix 'ExecutionContext.LoadAssembly' to load with name when file cannot be found (#5161) --- .../engine/ExecutionContext.cs | 19 ++++++++++++------- .../Import-Module.Tests.ps1 | 19 +++++++++++++++++++ 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/System.Management.Automation/engine/ExecutionContext.cs b/src/System.Management.Automation/engine/ExecutionContext.cs index 13974e8ef30..e67e8fcb394 100644 --- a/src/System.Management.Automation/engine/ExecutionContext.cs +++ b/src/System.Management.Automation/engine/ExecutionContext.cs @@ -1193,21 +1193,19 @@ internal void RemoveAssembly(string name) } } - [SuppressMessage("Microsoft.Reliability", "CA2001:AvoidCallingProblematicMethods", MessageId = "System.Reflection.Assembly.LoadWithPartialName")] [SuppressMessage("Microsoft.Reliability", "CA2001:AvoidCallingProblematicMethods", MessageId = "System.Reflection.Assembly.LoadFrom")] internal static Assembly LoadAssembly(string name, string filename, out Exception error) { // First we try to load the assembly based on the filename - Assembly loadedAssembly = null; error = null; - if (!String.IsNullOrEmpty(filename)) { try { loadedAssembly = Assembly.LoadFrom(filename); + return loadedAssembly; } catch (FileNotFoundException fileNotFound) { @@ -1216,17 +1214,22 @@ internal static Assembly LoadAssembly(string name, string filename, out Exceptio catch (FileLoadException fileLoadException) { error = fileLoadException; + return null; } catch (BadImageFormatException badImage) { error = badImage; + return null; } catch (SecurityException securityException) { error = securityException; + return null; } } - else if (!String.IsNullOrEmpty(name)) + + // Then we try to load the assembly based on the given name + if (!String.IsNullOrEmpty(name)) { string fixedName = null; // Remove the '.dll' if it's there... @@ -1249,8 +1252,6 @@ internal static Assembly LoadAssembly(string name, string filename, out Exceptio catch (FileLoadException fileLoadException) { error = fileLoadException; - // this is a legitimate error on CoreCLR for a newly emited with Add-Type assemblies - // they cannot be loaded by name, but we are only interested in importing them by path } catch (BadImageFormatException badImage) { @@ -1262,7 +1263,11 @@ internal static Assembly LoadAssembly(string name, string filename, out Exceptio } } - // We either return the loaded Assembly, or return null. + // If the assembly is loaded, we ignore error as it may come from the filepath loading. + if (loadedAssembly != null) + { + error = null; + } return loadedAssembly; } diff --git a/test/powershell/Modules/Microsoft.PowerShell.Core/Import-Module.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Core/Import-Module.Tests.ps1 index e532e32e085..98d12c4656e 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Core/Import-Module.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Core/Import-Module.Tests.ps1 @@ -139,6 +139,25 @@ namespace ModuleCmdlets $results[0] | Should Be $path $results[1] | Should BeExactly "BinaryModuleCmdlet1 exported by the ModuleCmdlets module." } + + It "PS should try to load the assembly from assembly name if file path doesn't exist" { + + $psdFile = Join-Path $TESTDRIVE test.psd1 + $nestedModule = Join-Path NOExistedPath Microsoft.PowerShell.Commands.Utility.dll + New-ModuleManifest -Path $psdFile -NestedModules $nestedModule + try + { + $module = Import-Module $psdFile -PassThru + $module.NestedModules | Should Not BeNullOrEmpty + $assemblyLocation = [Microsoft.PowerShell.Commands.AddTypeCommand].Assembly.Location + $module.NestedModules.ImplementingAssembly.Location | Should Be $assemblyLocation + } + finally + { + Remove-Module $module -ErrorAction SilentlyContinue + } + + } } Describe "Import-Module should be case insensitive" -Tags 'CI' { From 51c985495f75c7f8f0e86eb290e5350a0a3e3120 Mon Sep 17 00:00:00 2001 From: Jason Shirk Date: Thu, 2 Nov 2017 17:59:43 -0700 Subject: [PATCH 084/617] Speed up check for suspicious content (#5302) This replaces the code that scanned a script block for suspicious strings. The previous implementation: * Tokenized input (generating many strings for garbage collection) * Used multiple threads This approach is based on Rubin-Karp and does not allocate any memory other than a small array to hold the running hash values. I tested the new and old approaches on 2200 files in the PowerShell repo. The old code ran in about 1.8-2.1s (ignoring time spent reading files) The new code runs in about 0.6s and is more stable due to no garbage. --- .../engine/runtime/CompiledScriptBlock.cs | 385 ++++++++++++------ 1 file changed, 268 insertions(+), 117 deletions(-) diff --git a/src/System.Management.Automation/engine/runtime/CompiledScriptBlock.cs b/src/System.Management.Automation/engine/runtime/CompiledScriptBlock.cs index f457796a4e1..87d7e3b140b 100644 --- a/src/System.Management.Automation/engine/runtime/CompiledScriptBlock.cs +++ b/src/System.Management.Automation/engine/runtime/CompiledScriptBlock.cs @@ -13,6 +13,7 @@ using System.Management.Automation.Tracing; using System.Security.Cryptography.X509Certificates; using System.Reflection; +using System.Runtime.CompilerServices; using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; @@ -1492,44 +1493,10 @@ private static bool ShouldLogScriptBlockActivity(string activity) // Quick check for script blocks that may have suspicious content. If this // is true, we log them to the event log despite event log settings. - // - // Performance notes: - // - // For the current number of search terms, the this approach is about as high - // performance as we can get. It adds about 1ms to the invocation of a script - // block (we don't do this at parse time). - // The manual tokenization is much faster than either Regex.Split - // or a series of String.Split calls. Lookups in the HashSet are much faster - // than a ton of calls to String.IndexOf (which .NET implements in native code). - // - // If we were to expand this set of keywords much farther, it would make sense - // to look into implementing the Aho-Corasick algorithm (the one used by antimalware - // engines), but Aho-Corasick is slower than the current approach for relatively - // small match sets. internal static string CheckSuspiciousContent(Ast scriptBlockAst) { - // Split the script block text into an array of elements that have - // a-Z A-Z dash. - string scriptBlockText = scriptBlockAst.Extent.Text; - IEnumerable elements = TokenizeWordElements(scriptBlockText); - - // First check for plain-text signatures - ParallelOptions parallelOptions = new ParallelOptions(); - string foundSignature = null; - - Parallel.ForEach(elements, parallelOptions, (element, loopState) => - { - if (foundSignature == null) - { - if (s_signatures.Contains(element)) - { - foundSignature = element; - loopState.Break(); - } - } - }); - - if (!String.IsNullOrEmpty(foundSignature)) + var foundSignature = SuspiciousContentChecker.Match(scriptBlockAst.Extent.Text); + if (foundSignature != null) { return foundSignature; } @@ -1556,106 +1523,290 @@ internal static string CheckSuspiciousContent(Ast scriptBlockAst) return null; } - // Extract tokens of a-z A-Z and dash - private static IEnumerable TokenizeWordElements(string scriptBlockText) + class SuspiciousContentChecker { - StringBuilder currentElement = new StringBuilder(100); + // Based on a (bad) random number generator, but good enough + // for our simple needs. + private const uint LCG = 31; - foreach (char character in scriptBlockText) + /// + /// Check if a hash code matches a small set of pre-computed hashes + /// for suspicious strings in a PowerShell script. + /// + /// If you need to add a new string, use the commented out + /// method HashNewPattern (commented out because it's dead + /// code - needed only to generate this switch statement below.) + /// + /// The string matching the hash, or null. + static string LookupHash(uint h) { - if ((character >= 'a') && - (character <= 'z')) - { - // Capture lowercase a-z - currentElement.Append(character); - continue; - } - else if ((character >= 'A') && - (character <= 'Z')) - { - // Capture uppercase A-Z - currentElement.Append(character); - continue; - } - else if (character == '-') + switch (h) { - // Capture dash - currentElement.Append(character); - continue; - } - else - { - // We hit a space or something else - // Only add if the current element is 4 characters or more - // (the length of the shortest string we're looking for) - if (currentElement.Length >= 4) - { - yield return currentElement.ToString(); - } - - currentElement.Clear(); + // Calling Add-Type + case 3012981990: return "Add-Type"; + case 3359423881: return "DllImport"; + + // Doing dynamic assembly building / method indirection + case 2713126922: return "DefineDynamicAssembly"; + case 2407049616: return "DefineDynamicModule"; + case 3276870517: return "DefineType"; + case 419507039: return "DefineConstructor"; + case 1370182198: return "CreateType"; + case 1973546644: return "DefineLiteral"; + case 3276413244: return "DefineEnum"; + case 2785322015: return "DefineField"; + case 837002512: return "ILGenerator"; + case 3117011: return "Emit"; + case 883134515: return "UnverifiableCodeAttribute"; + case 2920989166: return "DefinePInvokeMethod"; + case 1996222179: return "GetTypes"; + case 3935635674: return "GetAssemblies"; + case 955534258: return "Methods"; + case 3368914227: return "Properties"; + + // Suspicious methods / properties on "Type" + case 398423780: return "GetConstructor"; + case 3761202703: return "GetConstructors"; + case 1998297230: return "GetDefaultMembers"; + case 1982269700: return "GetEvent"; + case 1320818671: return "GetEvents"; + case 1982805860: return "GetField"; + case 1337439631: return "GetFields"; + case 2784018083: return "GetInterface"; + case 2864332761: return "GetInterfaceMap"; + case 405214768: return "GetInterfaces"; + case 1534378352: return "GetMember"; + case 321088771: return "GetMembers"; + case 1534592951: return "GetMethod"; + case 327741340: return "GetMethods"; + case 1116240007: return "GetNestedType"; + case 243701964: return "GetNestedTypes"; + case 1077700873: return "GetProperties"; + case 1020114731: return "GetProperty"; + case 257791250: return "InvokeMember"; + case 3217683173: return "MakeArrayType"; + case 821968872: return "MakeByRefType"; + case 3538448099: return "MakeGenericType"; + case 3207725129: return "MakePointerType"; + case 1617553224: return "DeclaringMethod"; + case 3152745313: return "DeclaringType"; + case 4144122198: return "ReflectedType"; + case 3455789538: return "TypeHandle"; + case 624373608: return "TypeInitializer"; + case 637454598: return "UnderlyingSystemType"; + + // Doing things with System.Runtime.InteropServices + case 1855303451: return "InteropServices"; + case 839491486: return "Marshal"; + case 1928879414: return "AllocHGlobal"; + case 3180922282: return "PtrToStructure"; + case 1718292736: return "StructureToPtr"; + case 3390778911: return "FreeHGlobal"; + case 3111215263: return "IntPtr"; + + // General Obfuscation + case 1606191041: return "MemoryStream"; + case 2147536747: return "DeflateStream"; + case 1820815050: return "FromBase64String"; + case 3656724093: return "EncodedCommand"; + case 2920836328: return "Bypass"; + case 3473847323: return "ToBase64String"; + case 4192166699: return "ExpandString"; + case 2462813217: return "GetPowerShell"; + + // Suspicious Win32 API calls + case 2123968741: return "OpenProcess"; + case 3630248714: return "VirtualAlloc"; + case 3303847927: return "VirtualFree"; + case 512407217: return "WriteProcessMemory"; + case 2357873553: return "CreateUserThread"; + case 756544032: return "CloseHandle"; + case 3400025495: return "GetDelegateForFunctionPointer"; + case 314128220: return "kernel32"; + case 2469462534: return "CreateThread"; + case 3217199031: return "memcpy"; + case 2283745557: return "LoadLibrary"; + case 3317813738: return "GetModuleHandle"; + case 2491894472: return "GetProcAddress"; + case 1757922660: return "VirtualProtect"; + case 2693938383: return "FreeLibrary"; + case 2873914970: return "ReadProcessMemory"; + case 2717270220: return "CreateRemoteThread"; + case 2867203884: return "AdjustTokenPrivileges"; + case 2889068903: return "WriteByte"; + case 3667925519: return "WriteInt32"; + case 2742077861: return "OpenThreadToken"; + case 2826980154: return "PtrToString"; + case 3735047487: return "ZeroFreeGlobalAllocUnicode"; + case 788615220: return "OpenProcessToken"; + case 1264589033: return "GetTokenInformation"; + case 2165372045: return "SetThreadToken"; + case 197357349: return "ImpersonateLoggedOnUser"; + case 1259149099: return "RevertToSelf"; + case 2446460563: return "GetLogonSessionData"; + case 2534763616: return "CreateProcessWithToken"; + case 3512478977: return "DuplicateTokenEx"; + case 3126049082: return "OpenWindowStation"; + case 3990594194: return "OpenDesktop"; + case 3195806696: return "MiniDumpWriteDump"; + case 3990234693: return "AddSecurityPackage"; + case 611728017: return "EnumerateSecurityPackages"; + case 4283779521: return "GetProcessHandle"; + case 845600244: return "DangerousGetHandle"; + + // Crypto - ransomware, etc. + case 2691669189: return "CryptoServiceProvider"; + case 1413809388: return "Cryptography"; + case 4113841312: return "RijndaelManaged"; + case 1650652922: return "SHA1Managed"; + case 1759701889: return "CryptoStream"; + case 2439640460: return "CreateEncryptor"; + case 1446703796: return "CreateDecryptor"; + case 1638240579: return "TransformFinalBlock"; + case 1464730593: return "DeviceIoControl"; + case 3966822309: return "SetInformationProcess"; + case 851965993: return "PasswordDeriveBytes"; + + // Keylogging + case 793353336: return "GetAsyncKeyState"; + case 293877108: return "GetKeyboardState"; + case 2448894537: return "GetForegroundWindow"; + + // Using internal types + case 4059335458: return "BindingFlags"; + case 1085624182: return "NonPublic"; + + // Changing logging settings + case 904148605: return "ScriptBlockLogging"; + case 4150524432: return "LogPipelineExecutionDetails"; + case 3704712755: return "ProtectedEventLogging"; + + default: return null; } } - // Clean up any remaining tokens. - if (currentElement.Length > 0) + /// + /// Check the list of running hashes for any matches, but + /// only up to the limit of . + /// + /// If a hash matches, we ignore the possibility of a + /// collision. If the hash is acceptable, collisions will + /// be infrequent and we'll just log an occasionaly script + /// that isn't really suspicious. + /// + /// The string matching the hash, or null. + private static string CheckForMatches(uint[] runningHash, int upTo) { - yield return currentElement.ToString(); - } + var upToMax = runningHash.Length; + if (upTo == 0) upTo = upToMax; + else if (upTo > upToMax) upTo = upToMax; - yield break; - } + for (var i = 0; i < upTo; i++) + { + var result = LookupHash(runningHash[i]); + if (result != null) return result; + } - // Regular string signatures that can be detected with just string comparison. - private static HashSet s_signatures = new HashSet(StringComparer.OrdinalIgnoreCase) { - // Calling Add-Type - "Add-Type", "DllImport", + return null; + } - // Doing dynamic assembly building / method indirection - "DefineDynamicAssembly", "DefineDynamicModule", "DefineType", "DefineConstructor", "CreateType", - "DefineLiteral", "DefineEnum", "DefineField", "ILGenerator", "Emit", "UnverifiableCodeAttribute", - "DefinePInvokeMethod", "GetTypes", "GetAssemblies", "Methods", "Properties", + /// + /// Scan a string for suspicious content. + /// + /// This is based on the Rubin-Karp algorithm, but heavily + /// modified to support searching for multiple patterns at + /// the same time. + /// + /// The key difference from Rubin-Karp is that we don't undo + /// the hash of the first character as we shift along in the + /// input. + /// + /// Instead, we can rely on knowing we need the hashes for + /// shorter strings anyway, so we reuse their values in + /// computing the hash for the longer patterns. This lets us + /// use a much simpler hash as well - we can avoid the use of + /// mod. + /// + /// The string matching the hash, or null. + public static string Match(string text) + { + // The longest pattern is 29 characters. + // The values in the array are the computed hashes of length + // index-1 (so runningHash[0] holds the hash for length 1). + var runningHash = new uint[29]; + + int longestPossiblePattern = 0; + for (int i = 0; i < text.Length; i++) + { + uint h = text[i]; + if (h >= 'A' && h <= 'Z') + { + h = h | 0x20; // ToLower + } + else if (!((h >= 'a' && h <= 'z') || h == '-')) + { + // If the character isn't in any of our patterns, + // don't bother hashing and reset the running length. + longestPossiblePattern = 0; + continue; + } - // Suspicious methods / properties on "Type" - "GetConstructor", "GetConstructors", "GetDefaultMembers", "GetEvent", "GetEvents", "GetField", - "GetFields", "GetInterface", "GetInterfaceMap", "GetInterfaces", "GetMember", "GetMembers", - "GetMethod", "GetMethods", "GetNestedType", "GetNestedTypes", "GetProperties", "GetProperty", - "InvokeMember", "MakeArrayType", "MakeByRefType", "MakeGenericType", "MakePointerType", - "DeclaringMethod", "DeclaringType", "ReflectedType", "TypeHandle", "TypeInitializer", - "UnderlyingSystemType", + for (int j = Math.Min(i, runningHash.Length) - 1; j > 0; j--) + { + // Say our input is: `Emit` (our shortest pattern, len 4). + // Towards the end just before matching, we will: + // + // iter n: compute hash on `Emi` (len 3) + // iter n+1: compute hash on `Emit` (len 4) using hash from previous iteration (j-1) + // iter n+1: compute hash on `mit` (len 3) + // This overwrites the previous iteration, hence we go from longest to shortest. + // + // LCG comes from a trivial (bad) random number generator, + // but it's sufficient for us - the hashes for our patterns + // are unique, and processing of 2200 files found no false matches. + runningHash[j] = LCG * runningHash[j - 1] + h; + } - // Doing things with System.Runtime.InteropServices - "InteropServices", "Marshal", "AllocHGlobal", "PtrToStructure", "StructureToPtr", - "FreeHGlobal", "IntPtr", + runningHash[0] = h; - // General Obfuscation - "MemoryStream", "DeflateStream", "FromBase64String", "EncodedCommand", "Bypass", "ToBase64String", - "ExpandString", "GetPowerShell", + if (++longestPossiblePattern >= 4) + { + var result = CheckForMatches(runningHash, longestPossiblePattern); + if (result != null) return result; + } + } - // Suspicious Win32 API calls - "OpenProcess", "VirtualAlloc", "VirtualFree", "WriteProcessMemory", "CreateUserThread", "CloseHandle", - "GetDelegateForFunctionPointer", "kernel32", "CreateThread", "memcpy", "LoadLibrary", "GetModuleHandle", - "GetProcAddress", "VirtualProtect", "FreeLibrary", "ReadProcessMemory", "CreateRemoteThread", - "AdjustTokenPrivileges", "WriteByte", "WriteInt32", "OpenThreadToken", "PtrToString", - "FreeHGlobal", "ZeroFreeGlobalAllocUnicode", "OpenProcessToken", "GetTokenInformation", "SetThreadToken", - "ImpersonateLoggedOnUser", "RevertToSelf", "GetLogonSessionData", "CreateProcessWithToken", - "DuplicateTokenEx", "OpenWindowStation", "OpenDesktop", "MiniDumpWriteDump", "AddSecurityPackage", - "EnumerateSecurityPackages", "GetProcessHandle", "DangerousGetHandle", + return CheckForMatches(runningHash, 0); + } - // Crypto - ransomware, etc. - "CryptoServiceProvider", "Cryptography", "RijndaelManaged", "SHA1Managed", "CryptoStream", - "CreateEncryptor", "CreateDecryptor", "TransformFinalBlock", "DeviceIoControl", "SetInformationProcess", - "PasswordDeriveBytes", +#if false + //This code can be used when adding a new pattern. + internal static uint HashNewPattern(string pattern) + { + char ToLower(char c) + { + if (c >= 'A' && c <= 'Z') + { + c = (char) (c | 0x20); + } + return c; + } - // Keylogging - "GetAsyncKeyState", "GetKeyboardState", "GetForegroundWindow", + if (pattern.Length > 29) { + throw new Exception("Update runningHash in match for new longest string.\n" + + "Also a longer maximum length could greatly affect the performance of this algorithm, so only increase with care."); + } - // Using internal types - "BindingFlags", "NonPublic", + uint h = 0; + foreach (var c in pattern) + { + h = LCG * h + ToLower(c); + } - // Changing logging settings - "ScriptBlockLogging", "LogPipelineExecutionDetails", "ProtectedEventLogging", - }; + return h; + } +#endif + } internal static bool ScriptBlockLoggingExplicitlyDisabled() { From 3771c88da34755c492c2a35a7d6fa93131e2077e Mon Sep 17 00:00:00 2001 From: Dongbo Wang Date: Thu, 2 Nov 2017 18:03:34 -0700 Subject: [PATCH 085/617] Always run test with crossgen'ed assemblies in CI (#5315) --- .../Scripting.Classes.BasicParsing.Tests.ps1 | 22 ------------- .../scripting.Classes.inheritance.tests.ps1 | 22 ------------- .../HelpersLanguage/HelpersLanguage.psm1 | 33 +------------------ tools/travis.ps1 | 18 +--------- 4 files changed, 2 insertions(+), 93 deletions(-) diff --git a/test/powershell/Language/Classes/Scripting.Classes.BasicParsing.Tests.ps1 b/test/powershell/Language/Classes/Scripting.Classes.BasicParsing.Tests.ps1 index a06a38bceb6..b9655a8bccc 100644 --- a/test/powershell/Language/Classes/Scripting.Classes.BasicParsing.Tests.ps1 +++ b/test/powershell/Language/Classes/Scripting.Classes.BasicParsing.Tests.ps1 @@ -2,24 +2,6 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # -try { -# -# CrossGen'ed assemblies cause a hang to happen intermittently when running this test suite in Linux and macOS. -# The issue has been reported to CoreCLR team. We need to work around it for now with the following approach: -# 1. For pull request and push commit, build without '-CrossGen' and run the parsing tests -# 2. For daily build, build with '-CrossGen' but don't run the parsing tests -# In this way, we will continue to exercise these parsing tests for each CI build, and skip them for daily -# build to avoid a hang. -# Note: this change should be reverted once the 'CrossGen' issue is fixed by CoreCLR. The issue is tracked by -# https://github.com/dotnet/coreclr/issues/9745 -# -$isDailyBuild = $env:TRAVIS_EVENT_TYPE -eq 'cron' -or $env:TRAVIS_EVENT_TYPE -eq 'api' -$defaultParamValues = $PSdefaultParameterValues.Clone() -$IsSkipped = (!$IsWindows -and $isDailyBuild) -$PSDefaultParameterValues["it:skip"] = $IsSkipped -$PSDefaultParameterValues["ShouldBeParseError:SkipInTravisFullBuild"] = $IsSkipped - - Describe 'Positive Parse Properties Tests' -Tags "CI" { It 'PositiveParsePropertiesTest' { # Just a bunch of random basic things here @@ -859,7 +841,3 @@ Describe 'variable analysis' -Tags "CI" { [B]::getA().getFoo() | Should Be 'foo' } } - -} finally { - $global:PSdefaultParameterValues = $defaultParamValues -} diff --git a/test/powershell/Language/Classes/scripting.Classes.inheritance.tests.ps1 b/test/powershell/Language/Classes/scripting.Classes.inheritance.tests.ps1 index cf7e7f1b4cd..13e71cc3bbf 100644 --- a/test/powershell/Language/Classes/scripting.Classes.inheritance.tests.ps1 +++ b/test/powershell/Language/Classes/scripting.Classes.inheritance.tests.ps1 @@ -2,24 +2,6 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # -try { -# -# CrossGen'ed assemblies cause a hang to happen intermittently when running this test suite in Linux and macOS. -# The issue has been reported to CoreCLR team. We need to work around it for now with the following approach: -# 1. For pull request and push commit, build without '-CrossGen' and run the parsing tests -# 2. For daily build, build with '-CrossGen' but don't run the parsing tests -# In this way, we will continue to exercise these parsing tests for each CI build, and skip them for daily -# build to avoid a hang. -# Note: this change should be reverted once the 'CrossGen' issue is fixed by CoreCLR. The issue is tracked by -# https://github.com/dotnet/coreclr/issues/9745 -# -$isDailyBuild = $env:TRAVIS_EVENT_TYPE -eq 'cron' -or $env:TRAVIS_EVENT_TYPE -eq 'api' -$defaultParamValues = $PSdefaultParameterValues.Clone() -$IsSkipped = (!$IsWindows -and $isDailyBuild) -$PSDefaultParameterValues["it:skip"] = $IsSkipped -$PSDefaultParameterValues["ShouldBeParseError:SkipInTravisFullBuild"] = $IsSkipped - - Describe 'Classes inheritance syntax' -Tags "CI" { It 'Base types' { @@ -539,7 +521,3 @@ class Derived : Base $sb.Invoke() | Should Be 200 } } - -} finally { - $global:PSdefaultParameterValues = $defaultParamValues -} diff --git a/test/tools/Modules/HelpersLanguage/HelpersLanguage.psm1 b/test/tools/Modules/HelpersLanguage/HelpersLanguage.psm1 index d4ee9eb2a24..6343395e22f 100644 --- a/test/tools/Modules/HelpersLanguage/HelpersLanguage.psm1 +++ b/test/tools/Modules/HelpersLanguage/HelpersLanguage.psm1 @@ -65,40 +65,9 @@ function ShouldBeParseError # This is a temporary solution after moving type creation from parse time to runtime [switch]$SkipAndCheckRuntimeError, # for test coverarage purpose, tests validate columnNumber or offset - [switch]$CheckColumnNumber, - # Skip this test in Travis CI nightly build - [switch]$SkipInTravisFullBuild + [switch]$CheckColumnNumber ) - # - # CrossGen'ed assemblies cause a hang to happen when running tests with this helper function in Linux and macOS. - # The issue has been reported to CoreCLR team. We need to work around it for now with the following approach: - # 1. For pull request and push commit, build without '-CrossGen' and run the parsing tests - # 2. For nightly build, build with '-CrossGen' but don't run the parsing tests - # In this way, we will continue to exercise these parsing tests for each CI build, and skip them for nightly - # build to avoid a hang. - # Note: this change should be reverted once the 'CrossGen' issue is fixed by CoreCLR. The issue is tracked by - # https://github.com/dotnet/coreclr/issues/9745 - # - if ($SkipInTravisFullBuild) { - ## Report that we skipped the tests and return - ## be sure to report the same number of tests - ## it should have the same appearance as if the tests were run - Context "Parse error expected: <<$src>>" { - if ($SkipAndCheckRuntimeError) - { - It "error should happen at parse time, not at runtime" -Skip {} - } - It "Error count" -Skip { } - foreach($expectedError in $expectedErrors) - { - It "Error Id" -Skip { } - It "Error position" -Skip { } - } - } - return - } - Context "Parse error expected: <<$src>>" { # Test case error if this fails $expectedErrors.Count | Should Be $expectedOffsets.Count diff --git a/tools/travis.ps1 b/tools/travis.ps1 index 73c3a74808e..dc7815ae02d 100644 --- a/tools/travis.ps1 +++ b/tools/travis.ps1 @@ -173,23 +173,11 @@ elseif($Stage -eq 'Build') Write-Host -Foreground Green "Executing travis.ps1 `$isPR='$isPr' `$isFullBuild='$isFullBuild' - $commitMessage" $output = Split-Path -Parent (Get-PSOutput -Options (New-PSOptions)) - # CrossGen'ed assemblies cause a hang to happen intermittently when running powershell class - # basic parsing tests in Linux/macOS. The hang seems to happen when generating dynamic assemblies. - # This issue has been reported to CoreCLR team. We need to work around it for now because - # the Travis CI build failures caused by this is draining our builder resource and severely - # affect our daily work. The workaround is: - # 1. For pull request and push commit, build without '-CrossGen' and run the parsing tests - # 2. For nightly build, build with '-CrossGen' but don't run the parsing tests - # With this workaround, CI builds triggered by pull request and push commit will exercise - # the parsing tests with IL assemblies, while nightly builds will exercise CrossGen'ed assemblies - # without running those class parsing tests so as to avoid the hang. - # NOTE: this change should be reverted once the 'CrossGen' issue is fixed by CoreCLR. The issue - # is tracked by https://github.com/dotnet/coreclr/issues/9745 $originalProgressPreference = $ProgressPreference $ProgressPreference = 'SilentlyContinue' try { ## We use CrossGen build to run tests only if it's the daily build. - Start-PSBuild -CrossGen:$isDailyBuild -PSModuleRestore + Start-PSBuild -CrossGen -PSModuleRestore } finally{ $ProgressPreference = $originalProgressPreference @@ -245,10 +233,6 @@ elseif($Stage -eq 'Build') } if (-not $isPr) { - # Run 'CrossGen' for push commit, so that we can generate package. - # It won't rebuild powershell, but only CrossGen the already built assemblies. - if (-not $isDailyBuild) { Start-PSBuild -CrossGen } - $packageParams = @{} if($env:TRAVIS_BUILD_NUMBER) { From c9f83fecfcec38fe678356ade01177ed1621b416 Mon Sep 17 00:00:00 2001 From: Raphael Date: Fri, 3 Nov 2017 09:08:37 +0100 Subject: [PATCH 086/617] Add Remove-Alias Command (#5143) * Add Remove-Alias Command. Add Remove-Alias Test. Add Remove-Alias to .psd1. * Fix code-formatting. Fix ErrorAction on Remove-Alias instead of preference variable. Remove unnecessary Get-Alias calls. Switch Force parameter to auto property. Add ValueFromPipeline to Remove-Alias Name parameter. * Remove empty lines. Add Remove-Alias to Unix Module .psd1. Add Remove-Alias to approved Commands test. Remove Try/Catch for SessionstateException. Add WriteError for aliasnotfound exception. * Add ErrorAction Stop to all Get-Alias and Set-Alias Cmdlets in all tests for consistency. Add Should BeNullOrEmpty to "should throw if alias does not exist" test to verify that foo alias really is not there before removing it. * Changed Remove-Alias parameter Name to String-Array. Changed Cmdlet Process Logic to work with String Array. Added Alias named "ral". Added test case for Alias "ral". Added "ral" Alias to list of approved Aliases. Replaced foo and bar values in all tests with better names. * Remove "ral"-alias test as this is covered in DefaultCommands.Tests.ps1. Add test for removing multiple alias at once. Fix wrong curly braces positioning. * Remove $FullCLR in DefaultCommands.Tests.ps1 for Remove-Alias and "ral" alias. * Add Alias "ral" to Remove-Alias Cmdlet. * Remove "ral" alias as this is handled by using the [Alias()] attribute on the Remove-Alias Cmdlet. * Replace alias names used in Remove-Alias Cmdlet tests with GUIDs to avoid collisions --- .../commands/utility/RemoveAliasCommand.cs | 72 +++++++++++++++++++ .../Microsoft.PowerShell.Utility.psd1 | 2 +- .../Microsoft.PowerShell.Utility.psd1 | 2 +- .../Remove-Alias.Tests.ps1 | 63 ++++++++++++++++ .../engine/Basic/DefaultCommands.Tests.ps1 | 1 + 5 files changed, 138 insertions(+), 2 deletions(-) create mode 100644 src/Microsoft.PowerShell.Commands.Utility/commands/utility/RemoveAliasCommand.cs create mode 100644 test/powershell/Modules/Microsoft.PowerShell.Utility/Remove-Alias.Tests.ps1 diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/RemoveAliasCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/RemoveAliasCommand.cs new file mode 100644 index 00000000000..92f0c1fbf2e --- /dev/null +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/RemoveAliasCommand.cs @@ -0,0 +1,72 @@ +using System; +using System.Management.Automation; +using System.Management.Automation.Internal; + +namespace Microsoft.PowerShell.Commands +{ + /// + /// The implementation of the "Remove-Alias" cmdlet. + /// + /// + [Cmdlet(VerbsCommon.Remove, "Alias", DefaultParameterSetName = "Default", HelpUri = "")] + [Alias("ral")] + public class RemoveAliasCommand : PSCmdlet + { + #region Parameters + + /// + /// The alias name to remove. + /// + [Parameter(Position = 0, Mandatory = true, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true)] + public string[] Name { get; set; } + + /// + /// The scope parameter for the command determines + /// which scope the alias is removed from. + /// + [Parameter] + public string Scope { get; set; } + + /// + /// If set to true and an existing alias of the same name exists + /// and is ReadOnly, it will still be deleted. + /// + [Parameter] + public SwitchParameter Force { get; set; } + + #endregion Parameters + + #region Command code + + /// + /// The main processing loop of the command. + /// + protected override void ProcessRecord() + { + foreach(string aliasName in Name) + { + AliasInfo existingAlias = null; + if (String.IsNullOrEmpty(Scope)) + { + existingAlias = SessionState.Internal.GetAlias(aliasName); + } + else + { + existingAlias = SessionState.Internal.GetAliasAtScope(aliasName, Scope); + } + + if (existingAlias != null) + { + SessionState.Internal.RemoveAlias(aliasName, Force); + } + else + { + ItemNotFoundException notAliasFound = new ItemNotFoundException(StringUtil.Format(AliasCommandStrings.NoAliasFound, "name", aliasName)); + ErrorRecord error = new ErrorRecord(notAliasFound, "ItemNotFoundException",ErrorCategory.ObjectNotFound, aliasName); + WriteError(error); + } + } + } + #endregion Command code + } +} diff --git a/src/Modules/Unix/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 b/src/Modules/Unix/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 index 9e94151edd7..65f4c80fc5b 100644 --- a/src/Modules/Unix/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 +++ b/src/Modules/Unix/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 @@ -22,7 +22,7 @@ CmdletsToExport= "Format-List", "Format-Custom", "Format-Table", "Format-Wide", "Get-PSBreakpoint", "Remove-PSBreakpoint", "Enable-PSBreakpoint", "Disable-PSBreakpoint", "Get-PSCallStack", "Send-MailMessage", "Get-TraceSource", "Set-TraceSource", "Trace-Command", "Get-FileHash", "Get-Runspace", "Debug-Runspace", "Enable-RunspaceDebug", "Disable-RunspaceDebug", - "Get-RunspaceDebug", "Wait-Debugger" , "Get-Uptime", "New-TemporaryFile", "Get-Verb", "Format-Hex" + "Get-RunspaceDebug", "Wait-Debugger" , "Get-Uptime", "New-TemporaryFile", "Get-Verb", "Format-Hex", "Remove-Alias" FunctionsToExport= "Import-PowerShellDataFile" AliasesToExport= "fhx" NestedModules="Microsoft.PowerShell.Commands.Utility.dll","Microsoft.PowerShell.Utility.psm1" diff --git a/src/Modules/Windows-Core/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 b/src/Modules/Windows-Core/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 index a47f81755ab..6aa5b03d76a 100644 --- a/src/Modules/Windows-Core/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 +++ b/src/Modules/Windows-Core/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 @@ -22,7 +22,7 @@ CmdletsToExport= "Format-List", "Format-Custom", "Format-Table", "Format-Wide", "Get-PSBreakpoint", "Remove-PSBreakpoint", "New-TemporaryFile", "Enable-PSBreakpoint", "Disable-PSBreakpoint", "Get-PSCallStack", "Send-MailMessage", "Get-TraceSource", "Set-TraceSource", "Trace-Command", "Get-FileHash", "Unblock-File", "Get-Runspace", "Debug-Runspace", "Enable-RunspaceDebug", "Disable-RunspaceDebug", - "Get-RunspaceDebug", "Wait-Debugger" , "Get-Uptime", "Get-Verb", "Format-Hex" + "Get-RunspaceDebug", "Wait-Debugger" , "Get-Uptime", "Get-Verb", "Format-Hex", "Remove-Alias" FunctionsToExport= "ConvertFrom-SddlString" AliasesToExport= "fhx" NestedModules="Microsoft.PowerShell.Commands.Utility.dll","Microsoft.PowerShell.Utility.psm1" diff --git a/test/powershell/Modules/Microsoft.PowerShell.Utility/Remove-Alias.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Utility/Remove-Alias.Tests.ps1 new file mode 100644 index 00000000000..913cf57c7aa --- /dev/null +++ b/test/powershell/Modules/Microsoft.PowerShell.Utility/Remove-Alias.Tests.ps1 @@ -0,0 +1,63 @@ +Describe "Remove-Alias" -Tags "CI" { + + BeforeAll { + $testAliasName = (New-Guid).Guid + } + + It "Remove-Alias should remove a non-readonly alias"{ + { + Set-Alias -Name $testAliasName -Value "Remove-Alias" -ErrorAction Stop + Remove-Alias -Name $testAliasName -ErrorAction Stop + Get-Alias -Name $testAliasName -ErrorAction Stop + } | ShouldBeErrorId 'ItemNotFoundException,Microsoft.PowerShell.Commands.GetAliasCommand' + } + + It "Remove-Alias should throw on a readonly alias"{ + { + Set-Alias -Name $testAliasName -Value "Remove-Alias" -Option ReadOnly -ErrorAction Stop + Remove-Alias -Name $testAliasName -ErrorAction Stop + } | ShouldBeErrorId 'AliasNotRemovable,Microsoft.PowerShell.Commands.RemoveAliasCommand' + } + + It "Remove-Alias should remove a non-readonly alias with force"{ + { + Set-Alias -Name $testAliasName -Value "Remove-Alias" -ErrorAction Stop + Remove-Alias -Name $testAliasName -Force -ErrorAction Stop + Get-Alias -Name $testAliasName -ErrorAction Stop + } | ShouldBeErrorId 'ItemNotFoundException,Microsoft.PowerShell.Commands.GetAliasCommand' + } + + It "Remove-Alias should remove a readonly alias with force"{ + { + Set-Alias -Name $testAliasName -Value "Remove-Alias" -Option ReadOnly -ErrorAction Stop + Remove-Alias -Name $testAliasName -Force -ErrorAction Stop + Get-Alias -Name $testAliasName -ErrorAction Stop + } | ShouldBeErrorId 'ItemNotFoundException,Microsoft.PowerShell.Commands.GetAliasCommand' + } + + It "Remove-Alias should throw if alias does not exist"{ + { + Get-Alias -Name $testAliasName -ErrorAction SilentlyContinue | Should BeNullorEmpty + Remove-Alias -Name $testAliasName -ErrorAction Stop + } | ShouldBeErrorId 'ItemNotFoundException,Microsoft.PowerShell.Commands.RemoveAliasCommand' + } + + It "Remove-Alias should remove multiple alias at once"{ + { + Set-Alias -Name "$testAliasName" -Value "Remove-Alias" -ErrorAction Stop + Set-Alias -Name "$testAliasName-2" -Value "Remove-Alias" -ErrorAction Stop + Set-Alias -Name "$testAliasName-3" -Value "Remove-Alias" -ErrorAction Stop + Remove-Alias -Name "$testAliasName","$testAliasName-2","$testAliasName-3" -ErrorAction Stop + Get-Alias -Name "$testAliasName" -ErrorAction Stop | ShouldBeErrorId 'ItemNotFoundException,Microsoft.PowerShell.Commands.GetAliasCommand' + Get-Alias -Name "$testAliasName-2" -ErrorAction Stop | ShouldBeErrorId 'ItemNotFoundException,Microsoft.PowerShell.Commands.GetAliasCommand' + Get-Alias -Name "$testAliasName-3" -ErrorAction Stop | ShouldBeErrorId 'ItemNotFoundException,Microsoft.PowerShell.Commands.GetAliasCommand' + } + } + + It "Remove-Alias should throw on out-of-range scope"{ + { + Set-Alias -Name $testAliasName -Value "Remove-Alias" -ErrorAction Stop + Remove-Alias -Name $testAliasName -Scope 99999 -ErrorAction Stop + } | ShouldBeErrorId "ArgumentOutOfRange,Microsoft.PowerShell.Commands.RemoveAliasCommand" + } +} diff --git a/test/powershell/engine/Basic/DefaultCommands.Tests.ps1 b/test/powershell/engine/Basic/DefaultCommands.Tests.ps1 index d0edc2aefe9..f35b1b4778e 100644 --- a/test/powershell/engine/Basic/DefaultCommands.Tests.ps1 +++ b/test/powershell/engine/Basic/DefaultCommands.Tests.ps1 @@ -363,6 +363,7 @@ Describe "Verify approved aliases list" -Tags "CI" { "Cmdlet", "Register-ObjectEvent", , $($FullCLR -or $CoreWindows -or $CoreUnix) "Cmdlet", "Register-PSSessionConfiguration", , $($FullCLR -or $CoreWindows -or $CoreUnix) "Cmdlet", "Register-WmiEvent", , $($FullCLR ) +"Cmdlet", "Remove-Alias", , $( $CoreWindows -or $CoreUnix) "Cmdlet", "Remove-Computer", , $($FullCLR ) "Cmdlet", "Remove-Event", , $($FullCLR -or $CoreWindows -or $CoreUnix) "Cmdlet", "Remove-EventLog", , $($FullCLR ) From da5a1a60154cd624efb05d45d2c9e331ebe4abd9 Mon Sep 17 00:00:00 2001 From: Dongbo Wang Date: Fri, 3 Nov 2017 08:47:26 -0700 Subject: [PATCH 087/617] Update 'installpsh-suse.sh' and remove 'download.sh' (#5309) - Update `installpsh-suse.sh` to work with the .tar.gz binary archive. - Remove `download.sh` as it's not used anywhere now. (checked with PowerShellGet and OneGet, they are using a local copy of download.sh). --- .spelling | 5 -- demos/install/README.md | 6 +- docs/building/linux.md | 2 +- tools/download.sh | 151 ------------------------------------- tools/installpsh-debian.sh | 4 +- tools/installpsh-osx.sh | 4 +- tools/installpsh-redhat.sh | 4 +- tools/installpsh-suse.sh | 46 ++++++++--- 8 files changed, 49 insertions(+), 173 deletions(-) delete mode 100755 tools/download.sh diff --git a/.spelling b/.spelling index 3926b6f90e3..802cdb665f7 100644 --- a/.spelling +++ b/.spelling @@ -406,11 +406,6 @@ u - demos/DSC/readme.md #endregion -#region demos/install/README.md Overrides - - demos/install/README.md -download.sh -#endregion - #region demos/python/README.md Overrides - demos/python/README.md _script.ps1 diff --git a/demos/install/README.md b/demos/install/README.md index 54049e09158..94a780644a5 100644 --- a/demos/install/README.md +++ b/demos/install/README.md @@ -1,5 +1,5 @@ -## Install demo +# Install demo -For Windows refer to the [installation instructions](https://github.com/PowerShell/PowerShell/blob/master/docs/installation/windows.md) +For Windows refer to the [installation instructions](https://github.com/PowerShell/PowerShell/blob/master/docs/installation/windows.md). -For Linux, using [download.sh](https://github.com/PowerShell/PowerShell/blob/master/tools/download.sh) is the best way to deploy PowerShell bits \ No newline at end of file +For Linux, using [`install-powershell.sh`](https://github.com/PowerShell/PowerShell/blob/master/tools/install-powershell-readme.md) is the best way to deploy PowerShell bits. diff --git a/docs/building/linux.md b/docs/building/linux.md index 9b8ebb8a2c7..55870983860 100644 --- a/docs/building/linux.md +++ b/docs/building/linux.md @@ -25,7 +25,7 @@ Installing the toolchain is as easy as running `Start-PSBootstrap` in PowerShell Of course, this requires a self-hosted copy of PowerShell on Linux. Fortunately, this is as easy as [downloading and installing the package](../installation/linux.md). -The `./tools/download.sh` script will also install the PowerShell package. +The `./tools/install-powershell.sh` script will also install the PowerShell package. In Bash: diff --git a/tools/download.sh b/tools/download.sh deleted file mode 100755 index 30230f97c97..00000000000 --- a/tools/download.sh +++ /dev/null @@ -1,151 +0,0 @@ -#!/usr/bin/env bash - -# Let's quit on interrupt of subcommands -trap ' - trap - INT # restore default INT handler - echo "Interrupted" - kill -s INT "$$" -' INT - -get_url() { - fork=$2 - echo "https://github.com/$fork/PowerShell/releases/download/$3/$1" -} - -fork="PowerShell" -release=v6.0.0-beta.9 -# Get OS specific asset ID and package name -case "$OSTYPE" in - linux*) - source /etc/os-release - # Install curl and wget to download package - case "$ID" in - centos*) - if ! hash curl 2>/dev/null; then - echo "curl not found, installing..." - sudo yum install -y curl - fi - - powershell-6.0.0_beta.9-1.rhel.7.x86_64.rpm - ;; - ubuntu) - if ! hash curl 2>/dev/null; then - echo "curl not found, installing..." - sudo apt-get install -y curl - fi - - case "$VERSION_ID" in - 14.04) - package=powershell_6.0.0-beta.9-1.ubuntu.14.04_amd64.deb - ;; - 16.04) - package=powershell_6.0.0-beta.9-1.ubuntu.16.04_amd64.deb - ;; - *) - echo "Ubuntu $VERSION_ID is not supported!" >&2 - exit 2 - esac - ;; - opensuse) - if ! hash curl 2>/dev/null; then - echo "curl not found, installing..." - sudo zypper install -y curl - fi - - - case "$VERSION_ID" in - 42.1) - package=powershell-6.0.0_beta.6-1.suse.42.1.x86_64.rpm - release=v6.0.0-beta.6 - ;; - *) - echo "OpenSUSE $VERSION_ID is not supported!" >&2 - exit 2 - esac - ;; - *) - echo "$NAME is not supported!" >&2 - exit 2 - esac - ;; - darwin*) - # We don't check for curl as macOS should have a system version - package=powershell-6.0.0-beta.9-osx.10.12-x64.pkg - ;; - *) - echo "$OSTYPE is not supported!" >&2 - exit 2 - ;; -esac - -curl -L -o "$package" $(get_url "$package" "$fork" "$release") - -if [[ ! -r "$package" ]]; then - echo "ERROR: $package failed to download! Aborting..." >&2 - exit 1 -fi - -# Installs PowerShell package -case "$OSTYPE" in - linux*) - source /etc/os-release - # Install dependencies - echo "Installing PowerShell with sudo..." - case "$ID" in - centos) - # yum automatically resolves dependencies for local packages - sudo yum install "./$package" - ;; - ubuntu) - # dpkg does not automatically resolve dependencies, but spouts ugly errors - sudo dpkg -i "./$package" &> /dev/null - # Resolve dependencies - sudo apt-get install -f - ;; - opensuse) - # Install the Microsoft public key so that zypper trusts the package - sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc - # zypper automatically resolves dependencies for local packages - sudo zypper --non-interactive install "./$package" &> /dev/null - ;; - *) - esac - ;; - darwin*) - patched=0 - if hash brew 2>/dev/null; then - if [[ ! -d $(brew --prefix openssl) ]]; then - echo "Installing OpenSSL with brew..." - if ! brew install openssl; then - echo "ERROR: OpenSSL failed to install! Crypto functions will not work..." >&2 - # Don't abort because it is not fatal - elif ! brew install curl --with-openssl; then - echo "ERROR: curl failed to build against OpenSSL; SSL functions will not work..." >&2 - # Still not fatal - else - # OpenSSL installation succeeded; remember to patch System.Net.Http after PowerShell installation - patched=1 - fi - fi - - else - echo "ERROR: brew not found! OpenSSL may not be available..." >&2 - # Don't abort because it is not fatal - fi - - echo "Installing $package with sudo ..." - sudo installer -pkg "./$package" -target / - if [[ $patched -eq 1 ]]; then - echo "Patching System.Net.Http for libcurl and OpenSSL..." - find /usr/local/microsoft/powershell -name System.Net.Http.Native.dylib | xargs sudo install_name_tool -change /usr/lib/libcurl.4.dylib /usr/local/opt/curl/lib/libcurl.4.dylib - fi - ;; -esac - -powershell -noprofile -c '"Congratulations! PowerShell is installed at $PSHOME"' -success=$? - -if [[ "$success" != 0 ]]; then - echo "ERROR: PowerShell failed to install!" >&2 - exit "$success" -fi diff --git a/tools/installpsh-debian.sh b/tools/installpsh-debian.sh index 2d82ff6009b..23725a9a947 100755 --- a/tools/installpsh-debian.sh +++ b/tools/installpsh-debian.sh @@ -132,7 +132,9 @@ $SUDO apt-get update # Install PowerShell $SUDO apt-get install -y powershell -pwsh -noprofile -c '"Congratulations! PowerShell is installed at $PSHOME"' +pwsh -noprofile -c '"Congratulations! PowerShell is installed at $PSHOME. +Run `"pwsh`" to start a PowerShell session."' + success=$? if [[ "$success" != 0 ]]; then diff --git a/tools/installpsh-osx.sh b/tools/installpsh-osx.sh index 7dc223b77ec..62a6fca1706 100755 --- a/tools/installpsh-osx.sh +++ b/tools/installpsh-osx.sh @@ -165,7 +165,9 @@ if [[ "'$*'" =~ includeide ]] ; then code --install-extension ms-vscode.PowerShell fi -pwsh -noprofile -c '"Congratulations! PowerShell is installed at $PSHOME"' +pwsh -noprofile -c '"Congratulations! PowerShell is installed at $PSHOME. +Run `"pwsh`" to start a PowerShell session."' + success=$? if [[ "$success" != 0 ]]; then diff --git a/tools/installpsh-redhat.sh b/tools/installpsh-redhat.sh index 40e29844d14..d152dd0284f 100755 --- a/tools/installpsh-redhat.sh +++ b/tools/installpsh-redhat.sh @@ -129,7 +129,9 @@ echo "*** Setting up PowerShell Core repo..." $SUDO curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/microsoft.repo $SUDO yum install -y powershell -pwsh -noprofile -c '"Congratulations! PowerShell is installed at $PSHOME"' +pwsh -noprofile -c '"Congratulations! PowerShell is installed at $PSHOME. +Run `"pwsh`" to start a PowerShell session."' + success=$? if [[ "$success" != 0 ]]; then diff --git a/tools/installpsh-suse.sh b/tools/installpsh-suse.sh index 067dea491b8..12813fd5ab4 100755 --- a/tools/installpsh-suse.sh +++ b/tools/installpsh-suse.sh @@ -22,7 +22,7 @@ VERSION="1.1.2" gitreposubpath="PowerShell/PowerShell/master" gitreposcriptroot="https://raw.githubusercontent.com/$gitreposubpath/tools" thisinstallerdistro=suse -repobased=true +repobased=false gitscriptname="installpsh-suse.psh" echo @@ -116,15 +116,22 @@ fi #END Verify The Installer Choice +echo +echo "*** Installing prerequisites for PowerShell Core..." +$SUDO zypper --non-interactive install \ + glibc-locale \ + glibc-i18ndata \ + tar \ + curl \ + libunwind \ + libicu \ + openssl \ + && zypper --non-interactive clean --all ##END Check requirements and prerequisites echo echo "*** Installing PowerShell Core for $DistroBasedOn..." -if ! hash curl 2>/dev/null; then - echo "curl not found, installing..." - $SUDO zypper install -y curl -fi release=`curl https://api.github.com/repos/powershell/powershell/releases/latest | sed '/tag_name/!d' | sed s/\"tag_name\"://g | sed s/\"//g | sed s/v//g | sed s/,//g | sed s/\ //g` #REPO BASED (Not ready yet) @@ -140,8 +147,8 @@ release=`curl https://api.github.com/repos/powershell/powershell/releases/latest #$SUDO zypper --non-interactive install powershell #DIRECT DOWNLOAD -packagerel=`echo $release | sed 's/-/_/'` -package=powershell-${packagerel}-1.suse.42.1.x86_64.rpm +pwshlink=/usr/bin/pwsh +package=powershell-${release}-linux-x64.tar.gz downloadurl=https://github.com/PowerShell/PowerShell/releases/download/v$release/$package echo "Destination file: $package" @@ -154,10 +161,29 @@ if [[ ! -r "$package" ]]; then exit 1 fi -sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc -sudo zypper --non-interactive install "./$package" +## Create the target folder where powershell will be placed +$SUDO mkdir -p /opt/microsoft/powershell/$release +## Expand powershell to the target folder +$SUDO tar zxf $package -C /opt/microsoft/powershell/$release + +## Change the mode of 'pwsh' to 'rwxr-xr-x' to allow execution +$SUDO chmod 755 /opt/microsoft/powershell/$release/pwsh +## Create the symbolic link that points to powershell +$SUDO ln -s /opt/microsoft/powershell/$release/pwsh $pwshlink + +## Add the symbolic link path to /etc/shells +if [ ! -f /etc/shells ] ; then + echo $pwshlink | $SUDO tee /etc/shells ; +else + grep -q "^${pwshlink}$" /etc/shells || echo $pwshlink | $SUDO tee --append /etc/shells > /dev/null ; +fi + +## Remove the downloaded package file +rm -f $package + +pwsh -noprofile -c '"Congratulations! PowerShell is installed at $PSHOME. +Run `"pwsh`" to start a PowerShell session."' -powershell -noprofile -c '"Congratulations! PowerShell is installed at $PSHOME"' success=$? if [[ "$success" != 0 ]]; then From 819f9a3edf4c06254ae5999d034031397137c40b Mon Sep 17 00:00:00 2001 From: Ilya Date: Fri, 3 Nov 2017 21:52:06 +0400 Subject: [PATCH 088/617] Add help strings in PowerShell banner (#5275) --- .../resources/ManagedEntranceStrings.resx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.PowerShell.ConsoleHost/resources/ManagedEntranceStrings.resx b/src/Microsoft.PowerShell.ConsoleHost/resources/ManagedEntranceStrings.resx index ac73867b960..46e84767cb0 100644 --- a/src/Microsoft.PowerShell.ConsoleHost/resources/ManagedEntranceStrings.resx +++ b/src/Microsoft.PowerShell.ConsoleHost/resources/ManagedEntranceStrings.resx @@ -119,7 +119,10 @@ PowerShell {0} -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. + +https://aka.ms/pscore6-docs +Type 'help' to get help. Usage: pwsh[.exe] [[-File] <filePath> [args]] From ed499ced53563d705c3487d94dc3016fd7cfcfd3 Mon Sep 17 00:00:00 2001 From: Dan Travison Date: Fri, 3 Nov 2017 10:56:35 -0700 Subject: [PATCH 089/617] Use native os_log APIs on OSX for PowerShell logging (#5310) --- src/libpsl-native/src/nativesyslog.cpp | 57 +++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) mode change 100644 => 100755 src/libpsl-native/src/nativesyslog.cpp diff --git a/src/libpsl-native/src/nativesyslog.cpp b/src/libpsl-native/src/nativesyslog.cpp old mode 100644 new mode 100755 index 1445c59a14f..15df49d7429 --- a/src/libpsl-native/src/nativesyslog.cpp +++ b/src/libpsl-native/src/nativesyslog.cpp @@ -2,18 +2,65 @@ //! @brief Provides wrappers around the syslog apis to support exporting //! for PInvoke calls by powershell. //! These functions are intended only for PowerShell internal use. +//! To view log output in real time +//! On Linux +//! tail -f /var/log/syslog | grep powershell +//! On OSX +//! sudo log stream +//! NOTE: replace powershell with the LogIdentity value when overriding in configuration #include #include +#if defined(__APPLE__) && defined(__MACH__) + +#include +#include +static os_log_t _log = NULL; + +// This format string ensures the message string for the log statements +// are visible. Using just %s marks them as private and the do not show +// up with log stream. +#define MESSAGE_FORMAT "%{public}s" + +// The submodule name to pass to os_log_create. +// The passed in ident value will be used for the category. +// see man os_log_create +#define SUBMODULE_NAME "com.microsoft.powershell" + +#endif + //! @brief Native_SysLog is a wrapper around the syslog api. //! It explicitly passes the message as a parameter to a %s format -//! string since the message may have arbitray characters that can +//! string since the message may have arbitrary characters that can //! be misinterpreted as format specifiers. //! //! @retval none. extern "C" void Native_SysLog(int32_t priority, const char* message) { +#if defined(__APPLE__) && defined(__MACH__) + switch (priority) + { + case LOG_EMERG: + case LOG_ALERT: + case LOG_CRIT: + os_log_fault(_log, MESSAGE_FORMAT, message); + break; + + case LOG_ERR: + os_log_error(_log, MESSAGE_FORMAT, message); + break; + + case LOG_DEBUG: + os_log_debug(_log, MESSAGE_FORMAT, message); + break; + + default: + os_log(_log, MESSAGE_FORMAT, message); + break; + } +#else syslog(priority, "%s", message); +#endif } //! @brief Native_OpenLog is a wrapper around the openlog, syslog api. @@ -23,7 +70,11 @@ extern "C" void Native_SysLog(int32_t priority, const char* message) //! @retval none. extern "C" void Native_OpenLog(const char* ident, int facility) { +#if defined(__APPLE__) && defined(__MACH__) + _log = os_log_create(SUBMODULE_NAME, ident); +#else openlog(ident, LOG_NDELAY | LOG_PID, facility); +#endif } //! @brief Native_OpenLog is a wrapper around the closelog, syslog api. @@ -31,5 +82,9 @@ extern "C" void Native_OpenLog(const char* ident, int facility) //! @retval none. extern "C" void Native_CloseLog() { +#if defined(__APPLE__) && defined(__MACH__) + // Nothing to do here now, for now. +#else closelog(); +#endif } From 36b600d1eca8f216384fe11d74445fc0f2eb058b Mon Sep 17 00:00:00 2001 From: Chunqing Chen Date: Fri, 3 Nov 2017 11:35:09 -0700 Subject: [PATCH 090/617] Add Jobject serialization support to ConvertTo-Json (#5141) --- .../utility/WebCmdlet/ConvertToJsonCommand.cs | 4 ++++ .../ConvertTo-Json.Tests.ps1 | 17 +++++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 test/powershell/Modules/Microsoft.PowerShell.Utility/ConvertTo-Json.Tests.ps1 diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/ConvertToJsonCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/ConvertToJsonCommand.cs index ea40f39c332..b5ccb144244 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/ConvertToJsonCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/ConvertToJsonCommand.cs @@ -426,6 +426,10 @@ private object ProcessValue(object obj, int depth) { rv = obj; } + else if (obj is Newtonsoft.Json.Linq.JObject jObject) + { + rv = jObject.ToObject>(); + } else { TypeInfo t = obj.GetType().GetTypeInfo(); diff --git a/test/powershell/Modules/Microsoft.PowerShell.Utility/ConvertTo-Json.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Utility/ConvertTo-Json.Tests.ps1 new file mode 100644 index 00000000000..eaa55227a9c --- /dev/null +++ b/test/powershell/Modules/Microsoft.PowerShell.Utility/ConvertTo-Json.Tests.ps1 @@ -0,0 +1,17 @@ +Describe 'ConvertTo-Json' -tags "CI" { + It 'Newtonsoft.Json.Linq.Jproperty should be converted to Json properly' { + $EgJObject = New-Object -TypeName Newtonsoft.Json.Linq.JObject + $EgJObject.Add("TestValue1", "123456") + $EgJObject.Add("TestValue2", "78910") + $EgJObject.Add("TestValue3", "99999") + $dict = @{} + $dict.Add('JObject', $EgJObject) + $dict.Add('StrObject', 'This is a string Object') + $properties = @{'DictObject' = $dict; 'RandomString' = 'A quick brown fox jumped over the lazy dog'} + $object = New-Object -TypeName psobject -Property $properties + $jsonFormat = ConvertTo-Json -InputObject $object + $jsonFormat | Should Match '"TestValue1": 123456' + $jsonFormat | Should Match '"TestValue2": 78910' + $jsonFormat | Should Match '"TestValue3": 99999' + } +} From 4140bb2ddb1b658907279735e00922386bceb896 Mon Sep 17 00:00:00 2001 From: Ilya Date: Fri, 3 Nov 2017 23:44:20 +0400 Subject: [PATCH 091/617] Revert the breaking change in AddTypeCommandBase.EndProcessing (#5306) --- .../commands/utility/AddType.cs | 65 ++++++++++++++++--- 1 file changed, 56 insertions(+), 9 deletions(-) diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/AddType.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/AddType.cs index a3701a56a92..3d389c9a84c 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/AddType.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/AddType.cs @@ -760,17 +760,10 @@ internal string GetUsingSet(Language language) /// /// Perform common error checks. /// Populate source code. + /// We only keep the code for backward compatibility. /// protected override void EndProcessing() { - // Prevent code compilation in ConstrainedLanguage mode - if (SessionState.LanguageMode == PSLanguageMode.ConstrainedLanguage) - { - ThrowTerminatingError( - new ErrorRecord( - new PSNotSupportedException(AddTypeStrings.CannotDefineNewType), "CannotDefineNewType", ErrorCategory.PermissionDenied, null)); - } - // Generate an error if they've specified an output // assembly type without an output assembly if (String.IsNullOrEmpty(outputAssembly) && outputTypeSpecified) @@ -787,6 +780,37 @@ protected override void EndProcessing() ThrowTerminatingError(errorRecord); return; } + + PopulateSource(); + } + + // We only keep the code for backward compatibility. + internal void PopulateSource() + { + // Prevent code compilation in ConstrainedLanguage mode + if (SessionState.LanguageMode == PSLanguageMode.ConstrainedLanguage) + { + ThrowTerminatingError( + new ErrorRecord( + new PSNotSupportedException(AddTypeStrings.CannotDefineNewType), "CannotDefineNewType", ErrorCategory.PermissionDenied, null)); + } + + // Load the source if they want to load from a file + if (String.Equals(ParameterSetName, "FromPath", StringComparison.OrdinalIgnoreCase) || + String.Equals(ParameterSetName, "FromLiteralPath", StringComparison.OrdinalIgnoreCase) + ) + { + sourceCode = ""; + foreach (string file in paths) + { + sourceCode += System.IO.File.ReadAllText(file) + "\n"; + } + } + + if (String.Equals(ParameterSetName, "FromMember", StringComparison.OrdinalIgnoreCase)) + { + sourceCode = GenerateTypeSource(typeNamespace, Name, sourceCode, language); + } } internal void HandleCompilerErrors(AddTypeCompilerError[] compilerErrors) @@ -891,7 +915,30 @@ public sealed class AddTypeCommand : AddTypeCommandBase /// protected override void EndProcessing() { - base.EndProcessing(); + // Prevent code compilation in ConstrainedLanguage mode + if (SessionState.LanguageMode == PSLanguageMode.ConstrainedLanguage) + { + ThrowTerminatingError( + new ErrorRecord( + new PSNotSupportedException(AddTypeStrings.CannotDefineNewType), "CannotDefineNewType", ErrorCategory.PermissionDenied, null)); + } + + // Generate an error if they've specified an output + // assembly type without an output assembly + if (String.IsNullOrEmpty(outputAssembly) && outputTypeSpecified) + { + ErrorRecord errorRecord = new ErrorRecord( + new Exception( + String.Format( + CultureInfo.CurrentCulture, + AddTypeStrings.OutputTypeRequiresOutputAssembly)), + "OUTPUTTYPE_REQUIRES_ASSEMBLY", + ErrorCategory.InvalidArgument, + outputType); + + ThrowTerminatingError(errorRecord); + return; + } if (loadAssembly) { From ef00088ade81a9aaa5bbbc29c772caa7ab3be71c Mon Sep 17 00:00:00 2001 From: Dongbo Wang Date: Fri, 3 Nov 2017 14:45:07 -0700 Subject: [PATCH 092/617] Separate Install-PowerShellRemoting.ps1 from psrp.windows nuget package (#5330) --- build.psm1 | 4 ---- docs/building/internals.md | 7 ------- src/powershell-win-core/.gitignore | 1 - src/powershell-win-core/powershell-win-core.csproj | 2 +- 4 files changed, 1 insertion(+), 13 deletions(-) delete mode 100644 src/powershell-win-core/.gitignore diff --git a/build.psm1 b/build.psm1 index 2e0439f5309..13afb79cbc2 100644 --- a/build.psm1 +++ b/build.psm1 @@ -257,10 +257,6 @@ cmd.exe /C cd /d "$location" "&" "$($vcPath)\vcvarsall.bat" "$Arch" "&" cmake "$ log " Copying $srcPath to $dstPath" Copy-Item $srcPath $dstPath } - - # Place the remoting configuration script in the same directory - # as the binary so it will get published. - Copy-Item .\Install-PowerShellRemoting.ps1 $dstPath } finally { Pop-Location } diff --git a/docs/building/internals.md b/docs/building/internals.md index 8c80654e89c..5c4fea938d4 100644 --- a/docs/building/internals.md +++ b/docs/building/internals.md @@ -124,8 +124,6 @@ Start-BuildNativeWindowsBinaries -Configuration Release -Arch x64 ``` After that, the binary `pwrshplugin.dll` and its PDB file will be placed under 'src/powershell-win-core'. -The script file `Install-PowerShellRemoting.ps1` will also be placed in the same folder, -which is supposed to be used to set up remoting configurations for PowerShell Core. To create a new NuGet package for `pwrshplugin.dll`, first you need to get the `psrp.windows.nuspec` from an existing `psrp.windows` package. You can find it at `~/.nuget/packages/psrp.windows` on your windows machine if you have recently built PowerShell on it. @@ -138,11 +136,6 @@ and create the same layout of files as in the existing package. The layout of files should look like this: ```none -+---contentFiles -| \---any -| \---any -| Install-PowerShellRemoting.ps1 -| \---runtimes +---win-x64 | \---native diff --git a/src/powershell-win-core/.gitignore b/src/powershell-win-core/.gitignore deleted file mode 100644 index 8aa2b4e4425..00000000000 --- a/src/powershell-win-core/.gitignore +++ /dev/null @@ -1 +0,0 @@ -Install-PowerShellRemoting.ps1 diff --git a/src/powershell-win-core/powershell-win-core.csproj b/src/powershell-win-core/powershell-win-core.csproj index 049d0531b6d..0d50de03323 100644 --- a/src/powershell-win-core/powershell-win-core.csproj +++ b/src/powershell-win-core/powershell-win-core.csproj @@ -19,7 +19,7 @@ PreserveNewest PreserveNewest - + PreserveNewest PreserveNewest From cbe6b88df24297021d0eeb7864302e330d9c2c43 Mon Sep 17 00:00:00 2001 From: Travis Plunk Date: Fri, 3 Nov 2017 14:49:15 -0700 Subject: [PATCH 093/617] Include symbols folder an embedded zip when packaging symbols (#5333) --- tools/packaging/packaging.psm1 | 58 +++++++++++-------- tools/releaseBuild/createComplianceFolder.ps1 | 38 ++++++++++++ 2 files changed, 73 insertions(+), 23 deletions(-) create mode 100644 tools/releaseBuild/createComplianceFolder.ps1 diff --git a/tools/packaging/packaging.psm1 b/tools/packaging/packaging.psm1 index 3aaee4e6ebb..7026fb393ef 100644 --- a/tools/packaging/packaging.psm1 +++ b/tools/packaging/packaging.psm1 @@ -146,38 +146,50 @@ function Start-PSPackage { $Source = Split-Path -Path $Script:Options.Output -Parent - # If building a symbols package, don't include the publish build. + # If building a symbols package, we add a zip of the parent to publish if ($IncludeSymbols.IsPresent) { $publishSource = $Source $buildSource = Split-Path -Path $Source -Parent $Source = New-TempFolder + $symbolsSource = New-TempFolder - # files not to include as individual files. These files will be included in publish.zip - $toExclude = @( - 'hostfxr.dll' - 'hostpolicy.dll' - 'libhostfxr.so' - 'libhostpolicy.so' - 'libhostfxr.dylib' - 'libhostpolicy.dylib' - 'Publish' - ) - Get-ChildItem -Path $buildSource | Where-Object {$toExclude -inotcontains $_.Name} | Copy-Item -Destination $Source -Recurse - - # Replace binaries with crossgen'ed binaires from publish folder. - Get-ChildItem -Recurse $Source | ForEach-Object { - $relativePath = $_.FullName.Replace($Source, '') - $publishPath = Join-Path $publishSource -ChildPath $relativePath - if (Test-Path -Path $publishPath) + try + { + # Copy files which go into the root package + Get-ChildItem -Path $publishSource | Copy-Item -Destination $Source -Recurse + + # files not to include as individual files. These files will be included in the root package + # pwsh.exe is just dotnet.exe renamed by dotnet.exe during the build. + $toExclude = @( + 'hostfxr.dll' + 'hostpolicy.dll' + 'libhostfxr.so' + 'libhostpolicy.so' + 'libhostfxr.dylib' + 'libhostpolicy.dylib' + 'Publish' + 'pwsh.exe' + ) + # Copy file which go into symbols.zip + Get-ChildItem -Path $buildSource | Where-Object {$toExclude -inotcontains $_.Name} | Copy-Item -Destination $symbolsSource -Recurse + + # Exclude Pester until we move it to PSModuleRestore + $pesterPath = Join-Path -Path $symbolsSource -ChildPath 'Modules\Pester' + if(Test-Path -Path $pesterPath) { - Copy-Item -Path $publishPath -Destination $_.FullName -Force + Remove-Item -Path $pesterPath -Recurse -Force -ErrorAction SilentlyContinue } - } - $zipSource = Join-Path $publishSource -ChildPath '*' - $zipPath = Join-Path -Path $Source -ChildPath 'publish.zip' - Compress-Archive -Path $zipSource -DestinationPath $zipPath + # Zip symbols.zip to the root package + $zipSource = Join-Path $symbolsSource -ChildPath '*' + $zipPath = Join-Path -Path $Source -ChildPath 'symbols.zip' + Compress-Archive -Path $zipSource -DestinationPath $zipPath + } + finally + { + Remove-Item -Path $symbolsSource -Recurse -Force -ErrorAction SilentlyContinue + } } log "Packaging Source: '$Source'" diff --git a/tools/releaseBuild/createComplianceFolder.ps1 b/tools/releaseBuild/createComplianceFolder.ps1 new file mode 100644 index 00000000000..31b972b9bc5 --- /dev/null +++ b/tools/releaseBuild/createComplianceFolder.ps1 @@ -0,0 +1,38 @@ +param( + [Parameter(HelpMessage="Artifact folder to find compliance files in.")] + [string[]] + $ArtifactFolder, + [Parameter(HelpMessage="VSTS Variable to set path to complinance Files.")] + [string] + $VSTSVariableName +) + +$compliancePath = $null +foreach($folder in $ArtifactFolder) +{ + # Find Symbols zip which contains compliance files + Write-Host "ArtifactFolder: $folder" + $filename = Join-Path -Path $folder -ChildPath 'symbols.zip' + $name = Split-Path -Path $folder -Leaf + + # Throw is compliance zip does not exist + if (!(Test-Path $filename)) + { + throw "symbols.zip for $VSTSVariableName does not exist" + } + + # make sure we have a single parent for everything + if (!$compliancePath) + { + $parent = Split-Path -Path $folder + $compliancePath = Join-Path -Path $parent -ChildPath 'compliance' + } + + # Extract complance files to individual folder to avoid overwriting files. + $unzipPath = Join-Path -Path $compliancePath -ChildPath $name + Write-Host "Symbols-zip: $filename ; unzipPath: $unzipPath" + Expand-Archive -Path $fileName -DestinationPath $unzipPath +} + +# set VSTS variable with path to compliance files +Write-Host "##vso[task.setvariable variable=$VSTSVariableName]$unzipPath" \ No newline at end of file From 0557f2df7217255f042db90309209447a83ba312 Mon Sep 17 00:00:00 2001 From: Steve Lee Date: Sat, 4 Nov 2017 17:02:50 -0700 Subject: [PATCH 094/617] add Uniform Type Identifier conforming with Apple standards using a reverse dns style prefix (#5323) --- tools/packaging/packaging.psm1 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/packaging/packaging.psm1 b/tools/packaging/packaging.psm1 index 7026fb393ef..bf5f60c210a 100644 --- a/tools/packaging/packaging.psm1 +++ b/tools/packaging/packaging.psm1 @@ -662,6 +662,9 @@ function New-UnixPackage { $Arguments += @("--rpm-dist", "rhel.7") $Arguments += @("--rpm-os", "linux") } + if ($Environment.IsMacOS) { + $Arguments += @("--osxpkg-identifier-prefix", "com.microsoft") + } foreach ($Dependency in $Dependencies) { $Arguments += @("--depends", $Dependency) } From 2670917981e98f3dfc1301badad194c92517c7c6 Mon Sep 17 00:00:00 2001 From: Dan Travison Date: Mon, 6 Nov 2017 08:32:29 -0800 Subject: [PATCH 095/617] Redirect ETW logging to Syslog on Linux (#5144) This PR is divided into the following areas: 1. Add/Rename the PowerShell/Windows ETW manifest to the repo and change both the provider id (guid) and name. See #4939. The manifest is at tools/resxgen/PowerShell-Core-Instrumentation.man 2. Generate a resx file containing the string resources needed for logging ETW events to syslog. This is accomplished by tools\resxgen\resxgen.psm1 and resxgen.ps1. The tool generates two files A resx file containing string resources for each message string from the manifest. This is generated in the System.Management.Automation\gen directory. A C# class (EventResource) that provides the mapping between the integer event id and the associated string resource name. The file is generated in the System.Management.Automation\CoreCLR directory with a compile-time condition of UNIX NOTE: The EventResource.cs class generated by resgen is explicitly ignored in the csproj file; it is not used. 3. SMA\utils\tracing\PSSysLogProvider.cs Implements the abstract LogProvider class and is the syslog equivalent of PSEtwLogProvider. The class contains a number of logical methods for logging lifecycle, health, and normal events. 4. SMA\utils\tracing\SysLogProvider.cs This is the Syslog equivalent of ETW's log provider class and implements a Log method versus ETW's EventWrite. It is also responsible for resolving event ids to resource names and performing the Syslog call. There is a large comment block in the class XML doc that describes the types of log output it produces. 5. SMA\utils\tracing\PSEtwLog.cs PowerShell's current implementation is tightly coupled to this class; with code calling it directly for all events. To simplify integration of syslog, I updated the class to create an instance of PSSysLogProvider on Linux and removed the Linux-specific stub file. 6. SMA\engine\PropertyAccessor.cs This class provides a wrapper around PowerShellProperties.json and has been extended to have Unix-specific assessors for configuring logging. Note that the file is expected to be in the $PSHOME directory to ensure SxS. Currently, there are four configuration properties: - LogIdentity - the string identifier for the source application. This defaults to 'powershell' and can be configured to enable distinguishing between side-by-side installations. - LogLevel - configures the tracing level (log level). Informational is the defauilt. - LogChannels - used to enable operational and analytic logging. Operational is the default. - LogKeywords - used to configure enabling tracing by keyword. All keywords other than `UseAlwaysAnalytic` are enabled by default. NOTE: This will likely change. PowerShell sometimes confuses the analytic channel with this keyword and sends logging to the wrong channel. Once this is cleared up, `UseAlwaysAnalytic` and `UseAlwaysOperational` keywords will likely be removed. Additional Notes: 1. The current implementation writes directly to syslog and writing to a separate log file is still pending. 2. The generated class and resx are not part of the build; instead, it is expected that Resxgen should be run when events are added to the manifest. To fully automate the process, resxgen will need to be updated to generate the other dependent enums such as 'PSChannel', 'PSEventId', 'PSTask', 'PSOpcode', etc. You will see parsing logic in resxgen.psm1 to prepare for that but it is not enabled at this point. 4. Documentation is pending that documents the format of the syslog output as well as associated configuration. 5. As mentioned at the start, tests are pending --- .../CoreCLR/CorePsStub.cs | 23 - .../CoreCLR/EventResource.cs | 616 ++ .../System.Management.Automation.csproj | 1 + .../engine/PropertyAccessor.cs | 195 + .../engine/remoting/common/PSETWTracer.cs | 2 + .../logging/LogProvider.cs | 166 + .../resources/EventResource.resx | 630 ++ .../utils/PowerShellETWTracer.cs | 2 +- .../utils/tracing/EtwActivity.cs | 3 +- .../utils/tracing/PSEtwLog.cs | 12 +- .../utils/tracing/PSEtwLogProvider.cs | 158 +- .../utils/tracing/PSSysLogProvider.cs | 337 + .../utils/tracing/SysLogProvider.cs | 522 ++ .../PowerShell-Core-Instrumentation.man | 5635 +++++++++++++++++ tools/ResxGen/ResxGen.ps1 | 58 + tools/ResxGen/ResxGen.psm1 | 529 ++ 16 files changed, 8703 insertions(+), 186 deletions(-) create mode 100755 src/System.Management.Automation/CoreCLR/EventResource.cs create mode 100644 src/System.Management.Automation/resources/EventResource.resx mode change 100644 => 100755 src/System.Management.Automation/utils/tracing/PSEtwLogProvider.cs create mode 100755 src/System.Management.Automation/utils/tracing/PSSysLogProvider.cs create mode 100755 src/System.Management.Automation/utils/tracing/SysLogProvider.cs create mode 100644 tools/ResxGen/PowerShell-Core-Instrumentation.man create mode 100755 tools/ResxGen/ResxGen.ps1 create mode 100644 tools/ResxGen/ResxGen.psm1 diff --git a/src/System.Management.Automation/CoreCLR/CorePsStub.cs b/src/System.Management.Automation/CoreCLR/CorePsStub.cs index f58d8d49eed..3170b545884 100644 --- a/src/System.Management.Automation/CoreCLR/CorePsStub.cs +++ b/src/System.Management.Automation/CoreCLR/CorePsStub.cs @@ -783,29 +783,6 @@ public static Guid GetActivityId() } } - internal static class PSEtwLog - { - static internal void LogAnalyticError(PSEventId id, PSOpcode opcode, PSTask task, PSKeyword keyword, params object[] args) { } - static internal void LogAnalyticWarning(PSEventId id, PSOpcode opcode, PSTask task, PSKeyword keyword, params object[] args) { } - static internal void LogAnalyticVerbose(PSEventId id, PSOpcode opcode, PSTask task, PSKeyword keyword, - Int64 objectId, - Int64 fragmentId, - int isStartFragment, - int isEndFragment, - UInt32 fragmentLength, - PSETWBinaryBlob fragmentData) - { } - static internal void LogAnalyticVerbose(PSEventId id, PSOpcode opcode, PSTask task, PSKeyword keyword, params object[] args) { } - static internal void SetActivityIdForCurrentThread(Guid newActivityId) { } - static internal void LogOperationalVerbose(PSEventId id, PSOpcode opcode, PSTask task, PSKeyword keyword, params object[] args) { } - static internal void LogOperationalWarning(PSEventId id, PSOpcode opcode, PSTask task, PSKeyword keyword, params object[] args) { } - static internal void ReplaceActivityIdForCurrentThread(Guid newActivityId, PSEventId eventForOperationalChannel, PSEventId eventForAnalyticChannel, PSKeyword keyword, PSTask task) { } - static internal void LogOperationalError(PSEventId id, PSOpcode opcode, PSTask task, PSKeyword keyword, params object[] args) { } - static internal void LogOperationalError(PSEventId id, PSOpcode opcode, PSTask task, LogContext logContext, string payLoad) { } - static internal void LogAnalyticInformational(PSEventId id, PSOpcode opcode, PSTask task, PSKeyword keyword, params object[] args) { } - static internal void LogOperationalInformation(PSEventId id, PSOpcode opcode, PSTask task, PSKeyword keyword, params object[] args) { } - } - public enum PowerShellTraceTask { /// diff --git a/src/System.Management.Automation/CoreCLR/EventResource.cs b/src/System.Management.Automation/CoreCLR/EventResource.cs new file mode 100755 index 00000000000..9ff6f38d402 --- /dev/null +++ b/src/System.Management.Automation/CoreCLR/EventResource.cs @@ -0,0 +1,616 @@ +#if UNIX +/* + This code was generated by the tools\ResxGen\ResxGen.ps1 run against PowerShell-Core-Instrumentation.man. + To add or change logged events and the associated resources, edit PowerShell-Core-Instrumentation.man + then rerun ResxGen.ps1 to produce an updated CS and Resx file. +*/ +using System.Collections.Generic; +using System.Management.Automation.Internal; +using System.Runtime.InteropServices; + +namespace System.Management.Automation.Tracing +{ + /// + /// Provides a class for describing a message resource for an ETW event. + /// + internal static class EventResource + { + // Defines the resource id of the message to use when an event id is not valid. + private const string MissingEventIdResourceName = "MissingEventIdMessage"; + + /// + /// Gets the name of the message resource to use for event ids that are not found. + /// is not found. + /// + /// + /// This method is called when GetMessage returns a null value indicating the passed + /// in event id was not found. The message should be used as the format string + /// with the event id as the single variable argument. + /// + public static string GetMissingEventMessage(out int parameterCount) + { + parameterCount = 1; + return MissingEventIdResourceName; + } + + /// + /// Gets the message resource id for the specified event id + /// + /// The event id for the message resource to retrieve. + /// The number of parameters required by the message resource + /// The string resource id of the associated event message; otherwise, a null reference if the event id is not valid. + public static string GetMessage(int eventId, out int parameterCount) + { + switch (eventId) + { + case 4097: + parameterCount = 0; + return "PS_PROVIDEReventE_O_CMDLETS_HOSTNAMERESOLVE"; + case 4098: + parameterCount = 0; + return "PS_PROVIDEReventE_O_CMDLETS_SCHEMERESOLVE"; + case 4099: + parameterCount = 0; + return "PS_PROVIDEReventE_O_CMDLETS_SHELLRESOLVE"; + case 4100: + parameterCount = 3; + return "PS_PROVIDEReventE_O_COMMAND_HEALTH"; + case 4101: + parameterCount = 3; + return "PS_PROVIDEReventE_O_ENGINE_HEALTH"; + case 4102: + parameterCount = 3; + return "PS_PROVIDEReventE_O_PROVIDER_HEALTH"; + case 4103: + parameterCount = 3; + return "PS_PROVIDEReventE_O_PIPELINE_DETAIL"; + case 4104: + parameterCount = 5; + return "PS_PROVIDEReventE_O_SCRIPTBLOCK_CREATE_DETAIL"; + case 4105: + parameterCount = 2; + return "PS_PROVIDEReventE_O_SCRIPTBLOCK_INVOKE_START_DETAIL"; + case 4106: + parameterCount = 2; + return "PS_PROVIDEReventE_O_SCRIPTBLOCK_INVOKE_COMPLETE_DETAIL"; + case 7937: + parameterCount = 3; + return "PS_PROVIDEReventE_A_COMMAND_LIFECYCLE"; + case 7938: + parameterCount = 3; + return "PS_PROVIDEReventE_A_ENGINE_LIFECYCLE"; + case 7939: + parameterCount = 3; + return "PS_PROVIDEReventE_A_PROVIDER_LIFECYCLE"; + case 7940: + parameterCount = 3; + return "PS_PROVIDEReventE_A_SETTINGS"; + case 7941: + parameterCount = 2; + return "PS_PROVIDEReventE_A_WriteTransferEvent"; + case 7942: + parameterCount = 8; + return "PS_PROVIDEReventE_A_ENGINE_TRACE"; + case 8193: + parameterCount = 1; + return "PS_PROVIDEReventE_O_RUNSPACE_CONSTRUCTOR"; + case 8194: + parameterCount = 3; + return "PS_PROVIDEReventE_O_RUNSPACEPOOL_CONSTRUCTOR"; + case 8195: + parameterCount = 0; + return "PS_PROVIDEReventE_O_RUNSPACEPOOL_OPEN"; + case 8196: + parameterCount = 0; + return "PS_PROVIDEReventE_O_RUNSPACEPOOL_TRANSFER"; + case 8197: + parameterCount = 1; + return "PS_PROVIDEReventE_O_RUNSPACE_STATE_CHANGE"; + case 8198: + parameterCount = 3; + return "PS_PROVIDEReventE_O_REMOTE_RUNSPACE_CREATE_RETRY"; + case 12033: + parameterCount = 1; + return "PS_PROVIDEReventE_A_RUNSPACE_PORT"; + case 12034: + parameterCount = 1; + return "PS_PROVIDEReventE_A_RUNSPACE_APPNAME"; + case 12035: + parameterCount = 1; + return "PS_PROVIDEReventE_A_RUNSPACE_COMPUTERNAME"; + case 12036: + parameterCount = 1; + return "PS_PROVIDEReventE_A_RUNSPACE_SCHEME"; + case 12037: + parameterCount = 0; + return "PS_PROVIDEReventE_A_RUNSPACE_TEST"; + case 12038: + parameterCount = 9; + return "PS_PROVIDEReventE_A_RUNSPACE_WSMANCONNECTIONINFO"; + case 12039: + parameterCount = 0; + return "PS_PROVIDEReventE_A_RUNSPACEPOOL_TRANSFER"; + case 24577: + parameterCount = 1; + return "PS_PROVIDEReventE_O_ISEExecuteScript"; + case 24578: + parameterCount = 1; + return "PS_PROVIDEReventE_O_ISEExecuteSelection"; + case 24579: + parameterCount = 0; + return "PS_PROVIDEReventE_O_ISEStopCommand"; + case 24580: + parameterCount = 0; + return "PS_PROVIDEReventE_O_ISEResumeDebugger"; + case 24581: + parameterCount = 0; + return "PS_PROVIDEReventE_O_ISEStopDebugger"; + case 24582: + parameterCount = 0; + return "PS_PROVIDEReventE_O_ISEDebuggerStepInto"; + case 24583: + parameterCount = 0; + return "PS_PROVIDEReventE_O_ISEDebuggerStepOver"; + case 24584: + parameterCount = 0; + return "PS_PROVIDEReventE_O_ISEDebuggerStepOut"; + case 24592: + parameterCount = 0; + return "PS_PROVIDEReventE_O_ISEEnableAllBreakpoints"; + case 24593: + parameterCount = 0; + return "PS_PROVIDEReventE_O_ISEDisableAllBreakpoints"; + case 24594: + parameterCount = 0; + return "PS_PROVIDEReventE_O_ISERemoveAllBreakpoints"; + case 24595: + parameterCount = 2; + return "PS_PROVIDEReventE_O_ISESetBreakpoint"; + case 24596: + parameterCount = 2; + return "PS_PROVIDEReventE_O_ISERemoveBreakpoint"; + case 24597: + parameterCount = 2; + return "PS_PROVIDEReventE_O_ISEEnableBreakpoint"; + case 24598: + parameterCount = 2; + return "PS_PROVIDEReventE_O_ISEDisableBreakpoint"; + case 24599: + parameterCount = 2; + return "PS_PROVIDEReventE_O_ISEHitBreakpoint"; + case 28673: + parameterCount = 3; + return "PS_PROVIDEReventE_A_SERIALIZER_REHYDRATION_SUCCESS"; + case 28674: + parameterCount = 4; + return "PS_PROVIDEReventE_A_SERIALIZER_REHYDRATION_FAILURE"; + case 28675: + parameterCount = 4; + return "PS_PROVIDEReventE_A_SERIALIZER_DEPTH_OVERRIDE"; + case 28676: + parameterCount = 2; + return "PS_PROVIDEReventE_A_SERIALIZER_MODE_OVERRIDE"; + case 28677: + parameterCount = 3; + return "PS_PROVIDEReventE_A_SERIALIZER_SCRIPT_PROPERTY_WITHOUT_RUNSPACE"; + case 28678: + parameterCount = 4; + return "PS_PROVIDEReventE_A_SERIALIZER_PROPERTY_GETTER_FAILED"; + case 28679: + parameterCount = 2; + return "PS_PROVIDEReventE_A_SERIALIZER_ENUMERATION_FAILED"; + case 28680: + parameterCount = 2; + return "PS_PROVIDEReventE_A_SERIALIZER_TOSTRING_FAILED"; + case 28682: + parameterCount = 3; + return "PS_PROVIDEReventE_A_SERIALIZER_MAX_DEPTH_WHEN_SERIALIZING"; + case 28683: + parameterCount = 3; + return "PS_PROVIDEReventE_A_SERIALIZER_XMLEXCEPTION_WHEN_DESERIALIZING"; + case 28684: + parameterCount = 2; + return "PS_PROVIDEReventE_A_SERIALIZER_SPECIFIC_PROPERTY_MISSING"; + case 32769: + parameterCount = 5; + return "PS_PROVIDEReventE_A_TRANSPORT_RCVDOBJ"; + case 32775: + parameterCount = 3; + return "PS_PROVIDEReventE_A_APPDOMAIN_UNHANDLED_EXCEPTION"; + case 32776: + parameterCount = 5; + return "PS_PROVIDEReventE_A_TRANSPORT_ERROR"; + case 32777: + parameterCount = 3; + return "PS_PROVIDEReventE_O_APPDOMAIN_UNHANDLED_EXCEPTION"; + case 32784: + parameterCount = 5; + return "PS_PROVIDEReventE_O_TRANSPORT_ERROR"; + case 32785: + parameterCount = 1; + return "PS_PROVIDEReventE_A_TRANSPORT_CONNECT"; + case 32786: + parameterCount = 1; + return "PS_PROVIDEReventE_A_TRANSPORT_SHELL_CONNECT_CALLBACK"; + case 32787: + parameterCount = 1; + return "PS_PROVIDEReventE_A_TRANSPORT_SHELL_CLOSE"; + case 32788: + parameterCount = 1; + return "PS_PROVIDEReventE_A_TRANSPORT_SHELL_CLOSE_CALLBACK"; + case 32789: + parameterCount = 3; + return "PS_PROVIDEReventE_A_TRANSPORT_SEND_DATA"; + case 32790: + parameterCount = 2; + return "PS_PROVIDEReventE_A_TRANSPORT_SEND_DATA_CALLBACK"; + case 32791: + parameterCount = 2; + return "PS_PROVIDEReventE_A_TRANSPORT_RECEIVE_DATA"; + case 32792: + parameterCount = 3; + return "PS_PROVIDEReventE_A_TRANSPORT_RECEIVE_DATA_CALLBACK"; + case 32793: + parameterCount = 2; + return "PS_PROVIDEReventE_A_TRANSPORT_CMD_CONNECT"; + case 32800: + parameterCount = 2; + return "PS_PROVIDEReventE_A_TRANSPORT_CMD_CONNECT_CALLBACK"; + case 32801: + parameterCount = 2; + return "PS_PROVIDEReventE_A_TRANSPORT_CMD_CLOSE"; + case 32802: + parameterCount = 2; + return "PS_PROVIDEReventE_A_TRANSPORT_CMD_CLOSE_CALLBACK"; + case 32803: + parameterCount = 3; + return "PS_PROVIDEReventE_A_TRANSPORT_SIGNAL"; + case 32804: + parameterCount = 2; + return "PS_PROVIDEReventE_A_TRANSPORT_SIGNAL_CALLBACK"; + case 32805: + parameterCount = 2; + return "PS_PROVIDEReventE_A_TRANSPORT_URI_REDIRECTION"; + case 32849: + parameterCount = 5; + return "PS_PROVIDEReventE_A_TRANSPORT_SERVER_SEND_DATA"; + case 32850: + parameterCount = 3; + return "PS_PROVIDEReventE_A_CREATE_SERVER_REMOTESESSION"; + case 32851: + parameterCount = 1; + return "PS_PROVIDEReventE_A_REPORT_CONTEXT"; + case 32852: + parameterCount = 4; + return "PS_PROVIDEReventE_A_REPORT_OPERATION_COMPLETE"; + case 32853: + parameterCount = 2; + return "PS_PROVIDEReventE_A_CREATE_COMMAND_REMOTESESSION"; + case 32854: + parameterCount = 3; + return "PS_PROVIDEReventE_A_STOP_COMMAND"; + case 32855: + parameterCount = 3; + return "PS_PROVIDEReventE_A_SERVER_RECEIVED_DATA"; + case 32856: + parameterCount = 3; + return "PS_PROVIDEReventE_A_SERVER_RECEIVE_REQUEST"; + case 32857: + parameterCount = 3; + return "PS_PROVIDEReventE_A_SERVER_CLOSE_OPERATION"; + case 32865: + parameterCount = 2; + return "PS_PROVIDEReventE_A_LOAD_PSCUSTOMSHELL_ASSEMBLY"; + case 32866: + parameterCount = 2; + return "PS_PROVIDEReventE_A_LOAD_PSCUSTOMSHELL_TYPE"; + case 32867: + parameterCount = 6; + return "PS_PROVIDEReventE_A_RECEIVED_FRAGMENT"; + case 32868: + parameterCount = 6; + return "PS_PROVIDEReventE_A_SENT_FRAGMENT"; + case 32869: + parameterCount = 0; + return "PS_PROVIDEReventE_A_SHUTTING_DOWN"; + case 40961: + parameterCount = 0; + return "PS_PROVIDEReventE_O_PowershellConsoleStartupStart"; + case 40962: + parameterCount = 0; + return "PS_PROVIDEReventE_O_PowershellConsoleStartupStop"; + case 45057: + parameterCount = 8; + return "PS_PROVIDEReventE_D_Powershell_ErrorRecord"; + case 45058: + parameterCount = 3; + return "PS_PROVIDEReventE_D_Powershell_Exception"; + case 45059: + parameterCount = 0; + return "PS_PROVIDEReventE_O_Powershell_PSObject"; + case 45060: + parameterCount = 6; + return "PS_PROVIDEReventE_D_Powershell_Job"; + case 45061: + parameterCount = 1; + return "PS_PROVIDEReventE_D_MESSAGE"; + case 45062: + parameterCount = 9; + return "PS_PROVIDEReventE_A_RUNSPACE_WSMANCONNECTIONINFO"; + case 45063: + parameterCount = 5; + return "PS_PROVIDEReventE_O_M3PWorkflowPluginStarted"; + case 45064: + parameterCount = 2; + return "PS_PROVIDEReventE_O_M3PWorkflowExecutionStarted"; + case 45065: + parameterCount = 3; + return "PS_PROVIDEReventE_O_M3PWorkflowStateChanged"; + case 45072: + parameterCount = 1; + return "PS_PROVIDEReventE_O_M3PWorkflowPluginRequestedToShutdown"; + case 45073: + parameterCount = 1; + return "PS_PROVIDEReventE_O_M3PWorkflowPluginRestarted"; + case 45074: + parameterCount = 1; + return "PS_PROVIDEReventE_O_M3PWorkflowWorkflowsResuming"; + case 45075: + parameterCount = 4; + return "PS_PROVIDEReventE_O_M3PWorkflowQuotaViolationDetected"; + case 45076: + parameterCount = 1; + return "PS_PROVIDEReventE_O_M3PWorkflowWorkflowsResumed"; + case 45078: + parameterCount = 2; + return "PS_PROVIDEReventE_O_M3PWorkflowRunspacePoolCreated"; + case 45079: + parameterCount = 2; + return "PS_PROVIDEReventE_O_M3PWorkflowActivityExecutionQueued"; + case 45080: + parameterCount = 2; + return "PS_PROVIDEReventE_O_M3PWorkflowActivityExecutionStarted"; + case 45081: + parameterCount = 2; + return "PS_PROVIDEReventE_O_M3PWorkflowImportingFromXaml"; + case 45082: + parameterCount = 2; + return "PS_PROVIDEReventE_O_M3PWorkflowImportedFromXaml"; + case 45083: + parameterCount = 2; + return "PS_PROVIDEReventE_O_M3PWorkflowImportFromXamlError"; + case 45084: + parameterCount = 1; + return "PS_PROVIDEReventE_O_M3PWorkflowImportFromXamlValidationStarted"; + case 45085: + parameterCount = 1; + return "PS_PROVIDEReventE_O_M3PWorkflowImportFromXamlValidationFinishedSuccessfully"; + case 45086: + parameterCount = 1; + return "PS_PROVIDEReventE_O_M3PWorkflowImportFromXamlValidationFinishedWithError"; + case 45087: + parameterCount = 3; + return "PS_PROVIDEReventE_O_M3PWorkflowImportFromXamlActivityValidated"; + case 45088: + parameterCount = 3; + return "PS_PROVIDEReventE_O_M3PWorkflowImportFromXamlActivityValidationFailed"; + case 45089: + parameterCount = 3; + return "PS_PROVIDEReventE_O_M3PWorkflowActivityExecutionFailed"; + case 45090: + parameterCount = 2; + return "PS_PROVIDEReventE_O_M3PWorkflowRunspaceAvailabilityChanged"; + case 45091: + parameterCount = 3; + return "PS_PROVIDEReventE_O_M3PWorkflowRunspaceStateChanged"; + case 45092: + parameterCount = 1; + return "PS_PROVIDEReventE_O_M3PWorkflowLoadedForExecution"; + case 45093: + parameterCount = 1; + return "PS_PROVIDEReventE_O_M3PWorkflowUnloaded"; + case 45094: + parameterCount = 1; + return "PS_PROVIDEReventE_O_M3PWorkflowCancelled"; + case 45095: + parameterCount = 1; + return "PS_PROVIDEReventE_O_M3PWorkflowAborted"; + case 45096: + parameterCount = 1; + return "PS_PROVIDEReventE_O_M3PWorkflowCleanup"; + case 45097: + parameterCount = 2; + return "PS_PROVIDEReventE_O_M3PWorkflowLoadedFromDisk"; + case 45098: + parameterCount = 2; + return "PS_PROVIDEReventE_O_M3PWorkflowDeletedFromDisk"; + case 45100: + parameterCount = 1; + return "PS_PROVIDEReventE_O_M3PRemoveJobStarted"; + case 45101: + parameterCount = 4; + return "PS_PROVIDEReventE_O_M3PJobStateChanged"; + case 45102: + parameterCount = 3; + return "PS_PROVIDEReventE_O_M3PJobError"; + case 45104: + parameterCount = 3; + return "PS_PROVIDEReventE_O_M3PWorkflowJobCreated"; + case 45105: + parameterCount = 1; + return "PS_PROVIDEReventE_O_M3PParentJobCreated"; + case 45106: + parameterCount = 2; + return "PS_PROVIDEReventE_O_M3PJobCreationCompleted"; + case 45107: + parameterCount = 3; + return "PS_PROVIDEReventE_O_M3PJobRemoved"; + case 45108: + parameterCount = 4; + return "PS_PROVIDEReventE_O_M3PJobRemoveError"; + case 45109: + parameterCount = 1; + return "PS_PROVIDEReventE_O_M3PLoadingWorkflowForExecution"; + case 45110: + parameterCount = 1; + return "PS_PROVIDEReventE_O_M3PWorkflowExecutionFinished"; + case 45111: + parameterCount = 1; + return "PS_PROVIDEReventE_O_M3PCancellingWorkflowExecution"; + case 45112: + parameterCount = 2; + return "PS_PROVIDEReventE_O_M3PAbortingWorkflowExecution"; + case 45113: + parameterCount = 1; + return "PS_PROVIDEReventE_O_M3PUnloadingWorkflow"; + case 45114: + parameterCount = 1; + return "PS_PROVIDEReventE_O_M3PForcedWorkflowShutdownStarted"; + case 45115: + parameterCount = 1; + return "PS_PROVIDEReventE_O_M3PForcedWorkflowShutdownFinished"; + case 45116: + parameterCount = 2; + return "PS_PROVIDEReventE_O_M3PForcedWorkflowShutdownError"; + case 45117: + parameterCount = 2; + return "PS_PROVIDEReventE_O_M3PPersistingWorkflow"; + case 45118: + parameterCount = 1; + return "PS_PROVIDEReventE_O_M3PWorkflowPersisted"; + case 45119: + parameterCount = 1; + return "PS_PROVIDEReventE_O_M3PWorkflowActivityExecutionFinished"; + case 45120: + parameterCount = 2; + return "PS_PROVIDEReventE_O_M3PWorkflowExecutionError"; + case 45121: + parameterCount = 3; + return "PS_PROVIDEReventE_O_M3PEndpointRegistered"; + case 45122: + parameterCount = 2; + return "PS_PROVIDEReventE_O_M3PEndpointModified"; + case 45123: + parameterCount = 2; + return "PS_PROVIDEReventE_O_M3PEndpointUnregistered"; + case 45124: + parameterCount = 2; + return "PS_PROVIDEReventE_O_M3PEndpointDisabled"; + case 45125: + parameterCount = 2; + return "PS_PROVIDEReventE_O_M3PEndpointEnabled"; + case 45126: + parameterCount = 1; + return "PS_PROVIDEReventE_O_M3POutOfProcessRunspaceStarted"; + case 45127: + parameterCount = 2; + return "PS_PROVIDEReventE_O_M3PParameterSplattingWasPerformed"; + case 45128: + parameterCount = 1; + return "PS_PROVIDEReventE_O_M3PWorkflowEngineStarted"; + case 45129: + parameterCount = 4; + return "PS_PROVIDEReventE_D_M3PWORKFLOW_MANAGER_CHECKPOINTPATH"; + case 46337: + parameterCount = 1; + return "PS_PROVIDEReventE_D_M3PBeginStartWorkflowApplication"; + case 46338: + parameterCount = 1; + return "PS_PROVIDEReventE_D_M3PEndStartWorkflowApplication"; + case 46339: + parameterCount = 1; + return "PS_PROVIDEReventE_D_M3PBeginCreateNewJob"; + case 46340: + parameterCount = 1; + return "PS_PROVIDEReventE_D_M3PEndCreateNewJob"; + case 46341: + parameterCount = 2; + return "PS_PROVIDEReventE_D_M3PTrackingGuidContainerParentJobCorrelation"; + case 46342: + parameterCount = 1; + return "PS_PROVIDEReventE_D_M3PBeginJobLogic"; + case 46343: + parameterCount = 1; + return "PS_PROVIDEReventE_D_M3PEndJobLogic"; + case 46344: + parameterCount = 1; + return "PS_PROVIDEReventE_D_M3PBeginWorkflowExecution"; + case 46345: + parameterCount = 1; + return "PS_PROVIDEReventE_D_M3PEndWorkflowExecution"; + case 46346: + parameterCount = 2; + return "PS_PROVIDEReventE_D_M3PChildWorkflowJobAddition"; + case 46347: + parameterCount = 2; + return "PS_PROVIDEReventE_D_M3PProxyJobRemoteJobAssociation"; + case 46348: + parameterCount = 1; + return "PS_PROVIDEReventE_D_M3PBeginContainerParentJobExecution"; + case 46349: + parameterCount = 1; + return "PS_PROVIDEReventE_D_M3PEndContainerParentJobExecution"; + case 46350: + parameterCount = 1; + return "PS_PROVIDEReventE_D_M3PBeginProxyJobExecution"; + case 46351: + parameterCount = 1; + return "PS_PROVIDEReventE_D_M3PEndProxyJobExecution"; + case 46352: + parameterCount = 1; + return "PS_PROVIDEReventE_D_M3PBeginProxyJobEventHandler"; + case 46353: + parameterCount = 1; + return "PS_PROVIDEReventE_D_M3PEndProxyJobEventHandler"; + case 46354: + parameterCount = 1; + return "PS_PROVIDEReventE_D_M3PBeginProxyChildJobEventHandler"; + case 46355: + parameterCount = 1; + return "PS_PROVIDEReventE_D_M3PEndProxyChildJobEventHandler"; + case 46356: + parameterCount = 0; + return "PS_PROVIDEReventE_D_M3PBeginRunGarbageCollection"; + case 46357: + parameterCount = 0; + return "PS_PROVIDEReventE_D_M3PEndRunGarbageCollection"; + case 46358: + parameterCount = 0; + return "PS_PROVIDEReventE_O_M3PPERSISTENCE_STORE_MAXSIZE_REACHED"; + case 49152: + parameterCount = 1; + return "PS_PROVIDEReventE_D_DebugMessage"; + case 49153: + parameterCount = 2; + return "PS_PROVIDEReventE_D_MESSAGE2"; + case 53249: + parameterCount = 2; + return "PS_PROVIDEReventE_O_ScheduledJobStarted"; + case 53250: + parameterCount = 3; + return "PS_PROVIDEReventE_O_ScheduledJobCompleted"; + case 53251: + parameterCount = 4; + return "PS_PROVIDEReventE_O_ScheduledJobException"; + case 53504: + parameterCount = 2; + return "PS_PROVIDEReventE_O_REMOTE_NAMEDPIPE_LISTENER_START"; + case 53505: + parameterCount = 2; + return "PS_PROVIDEReventE_O_REMOTE_NAMEDPIPE_LISTENER_END"; + case 53506: + parameterCount = 3; + return "PS_PROVIDEReventE_O_REMOTE_NAMEDPIPE_LISTENER_ERROR"; + case 53507: + parameterCount = 3; + return "PS_PROVIDEReventE_O_REMOTE_NAMEDPIPE_CONNECT"; + case 53508: + parameterCount = 3; + return "PS_PROVIDEReventE_O_REMOTE_NAMEDPIPE_DISCONNECT"; + } + parameterCount = 0; + return null; + } + } +} +#endif diff --git a/src/System.Management.Automation/System.Management.Automation.csproj b/src/System.Management.Automation/System.Management.Automation.csproj index a9c43f67117..98cc8af08fd 100644 --- a/src/System.Management.Automation/System.Management.Automation.csproj +++ b/src/System.Management.Automation/System.Management.Automation.csproj @@ -119,6 +119,7 @@ + diff --git a/src/System.Management.Automation/engine/PropertyAccessor.cs b/src/System.Management.Automation/engine/PropertyAccessor.cs index eade35a7f66..d44e34461fa 100644 --- a/src/System.Management.Automation/engine/PropertyAccessor.cs +++ b/src/System.Management.Automation/engine/PropertyAccessor.cs @@ -9,6 +9,7 @@ using System.Threading; using System.Management.Automation; +using System.Management.Automation.Internal; using Microsoft.Win32; using Newtonsoft.Json; @@ -101,6 +102,51 @@ internal enum PropertyScope internal abstract string GetDefaultSourcePath(); internal abstract void SetDefaultSourcePath(string defaultPath); +#if UNIX + /// + /// Gets the application identity (name) to use for writing to syslog. + /// + /// + /// The string identity to use for writing to syslog. + /// + /// The default value is 'powershell' + /// + /// + internal abstract string GetSysLogIdentity(); + + /// + /// Gets the log level filter. + /// + /// One of the PSLevel values indicating the level to log. + /// + /// The default value is PSLevel.Informational + /// + /// + internal abstract PSLevel GetLogLevel(); + + /// + /// Gets the bitmask of the PSChannel values to log. + /// + /// + /// A bitmask of PSChannel.Operational and/or PSChannel.Analytic + /// + /// The default value is PSChannel.Operational + /// + /// + internal abstract PSChannel GetLogChannels(); + + /// + /// Gets the bitmask of keywords to log. + /// + /// + /// A bitmask of PSKeyword values. + /// + /// The default value is all keywords other than UseAlwaysAnalytic + /// + /// + internal abstract PSKeyword GetLogKeywords(); + +#endif // UNIX #endregion // Interface Methods } @@ -310,6 +356,155 @@ internal override void SetDefaultSourcePath(string defaultPath) WriteValueToFile(fileName, "DefaultSourcePath", defaultPath); } +#if UNIX + /// + /// Gets the identity name to use for writing to syslog. + /// + /// + /// The string identity to use for writing to syslog. + /// + /// The default value is 'powershell'. + /// + /// + internal override string GetSysLogIdentity() + { + string fileName = Path.Combine(psHomeConfigDirectory, configFileName); + string identity = ReadValueFromFile(fileName, "LogIdentity"); + + if (string.IsNullOrEmpty(identity) || + identity.Equals(LogDefaultValue, StringComparison.OrdinalIgnoreCase)) + { + identity = "powershell"; + } + return identity; + } + + /// + /// Gets the log level filter. + /// + /// One of the PSLevel values indicating the level to log. + /// + /// The default value is PSLevel.Informational. + /// + /// + internal override PSLevel GetLogLevel() + { + string fileName = Path.Combine(psHomeConfigDirectory, configFileName); + string levelName = ReadValueFromFile(fileName, "LogLevel"); + PSLevel level; + + if (string.IsNullOrEmpty(levelName) || + levelName.Equals(LogDefaultValue, StringComparison.OrdinalIgnoreCase) || + !Enum.TryParse(levelName, true, out level)) + { + level = PSLevel.Informational; + } + return level; + } + + /// + /// The supported separator characters for listing channels and keywords in configuration. + /// + static readonly char[] s_valueSeparators = new char[] {' ', ',', '|'}; + + /// + /// Provides a string name to indicate the default for a configuration setting. + /// + const string LogDefaultValue = "default"; + + const PSChannel DefaultChannels = PSChannel.Operational; + + /// + /// Gets the bitmask of the PSChannel values to log. + /// + /// + /// A bitmask of PSChannel.Operational and/or PSChannel.Analytic. + /// + /// The default value is PSChannel.Operational. + /// + /// + internal override PSChannel GetLogChannels() + { + string fileName = Path.Combine(psHomeConfigDirectory, configFileName); + string values = ReadValueFromFile(fileName, "LogChannels"); + + PSChannel result = 0; + if (!string.IsNullOrEmpty(values)) + { + string[] names = values.Split(s_valueSeparators, StringSplitOptions.RemoveEmptyEntries); + + foreach (string name in names) + { + if (name.Equals(LogDefaultValue, StringComparison.OrdinalIgnoreCase)) + { + result = 0; + break; + } + + PSChannel value; + if (Enum.TryParse(name, true, out value)) + { + result |= value; + } + } + } + + if (result == 0) + { + result = DefaultChannels; + } + + return result; + } + + // by default, do not include analytic events. + const PSKeyword DefaultKeywords = (PSKeyword) (0xFFFFFFFFFFFFFFFF & ~(ulong)PSKeyword.UseAlwaysAnalytic); + + /// + /// Gets the bitmask of keywords to log. + /// + /// + /// A bitmask of PSKeyword values. + /// + /// The default value is all keywords other than UseAlwaysAnalytic. + /// + /// + internal override PSKeyword GetLogKeywords() + { + string fileName = Path.Combine(psHomeConfigDirectory, configFileName); + string values = ReadValueFromFile(fileName, "LogKeywords"); + + PSKeyword result = 0; + if (!string.IsNullOrEmpty(values)) + { + string[] names = values.Split(s_valueSeparators, StringSplitOptions.RemoveEmptyEntries); + + foreach (string name in names) + { + if (name.Equals(LogDefaultValue, StringComparison.OrdinalIgnoreCase)) + { + result = 0; + break; + } + + PSKeyword value; + if (Enum.TryParse(name, true, out value)) + { + result |= value; + } + } + } + + if (result == 0) + { + result = DefaultKeywords; + } + + return result; + } + +#endif // UNIX + private T ReadValueFromFile(string fileName, string key) { fileLock.EnterReadLock(); diff --git a/src/System.Management.Automation/engine/remoting/common/PSETWTracer.cs b/src/System.Management.Automation/engine/remoting/common/PSETWTracer.cs index 54ae63b4fbf..5008ab57dde 100644 --- a/src/System.Management.Automation/engine/remoting/common/PSETWTracer.cs +++ b/src/System.Management.Automation/engine/remoting/common/PSETWTracer.cs @@ -9,6 +9,7 @@ namespace System.Management.Automation.Internal /// /// Defines enumerations for the keywords /// + [Flags] internal enum PSKeyword : ulong { Runspace = 0x1, @@ -194,6 +195,7 @@ internal enum PSEventId : int /// /// Defines enumerations for channels /// + [Flags] internal enum PSChannel : byte { Operational = 0x10, diff --git a/src/System.Management.Automation/logging/LogProvider.cs b/src/System.Management.Automation/logging/LogProvider.cs index 362a417c67c..c5445c010e9 100644 --- a/src/System.Management.Automation/logging/LogProvider.cs +++ b/src/System.Management.Automation/logging/LogProvider.cs @@ -3,6 +3,8 @@ --********************************************************************/ using System.Collections.Generic; +using System.Text; +using System.Management.Automation.Internal; namespace System.Management.Automation { @@ -119,6 +121,170 @@ internal virtual bool UseLoggingVariables() } #endregion + + #region Shared utilities + + private static class Strings + { + // The strings are stored in a different class to defer loading the resources until as late + // as possible, e.g. if logging is never on, these strings won't be loaded. + internal static readonly string LogContextSeverity = EtwLoggingStrings.LogContextSeverity; + internal static readonly string LogContextHostName = EtwLoggingStrings.LogContextHostName; + internal static readonly string LogContextHostVersion = EtwLoggingStrings.LogContextHostVersion; + internal static readonly string LogContextHostId = EtwLoggingStrings.LogContextHostId; + internal static readonly string LogContextHostApplication = EtwLoggingStrings.LogContextHostApplication; + internal static readonly string LogContextEngineVersion = EtwLoggingStrings.LogContextEngineVersion; + internal static readonly string LogContextRunspaceId = EtwLoggingStrings.LogContextRunspaceId; + internal static readonly string LogContextPipelineId = EtwLoggingStrings.LogContextPipelineId; + internal static readonly string LogContextCommandName = EtwLoggingStrings.LogContextCommandName; + internal static readonly string LogContextCommandType = EtwLoggingStrings.LogContextCommandType; + internal static readonly string LogContextScriptName = EtwLoggingStrings.LogContextScriptName; + internal static readonly string LogContextCommandPath = EtwLoggingStrings.LogContextCommandPath; + internal static readonly string LogContextSequenceNumber = EtwLoggingStrings.LogContextSequenceNumber; + internal static readonly string LogContextUser = EtwLoggingStrings.LogContextUser; + internal static readonly string LogContextConnectedUser = EtwLoggingStrings.LogContextConnectedUser; + internal static readonly string LogContextTime = EtwLoggingStrings.LogContextTime; + internal static readonly string LogContextShellId = EtwLoggingStrings.LogContextShellId; + } + + /// + /// Gets PSLogUserData from execution context. + /// + /// + /// + protected static string GetPSLogUserData(ExecutionContext context) + { + if (context == null) + { + return String.Empty; + } + + object logData = context.GetVariableValue(SpecialVariables.PSLogUserDataPath); + + if (logData == null) + { + return String.Empty; + } + + return logData.ToString(); + } + + /// + /// Appends exception information. + /// + /// string builder. + /// exception. + protected static void AppendException(StringBuilder sb, Exception except) + { + sb.AppendLine(StringUtil.Format(EtwLoggingStrings.ErrorRecordMessage, except.Message)); + + IContainsErrorRecord ier = except as IContainsErrorRecord; + + if (ier != null) + { + ErrorRecord er = ier.ErrorRecord; + + if (er != null) + { + sb.AppendLine(StringUtil.Format(EtwLoggingStrings.ErrorRecordId, er.FullyQualifiedErrorId)); + + ErrorDetails details = er.ErrorDetails; + + if (details != null) + { + sb.AppendLine(StringUtil.Format(EtwLoggingStrings.ErrorRecordRecommendedAction, details.RecommendedAction)); + } + } + } + } + + /// + /// Appends additional information. + /// + /// string builder. + /// additional information. + protected static void AppendAdditionalInfo(StringBuilder sb, Dictionary additionalInfo) + { + if (additionalInfo != null) + { + foreach (KeyValuePair value in additionalInfo) + { + sb.AppendLine(StringUtil.Format("{0} = {1}", value.Key, value.Value)); + } + } + } + + /// + /// Gets PSLevel from severity. + /// + /// error severity. + /// PS log level. + protected static PSLevel GetPSLevelFromSeverity(string severity) + { + switch (severity) + { + case "Critical": + case "Error": + return PSLevel.Error; + case "Warning": + return PSLevel.Warning; + default: + return PSLevel.Informational; + } + } + + // Estimate an approximate size to use for the StringBuilder in LogContextToString + // Estimated length of all Strings.* values + // Rough estimate of values + // max path for Command path + const int LogContextInitialSize = 30 * 16 + 13 * 20 + 255; + + /// + /// Converts log context to string + /// + /// log context + /// string representation + protected static string LogContextToString(LogContext context) + { + StringBuilder sb = new StringBuilder(LogContextInitialSize); + + sb.Append(Strings.LogContextSeverity); + sb.AppendLine(context.Severity); + sb.Append(Strings.LogContextHostName); + sb.AppendLine(context.HostName); + sb.Append(Strings.LogContextHostVersion); + sb.AppendLine(context.HostVersion); + sb.Append(Strings.LogContextHostId); + sb.AppendLine(context.HostId); + sb.Append(Strings.LogContextHostApplication); + sb.AppendLine(context.HostApplication); + sb.Append(Strings.LogContextEngineVersion); + sb.AppendLine(context.EngineVersion); + sb.Append(Strings.LogContextRunspaceId); + sb.AppendLine(context.RunspaceId); + sb.Append(Strings.LogContextPipelineId); + sb.AppendLine(context.PipelineId); + sb.Append(Strings.LogContextCommandName); + sb.AppendLine(context.CommandName); + sb.Append(Strings.LogContextCommandType); + sb.AppendLine(context.CommandType); + sb.Append(Strings.LogContextScriptName); + sb.AppendLine(context.ScriptName); + sb.Append(Strings.LogContextCommandPath); + sb.AppendLine(context.CommandPath); + sb.Append(Strings.LogContextSequenceNumber); + sb.AppendLine(context.SequenceNumber); + sb.Append(Strings.LogContextUser); + sb.AppendLine(context.User); + sb.Append(Strings.LogContextConnectedUser); + sb.AppendLine(context.ConnectedUser); + sb.Append(Strings.LogContextShellId); + sb.AppendLine(context.ShellId); + + return sb.ToString(); + } + + #endregion } /// diff --git a/src/System.Management.Automation/resources/EventResource.resx b/src/System.Management.Automation/resources/EventResource.resx new file mode 100644 index 00000000000..5099674c6eb --- /dev/null +++ b/src/System.Management.Automation/resources/EventResource.resx @@ -0,0 +1,630 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + A message was not found for event id PowerShell-Core-Instrumentation.man. + + + Scheduled Job {0} started at {1} %n + + + Scheduled Job {0} completed at {1} with state {2} %n + + + Scheduled Job Exception {0}: %n Message: {1} %n StackTrace: {2} %n InnerException: {3} %n + + + Workflow plugin loaded. %n %t EndpointName: {0} %n %t User: {1} %n %t HostingMode: {2} %n %t Protocol: {3} %n %t Configuration: %n {4} + + + Workflow execution started. %n %t WorkflowId: {0} %n %t ManagedNodes: {1} + + + Workflow state changed. %n %t WorkflowId: {0} %n %t NewState: {1} %n %t OldState: {2} + + + Workflow plugin has been requested for a shutdown. %n %t EndpointName: {0} + + + Workflow plugin restarted. %n %t EndpointName: {0} + + + Workflow is resuming. %n %t WorkflowId: {0} + + + A quota limit that was set for the endpoint was exceeded. %n %t EndpointName: {0} %n %t ConfigName: {1} %n %t AllowedValue: {2} %n %t ValueInQuestion: {3} + + + Workflow has resumed. %n %t WorkflowId: {0} + + + Workflow runspace pool was created. %n %t WorkflowId: {0} %n %t ManagedNode: {1} + + + Activity was queued for execution. %n %t WorkflowId: {0} %n %t ActivityName: {1} + + + Activity execution started. %n %t ActivityName: {0} %n %t ActivityTypeName: {1} + + + Workflow is being imported from a XAML file. %n %t WorkflowId: {0} %n %t XamlFile: {1} + + + Workflow has been imported from a XAML file. %n %t WorkflowId: {0} %n %t XamlFile: {1} + + + Workflow could not be imported from a XAML file because of an error. %n %t WorkflowId: {0} %n %t ErrorDescription: {1} + + + Workflow validation started. %n %t WorkflowId: {0} + + + Workflow validation succeeded. %n %t WorkflowId: {0} + + + Workflow validation failed with error. %n %t WorkflowId: {0} + + + Workflow activity validated. %n %t WorkflowId: {0} %n %t ActivityDisplayName: {1} %n %t ActivityTypeName: {2} + + + Workflow activity could not be validated. %n %t WorkflowId: {0} %n %t ActivityDisplayName: {1} %n %t ActivityTypeName: {2} + + + Activity execution failed. %n %t WorkflowId: {0} %n %t ActivityName: {1} %n %t FailureDescription: {2} + + + Runspace availability changed. %n %t RunspaceId: {0} %n %t Availability: {1} + + + Runspace state changed. %n %t RunspaceId: {0} %n %t NewState: {1} %n %t OldState: {2} + + + Workflow loaded for execution. %n %t WorkflowId: {0} + + + Workflow unloaded. %n %t WorkflowId: {0} + + + Workflow execution cancelled. %n %t WorkflowId: {0} + + + Workflow execution aborted. %n %t WorkflowId: {0} + + + Workflow cleanup operation executed. %n %t WorkflowId: {0} + + + Persisted workflow loaded from disk. %n %t WorkflowId: {0} %n %t Path: {1} + + + Workflow data was deleted from disk. %n %t WorkflowId: {0} %n %t Path: {1} + + + Starting remove job. %n %t JobId: {0} + + + Job state changed. %n %t JobId: {0} %n %t WorkflowId: {1} %n %t NewState: {2} %n %t OldState: {3} + + + Job error. %n %t JobId: {0} %n %t WorkflowId: {1} %n %t ErrorDescription: {2} + + + Job created for workflow (child job). %n %t ParentJobId: {0} %n %t ChildJobId: {1} %n %t ChildWorkflowId: {2} + + + Parent job created for workflow. %n %t JobId: {0} + + + All required jobs were created for workflow execution. %n %t JobId: {0} %n %t WorkflowId: {1} + + + Child job removed for workflow. %n %t ParentJobId: {0} %n %t ChildJobId: {1} %n %t WorkflowId: {2} + + + An error occurred while removing job. %n %t ParentJobId: {0} %n %t ChildJobId: {1} %n %t WorkflowId: {2} %n %t Error: {3} + + + Loading workflow for execution. %n %t WorkflowId: {0} + + + Workflow execution finished. %n %t WorkflowId: {0} + + + Cancelling workflow execution. %n %t WorkflowId: {0} + + + Aborting workflow execution. %n %t WorkflowId: {0} %n %t Reason: {1} + + + Unloading workflow. %n %t WorkflowId: {0} + + + Forced workflow shutdown started. %n %t WorkflowId: {0} + + + Forced workflow shutdown finished. %n %t WorkflowId: {0} + + + An error occurred while forcefully shutting down a workflow. %n %t WorkflowId: {0} %n %t ErrorDescription: {1} + + + Persisting workflow to disk. %n %t WorkflowId: {0} %n %t PersistPath: {1} + + + Workflow persisted to disk. %n %t WorkflowId: {0} + + + Activity execution finished. %n %t ActivityName: {0} + + + Workflow execution error. %n %t WorkflowId: {0} %n %t ErrorDescription: {1} + + + A new PowerShell endpoint was registered. %n %t EndpointName: {0} %n %t EndpointType: {1} %n %t RegisteredBy: {2} + + + Endpoint configuration modified. %n %t EndpointName: {0} %n %t ModifiedBy: {1} + + + Endpoint configuration unregistered. %n %t EndpointName: {0} %n %t UnregisteredBy: {1} + + + Endpoint configuration disabled. %n %t EndpointName: {0} %n %t DisabledBy: {1} + + + Endpoint configuration enabled. %n %t EndpointName: {0} %n %t EnabledBy: {1} + + + Out of process runspace started. %n %t Command: {0} + + + Parameter splatting was performed during workflow execution. %n %t Parameters: {0} %n %t Computers: {1} + + + Workflow engine started. %n %t EndpointName: {0} + + + Workflow manager instantiated with %n %t CheckpointPath: {0} %n %t ConfigProviderId: {1} %n %t UserName: {2} %n %t Path: {3} + + + Computer Name $null or . resolve to LocalHost + + + Resolving to default scheme http + + + Remote shell name resolved to default PowerShellCore + + + {2}%n%nContext:%n{0}%n%nUser Data:%n{1}%n + + + {2}%n%nContext:%n{0}%n%nUser Data:%n{1}%n + + + {2}%n%nContext:%n{0}%n%nUser Data:%n{1}%n + + + {2}%n%nContext:%n{0}%n%nUser Data:%n{1}%n + + + Creating Scriptblock text ({0} of {1}):%n{2}%n%nScriptBlock ID: {3}%nPath: {4} + + + Started invocation of ScriptBlock ID: {0}%nRunspace ID: {1} + + + Completed invocation of ScriptBlock ID: {0}%nRunspace ID: {1} + + + {2}%n%nContext:%n{0}%n%nUser Data:%n{1}%n + + + {2}%n%nContext:%n{0}%n%nUser Data:%n{1}%n + + + {2}%n%nContext:%n{0}%n%nUser Data:%n{1}%n + + + {2}%n%nContext:%n{0}%n%nUser Data:%n{1}%n + + + Correlating activity id's. %n %t CurrentActivityId: {0} %n %t ParentActivityId: {1} + + + Class Name = {0}%nMethod Name = {1}%nWorkflow GUID = {2}%nMessage = {3}%n{4}%nActivity Name = {5}%nActivity GUID = {6}%nParameters = {7} + + + Creating Runspace object %n %t Instance Id: {0} + + + Creating RunspacePool object %n %t InstanceId {0} %n %t MinRunspaces {1} %n %t MaxRunspaces {2} + + + Opening RunspacePool + + + Modifying activity Id and correlating + + + Runspace state changed to {0} + + + Attempting session creation retry {0} for error code {1} on session Id {2} + + + Windows PowerShell has started an IPC listening thread on process: {0} in AppDomain: {1}. + + + Windows PowerShell has ended an IPC listening thread on process: {0} in AppDomain: {1}. + + + An error has occurred in Windows PowerShell IPC listening thread on process: {0} in AppDomain: {1}. Error Message: {2}. + + + Windows PowerShell IPC connect on process: {0} in AppDomain: {1} for User: {2}. + + + Windows PowerShell IPC disconnect on process: {0} in AppDomain: {1} for User: {2}. + + + Port resolved to {0} + + + AppName resolved to {0} + + + ComputerName resolved to {0} + + + Scheme is {0} + + + Test analytic message + + + Connection Paramters are %n Connection URI: {0} %n Resource URI: {1} %n User: {2} %n OpenTimeout: {3} %n IdleTimeout: {4} %n CancelTimeout: {5} %n AuthenticationMechanism: {6} %n Thumb Print: {7} %n MaxUriRedirectionCount: {8} %n MaxReceivedDataSizePerCommand: {0}0 %n MaxReceivedObjectSize: {0}1 + + + Modifying activity Id and correlating + + + Received object with Runspace Id: {0} Command Id: {1} Destination: {2} DataType: {3} TargetInterface: {4} + + + An unhandled exception occurred in the appdomain. %nException Type: {0} %nException Message: {1} %nException StackTrace: {2} + + + Runspace Id: {0} Pipeline Id: {1}. WSMan reported an error with error code: {2}. %n Error message: {3} %n StackTrace: {4} + + + An unhandled exception occurred in the appdomain. %nException Type: {0} %nException Message: {1} %nException StackTrace: {2} + + + Runspace Id: {0} Pipeline Id: {1}. WSMan reported an error with error code: {2}. %n Error message: {3} %n StackTrace: {4} + + + Runspace Id {0}. Establishing a connection using WSMan Create Shell + + + Runspace Id {0}. Callback received for WSMan Create Shell + + + Runspace Id: {0}. Closing shell using WSManCloseShell + + + Runspace Id: {0}. Callback received for WSManCloseShell + + + Runspace Id: {0} Pipeline Id: {1}. Sending data of size {2} + + + Runspace Id: {0} Pipeline Id: {1}. Callback received for WSManSendShellInputEx + + + Runspace Id: {0} Pipeline Id: {1}. Placing Receive request using WSManReceiveShellOutputEx + + + Runspace Id: {0} Pipeline Id: {1}. Received Data of size {2}. + + + Runspace Id {0} Pipeline Id {1}. Establishing a command connection using WSManRunShellCommandEx + + + Runspace Id {0} Pipeline Id {1}. Callback received for command connection + + + Runspace Id: {0} Pipeline Id {1}. Closing transport for command + + + Runspace Id: {0} Pipeline Id {1}. Callback received for command close + + + Runspace Id: {0} Pipeline Id {1}. Sending signal with code {2} using WSManSignalShellEx + + + Runspace Id: {0} Pipeline Id {1}. Callback received for WSManSignalShellEx + + + Runspace Id: {0}. Connection is getting redirected to Uri: {1} + + + Runspace Id: {0} Pipeline Id: {1}. Server is sending data of size {2} to client. DataType: {3} TargetInterface: {4} + + + Request {0}. Creating a server remote session. UserName: {1} Custome Shell Id: {2} + + + Reporting context for request: {0} Context Reported: {0} + + + Reporting operation complete for request: {0} %n Error Code: {1} %n Error Message: {2} %n StackTrace: {3} + + + Shell Context {0}. Request Id {1}. Creating a commonad session for running a command. + + + Shell Context {0} Command Context {1} Request Id {2}. Stopping command. + + + Shell Context {0} Command Context {1} Request Id {2}. Received data from client. + + + Shell Context {0} Command Context {1} Request Id {2}. Client sent a receive request so that server can send data. + + + Shell Context {0} Command Context {1} IsReceiveOperation {2}. Got close operation request. + + + Loading assembly {0} for custom shell with shell Id {1} + + + Loading type {0} for custom shell with shell Id {1} + + + Received remoting fragment. %n %t Object Id: {0} %n %t Fragment Id: {1} %n %t Start Flag: {2} %n %t End Flag: {3} %n %t Payload Length: {4} %n %t Payload Data: {5} + + + Sent remoting fragment. %n %t Object Id: {0} %n %t Fragment Id: {1} %n %t Start Flag: {2} %n %t End Flag: {3} %n %t Payload Length: {4} %n %t Payload Data: {5} + + + Shutting down winrm service. + + + Successfully rehydrated an object. %n %t Deserialized type name: {0} %n %t Rehydrated by casting to type: {1} %n %t Rehydrated object is of type: {2} + + + Failed to rehydrated an object. %n %t Deserialized type name: {0} %n %t Rehydrated by casting to type: {1} %n %t Type cast exception: {2} %n %t Type cast inner exception: {3} + + + Serialization depth has been overriden. %n %t Serialized type name: {0} %n %t Original depth: {1} %n %t Overriden depth: {2} %n %t Current depth below top level: {3} + + + Serialization mode has been overriden. %n %t Serialized type name: {0} %n %t Overriden mode: {1} + + + Serialization of a script property has been skipped, because there is no runspace to use for evaluation of the property. %n %t Property name: {0} %n %t Property owner's type name: {1} %n %t Getter script: {2} + + + Serialization of a property has been skipped, because property getter failed. %n %t Property name: {0} %n %t Property owner's type name: {1} %n %t Exception from property getter: {2} %n %t Inner exception from property getter: {3} + + + Serialization of an enumerable object might not be complete, because object being enumerated threw an exception. %n %t Type of object being enumerated: {0} %n %t Exception: {1} + + + Serialization called object's ToString method which failed. %n %t Type of object: {0} %n %t Exception: {1} + + + Maximum depth below top level has been reached, forcing object to be serialized as strings. %n %t Object type at max depth: {0} %n %t Property name at max depth: {1} %n %t Depth: {2} + + + XmlException has been thrown by the deserializer (most likely indicating incorrect clixml format). %n %t Line number: {0} Line position: {1} %n %t Exception: {2} + + + Serialization of specified properties failed, because one of the specified properties was missing. %n %t Type of object: {0} %n %t Property name: {1} + + + PowerShell console is starting up + + + PowerShell console is ready for user input + + + {0} + + + Tracing ErrorRecord: %n Message: {0} %n CategoryInfo.Category: {1} %n CategoryInfo.Reason : {2} %n CategoryInfo.TargetName : {3} %n FullyQualifiedErrorId: {4} %n Exception Details: %n Message : {5} %n Stack Trace: {6} %n InnerException {7} %n + + + Exception: %n Message: {0} %n StackTrace: {1} %n InnerException : {2} %n + + + Tracing PSObject + + + Tracing Job: %n Id: {0} %n InstanceId: {1} %n Name: {2} %n Location: {3} %n State: {4} %n Command: {5} %n + + + Trace Information: %n {0} + + + Trace Information: %n {0} {1} + + + BEGIN ImportWorkflowCommand::StartWorkflowApplication. Starting invocation of workflow function. Tracking Guid {0} + + + END ImportWorkflowCommand::StartWorkflowApplication. Ending invocation of workflow function. Tracking Guid {0} + + + BEGIN Creating new job in ImportWorkflowCommand::StartWorkflowApplication. Tracking Guid {0} + + + END Creating new job in ImportWorkflowCommand::StartWorkflowApplication. Tracking Guid {0} + + + END Creating new job in ImportWorkflowCommand::StartWorkflowApplication. Tracking Guid {0} : ContainerParentJob Guid {1} + + + BEGIN JobLogic ContainerParentJob Guid {0} + + + END JobLogic ContainerParentJob Guid {0} + + + BEGIN WorkflowExecution ContainerParentJob Guid {0} + + + END WorkflowExecution ContainerParentJob Guid {0} + + + WorkflowJob with Guid {0} added to ContainerParentJob with Guid {1} + + + ProxyJob with Guid {0} associated with remote ContainerParentJob with Guid {1} + + + BEGIN Execution of ContainerParentJob with Guid {0} + + + END Execution of ContainerParentJob with Guid {0} + + + BEGIN Execution of Proxy Job with Guid {0} + + + END Execution of Proxy Job with Guid {0} + + + BEGIN StateChanged event handler for Proxy Job with Guid {0} + + + END StateChanged event handler for Proxy Job with Guid {0} + + + BEGIN StateChanged event handler for Proxy Child Job with Guid {0} + + + END StateChanged event handler for Proxy Child Job with Guid {0} + + + BEGIN Running garbage collection + + + END Running garbage collection + + + Persistence store has reached its maximum specified size + + + Windows PowerShell ISE has started to run script file {0}. + + + Windows PowerShell ISE has started to run a user-selected script from file {0}. + + + Windows PowerShell ISE is stopping the current command. + + + Windows PowerShell ISE is resuming the debugger. + + + Windows PowerShell ISE is stopping the debugger. + + + Windows PowerShell ISE is stepping into debugging. + + + Windows PowerShell ISE is stepping over debugging. + + + Windows PowerShell ISE is stepping out of debugging. + + + Windows PowerShell ISE is enabling all breakpoints. + + + Windows PowerShell ISE is disabling all breakpoints. + + + Windows PowerShell ISE is removing all breakpoints. + + + Windows PowerShell ISE is setting the breakpoint at line #: {0} of file {1}. + + + Windows PowerShell ISE is removing the breakpoint on line #: {0} of file {1}. + + + Windows PowerShell ISE is enabling the breakpoint on line #: {0} of file {1}. + + + Windows PowerShell ISE is disabling the breakpoint on line #: {0} of file {1}. + + + Windows PowerShell ISE has hit a breakpoint on line #: {0} of file {1}. + + diff --git a/src/System.Management.Automation/utils/PowerShellETWTracer.cs b/src/System.Management.Automation/utils/PowerShellETWTracer.cs index 06e9bf39319..39990d8a30d 100644 --- a/src/System.Management.Automation/utils/PowerShellETWTracer.cs +++ b/src/System.Management.Automation/utils/PowerShellETWTracer.cs @@ -809,7 +809,7 @@ public sealed class PowerShellChannelWriter : BaseChannelWriter /* * Making the provider static to reduce the number of buffers needed to 1. * */ - private static readonly EventProvider _provider = new EventProvider(new Guid("A0C1853B-5C40-4b15-8766-3CF1C58F985A")); + private static readonly EventProvider _provider = new EventProvider(PSEtwLogProvider.ProviderGuid); private bool disposed; private PowerShellTraceKeywords _keywords; diff --git a/src/System.Management.Automation/utils/tracing/EtwActivity.cs b/src/System.Management.Automation/utils/tracing/EtwActivity.cs index 45794cc00bd..75db5129b6c 100644 --- a/src/System.Management.Automation/utils/tracing/EtwActivity.cs +++ b/src/System.Management.Automation/utils/tracing/EtwActivity.cs @@ -251,7 +251,6 @@ public void Callback(IAsyncResult asyncResult) } } - private static Guid powerShellProviderId = Guid.Parse("A0C1853B-5C40-4b15-8766-3CF1C58F985A"); private static Dictionary providers = new Dictionary(); private static object syncLock = new object(); @@ -431,7 +430,7 @@ protected virtual Guid ProviderId { get { - return powerShellProviderId; + return PSEtwLogProvider.ProviderGuid; } } diff --git a/src/System.Management.Automation/utils/tracing/PSEtwLog.cs b/src/System.Management.Automation/utils/tracing/PSEtwLog.cs index c2f449862f4..8ba057e94bf 100644 --- a/src/System.Management.Automation/utils/tracing/PSEtwLog.cs +++ b/src/System.Management.Automation/utils/tracing/PSEtwLog.cs @@ -1,4 +1,3 @@ -#if !UNIX // // Copyright (c) Microsoft Corporation. All rights reserved. // @@ -13,14 +12,22 @@ namespace System.Management.Automation.Tracing /// internal static class PSEtwLog { +#if UNIX + private static PSSysLogProvider provider; +#else private static PSEtwLogProvider provider; +#endif /// /// Class constructor /// static PSEtwLog() { +#if UNIX + provider = new PSSysLogProvider(); +#else provider = new PSEtwLogProvider(); +#endif } /// @@ -311,6 +318,3 @@ internal static void WriteTransferEvent(Guid parentActivityId) } } } - - -#endif diff --git a/src/System.Management.Automation/utils/tracing/PSEtwLogProvider.cs b/src/System.Management.Automation/utils/tracing/PSEtwLogProvider.cs old mode 100644 new mode 100755 index 01b3b636bcb..574508a004c --- a/src/System.Management.Automation/utils/tracing/PSEtwLogProvider.cs +++ b/src/System.Management.Automation/utils/tracing/PSEtwLogProvider.cs @@ -15,38 +15,15 @@ namespace System.Management.Automation.Tracing internal class PSEtwLogProvider : LogProvider { private static EventProvider etwProvider; - private static readonly string PowerShellEventProviderGuid = "A0C1853B-5C40-4b15-8766-3CF1C58F985A"; + internal static readonly Guid ProviderGuid = new Guid("F90714A8-5509-434A-BF6D-B1624C8A19A2"); private static EventDescriptor _xferEventDescriptor = new EventDescriptor(0x1f05, 0x1, 0x11, 0x5, 0x14, 0x0, (long)0x4000000000000000); - private static class Strings - { - // The strings are stored in a different class to defer loading the resources until as late - // as possible, e.g. if logging is never on, these strings won't be loaded. - internal static readonly string LogContextSeverity = EtwLoggingStrings.LogContextSeverity; - internal static readonly string LogContextHostName = EtwLoggingStrings.LogContextHostName; - internal static readonly string LogContextHostVersion = EtwLoggingStrings.LogContextHostVersion; - internal static readonly string LogContextHostId = EtwLoggingStrings.LogContextHostId; - internal static readonly string LogContextHostApplication = EtwLoggingStrings.LogContextHostApplication; - internal static readonly string LogContextEngineVersion = EtwLoggingStrings.LogContextEngineVersion; - internal static readonly string LogContextRunspaceId = EtwLoggingStrings.LogContextRunspaceId; - internal static readonly string LogContextPipelineId = EtwLoggingStrings.LogContextPipelineId; - internal static readonly string LogContextCommandName = EtwLoggingStrings.LogContextCommandName; - internal static readonly string LogContextCommandType = EtwLoggingStrings.LogContextCommandType; - internal static readonly string LogContextScriptName = EtwLoggingStrings.LogContextScriptName; - internal static readonly string LogContextCommandPath = EtwLoggingStrings.LogContextCommandPath; - internal static readonly string LogContextSequenceNumber = EtwLoggingStrings.LogContextSequenceNumber; - internal static readonly string LogContextUser = EtwLoggingStrings.LogContextUser; - internal static readonly string LogContextConnectedUser = EtwLoggingStrings.LogContextConnectedUser; - internal static readonly string LogContextTime = EtwLoggingStrings.LogContextTime; - internal static readonly string LogContextShellId = EtwLoggingStrings.LogContextShellId; - } - /// /// Class constructor /// static PSEtwLogProvider() { - etwProvider = new EventProvider(new Guid(PowerShellEventProviderGuid)); + etwProvider = new EventProvider(ProviderGuid); } /// @@ -269,137 +246,6 @@ internal override bool UseLoggingVariables() return false; } - /// - /// Gets PSLogUserData from execution context - /// - /// - /// - private static string GetPSLogUserData(ExecutionContext context) - { - if (context == null) - { - return String.Empty; - } - - object logData = context.GetVariableValue(SpecialVariables.PSLogUserDataPath); - - if (logData == null) - { - return String.Empty; - } - - return logData.ToString(); - } - - /// - /// Appends exception information - /// - /// string builder - /// exception - internal static void AppendException(StringBuilder sb, Exception except) - { - sb.AppendLine(StringUtil.Format(EtwLoggingStrings.ErrorRecordMessage, except.Message)); - - IContainsErrorRecord ier = except as IContainsErrorRecord; - - if (ier != null) - { - ErrorRecord er = ier.ErrorRecord; - - if (er != null) - { - sb.AppendLine(StringUtil.Format(EtwLoggingStrings.ErrorRecordId, er.FullyQualifiedErrorId)); - - ErrorDetails details = er.ErrorDetails; - - if (details != null) - { - sb.AppendLine(StringUtil.Format(EtwLoggingStrings.ErrorRecordRecommendedAction, details.RecommendedAction)); - } - } - } - } - - /// - /// Appends additional information - /// - /// string builder - /// additional information - private static void AppendAdditionalInfo(StringBuilder sb, Dictionary additionalInfo) - { - if (additionalInfo != null) - { - foreach (KeyValuePair value in additionalInfo) - { - sb.AppendLine(StringUtil.Format("{0} = {1}", value.Key, value.Value)); - } - } - } - - /// - /// Gets PSLevel from severity - /// - /// error severity - /// PS log level - private static PSLevel GetPSLevelFromSeverity(string severity) - { - switch (severity) - { - case "Critical": - case "Error": - return PSLevel.Error; - case "Warning": - return PSLevel.Warning; - default: - return PSLevel.Informational; - } - } - - /// - /// Converts log context to string - /// - /// log context - /// string representation - private static string LogContextToString(LogContext context) - { - StringBuilder sb = new StringBuilder(); - - sb.Append(Strings.LogContextSeverity); - sb.AppendLine(context.Severity); - sb.Append(Strings.LogContextHostName); - sb.AppendLine(context.HostName); - sb.Append(Strings.LogContextHostVersion); - sb.AppendLine(context.HostVersion); - sb.Append(Strings.LogContextHostId); - sb.AppendLine(context.HostId); - sb.Append(Strings.LogContextHostApplication); - sb.AppendLine(context.HostApplication); - sb.Append(Strings.LogContextEngineVersion); - sb.AppendLine(context.EngineVersion); - sb.Append(Strings.LogContextRunspaceId); - sb.AppendLine(context.RunspaceId); - sb.Append(Strings.LogContextPipelineId); - sb.AppendLine(context.PipelineId); - sb.Append(Strings.LogContextCommandName); - sb.AppendLine(context.CommandName); - sb.Append(Strings.LogContextCommandType); - sb.AppendLine(context.CommandType); - sb.Append(Strings.LogContextScriptName); - sb.AppendLine(context.ScriptName); - sb.Append(Strings.LogContextCommandPath); - sb.AppendLine(context.CommandPath); - sb.Append(Strings.LogContextSequenceNumber); - sb.AppendLine(context.SequenceNumber); - sb.Append(Strings.LogContextUser); - sb.AppendLine(context.User); - sb.Append(Strings.LogContextConnectedUser); - sb.AppendLine(context.ConnectedUser); - sb.Append(Strings.LogContextShellId); - sb.AppendLine(context.ShellId); - - return sb.ToString(); - } - /// /// Writes a single event /// diff --git a/src/System.Management.Automation/utils/tracing/PSSysLogProvider.cs b/src/System.Management.Automation/utils/tracing/PSSysLogProvider.cs new file mode 100755 index 00000000000..3f316b1e55a --- /dev/null +++ b/src/System.Management.Automation/utils/tracing/PSSysLogProvider.cs @@ -0,0 +1,337 @@ +#if UNIX +// +// Copyright (C) Microsoft. All rights reserved. +// +using System.Diagnostics.Eventing; +using System.Management.Automation.Internal; +using System.Text; +using System.Collections.Generic; + +namespace System.Management.Automation.Tracing +{ + /// + /// SysLog LogProvider implementation. + /// + internal class PSSysLogProvider : LogProvider + { + private static SysLogProvider s_provider; + + // by default, do not include analytic events + internal const PSKeyword DefaultKeywords = (PSKeyword) (0xFFFFFFFFFFFFFFFF & ~(ulong)PSKeyword.UseAlwaysAnalytic); + + /// + /// Class constructor. + /// + static PSSysLogProvider() + { + s_provider = new SysLogProvider(ConfigPropertyAccessor.Instance.GetSysLogIdentity(), + ConfigPropertyAccessor.Instance.GetLogLevel(), + ConfigPropertyAccessor.Instance.GetLogKeywords(), + ConfigPropertyAccessor.Instance.GetLogChannels()); + } + + /// + /// Defines a thread local StringBuilder for building event payload strings. + /// + /// + /// NOTE: do not access this field directly, use the PayloadBuilder + /// property to ensure correct thread initialization; otherwise, a null reference can occur. + /// + [ThreadStatic] + private static StringBuilder _payloadBuilder; + + private static StringBuilder PayloadBuilder + { + get + { + if (_payloadBuilder == null) + { + // NOTE: Thread static fields must be explicitly initialized for each thread. + _payloadBuilder = new StringBuilder(200); + } + return _payloadBuilder; + } + } + + + + /// + /// Determines whether any session is requesting the specified event from the provider. + /// + /// + /// + /// + /// + /// Typically, a provider does not call this method to determine whether a session requested the specified event; + /// the provider simply writes the event, and ETW determines whether the event is logged to a session. A provider + /// may want to call this function if the provider needs to perform extra work to generate the event. In this case, + /// calling this function first to determine if a session requested the event or not, may save resources and time. + /// + internal bool IsEnabled(PSLevel level, PSKeyword keywords) + { + return s_provider.IsEnabled(level, keywords); + } + + /// + /// Provider interface function for logging health event + /// + /// + /// + /// + /// + /// + internal override void LogEngineHealthEvent(LogContext logContext, int eventId, Exception exception, Dictionary additionalInfo) + { + StringBuilder payload = PayloadBuilder; + payload.Clear(); + + AppendException(payload, exception); + payload.AppendLine(); + AppendAdditionalInfo(payload, additionalInfo); + + WriteEvent(PSEventId.Engine_Health, PSChannel.Operational, PSOpcode.Exception, PSTask.ExecutePipeline, logContext, payload.ToString()); + } + + /// + /// Provider interface function for logging engine lifecycle event + /// + /// + /// + /// + /// + internal override void LogEngineLifecycleEvent(LogContext logContext, EngineState newState, EngineState previousState) + { + if (IsEnabled(PSLevel.Informational, PSKeyword.Cmdlets | PSKeyword.UseAlwaysAnalytic)) + { + StringBuilder payload = PayloadBuilder; + payload.Clear(); + + payload.AppendLine(StringUtil.Format(EtwLoggingStrings.EngineStateChange, previousState.ToString(), newState.ToString())); + + PSTask task = PSTask.EngineStart; + + if (newState == EngineState.Stopped || + newState == EngineState.OutOfService || + newState == EngineState.None || + newState == EngineState.Degraded) + { + task = PSTask.EngineStop; + } + + WriteEvent(PSEventId.Engine_Lifecycle, PSChannel.Analytic, PSOpcode.Method, task, logContext, payload.ToString()); + } + } + + /// + /// Provider interface function for logging command health event + /// + /// + /// + internal override void LogCommandHealthEvent(LogContext logContext, Exception exception) + { + StringBuilder payload = PayloadBuilder; + payload.Clear(); + + AppendException(payload, exception); + + WriteEvent(PSEventId.Command_Health, PSChannel.Operational, PSOpcode.Exception, PSTask.ExecutePipeline, logContext, payload.ToString()); + } + + /// + /// Provider interface function for logging command lifecycle event + /// + /// + /// + /// + internal override void LogCommandLifecycleEvent(Func getLogContext, CommandState newState) + { + if (IsEnabled(PSLevel.Informational, PSKeyword.Cmdlets | PSKeyword.UseAlwaysAnalytic)) + { + LogContext logContext = getLogContext(); + StringBuilder payload = PayloadBuilder; + payload.Clear(); + + if (logContext.CommandType != null) + { + if (logContext.CommandType.Equals(StringLiterals.Script, StringComparison.OrdinalIgnoreCase)) + { + payload.AppendLine(StringUtil.Format(EtwLoggingStrings.ScriptStateChange, newState.ToString())); + } + else + { + payload.AppendLine(StringUtil.Format(EtwLoggingStrings.CommandStateChange, logContext.CommandName, newState.ToString())); + } + } + + PSTask task = PSTask.CommandStart; + + if (newState == CommandState.Stopped || + newState == CommandState.Terminated) + { + task = PSTask.CommandStop; + } + + WriteEvent(PSEventId.Command_Lifecycle, PSChannel.Analytic, PSOpcode.Method, task, logContext, payload.ToString()); + } + } + + /// + /// Provider interface function for logging pipeline execution detail. + /// + /// + /// + internal override void LogPipelineExecutionDetailEvent(LogContext logContext, List pipelineExecutionDetail) + { + StringBuilder payload = PayloadBuilder; + payload.Clear(); + + if (pipelineExecutionDetail != null) + { + foreach (String detail in pipelineExecutionDetail) + { + payload.AppendLine(detail); + } + } + + WriteEvent(PSEventId.Pipeline_Detail, PSChannel.Operational, PSOpcode.Method, PSTask.ExecutePipeline, logContext, payload.ToString()); + } + + /// + /// Provider interface function for logging provider health event + /// + /// + /// + /// + internal override void LogProviderHealthEvent(LogContext logContext, string providerName, Exception exception) + { + StringBuilder payload = PayloadBuilder; + payload.Clear(); + + AppendException(payload, exception); + payload.AppendLine(); + + Dictionary additionalInfo = new Dictionary(); + + additionalInfo.Add(EtwLoggingStrings.ProviderNameString, providerName); + + AppendAdditionalInfo(payload, additionalInfo); + + WriteEvent(PSEventId.Provider_Health, PSChannel.Operational, PSOpcode.Exception, PSTask.ExecutePipeline, logContext, payload.ToString()); + } + + /// + /// Provider interface function for logging provider lifecycle event + /// + /// + /// + /// + /// + internal override void LogProviderLifecycleEvent(LogContext logContext, string providerName, ProviderState newState) + { + if (IsEnabled(PSLevel.Informational, PSKeyword.Cmdlets | PSKeyword.UseAlwaysAnalytic)) + { + StringBuilder payload = PayloadBuilder; + payload.Clear(); + + payload.AppendLine(StringUtil.Format(EtwLoggingStrings.ProviderStateChange, providerName, newState.ToString())); + + PSTask task = PSTask.ProviderStart; + + if (newState == ProviderState.Stopped) + { + task = PSTask.ProviderStop; + } + + WriteEvent(PSEventId.Provider_Lifecycle, PSChannel.Analytic, PSOpcode.Method, task, logContext, payload.ToString()); + } + } + + /// + /// Provider interface function for logging settings event + /// + /// + /// + /// + /// + /// + internal override void LogSettingsEvent(LogContext logContext, string variableName, string value, string previousValue) + { + if (IsEnabled(PSLevel.Informational, PSKeyword.Cmdlets | PSKeyword.UseAlwaysAnalytic)) + { + StringBuilder payload = PayloadBuilder; + payload.Clear(); + + if (previousValue == null) + { + payload.AppendLine(StringUtil.Format(EtwLoggingStrings.SettingChangeNoPrevious, variableName, value)); + } + else + { + payload.AppendLine(StringUtil.Format(EtwLoggingStrings.SettingChange, variableName, previousValue, value)); + } + + WriteEvent(PSEventId.Settings, PSChannel.Analytic, PSOpcode.Method, PSTask.ExecutePipeline, logContext, payload.ToString()); + } + } + + /// + /// The SysLog provider does not use logging variables + /// + /// + internal override bool UseLoggingVariables() + { + return false; + } + + /// + /// Writes a single event + /// + /// event id + /// + /// + /// + /// log context + /// + internal void WriteEvent(PSEventId id, PSChannel channel, PSOpcode opcode, PSTask task, LogContext logContext, string payLoad) + { + s_provider.Log(id, channel, task, opcode, GetPSLevelFromSeverity(logContext.Severity), DefaultKeywords, + LogContextToString(logContext), + GetPSLogUserData(logContext.ExecutionContext), + payLoad); + } + + /// + /// Writes an event + /// + /// + /// + /// + /// + /// + /// + /// + internal void WriteEvent(PSEventId id, PSChannel channel, PSOpcode opcode, PSLevel level, PSTask task, PSKeyword keyword, params object[] args) + { + s_provider.Log(id, channel, task, opcode, level, keyword, args); + } + + /// + /// Writes an activity transfer event + /// + internal void WriteTransferEvent(Guid parentActivityId) + { + s_provider.LogTransfer(parentActivityId); + } + + /// + /// Sets the activity id for the current thread. + /// + /// the GUID identifying the activity. + internal void SetActivityIdForCurrentThread(Guid newActivityId) + { + s_provider.SetActivity(newActivityId); + } + } +} + +#endif // UNIX diff --git a/src/System.Management.Automation/utils/tracing/SysLogProvider.cs b/src/System.Management.Automation/utils/tracing/SysLogProvider.cs new file mode 100755 index 00000000000..d54392e607a --- /dev/null +++ b/src/System.Management.Automation/utils/tracing/SysLogProvider.cs @@ -0,0 +1,522 @@ +#if UNIX + +using System; +using System.Diagnostics; +using System.Globalization; +using System.Reflection; +using System.Resources; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading; + +using System.Management.Automation.Internal; + +namespace System.Management.Automation.Tracing +{ + /// + /// Encapsulates the message resource and SysLog logging for an ETW event. + /// The other half of the partial class is generated by EtwGen and contains a + /// static dictionary containing the event id mapped to the associated event meta data + /// and resource string reference. + /// + /// + /// This component logs ETW trace events to syslog. + /// The log entries use the following common format + /// (commitId:threadId:channelid) [context] payload + /// Where: + /// commitId: A hash code of the full git commit id string. + /// threadid: The thread identifier of calling code. + /// channelid: The identifier for the output channel. See PSChannel for values. + /// context: Dependent on the type of log entry. + /// payload: Dependent on the type of log entry. + /// Note: + /// commitId, threadId, and eventId are logged as HEX without a leading + /// '0x'. + /// + /// 4 types of log entries are produced. + /// NOTE: Where constant string are logged, the template places the string in + /// double quotes. For example, the GitCommitId log entry uses "GitCommitId" + /// for the context value. + /// + /// Note that the examples illustrate the output from SysLogProvider.Log, + /// Data automatically prepended by syslog, such as timestamp, hostname, ident, + /// and processid are not shown. + /// + /// GitCommitId + /// This is the first log entry for a session. It provides a correlation + /// between the full git commit id string and a hash code used for subsequent + /// log entries. + /// Context: "GitCommitId" + /// Payload: string "Hash:" hashcode as HEX string. + /// For official builds, the GitCommitID is the release tag. For other builds the commit id may include an SHA-1 hash at the + /// end of the release tag. + /// Example 1: Official release + /// (19E1025:3:10) [GitCommitId] v6.0.0-beta.9 Hash:64D0C08D + /// Example 2: Commit id with SHA-1 hash + /// (19E1025:3:10) [GitCommitId] v6.0.0-beta.8-67-gca2630a3dea6420a3cd3914c84a74c1c45311f54 Hash:8EE3A3B3 + /// + /// Transfer + /// A log entry to record a transfer event. + /// Context: "Transfer" + /// The playload is two, space separated string guids, the first being the + /// parent activityid followed by the new activityid. + /// Example: (19E1025:3:10) [Transfer] {de168a71-6bb9-47e4-8712-bc02506d98be} {ab0077f6-c042-4728-be76-f688cfb1b054} + /// + /// Activity + /// A log entry for when activity is set. + /// Context: "Activity" + /// Payload: The string guid of the activity id. + /// Example: (19E1025:3:10) [Activity] {ab0077f6-c042-4728-be76-f688cfb1b054} + /// + /// Event + /// Application logging (Events) + /// Context: EventId:taskname.opcodename.levelname + /// Payload: The event's message text formatted with arguments from the caller. + /// Example: (19E1025:3:10) [Perftrack_ConsoleStartupStart:PowershellConsoleStartup.WinStart.Informational] PowerShell console is starting up + /// + internal class SysLogProvider + { + // Ensure the string pointer is not garbage collected. + static IntPtr _nativeSyslogIdent = IntPtr.Zero; + static NativeMethods.SysLogPriority _facility = NativeMethods.SysLogPriority.Local0; + + byte _channelFilter; + ulong _keywordFilter; + byte _levelFilter; + + /// + /// Initializes a new instance of this class. + /// + /// The log identity name used to identify the application in syslog. + /// The trace lavel to enable. + /// The keywords to enable. + /// The output channels to enable. + public SysLogProvider(string applicationId, PSLevel level, PSKeyword keywords, PSChannel channels) + { + // NOTE: This string needs to remain valid for the life of the process since the underlying API keeps + // a reference to it. + // FUTURE: If logging is redesigned, make these details static or a singleton since there should only be one + // instance active. + _nativeSyslogIdent = Marshal.StringToHGlobalAnsi(applicationId); + NativeMethods.OpenLog(_nativeSyslogIdent, _facility); + _keywordFilter = (ulong)keywords; + _levelFilter = (byte) level; + _channelFilter = (byte) channels; + } + + /// + /// Defines a thread local StringBuilder for building log messages. + /// + /// + /// NOTE: do not access this field directly, use the MessageBuilder + /// property to ensure correct thread initialization; otherwise, a null reference can occur. + /// + [ThreadStatic] + private static StringBuilder _messageBuilder; + + private static StringBuilder MessageBuilder + { + get + { + if (_messageBuilder == null) + { + // NOTE: Thread static fields must be explicitly initialized for each thread. + _messageBuilder = new StringBuilder(200); + } + return _messageBuilder; + } + } + + /// + /// Defines a activity id for the current thread. + /// + /// + /// NOTE: do not access this field directly, use the Activity property + /// to ensure correct thread initialization. + /// + [ThreadStatic] + static Guid? _activity; + + private static Guid Activity + { + get + { + if (_activity.HasValue == false) + { + // NOTE: Thread static fields must be explicitly initialized for each thread. + _activity = Guid.NewGuid(); + } + return _activity.Value; + } + set + { + _activity = value; + } + } + + /// + /// Gets the value indicating if the specified level and keywords are enabled for logging. + /// + /// The PSLevel to check. + /// The PSKeyword to check. + /// true if the specified level and keywords are enabled for logging. + internal bool IsEnabled(PSLevel level, PSKeyword keywords) + { + return ( ((ulong) keywords & _keywordFilter) != 0 && + ((int) level <= _levelFilter) ); + } + + // NOTE: There are a number of places where PowerShell code sends analytic events + // to the operational channel. This is a side-effect of the custom wrappers that + // use flags that are not consistent with the event definition. + // To ensure filtering of analytic events is consistent, both keyword and channel + // filtering is performed to suppress analytic events. + private bool ShouldLog(PSLevel level, PSKeyword keywords, PSChannel channel) + { + return ((_channelFilter & (ulong)channel) != 0 && + IsEnabled(level, keywords)); + } + + #region resource manager + + private static global::System.Resources.ResourceManager _resourceManager; + private static global::System.Globalization.CultureInfo _resourceCulture; + + private static global::System.Resources.ResourceManager ResourceManager + { + get + { + if (object.ReferenceEquals(_resourceManager, null)) + { + _resourceManager = new global::System.Resources.ResourceManager("System.Management.Automation.resources.EventResource", typeof(EventResource).GetTypeInfo().Assembly); + } + return _resourceManager; + } + } + + /// + /// Overrides the current threads CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return _resourceCulture; + } + set + { + _resourceCulture = value; + } + } + + private static string GetResourceString(string resourceName) + { + string value = ResourceManager.GetString(resourceName, Culture); + if (string.IsNullOrEmpty(value)) + { + value = string.Format(CultureInfo.InvariantCulture, "Unknown resource: {0}", resourceName); + Diagnostics.Assert(false, value); + } + return value; + } + + #endregion resource manager + + /// + /// Gets the EventMessage for a given event. + /// + /// The StringBuilder to append. + /// The id of the event to retrieve. + /// An array of zero or more payload objects. + private static void GetEventMessage(StringBuilder sb, PSEventId eventId, params object[] args ) + { + int parameterCount; + string resourceName = EventResource.GetMessage((int) eventId, out parameterCount); + + if (resourceName == null) + { + // If an event id was specified that is not found in the event resource lookup table, + // use a placeholder message that includes the event id. + resourceName = EventResource.GetMissingEventMessage(out parameterCount); + Diagnostics.Assert(false, sb.ToString()); + args = new object[] {eventId}; + } + + string resourceValue = GetResourceString(resourceName); + if (parameterCount > 0) + { + sb.AppendFormat(resourceValue, args); + } + else + { + sb.Append(resourceValue); + } + } + + #region logging + + // maps a LogLevel to an associated SysLogPriority. + static NativeMethods.SysLogPriority[] _levels = + { + NativeMethods.SysLogPriority.Info, + NativeMethods.SysLogPriority.Critical, + NativeMethods.SysLogPriority.Error, + NativeMethods.SysLogPriority.Warning, + NativeMethods.SysLogPriority.Info, + NativeMethods.SysLogPriority.Info + }; + + /// + /// Logs a activity transfer. + /// + /// The parent activity id. + public void LogTransfer(Guid parentActivityId) + { + // NOTE: always log + int threadId = Thread.CurrentThread.ManagedThreadId; + string message = string.Format(CultureInfo.InvariantCulture, + "({0}:{1:X}:{2:X}) [Transfer]:{3} {4}", + PSVersionInfo.GitCommitId, threadId, PSChannel.Operational, + parentActivityId.ToString("B"), + Activity.ToString("B")); + + NativeMethods.SysLog(NativeMethods.SysLogPriority.Info, message); + } + + /// + /// Logs the activity identifier for the current thread. + /// + /// The Guid activity identifier. + public void SetActivity(Guid activity) + { + int threadId = Thread.CurrentThread.ManagedThreadId; + Activity = activity; + + // NOTE: always log + string message = string.Format(CultureInfo.InvariantCulture, + "({0:X}:{1:X}:{2:X}) [Activity] {3}", + PSVersionInfo.GitCommitId, threadId, PSChannel.Operational, activity.ToString("B")); + NativeMethods.SysLog(NativeMethods.SysLogPriority.Info, message); + } + + /// + /// Writes a log entry. + /// + /// The event id of the log entry. + /// The channel to log. + /// The task for the log entry. + /// The operation for the log entry. + /// The logging level. + /// The keyword(s) for the event. + /// The payload for the log message. + public void Log(PSEventId eventId, PSChannel channel, PSTask task, PSOpcode opcode, PSLevel level, PSKeyword keyword, params object[] args) + { + if (ShouldLog(level, keyword, channel)) + { + int threadId = Thread.CurrentThread.ManagedThreadId; + + StringBuilder sb = MessageBuilder; + sb.Clear(); + + // add the message preamble + sb.AppendFormat(CultureInfo.InvariantCulture, + "({0}:{1:X}:{2:X}) [{3:G}:{4:G}.{5:G}.{6:G}] ", + PSVersionInfo.GitCommitId, threadId, channel, eventId, task, opcode, level); + + // add the message + GetEventMessage(sb, eventId, args); + + NativeMethods.SysLogPriority priority; + if ((int) level <= _levels.Length) + { + priority = _levels[(int)level]; + } + else + { + priority = NativeMethods.SysLogPriority.Info; + } + // log it. + NativeMethods.SysLog(priority, sb.ToString()); + } + } + + #endregion logging + } + + internal enum LogLevel : uint + { + Always = 0, + Critical = 1, + Error = 2, + Warning = 3, + Information = 4, + Verbose = 5 + } + + internal static class NativeMethods + { + /// + /// Write a message to the system logger, which in turn writes the message to the system console, log files, etc. + /// See man 3 syslog for more info. + /// + /// + /// The OR of a priority and facility in the SysLogPriority enum indicating the the priority and facility of the log entry. + /// + /// The message to put in the log entry. + [DllImport("psl-native", CharSet = CharSet.Ansi, EntryPoint = "Native_SysLog")] + internal static extern void SysLog(SysLogPriority priority, string message); + + [DllImport("psl-native", CharSet = CharSet.Ansi, EntryPoint = "Native_OpenLog")] + internal static extern void OpenLog(IntPtr ident, SysLogPriority facility); + + [DllImport("psl-native", EntryPoint = "Native_CloseLog")] + internal static extern void CloseLog(); + + [Flags] + internal enum SysLogPriority : uint + { + // Priorities enum values. + + /// + /// System is unusable + /// + Emergency = 0, + + /// + /// Action must be taken immediately + /// + Alert = 1, + + /// + /// Critical conditions + /// + Critical = 2, + + /// + /// Error conditions + /// + Error = 3, + + /// + /// Warning conditions + /// + Warning = 4, + + /// + /// Normal but significant condition + /// + Notice = 5, + + /// + /// Informational + /// + Info = 6, + + /// + /// Debug-level messages + /// + Debug = 7, + + // Facility enum values. + + /// + /// Kernel messages + /// + Kernel = (0<<3), + + /// + /// Random user-level messages + /// + User = (1<<3), + + /// + /// Mail system + /// + Mail = (2<<3), + + /// + /// System daemons + /// + Daemon = (3<<3), + + /// + /// Authorization messages + /// + Authorization = (4<<3), + + /// + /// Messages generated internally by syslogd + /// + Syslog = (5<<3), + + /// + /// Line printer subsystem + /// + Lpr = (6<<3), + + /// + /// Network news subsystem + /// + News = (7<<3), + + /// + /// UUCP subsystem + /// + Uucp = (8<<3), + + /// + /// Clock daemon + /// + Cron = (9<<3), + + /// + /// Security/authorization messages (private) + /// + Authpriv = (10<<3), + + /// + /// FTP daemon + /// + Ftp = (11<<3), + + // Reserved for system use + + /// + /// Reserved for local use + /// + Local0 = (16<<3), + /// + /// Reserved for local use + /// + Local1 = (17<<3), + /// + /// Reserved for local use + /// + Local2 = (18<<3), + /// + /// Reserved for local use + /// + Local3 = (19<<3), + /// + /// Reserved for local use + /// + Local4 = (20<<3), + /// + /// Reserved for local use + /// + Local5 = (21<<3), + /// + /// Reserved for local use + /// + Local6 = (22<<3), + /// + /// Reserved for local use + /// + Local7 = (23<<3), + } + } +} + +#endif // UNIX diff --git a/tools/ResxGen/PowerShell-Core-Instrumentation.man b/tools/ResxGen/PowerShell-Core-Instrumentation.man new file mode 100644 index 00000000000..2fad01ea51c --- /dev/null +++ b/tools/ResxGen/PowerShell-Core-Instrumentation.man @@ -0,0 +1,5635 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + + 15728640 + + + + + + true + + 1048985600 + + + + 64 + + + + + + true + + 1048985600 + + + + 64 + + + + + + true + + 1048985600 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +