@@ -188,14 +188,13 @@ function Register-PSSessionConfiguration |
188 | 188 | }} |
189 | 189 | }} |
190 | 190 | if (([System.Management.Automation.Runspaces.PSSessionConfigurationAccessMode]::Local.Equals($accessMode) -or |
191 | | - ([System.Management.Automation.Runspaces.PSSessionConfigurationAccessMode]::Remote.Equals($accessMode)-and $disableNetworkExists)) -and |
192 | | - !$haveDisableACE) |
| 191 | + ([System.Management.Automation.Runspaces.PSSessionConfigurationAccessMode]::Remote.Equals($accessMode))) -and !$haveDisableACE) |
193 | 192 | {{ |
194 | | - # Add network deny ACE for local access or remote access with PSRemoting disabled ($disableNetworkExists) |
| 193 | + # Add network deny ACE for local access or remote access with PSRemoting disabled. |
195 | 194 | $sd.DiscretionaryAcl.AddAccess(""deny"", $networkSID, 268435456, ""None"", ""None"") |
196 | 195 | $newSDDL = $sd.GetSddlForm(""all"") |
197 | 196 | }} |
198 | | - if ([System.Management.Automation.Runspaces.PSSessionConfigurationAccessMode]::Remote.Equals($accessMode) -and -not $disableNetworkExists -and $haveDisableACE) |
| 197 | + if ([System.Management.Automation.Runspaces.PSSessionConfigurationAccessMode]::Remote.Equals($accessMode) -and $haveDisableACE) |
199 | 198 | {{ |
200 | 199 | # Remove the specific ACE |
201 | 200 | $sd.discretionaryacl.RemoveAccessSpecific('Deny', $securityIdentifierToPurge, 268435456, 'none', 'none') |
@@ -4796,16 +4795,119 @@ public sealed class EnablePSRemotingCommand : PSCmdlet |
4796 | 4795 |
|
4797 | 4796 | //TODO: CLR4: Remove the logic for setting the MaxMemoryPerShellMB to 200 MB once IPMO->Get-Command->Get-Help memory usage issue is fixed. |
4798 | 4797 | private const string enableRemotingSbFormat = @" |
4799 | | -function Generate-PluginConfigFile |
| 4798 | +Set-StrictMode -Version Latest |
| 4799 | +
|
| 4800 | +function New-PluginConfigFile |
4800 | 4801 | {{ |
| 4802 | +[CmdletBinding(SupportsShouldProcess=$true, ConfirmImpact=""Medium"")] |
4801 | 4803 | param( |
4802 | 4804 | [Parameter()] [string] $pluginInstallPath |
4803 | 4805 | ) |
4804 | 4806 | $pluginConfigFile = Join-Path $pluginInstallPath ""RemotePowerShellConfig.txt"" |
4805 | 4807 |
|
4806 | 4808 | # This always overwrites the file with a new version of it (if it already exists) |
4807 | | - Set-Content -Path $pluginConfigFile -Value ""PSHOMEDIR=$PSHOME"" |
4808 | | - Add-Content -Path $pluginConfigFile -Value ""CORECLRDIR=$PSHOME"" |
| 4809 | + Set-Content -Path $pluginConfigFile -Value ""PSHOMEDIR=$PSHOME"" -ErrorAction Stop |
| 4810 | + Add-Content -Path $pluginConfigFile -Value ""CORECLRDIR=$PSHOME"" -ErrorAction Stop |
| 4811 | +}} |
| 4812 | +
|
| 4813 | +function Copy-PluginToEndpoint |
| 4814 | +{{ |
| 4815 | +param( |
| 4816 | + [Parameter()] [string] $endpointDir |
| 4817 | +) |
| 4818 | + $resolvedPluginInstallPath = """" |
| 4819 | + $pluginInstallPath = Join-Path ([System.Environment]::GetFolderPath([System.Environment+SpecialFolder]::Windows) + ""\System32\PowerShell"") $endpointDir |
| 4820 | + if (!(Test-Path $pluginInstallPath)) |
| 4821 | + {{ |
| 4822 | + $resolvedPluginInstallPath = New-Item -Type Directory -Path $pluginInstallPath |
| 4823 | + }} |
| 4824 | + else |
| 4825 | + {{ |
| 4826 | + $resolvedPluginInstallPath = Resolve-Path $pluginInstallPath |
| 4827 | + }} |
| 4828 | + if (!(Test-Path $resolvedPluginInstallPath\{5})) |
| 4829 | + {{ |
| 4830 | + Copy-Item -Path $PSHOME\{5} -Destination $resolvedPluginInstallPath -Force -ErrorAction Stop |
| 4831 | + if (!(Test-Path $resolvedPluginInstallPath\{5})) |
| 4832 | + {{ |
| 4833 | + Write-Error ($errorMsgUnableToInstallPlugin -f ""{5}"", $resolvedPluginInstallPath) |
| 4834 | + return $null |
| 4835 | + }} |
| 4836 | + }} |
| 4837 | + return $resolvedPluginInstallPath |
| 4838 | +}} |
| 4839 | +
|
| 4840 | +function Register-Endpoint |
| 4841 | +{{ |
| 4842 | +param( |
| 4843 | + [Parameter()] [string] $configurationName |
| 4844 | +) |
| 4845 | + # |
| 4846 | + # Section 1: |
| 4847 | + # Move pwrshplugin.dll from $PSHOME to the endpoint directory |
| 4848 | + # |
| 4849 | + # The plugin directory pattern for endpoint configuration is: |
| 4850 | + # '$env:WINDIR\System32\PowerShell\' + powershell_version, |
| 4851 | + # so we call Copy-PluginToEndpoint function only with the PowerShell version argument. |
| 4852 | +
|
| 4853 | + $pwshVersion = $configurationName.Replace(""PowerShell."", """") |
| 4854 | + $resolvedPluginInstallPath = Copy-PluginToEndpoint $pwshVersion |
| 4855 | + if (!$resolvedPluginInstallPath) {{ |
| 4856 | + return |
| 4857 | + }} |
| 4858 | +
|
| 4859 | + # |
| 4860 | + # Section 2: |
| 4861 | + # Generate the Plugin Configuration File |
| 4862 | + # |
| 4863 | + New-PluginConfigFile $resolvedPluginInstallPath |
| 4864 | +
|
| 4865 | + # |
| 4866 | + # Section 3: |
| 4867 | + # Register the endpoint |
| 4868 | + # |
| 4869 | + $null = Register-PSSessionConfiguration -Name $configurationName -force -ErrorAction Stop |
| 4870 | +
|
| 4871 | + set-item -WarningAction SilentlyContinue wsman:\localhost\plugin\$configurationName\Quotas\MaxShellsPerUser -value ""25"" -confirm:$false |
| 4872 | + set-item -WarningAction SilentlyContinue wsman:\localhost\plugin\$configurationName\Quotas\MaxIdleTimeoutms -value {4} -confirm:$false |
| 4873 | + restart-service winrm -confirm:$false |
| 4874 | +}} |
| 4875 | +
|
| 4876 | +function Register-EndpointIfNotPresent |
| 4877 | +{{ |
| 4878 | +[CmdletBinding(SupportsShouldProcess=$true, ConfirmImpact=""Medium"")] |
| 4879 | +param( |
| 4880 | + [Parameter()] [string] $Name, |
| 4881 | + [Parameter()] [bool] $Force, |
| 4882 | + [Parameter()] [string] $queryForRegisterDefault, |
| 4883 | + [Parameter()] [string] $captionForRegisterDefault |
| 4884 | +) |
| 4885 | + # |
| 4886 | + # This cmdlet will make sure default powershell end points exist upon successful completion. |
| 4887 | + # |
| 4888 | + # Windows PowerShell: |
| 4889 | + # Microsoft.PowerShell |
| 4890 | + # Microsoft.PowerShell32 (wow64) |
| 4891 | + # |
| 4892 | + # PowerShell Core: |
| 4893 | + # PowerShell.<version ID> |
| 4894 | + # |
| 4895 | + $errorCount = $error.Count |
| 4896 | + $endPoint = Get-PSSessionConfiguration $Name -Force:$Force -ErrorAction silentlycontinue 2>&1 |
| 4897 | + $newErrorCount = $error.Count |
| 4898 | +
|
| 4899 | + # remove the 'No Session Configuration matches criteria' errors |
| 4900 | + for ($index = 0; $index -lt ($newErrorCount - $errorCount); $index ++) |
| 4901 | + {{ |
| 4902 | + $error.RemoveAt(0) |
| 4903 | + }} |
| 4904 | +
|
| 4905 | + $qMessage = $queryForRegisterDefault -f ""$Name"",""Register-PSSessionConfiguration {0} -force"" |
| 4906 | + if ((!$endpoint) -and |
| 4907 | + ($force -or $pscmdlet.ShouldProcess($qMessage, $captionForRegisterDefault))) |
| 4908 | + {{ |
| 4909 | + Register-Endpoint $Name |
| 4910 | + }} |
4809 | 4911 | }} |
4810 | 4912 |
|
4811 | 4913 | function Enable-PSRemoting |
@@ -4836,70 +4938,16 @@ function Enable-PSRemoting |
4836 | 4938 | # first try to enable all the sessions |
4837 | 4939 | Enable-PSSessionConfiguration @PSBoundParameters |
4838 | 4940 |
|
4839 | | - # |
4840 | | - # This cmdlet will make sure default powershell end points exist upon successful completion. |
4841 | | - # |
4842 | | - # Windows PowerShell: |
4843 | | - # Microsoft.PowerShell |
4844 | | - # Microsoft.PowerShell32 (wow64) |
4845 | | - # |
4846 | | - # PowerShell Core: |
4847 | | - # PowerShell.<version ID> |
4848 | | - # |
4849 | | - $errorCount = $error.Count |
4850 | | - $endPoint = Get-PSSessionConfiguration {0} -Force:$Force -ErrorAction silentlycontinue 2>&1 |
4851 | | - $newErrorCount = $error.Count |
4852 | | -
|
4853 | | - # remove the 'No Session Configuration matches criteria' errors |
4854 | | - for ($index = 0; $index -lt ($newErrorCount - $errorCount); $index ++) |
4855 | | - {{ |
4856 | | - $error.RemoveAt(0) |
4857 | | - }} |
4858 | | -
|
4859 | | - $qMessage = $queryForRegisterDefault -f ""{0}"",""Register-PSSessionConfiguration {0} -force"" |
4860 | | - if ((!$endpoint) -and |
4861 | | - ($force -or $pscmdlet.ShouldProcess($qMessage, $captionForRegisterDefault))) |
4862 | | - {{ |
4863 | | - $resolvedPluginInstallPath = """" |
4864 | | - # |
4865 | | - # Section 1: |
4866 | | - # Move pwrshplugin.dll from $PSHOME to the endpoint directory |
4867 | | - # |
4868 | | - $pluginInstallPath = Join-Path ""$env:WINDIR\System32\PowerShell"" $psversiontable.GitCommitId |
4869 | | - if (!(Test-Path $pluginInstallPath)) |
4870 | | - {{ |
4871 | | - $resolvedPluginInstallPath = New-Item -Type Directory -Path $pluginInstallPath |
4872 | | - }} |
4873 | | - else |
4874 | | - {{ |
4875 | | - $resolvedPluginInstallPath = Resolve-Path $pluginInstallPath |
4876 | | - }} |
4877 | | - if (!(Test-Path $resolvedPluginInstallPath\{5})) |
4878 | | - {{ |
4879 | | - Copy-Item $PSHOME\{5} $resolvedPluginInstallPath -Force |
4880 | | - if (!(Test-Path $resolvedPluginInstallPath\{5})) |
4881 | | - {{ |
4882 | | - Write-Error ($errorMsgUnableToInstallPlugin -f ""{5}"", $resolvedPluginInstallPath) |
4883 | | - return |
4884 | | - }} |
4885 | | - }} |
| 4941 | + Register-EndpointIfNotPresent -Name {0} $Force $queryForRegisterDefault $captionForRegisterDefault |
4886 | 4942 |
|
4887 | | - # |
4888 | | - # Section 2: |
4889 | | - # Generate the Plugin Configuration File |
4890 | | - # |
4891 | | - Generate-PluginConfigFile $resolvedPluginInstallPath |
4892 | | -
|
4893 | | - # |
4894 | | - # Section 3: |
4895 | | - # Register the endpoint |
4896 | | - # |
4897 | | - $null = Register-PSSessionConfiguration -Name {0} -force |
4898 | | -
|
4899 | | - set-item -WarningAction SilentlyContinue wsman:\localhost\plugin\{0}\Quotas\MaxShellsPerUser -value ""25"" -confirm:$false |
4900 | | - set-item -WarningAction SilentlyContinue wsman:\localhost\plugin\{0}\Quotas\MaxIdleTimeoutms -value {4} -confirm:$false |
4901 | | - restart-service winrm -confirm:$false |
| 4943 | + # Create the default PSSession configuration, not tied to specific PowerShell version |
| 4944 | + # e. g. 'PowerShell.6'. |
| 4945 | + $powershellVersionMajor = $PSVersionTable.PSVersion.ToString() |
| 4946 | + $dotPos = $powershellVersionMajor.IndexOf(""."") |
| 4947 | + if ($dotPos -ne -1) {{ |
| 4948 | + $powershellVersionMajor = $powershellVersionMajor.Substring(0, $dotPos) |
4902 | 4949 | }} |
| 4950 | + Register-EndpointIfNotPresent -Name (""PowerShell."" + $powershellVersionMajor) $Force $queryForRegisterDefault $captionForRegisterDefault |
4903 | 4951 |
|
4904 | 4952 | # PowerShell Workflow and WOW are not supported for PowerShell Core |
4905 | 4953 | if (![System.Management.Automation.Platform]::IsCoreCLR) |
|