1
+ function AddWinRMTrustLocalHost {
2
+ [CmdletBinding ()]
3
+ Param (
4
+ [Parameter (Mandatory = $False )]
5
+ [string ]$NewRemoteHost = " localhost"
6
+ )
7
+
8
+ # Make sure WinRM in Enabled and Running on $env:ComputerName
9
+ try {
10
+ $null = Enable-PSRemoting - Force - ErrorAction Stop
11
+ }
12
+ catch {
13
+ if ($PSVersionTable.PSEdition -eq " Core" ) {
14
+ Import-WinModule NetConnection
15
+ }
16
+
17
+ $NICsWPublicProfile = @ (Get-NetConnectionProfile | Where-Object {$_.NetworkCategory -eq 0 })
18
+ if ($NICsWPublicProfile.Count -gt 0 ) {
19
+ foreach ($Nic in $NICsWPublicProfile ) {
20
+ Set-NetConnectionProfile - InterfaceIndex $Nic.InterfaceIndex - NetworkCategory ' Private'
21
+ }
22
+ }
23
+
24
+ try {
25
+ $null = Enable-PSRemoting - Force
26
+ }
27
+ catch {
28
+ Write-Error $_
29
+ Write-Error " Problem with Enable-PSRemoting WinRM Quick Config! Halting!"
30
+ $global :FunctionResult = " 1"
31
+ return
32
+ }
33
+ }
34
+
35
+ # If $env:ComputerName is not part of a Domain, we need to add this registry entry to make sure WinRM works as expected
36
+ if (! $ (Get-CimInstance Win32_Computersystem).PartOfDomain) {
37
+ $null = reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System / v LocalAccountTokenFilterPolicy / t REG_DWORD / d 1 / f
38
+ }
39
+
40
+ # Add the New Server's IP Addresses to $env:ComputerName's TrustedHosts
41
+ $CurrentTrustedHosts = $ (Get-Item WSMan:\localhost\Client\TrustedHosts).Value
42
+ [System.Collections.ArrayList ][array ]$CurrentTrustedHostsAsArray = $CurrentTrustedHosts -split ' ,'
43
+
44
+ $HostsToAddToWSMANTrustedHosts = @ ($NewRemoteHost )
45
+ foreach ($HostItem in $HostsToAddToWSMANTrustedHosts ) {
46
+ if ($CurrentTrustedHostsAsArray -notcontains $HostItem ) {
47
+ $null = $CurrentTrustedHostsAsArray.Add ($HostItem )
48
+ }
49
+ else {
50
+ Write-Warning " Current WinRM Trusted Hosts Config already includes $HostItem "
51
+ return
52
+ }
53
+ }
54
+ $UpdatedTrustedHostsString = $ ($CurrentTrustedHostsAsArray | Where-Object {! [string ]::IsNullOrWhiteSpace($_ )}) -join ' ,'
55
+ Set-Item WSMan:\localhost\Client\TrustedHosts $UpdatedTrustedHostsString - Force
56
+ }
57
+
1
58
function GetModuleDependencies {
2
59
[CmdletBinding (DefaultParameterSetName = " LoadedFunction" )]
3
60
Param (
@@ -83,6 +140,8 @@ function GetModuleDependencies {
83
140
}
84
141
$ModInfoFromGetCommand = Get-Command - CommandType Cmdlet, Function, Workflow
85
142
143
+ $CurrentlyLoadedModuleNames = $ (Get-Module ).Name
144
+
86
145
[System.Collections.ArrayList ]$AutoFunctionsInfo = @ ()
87
146
88
147
foreach ($ModInfoObj in $ModInfoFromManifests ) {
@@ -92,18 +151,51 @@ function GetModuleDependencies {
92
151
ManifestFileItem = $ModInfoObj.ManifestFileItem
93
152
ExportedCommands = $ModInfoObj.ExportedCommands
94
153
}
95
- $null = $AutoFunctionsInfo.Add ($PSObj )
154
+
155
+ if ($NameOfLoadedFunction ) {
156
+ if ($PSObj.ModuleName -ne $NameOfLoadedFunction -and
157
+ $CurrentlyLoadedModuleNames -notcontains $PSObj.ModuleName
158
+ ) {
159
+ $null = $AutoFunctionsInfo.Add ($PSObj )
160
+ }
161
+ }
162
+ if ($PathToScriptFile ) {
163
+ $ScriptFileItem = Get-Item $PathToScriptFile
164
+ if ($PSObj.ModuleName -ne $ScriptFileItem.BaseName -and
165
+ $CurrentlyLoadedModuleNames -notcontains $PSObj.ModuleName
166
+ ) {
167
+ $null = $AutoFunctionsInfo.Add ($PSObj )
168
+ }
169
+ }
96
170
}
97
171
}
98
172
foreach ($ModInfoObj in $ModInfoFromGetCommand ) {
99
173
$PSObj = [pscustomobject ]@ {
100
174
ModuleName = $ModInfoObj.ModuleName
101
175
ExportedCommands = $ModInfoObj.Name
102
176
}
103
- $null = $AutoFunctionsInfo.Add ($PSObj )
177
+
178
+ if ($NameOfLoadedFunction ) {
179
+ if ($PSObj.ModuleName -ne $NameOfLoadedFunction -and
180
+ $CurrentlyLoadedModuleNames -notcontains $PSObj.ModuleName
181
+ ) {
182
+ $null = $AutoFunctionsInfo.Add ($PSObj )
183
+ }
184
+ }
185
+ if ($PathToScriptFile ) {
186
+ $ScriptFileItem = Get-Item $PathToScriptFile
187
+ if ($PSObj.ModuleName -ne $ScriptFileItem.BaseName -and
188
+ $CurrentlyLoadedModuleNames -notcontains $PSObj.ModuleName
189
+ ) {
190
+ $null = $AutoFunctionsInfo.Add ($PSObj )
191
+ }
192
+ }
104
193
}
105
194
106
- $AutoFunctionsInfo = $AutoFunctionsInfo | Where-Object {! [string ]::IsNullOrWhiteSpace($_ ) -and $_.ManifestFileItem -ne $null }
195
+ $AutoFunctionsInfo = $AutoFunctionsInfo | Where-Object {
196
+ ! [string ]::IsNullOrWhiteSpace($_ ) -and
197
+ $_.ManifestFileItem -ne $null
198
+ }
107
199
108
200
$FunctionRegex = " ([a-zA-Z]|[0-9])+-([a-zA-Z]|[0-9])+"
109
201
$LinesWithFunctions = $ ($FunctionOrScriptContent -split " `n " ) -match $FunctionRegex | Where-Object {! [bool ]$ ($_ -match " [\s]+#" )}
@@ -195,6 +287,8 @@ function InvokePSCompatibility {
195
287
return
196
288
}
197
289
290
+ AddWinRMTrustLocalHost
291
+
198
292
if (! $InvocationMethod ) {
199
293
$MyInvParentScope = Get-Variable " MyInvocation" - Scope 1 - ValueOnly
200
294
$PathToFile = $MyInvParentScope.MyCommand.Source
@@ -360,7 +454,7 @@ function InvokePSCompatibility {
360
454
foreach ($ModuleName in $ModulesNotFoundLocally ) {
361
455
try {
362
456
if (! [bool ]$ (Get-Module - ListAvailable $ModuleName ) -and $InstallModulesNotAvailableLocally ) {
363
- Install-Module $ModuleName - Force - ErrorAction Stop - WarningAction SilentlyContinue
457
+ Install-Module $ModuleName - AllowClobber - Force - ErrorAction Stop - WarningAction SilentlyContinue
364
458
$null = $ModulesSuccessfullyInstalled.Add ($ModuleName )
365
459
}
366
460
@@ -385,7 +479,7 @@ function InvokePSCompatibility {
385
479
386
480
$ManifestFileItem = Invoke-WinCommand - ComputerName localhost - ScriptBlock {
387
481
if (! [bool ]$ (Get-Module - ListAvailable $args [0 ]) -and $args [1 ]) {
388
- Install-Module $args [0 ] - Force
482
+ Install-Module $args [0 ] - AllowClobber - Force
389
483
}
390
484
$ (Get-Item $ (Get-Module - ListAvailable $args [0 ]).Path)
391
485
} - ArgumentList $ModuleName , $InstallModulesNotAvailableLocally - ErrorAction Stop - WarningAction SilentlyContinue
@@ -408,9 +502,9 @@ function InvokePSCompatibility {
408
502
}
409
503
}
410
504
411
- if ($ModulesNotFoundLocally.Count -ne $ModulesSuccessfullyInstalled -and ! $InstallModulesNotAvailableLocally ) {
505
+ if ($ModulesNotFoundLocally.Count -ne $ModulesSuccessfullyInstalled.Count -and ! $InstallModulesNotAvailableLocally ) {
412
506
$ErrMsg = " The following Modules were not found locally, and they will NOT be installed " +
413
- " because the -InstallModulesNotAvailableLocally switch was not used:`n $ ( $ModulesNotFOundLocally -join " `n " ) "
507
+ " because the -InstallModulesNotAvailableLocally switch was not used:`n $ ( $ModulesNotFoundLocally -join " `n " ) "
414
508
Write-Error $ErrMsg
415
509
Write-Warning " No Modules have been Imported or Installed!"
416
510
$global :FunctionResult = " 1"
@@ -438,24 +532,7 @@ function InvokePSCompatibility {
438
532
$_.ModuleName -eq $ModObj.ModuleName
439
533
}
440
534
441
- $AllVersionsPrep = $MatchingModObjs.ManifestFileItem.FullName | Split-Path - Parent
442
-
443
- $AllVersions = foreach ($PotentialVersionPath in $AllVersionsPrep ) {
444
- $PotentialVersionString = $PotentialVersionPath | Split-Path - Leaf
445
-
446
- $VersionCheck = [bool ]$ (
447
- try {
448
- [version ]$PotentialVersionString
449
- }
450
- catch {
451
- Write-Verbose " '$PotentialVersionString ' is not a version number..."
452
- }
453
- )
454
-
455
- if ($VersionCheck ) {
456
- $PotentialVersionString
457
- }
458
- }
535
+ $AllVersions = $MatchingModObjs.ManifestFileItem.FullName | foreach {$ (Import-PowerShellDataFile $_ ).ModuleVersion} | foreach {[version ]$_ }
459
536
460
537
if ($AllVersions.Count -gt 1 ) {
461
538
$VersionsSorted = $AllVersions | Sort-Object | Get-Unique
@@ -464,8 +541,8 @@ function InvokePSCompatibility {
464
541
$VersionsToRemove = $VersionsSorted [0 .. $ ($VersionsSorted.Count - 2 )]
465
542
466
543
foreach ($Version in $ ($VersionsToRemove | foreach {$_.ToString ()})) {
467
- [array ]$ModObjsToRemove = $RequiredLocallyAvailableModulesScan .PSCoreModuleDependencies | Where-Object {
468
- $_.ManifestFileItem.FullName -match " \\ $Version \\ " -and $_.ModuleName -eq $ModObj.ModuleName
544
+ [array ]$ModObjsToRemove = $MatchingModObjs | Where-Object {
545
+ $ ( Import-PowerShellDataFile $ _.ManifestFileItem.FullName ).ModuleVersion -eq $Version -and $_.ModuleName -eq $ModObj.ModuleName
469
546
}
470
547
471
548
foreach ($obj in $ModObjsToRemove ) {
@@ -481,24 +558,7 @@ function InvokePSCompatibility {
481
558
$_.ModuleName -eq $ModObj.ModuleName
482
559
}
483
560
484
- $AllVersionsPrep = $MatchingModObjs.ManifestFileItem.FullName | Split-Path - Parent
485
-
486
- $AllVersions = foreach ($PotentialVersionPath in $AllVersionsPrep ) {
487
- $PotentialVersionString = $PotentialVersionPath | Split-Path - Leaf
488
-
489
- $VersionCheck = [bool ]$ (
490
- try {
491
- [version ]$PotentialVersionString
492
- }
493
- catch {
494
- Write-Verbose " '$PotentialVersionString ' is not a version number..."
495
- }
496
- )
497
-
498
- if ($VersionCheck ) {
499
- $PotentialVersionString
500
- }
501
- }
561
+ $AllVersions = $MatchingModObjs.ManifestFileItem.FullName | foreach {$ (Import-PowerShellDataFile $_ ).ModuleVersion} | foreach {[version ]$_ }
502
562
503
563
if ($AllVersions.Count -gt 1 ) {
504
564
$VersionsSorted = $AllVersions | Sort-Object | Get-Unique
@@ -507,8 +567,8 @@ function InvokePSCompatibility {
507
567
$VersionsToRemove = $VersionsSorted [0 .. $ ($VersionsSorted.Count - 2 )]
508
568
509
569
foreach ($Version in $ ($VersionsToRemove | foreach {$_.ToString ()})) {
510
- [array ]$ModObjsToRemove = $RequiredLocallyAvailableModulesScan .WinPSModuleDependencies | Where-Object {
511
- $_.ManifestFileItem.FullName -match " \\ $Version \\ " -and $_.ModuleName -eq $ModObj.ModuleName
570
+ [array ]$ModObjsToRemove = $MatchingModObjs | Where-Object {
571
+ $ ( Import-PowerShellDataFile $ _.ManifestFileItem.FullName ).ModuleVersion -eq $Version -and $_.ModuleName -eq $ModObj.ModuleName
512
572
}
513
573
514
574
foreach ($obj in $ModObjsToRemove ) {
@@ -520,6 +580,7 @@ function InvokePSCompatibility {
520
580
521
581
# endregion >> Prep
522
582
583
+ $RequiredLocallyAvailableModulesScan
523
584
524
585
# region >> Main
525
586
@@ -529,8 +590,9 @@ function InvokePSCompatibility {
529
590
[System.Collections.ArrayList ]$SuccessfulModuleImports = @ ()
530
591
[System.Collections.ArrayList ]$FailedModuleImports = @ ()
531
592
foreach ($ModObj in $RequiredLocallyAvailableModulesScan.PSCoreModuleDependencies ) {
593
+ Write-Verbose " Attempting import of $ ( $ModObj.ModuleName ) ..."
532
594
try {
533
- Import-Module $ModObj.ModuleName - Scope Global - NoClobber - Force - ErrorAction Stop
595
+ Import-Module $ModObj.ModuleName - Scope Global - NoClobber - Force - ErrorAction Stop - WarningAction SilentlyContinue
534
596
535
597
$ModuleInfo = [pscustomobject ]@ {
536
598
ModulePSCompatibility = " PSCore"
@@ -547,7 +609,7 @@ function InvokePSCompatibility {
547
609
Write-Verbose " Problem importing module '$ ( $ModObj.ModuleName ) '...trying via Manifest File..."
548
610
549
611
try {
550
- Import-Module $ModObj.ManifestFileItem.FullName - Scope Global - NoClobber - Force - ErrorAction Stop
612
+ Import-Module $ModObj.ManifestFileItem.FullName - Scope Global - NoClobber - Force - ErrorAction Stop - WarningAction SilentlyContinue
551
613
552
614
$ModuleInfo = [pscustomobject ]@ {
553
615
ModulePSCompatibility = " PSCore"
@@ -593,7 +655,7 @@ function InvokePSCompatibility {
593
655
}
594
656
595
657
Invoke-WinCommand - ComputerName localhost - ScriptBlock {
596
- Import-Module $args [0 ] - Scope Global - NoClobber - Force
658
+ Import-Module $args [0 ] - Scope Global - NoClobber - Force - WarningAction SilentlyContinue
597
659
} - ArgumentList $ModObj.ModuleName - ErrorAction Stop
598
660
599
661
$ModuleInfo = [pscustomobject ]@ {
@@ -640,7 +702,7 @@ function InvokePSCompatibility {
640
702
}
641
703
642
704
Invoke-WinCommand - ComputerName localhost - ScriptBlock {
643
- Import-Module $args [0 ] - Scope Global - NoClobber - Force
705
+ Import-Module $args [0 ] - Scope Global - NoClobber - Force - WarningAction SilentlyContinue
644
706
} - ArgumentList $ModObj.ManifestFileItem.FullName - ErrorAction Stop
645
707
646
708
$ModuleInfo = [pscustomobject ]@ {
@@ -865,7 +927,7 @@ function InvokeModuleDependencies {
865
927
if (! [bool ]$ (Get-Module - ListAvailable $ModuleName ) -and $InstallModulesNotAvailableLocally ) {
866
928
# Install the Module
867
929
try {
868
- $null = Install-Module $ModuleName - Force - ErrorAction Stop - WarningAction SilentlyContinue
930
+ $null = Install-Module $ModuleName - AllowClobber - Force - ErrorAction Stop - WarningAction SilentlyContinue
869
931
}
870
932
catch {
871
933
Write-Error $_
@@ -910,8 +972,8 @@ function InvokeModuleDependencies {
910
972
# SIG # Begin signature block
911
973
# MIIMiAYJKoZIhvcNAQcCoIIMeTCCDHUCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
912
974
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
913
- # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUVmxhqCLT0ej4/cdxf5UPkG4O
914
- # 9o2gggn9MIIEJjCCAw6gAwIBAgITawAAAB /Nnq77QGja+wAAAAAAHzANBgkqhkiG
975
+ # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQU0ft8F2StAHKvZEH3xRfg0eIe
976
+ # Plegggn9MIIEJjCCAw6gAwIBAgITawAAAB /Nnq77QGja+wAAAAAAHzANBgkqhkiG
915
977
# 9w0BAQsFADAwMQwwCgYDVQQGEwNMQUIxDTALBgNVBAoTBFpFUk8xETAPBgNVBAMT
916
978
# CFplcm9EQzAxMB4XDTE3MDkyMDIxMDM1OFoXDTE5MDkyMDIxMTM1OFowPTETMBEG
917
979
# CgmSJomT8ixkARkWA0xBQjEUMBIGCgmSJomT8ixkARkWBFpFUk8xEDAOBgNVBAMT
@@ -968,11 +1030,11 @@ function InvokeModuleDependencies {
968
1030
# ARkWA0xBQjEUMBIGCgmSJomT8ixkARkWBFpFUk8xEDAOBgNVBAMTB1plcm9TQ0EC
969
1031
# E1gAAAH5oOvjAv3166MAAQAAAfkwCQYFKw4DAhoFAKB4MBgGCisGAQQBgjcCAQwx
970
1032
# CjAIoAKAAKECgAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGC
971
- # NwIBCzEOMAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkEMRYEFDaKC57oFZDELs5G
972
- # t32Xr2aKYNAFMA0GCSqGSIb3DQEBAQUABIIBAAfBhhnRJRcN1tZpvUh17Q5liJTy
973
- # a0RAZCTjM/qa6ZeEIUvx4RFFYHhIStE8wzvy/95frpK47cvYgGnz4tLm9Vk+bg45
974
- # C5d6KrYBvFWF5n53uOjlo46GyaRaI/aQ/G0UDXMt3iU9ESY2HAe3BExWKst2iNvP
975
- # VyRxbrop55EOx6Iojg7AfANMIUsjDK9z1EPRO3MZlIhPMxH0EsL463mXEwPHH+i3
976
- # igMPBo26I1n71ECw8J35MEc7ouk9HdXgHKsYo1txdHRXlDWvv1GMl/Dp4jRqzeu5
977
- # y7+/PRfrjUo0hc51zLiUtiJhP9+8xa9C3NRgcElrg50UQWvrXjXnO7BIGmo =
1033
+ # NwIBCzEOMAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkEMRYEFMitP2lxEMl7N8rR
1034
+ # ruFsL9Knvq2gMA0GCSqGSIb3DQEBAQUABIIBAE69J2OC+UdfuTYP8AsOJMkHrr0i
1035
+ # 2b8UxBnzujnain9iK7nasDA57ui1if0RFLkCqMlD/4LT/BabjBa7LZ2kZdvZ9raQ
1036
+ # A5h3vCzGggoPVySz2w9PXXf64YgcUvG/k1anX2ejlxV+gRcSy2SsuemPX6JZPVy7
1037
+ # UfSG+Bn/pym4zL0k12HSjZLtSUtTSkE370cWrlBUEX8Kx0SUH+YFX/2f4mUc050R
1038
+ # A+vqKVqBsFxKMFvXko/ckllD9ST5orAiFW04VwCqtmYKGxRvQ7RYD40k52xawDLM
1039
+ # 3u/GBIe2AwfZeU0ejNwmaZZNpVRYyqNcHbrqd0WRSCJqg8eJAOTpewUu+z8 =
978
1040
# SIG # End signature block
0 commit comments