├── .gitattributes ├── .gitignore ├── .vscode ├── settings.json └── tasks.json ├── ChangeLog.md ├── Code ├── Add-NgenPdbs.ps1 ├── Compare-Directories.ps1 ├── Expand-ZipFile.ps1 ├── Get-DumpAnalysis.ps1 ├── Get-SysinternalsSuite.ps1 ├── Get-Uptime.ps1 ├── Import-VisualStudioEnvironment.ps1 ├── Internal.ps1 ├── Invoke-CmdScript.ps1 ├── Merge-HashTables.ps1 ├── Remove-IntelliTraceFile.ps1 ├── Set-Environment.ps1 ├── Set-ProjectProperties.ps1 ├── Set-Signatures.ps1 ├── SymbolsSource.ps1 ├── Test-PathReg.ps1 └── WintellectPowerShellHelper.dll ├── License.txt ├── ReadMe.md ├── Support ├── SignWintellectPowerShell.ps1 ├── UpdateSignatures.ps1 └── UploadWintellectPowerShell.ps1 ├── WintellectPowerShell.psd1 ├── WintellectPowerShell.psm1 ├── WintellectPowerShellHelper ├── DumpVSInstalls │ ├── App.config │ ├── DumpVSInstalls.csproj │ ├── Program.cs │ └── Properties │ │ └── AssemblyInfo.cs ├── WintellectPowerShellHelper.sln └── WintellectPowerShellHelper │ ├── Dictionary.xml │ ├── GlobalSuppressions.cs │ ├── NativeMethods.cs │ ├── PrivateRegistry.cs │ ├── Properties │ └── AssemblyInfo.cs │ ├── VisualStudioInstance.cs │ ├── VisualStudioSetup.cs │ ├── WintellectPowerShellHelper.csproj │ └── packages.config └── about_WintellectPowerShell.help.txt /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | *.sln merge=union 7 | *.csproj merge=union 8 | *.vbproj merge=union 9 | *.fsproj merge=union 10 | *.dbproj merge=union 11 | 12 | # Standard to msysgit 13 | *.doc diff=astextplain 14 | *.DOC diff=astextplain 15 | *.docx diff=astextplain 16 | *.DOCX diff=astextplain 17 | *.dot diff=astextplain 18 | *.DOT diff=astextplain 19 | *.pdf diff=astextplain 20 | *.PDF diff=astextplain 21 | *.rtf diff=astextplain 22 | *.RTF diff=astextplain 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ################# 2 | ## Eclipse 3 | ################# 4 | 5 | *.pydevproject 6 | .project 7 | .metadata 8 | bin/ 9 | tmp/ 10 | *.tmp 11 | *.bak 12 | *.swp 13 | *~.nib 14 | local.properties 15 | .classpath 16 | .settings/ 17 | .loadpath 18 | 19 | # External tool builders 20 | .externalToolBuilders/ 21 | 22 | # Locally stored "Eclipse launch configurations" 23 | *.launch 24 | 25 | # CDT-specific 26 | .cproject 27 | 28 | # PDT-specific 29 | .buildpath 30 | 31 | 32 | ################# 33 | ## Visual Studio 34 | ################# 35 | 36 | ## Ignore Visual Studio temporary files, build results, and 37 | ## files generated by popular Visual Studio add-ons. 38 | 39 | # User-specific files 40 | *.suo 41 | *.user 42 | *.sln.docstates 43 | 44 | # Build results 45 | [Dd]ebug/ 46 | [Rr]elease/ 47 | *_i.c 48 | *_p.c 49 | *.ilk 50 | *.meta 51 | *.obj 52 | *.pch 53 | *.pdb 54 | *.pgc 55 | *.pgd 56 | *.rsp 57 | *.sbr 58 | *.tlb 59 | *.tli 60 | *.tlh 61 | *.tmp 62 | *.vspscc 63 | .builds 64 | *.dotCover 65 | 66 | ## TODO: If you have NuGet Package Restore enabled, uncomment this 67 | packages/ 68 | 69 | # Visual C++ cache files 70 | ipch/ 71 | *.aps 72 | *.ncb 73 | *.opensdf 74 | *.sdf 75 | 76 | # Visual Studio profiler 77 | *.psess 78 | *.vsp 79 | 80 | # ReSharper is a .NET coding add-in 81 | _ReSharper* 82 | 83 | # Installshield output folder 84 | [Ee]xpress 85 | 86 | # DocProject is a documentation generator add-in 87 | DocProject/buildhelp/ 88 | DocProject/Help/*.HxT 89 | DocProject/Help/*.HxC 90 | DocProject/Help/*.hhc 91 | DocProject/Help/*.hhk 92 | DocProject/Help/*.hhp 93 | DocProject/Help/Html2 94 | DocProject/Help/html 95 | 96 | # Click-Once directory 97 | publish 98 | 99 | # Others 100 | [Bb]in 101 | [Oo]bj 102 | sql 103 | TestResults 104 | *.Cache 105 | ClientBin 106 | stylecop.* 107 | ~$* 108 | *.dbmdl 109 | Generated_Code #added for RIA/Silverlight projects 110 | 111 | # Backup & report files from converting an old project file to a newer 112 | # Visual Studio version. Backup files are not needed, because we have git ;-) 113 | _UpgradeReport_Files/ 114 | Backup*/ 115 | UpgradeLog*.XML 116 | 117 | 118 | 119 | ############ 120 | ## Windows 121 | ############ 122 | 123 | # Windows image file caches 124 | Thumbs.db 125 | 126 | # Folder config file 127 | Desktop.ini 128 | 129 | 130 | ############# 131 | ## Python 132 | ############# 133 | 134 | *.py[co] 135 | 136 | # Packages 137 | *.egg 138 | *.egg-info 139 | dist 140 | build 141 | eggs 142 | parts 143 | bin 144 | var 145 | sdist 146 | develop-eggs 147 | .installed.cfg 148 | 149 | # Installer logs 150 | pip-log.txt 151 | 152 | # Unit test / coverage reports 153 | .coverage 154 | .tox 155 | 156 | #Translations 157 | *.mo 158 | 159 | #Mr Developer 160 | .mr.developer.cfg 161 | 162 | # Mac crap 163 | .DS_Store 164 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "cSpell.words": [ 3 | "cmdlet", 4 | "cmdlets", 5 | "hashtable", 6 | "sysinternals" 7 | ] 8 | } -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | // See https://go.microsoft.com/fwlink/?LinkId=733558 3 | // for the documentation about the tasks.json format 4 | "version": "0.1.0", 5 | "command": "${env.windir}\\sysnative\\windowspowershell\\v1.0\\PowerShell.exe", 6 | "isShellCommand": true, 7 | "args": ["-NoProfile", "-ExecutionPolicy", "RemoteSigned"], 8 | "showOutput": "always", 9 | "tasks": [ 10 | { 11 | "taskName": "ScriptAnalyzer", 12 | "isBuildCommand": true, 13 | "suppressTaskName": true, 14 | "args": [ 15 | "Write-Host 'This takes a while...'; Import-Module PSScriptAnalyzer; Get-ChildItem *.ps* -Recurse | ForEach-Object {Invoke-ScriptAnalyzer $_.FullName}; Write-Host 'Script Analysis Finished!'" 16 | ] 17 | } 18 | ] 19 | 20 | } -------------------------------------------------------------------------------- /ChangeLog.md: -------------------------------------------------------------------------------- 1 | # Wintellect PowerShell Change Log # 2 | 3 | ## Version Current 4 | - Added support for the new Source Linking in VS 2017. 5 | - Removed forcing "set" as an alias because it made the installation of the module ugly and confusing. Add the following to your $profile to bring it back: Set-Alias -Name set -Value Set-Environment -Scope Global -Option AllScope 6 | - Fixed some formatting in the read me and a spelling error in the help. 7 | 8 | ## 4.0.0.3 9 | - Many thanks to [Sebastian Solnica](https://github.com/lowleveldesign) for fixing an internationalization bug in Import-VisualStudioEnvironment: [Pull request](https://github.com/Wintellect/WintellectPowerShell/pull/9). 10 | - Fixed some formatting in this file. 11 | 12 | ## 4.0.0.2 13 | - Fixed a bug with Get-SysInternalsSuite where I needed to add the -Force option when expanding the zip file to force extract into a directory with the existing tools files. 14 | - Thanks to [bojanrajkovic](https://github.com/bojanrajkovic) as he fixed an issue it Test-Path: [Pull Request](https://github.com/Wintellect/WintellectPowerShell/pull/8). 15 | 16 | ## 4.0.0.1 17 | - PowerShell 5.0 is now the minimum supported version. It's time to upgrade people. 18 | - Dropped support for any versions prior to VS 2013. Continue to use WintellectPowerShell 3.3.2.0 for older versions of Visual Studio. 19 | - Completely rewrote everything in SymbolsSource.ps1. With VS 2017 no longer using the global registry to save settings, I had to make the changes in the CurrentSettings.vssettings file. This change works for VS2013-VS2017. The only difference you will notice is that after running WintellectPowerShell cmdlets is that you will see Visual Studio show the quick dialog that it is loading settings. 20 | - Added the Set-SymbolAndSourceServer cmdlet. This combines both Set-SymbolServer and Set-SourceServer (which both still exist) because you really should set both at once. 21 | - Updated Import-VisualStudioEnvironment to work with VS 2017 as Microsoft changed how the environment batch files worked. 22 | - Updated Remove-IntelliTrace files to support VS 2017. That was a lot of work because Visual Studio 2017's installation is now complex enough that it requires an API to determine what's installed. Also, VS 2017 moved to private registry hives for performance reasons. I introduced a support DLL written in C# to isolate this complexity. 23 | - Updated Add-NgenPdbs to work with VS 2017. 24 | - Fixed all warnings reported by Invoke-ScriptAnalysis (version 1.9.0). 25 | 26 | ## November 16, 2015 27 | - Fixed issue in Import-VisualStudioEnvironment that if the C++ tools were not installed, falls back to using VSDEVCMD.BAT to set the environment. Because VSDEVCMD.BAT does not support command line arguments, you only get the 32-bit tools. Use the -Verbose switch to see if VSDEVCMD.BAT is used. 28 | 29 | ## October 21, 2015 30 | - Fixed an issue in Remove-IntelliTraceFiles where it did not work on VS 2015. 31 | 32 | ## July 9, 2015 33 | - Fixed most of the errors reported by Invoke-ScriptAnalysis. Once RTM hits for PowerShell 5.0 I will fix the rest or suppress as appropriate. 34 | - Add-NgenPDBs now supports VS 2015 35 | - Fixed an issue in Compare-Directories where I removed stripping of the original and new directory paths when it was really needed. Sorry. 36 | 37 | ## June 25, 2015 38 | - Set-SymbolServer now uses the new https://msdl.microsoft.com/download/symbols for more security. 39 | 40 | ## May 4, 2015 41 | - Added Get-DumpAnalysis to automate minidump analysis easier. 42 | - Fixed a bug in Get-SourceServer and Get-SymbolServer. 43 | 44 | ## December 27, 2014 45 | Small updates 46 | 47 | - Added Set-Signatures to make signing scripts easier mainly for me and others who sign but also have Azure certificates on the computer. 48 | - Removed unneeded array conversion in Compare-Directories 49 | - Removed the -Quiet switch to Add-NgenPdbs and removed Write-Host calls in the function. Use the standard -Verbose to see the output. 50 | 51 | ## November 11, 2014 52 | A huge refactor! 53 | 54 | - Full support for the spanking new Visual Studio 2015. 55 | - Now dot sourcing the individual files so I can start sharing some code. 56 | - Fixed many of the warnings reported by Script Analyer 1.4. 57 | - Now requiring PowerShell 4.0. 58 | - Removed my Get-Hash and now using Get-FileHash. 59 | - Remove-IntelliTraceFiles now supports -Latest like Import-VisualStudioEnvironment 60 | - Get-SysInternalsSuite uses Invoke-WebRequest and additionally called Unblock-File to unlock all the extracted files. 61 | - Fixed the issue where I was not exporting the set alias correctly. 62 | 63 | 64 | ## July 7, 2014 65 | - Fixed an issue in Add-NgenPdbs where I wasn't handling the case where the VS cache directory could be blank. 66 | 67 | ## June 18, 2014 68 | - Fixed an issue reported by [Chris Fraire/idodeclare](https://github.com/idodeclare) is Set-ProjectProperties where the assembly name for XML document comments was not set correctly in all cases. 69 | - Ensured Set-ProjectProperties.ps1 is clean as reported by Microsoft's Script Analyzer plug in. 70 | 71 | ## June 13, 2014 72 | - Fixed an issue with relative paths in Expand-ZipFile 73 | - Added the -CurrentEnvironmentOnly switch to both Set-SymbolServer and Set-SourceServer that changes on the environment variables for the current PowerShell window. This is only useful when using WinDBG because Visual Studio requires registry settings instead of environment variables. 74 | - For the two files I touched, ensured they are clean as reported by Microsoft's Script Analyzer plug in. 75 | 76 | ## March 11, 2014 77 | - Fixed a bug in Compare-Directories. 78 | 79 | ## November 18, 2013 80 | - Fixed a copy pasta bug in Get-SourceServerFiles 81 | - Add-NgenPdbs now properly supports VS 2013 82 | - Re-digitally signed everything with my new code signing certificate as the old one was expiring. I didn't have to do that but was signing the changed file so went ahead and did all of them. 83 | 84 | ## July 17, 2013 85 | - Updated Set-SymbolServer, Set-SourceServer, Get-SourceServer, and Remove-IntelliTraceFiles to support VS 2013. 86 | 87 | ## June 24, 2013 88 | - Fixed a bug in Import-VisualStudioEnvironment where I should be looking at the Wow6432Node on x64 dev boxes reported by [RaHe67](https://github.com/RaHe67). Also updated the cmdlet with the official version and name of VS 2013. 89 | 90 | ## May 20, 2013 91 | - Updated the Set-SymbolServer -public switch to use the same cache on both the reference source and msdl download items. With VS 2012 this works better and helps avoid multiple downloads of various PDB files. Since I no longer use VS 2010, I'm not sure what affect this will have on that version. Also, I turn off using the Microsoft symbol servers as I'm putting them all in the _NT_SYMBOL_PATH environment variable anyway. 92 | - Additionally, Set-SymbolServer now puts any specified symbol servers with the -SymbolServers switch at the front of the _NT_SYMBOL_PATH environment variable. This will make symbol downloading faster for those with your own symbol server set up. 93 | 94 | ## May 9, 2013 95 | - Added the Set-Environment, Invoke-CmdScript, and Import-VisualStudioEnvironment cmdlets. 96 | - The Invoke-CmdScript cmdlet is based off [Lee Holmes'](http://www.leeholmes.com/blog/2006/05/11/nothing-solves-everything-%e2%80%93-powershell-and-other-technologies/) version. 97 | - The Set-Environment cmdlet is from [Wes Haggard](http://weblogs.asp.net/whaggard/archive/2007/02/08/powershell-version-of-cmd-set.aspx). To replace the default set alias with the one provided by WintellectPowerShell, execute the following command before importing the module: 98 | 99 | `Import-Module WintellectPowerShell 100 | Remove-Item alias:set -Force -ErrorAction SilentlyContinue 101 | ` 102 | 103 | ## February 25, 2013 104 | - Added the Add-NgenPdb cmdlet. 105 | 106 | ## January, 27, 2013 107 | - Added the very cool Set-ProjectProperties cmdlet to make batch updating of Visual Studio projects much easier. Right now it only supports C# projects. 108 | - Changed the architecture of the whole module to break up a single .PSM1 file into different files for each cmdlet. This will make development much easier going forward. 109 | - Removed the external help XML file and put all help back into the source code. Editing the external file was a pain in the butt because the editor leaves lots to be desired and I was never going to support updatable help anyway. 110 | 111 | ## October 14, 2012 ## 112 | - Added the following cmdlets: 113 | - Compare-Directories - Can compare directories to see if they contain the same filenames as well as the same content. 114 | - Get-Hash - Gets the cryptographic hash for a file or string. 115 | 116 | ## September 29, 2012 ## 117 | - Added the following cmdlets: 118 | - Test-RegPath - Original author [Can Dedeoglu](http://blogs.msdn.com/candede "Can Dedeoglu") 119 | - Remove-IntelliTraceFiles - If saving your debugging IntelliTrace files, the directory can quickly fill with many large files. This cmdlet keeps your IntelliTrace file directory cleaned up. 120 | 121 | ## August 29, 2012 ## 122 | - Initial release to GitHub. 123 | -------------------------------------------------------------------------------- /Code/Compare-Directories.ps1: -------------------------------------------------------------------------------- 1 | #requires -version 5.0 2 | ############################################################################### 3 | # WintellectPowerShell Module 4 | # Copyright (c) 2010-2017 - John Robbins/Wintellect 5 | # 6 | # Do whatever you want with this module, but please do give credit. 7 | ############################################################################### 8 | 9 | # Always make sure all variables are defined and all best practices are 10 | # followed. 11 | Set-StrictMode -version Latest 12 | 13 | ############################################################################### 14 | # Public Cmdlets 15 | ############################################################################### 16 | 17 | function Compare-Directories 18 | { 19 | <# 20 | .SYNOPSIS 21 | Compare two directories to see if they are identical 22 | 23 | .DESCRIPTION 24 | This cmdlet will compare two directories and report if the files are identical 25 | by name, and optionally on content. 26 | 27 | Symbol explanation: 28 | => - The file is in the -NewDir directory, not the -OriginalDir. 29 | <= - The file is in the -OriginalDir directory and not the -NewDir. 30 | != - The file is in both directories, but the content is not identical. 31 | 32 | If the directories are identical an empty hash table is returned. 33 | 34 | Since sometimes filenames are long, you can pipe this output of this cmdlet 35 | into Format-Table -AutoSize to avoid truncating the filenames. 36 | 37 | .PARAMETER OriginalDir 38 | The original directory to use for the comparison. 39 | 40 | .PARAMETER NewDir 41 | The new directory to compare to. 42 | 43 | .PARAMETER Excludes 44 | The array of exclusions, including wildcards, so you can filter out some of 45 | the extraneous files. 46 | 47 | .PARAMETER Recurse 48 | Recurse the directory tree. The default is to just look at the directory. 49 | 50 | .PARAMETER Force 51 | Allows the cmdlet to get items that cannot otherwise not be accessed by the 52 | user, such as hidden or system files. 53 | 54 | .PARAMETER Content 55 | Check the content of matching filenames in both directories to see if they are 56 | equal. This is done through the Get-FileHash cmdlet from PowerShell 4.0. 57 | 58 | .OUTPUTS 59 | HashTable 60 | The name is the file, and the value is the difference indicator. If the 61 | directories are identical, an empty hash table is returned. 62 | 63 | .EXAMPLE 64 | C:\PS>Compare-Directories .\Original .\Copied -Content 65 | 66 | 67 | Compares the original directory against a copied directory for both filenames 68 | and content. 69 | 70 | This shows that both file a.pptx, and c.pptx are in both directories but the 71 | content is different. Files f.pptx and i.pptx are only in the .\Copied 72 | directory. 73 | 74 | Name Value 75 | ---- ----- 76 | a.pptx != 77 | c.pptx != 78 | f.pptx => 79 | i.pptx => 80 | 81 | #> 82 | # I hate suppressing this warning, but I created this cmdlet long before the 83 | # script analyzer came out. If someone has this in a script, changing the 84 | # cmdlet name will break them. 85 | [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Scope="Function")] 86 | param ( 87 | [Parameter(Mandatory=$true)] 88 | [string] $OriginalDir, 89 | [Parameter(Mandatory=$true)] 90 | [string] $NewDir, 91 | [string[]] $Excludes="", 92 | [switch] $Recurse, 93 | [switch] $Force, 94 | [switch] $Content 95 | ) 96 | 97 | if ((Test-Path -Path $OriginalDir) -eq $false) 98 | { 99 | throw "$OriginalDir does not exist" 100 | } 101 | 102 | if ((Test-Path -Path $NewDir) -eq $false) 103 | { 104 | throw "$NewDir does not exist" 105 | } 106 | 107 | # I need the real paths for the two input directories. 108 | $OriginalDir = (Resolve-Path -Path $OriginalDir).ToString().Trim("\") 109 | $NewDir = (Resolve-Path -Path $NewDir).ToString().Trim("\") 110 | # When you do a Resolve-Path on a network share you get the 111 | # Microsoft.PowerShell.Core\FileSystem:: added to the name so 112 | # yank it off if there. 113 | $OriginalDir = StripFileSystem -directory $OriginalDir 114 | $NewDir = StripFileSystem -directory $NewDir 115 | 116 | # Do the work to find all the files. 117 | $origFiles = Get-ChildItem -Path $OriginalDir -Recurse:$Recurse -Force:$Force -Exclude $Excludes 118 | $newFiles = Get-ChildItem -Path $NewDir -Recurse:$Recurse -Force:$Force -Exclude $Excludes 119 | 120 | # Here I'm going to strip off the initial directories and leave the names. Thus if 121 | # the OriginalDir was C:\FOO and one of the files is C:\FOO\BAR.TXT, the result would 122 | # be BAR.TXT (C:\FOO\BAZ\Z.TXT -> BAZ\Z.TXT. This will make it easier for content checking. 123 | # The issue is that by doing the content checking on the default return type from 124 | # Compare-Object, I'd lose the relativeness of the filenames. By forcing the data 125 | # to be the relative filenames from input I can do the content comparisons much easier. 126 | $origFiles = $origFiles | ForEach-Object { $_.FullName.Remove(0,$OriginalDir.Length+1) } 127 | $newFiles = $newFiles | ForEach-Object { $_.FullName.Remove(0,$NewDir.Length+1) } 128 | 129 | # If either return is empty, create an empty array so I can return correct data. 130 | if ($null -eq $origFiles) 131 | { 132 | $origFiles = @() 133 | } 134 | if ($null -eq $newFiles) 135 | { 136 | $newFiles = @() 137 | } 138 | 139 | # Now do the comparisons on the names only. 140 | $nameComp = Compare-Object -ReferenceObject $origFiles -DifferenceObject $newFiles 141 | 142 | # The hash we are going to return. 143 | $resultHash = @{} 144 | 145 | # If there's no differences, $nameComp is null. 146 | if ($null -ne $nameComp) 147 | { 148 | # Push the PSCustomObject type into a resultHash table so content checking can put it's custom 149 | # results into the table. 150 | $nameComp | ForEach-Object { $resultHash[$_.InputObject] = $_.SideIndicator} 151 | } 152 | 153 | # if comparing the content 154 | if ($Content) 155 | { 156 | # Get just the matching values by calling Compare-Object -ExcludeDifferent -IncludeEqual. 157 | # Note that I'm using -PassThru here because I want result to be the identical filenames, not the 158 | # normal custom object returned by Compare-Object. 159 | $sameFiles = Compare-Object -ReferenceObject $origFiles -DifferenceObject $newFiles -IncludeEqual -ExcludeDifferent -PassThru 160 | 161 | foreach($file in $sameFiles) 162 | { 163 | 164 | # Build up the paths to the original file and the new file. 165 | $orig = $OriginalDir 166 | $orig += "\" + $file 167 | 168 | # Am I about to check a directory that's in both places? If so, skip it because the 169 | # hash will be different because the strings are different. 170 | if ((Get-Item -Path $orig) -is [System.IO.DirectoryInfo]) 171 | { 172 | continue 173 | } 174 | 175 | $new = $NewDir 176 | $new += "\" + $file 177 | 178 | $origHash = Get-FileHash -Path $orig 179 | $newHash = Get-FileHash -Path $new 180 | 181 | if ($origHash.Hash -ne $newHash.Hash) 182 | { 183 | $resultHash[$file] = "!=" 184 | } 185 | } 186 | } 187 | 188 | # Nice trick to get the hash sorted by Name so it's easier to read. 189 | $resultHash.GetEnumerator() | Sort-Object -Property Name 190 | } 191 | 192 | function StripFileSystem([string]$directory="") 193 | { 194 | $fsText = "Microsoft.PowerShell.Core\FileSystem::" 195 | if ($directory.StartsWith($fsText)) 196 | { 197 | $fsLen = $fsText.Length 198 | $dirLen = $directory.Length 199 | $directory = $directory.Substring($fsLen,$dirLen - $fsLen) 200 | } 201 | return $directory 202 | } 203 | 204 | 205 | # SIG # Begin signature block 206 | # MIIUywYJKoZIhvcNAQcCoIIUvDCCFLgCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB 207 | # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR 208 | # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUKQ2N+ER8FrZTCQrNCY1te+o8 209 | # eQqggg+6MIIEmTCCA4GgAwIBAgIPFojwOSVeY45pFDkH5jMLMA0GCSqGSIb3DQEB 210 | # BQUAMIGVMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQg 211 | # TGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNV 212 | # BAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTEdMBsGA1UEAxMUVVROLVVTRVJG 213 | # aXJzdC1PYmplY3QwHhcNMTUxMjMxMDAwMDAwWhcNMTkwNzA5MTg0MDM2WjCBhDEL 214 | # MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE 215 | # BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKjAoBgNVBAMT 216 | # IUNPTU9ETyBTSEEtMSBUaW1lIFN0YW1waW5nIFNpZ25lcjCCASIwDQYJKoZIhvcN 217 | # AQEBBQADggEPADCCAQoCggEBAOnpPd/XNwjJHjiyUlNCbSLxscQGBGue/YJ0UEN9 218 | # xqC7H075AnEmse9D2IOMSPznD5d6muuc3qajDjscRBh1jnilF2n+SRik4rtcTv6O 219 | # KlR6UPDV9syR55l51955lNeWM/4Og74iv2MWLKPdKBuvPavql9LxvwQQ5z1IRf0f 220 | # aGXBf1mZacAiMQxibqdcZQEhsGPEIhgn7ub80gA9Ry6ouIZWXQTcExclbhzfRA8V 221 | # zbfbpVd2Qm8AaIKZ0uPB3vCLlFdM7AiQIiHOIiuYDELmQpOUmJPv/QbZP7xbm1Q8 222 | # ILHuatZHesWrgOkwmt7xpD9VTQoJNIp1KdJprZcPUL/4ygkCAwEAAaOB9DCB8TAf 223 | # BgNVHSMEGDAWgBTa7WR0FJwUPKvdmam9WyhNizzJ2DAdBgNVHQ4EFgQUjmstM2v0 224 | # M6eTsxOapeAK9xI1aogwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwFgYD 225 | # VR0lAQH/BAwwCgYIKwYBBQUHAwgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2Ny 226 | # bC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmlyc3QtT2JqZWN0LmNybDA1BggrBgEF 227 | # BQcBAQQpMCcwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnVzZXJ0cnVzdC5jb20w 228 | # DQYJKoZIhvcNAQEFBQADggEBALozJEBAjHzbWJ+zYJiy9cAx/usfblD2CuDk5oGt 229 | # Joei3/2z2vRz8wD7KRuJGxU+22tSkyvErDmB1zxnV5o5NuAoCJrjOU+biQl/e8Vh 230 | # f1mJMiUKaq4aPvCiJ6i2w7iH9xYESEE9XNjsn00gMQTZZaHtzWkHUxY93TYCCojr 231 | # QOUGMAu4Fkvc77xVCf/GPhIudrPczkLv+XZX4bcKBUCYWJpdcRaTcYxlgepv84n3 232 | # +3OttOe/2Y5vqgtPJfO44dXddZhogfiqwNGAwsTEOYnB9smebNd0+dmX+E/CmgrN 233 | # Xo/4GengpZ/E8JIh5i15Jcki+cPwOoRXrToW9GOUEB1d0MYwggU1MIIEHaADAgEC 234 | # AhEA+CGT8y+uLXmA2UBOFe5VGzANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJH 235 | # QjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3Jk 236 | # MRowGAYDVQQKExFDT01PRE8gQ0EgTGltaXRlZDEjMCEGA1UEAxMaQ09NT0RPIFJT 237 | # QSBDb2RlIFNpZ25pbmcgQ0EwHhcNMTYwMjE4MDAwMDAwWhcNMTgxMDI4MjM1OTU5 238 | # WjCBnTELMAkGA1UEBhMCVVMxDjAMBgNVBBEMBTM3OTMyMQswCQYDVQQIDAJUTjES 239 | # MBAGA1UEBwwJS25veHZpbGxlMRIwEAYDVQQJDAlTdWl0ZSAzMDIxHzAdBgNVBAkM 240 | # FjEwMjA3IFRlY2hub2xvZ3kgRHJpdmUxEzARBgNVBAoMCldpbnRlbGxlY3QxEzAR 241 | # BgNVBAMMCldpbnRlbGxlY3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB 242 | # AQDfLujuIe3yrrTfTOdYfstwFDZrI7XezoeFPA33GRxY/MSbKuUvPcN8XqU8Jpg4 243 | # NUkByzoSjPsq9Yjx3anHflcNendqa/8gbkPdiEMg+6kRVmtv1QHfGt+UbEMfrUk0 244 | # Ltm0DE+6OIZFx8hjsxifJvWrQ/jG9lat6e2YwIdNAqyG2htqCrmBN90lW+0+zU9s 245 | # YJIVD0ZfyZJVkvbeay+HwlbojW7JQyyhdGOSa61zUqlD85RX6HzcCbb1WHf5bZRO 246 | # 2idaVNAOw1YHqJAUjY4oJY4lqWwg5Inza4f33Wt82zJAgKY4S01bddkvjPi6iMnG 247 | # y8bI1EfWAdFFC+UM2qKsNc2/AgMBAAGjggGNMIIBiTAfBgNVHSMEGDAWgBQpkWD/ 248 | # ik366/mmarjP+eZLvUnOEjAdBgNVHQ4EFgQUZdNFdxzRtMVCZCvcFV4g7vsL8vgw 249 | # DgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwEwYDVR0lBAwwCgYIKwYBBQUH 250 | # AwMwEQYJYIZIAYb4QgEBBAQDAgQQMEYGA1UdIAQ/MD0wOwYMKwYBBAGyMQECAQMC 251 | # MCswKQYIKwYBBQUHAgEWHWh0dHBzOi8vc2VjdXJlLmNvbW9kby5uZXQvQ1BTMEMG 252 | # A1UdHwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL0NPTU9ET1JT 253 | # QUNvZGVTaWduaW5nQ0EuY3JsMHQGCCsGAQUFBwEBBGgwZjA+BggrBgEFBQcwAoYy 254 | # aHR0cDovL2NydC5jb21vZG9jYS5jb20vQ09NT0RPUlNBQ29kZVNpZ25pbmdDQS5j 255 | # cnQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9kb2NhLmNvbTANBgkqhkiG 256 | # 9w0BAQsFAAOCAQEAnSVG6TXbazSxczonyo/Q+pjX+6JERtMZ0sz3Fc3PTMDcb9DS 257 | # tALjZiZhOgOoRNC+5OHgE3tTPLCT6ZGktfedzp6J9mICzoJIIBelfdiIwJNkPTzR 258 | # I2krUn/6ld5coh0zyM85lCjXkqzZmyQmRRNQoycWtxUwxsNlkiGlRIiIJHztbg1I 259 | # lv9C90zCZ1nAhfOpv+maUohLtz22F9wXCJuIUQapOhPG5n/opM/AUQV2WuDa3AZP 260 | # VYleK90zOgHLDgLICxrx57z2JRlXyW2ga2N5J6DXzwGmxpCe0LbzYCj4h42SjUuf 261 | # 9hOQtORlSjYEj8RFpxatyxcmIIpej9/NDNXgIzCCBeAwggPIoAMCAQICEC58h8wO 262 | # k0pS/pT9HLfNNK8wDQYJKoZIhvcNAQEMBQAwgYUxCzAJBgNVBAYTAkdCMRswGQYD 263 | # VQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxGjAYBgNV 264 | # BAoTEUNPTU9ETyBDQSBMaW1pdGVkMSswKQYDVQQDEyJDT01PRE8gUlNBIENlcnRp 265 | # ZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDUwOTAwMDAwMFoXDTI4MDUwODIzNTk1 266 | # OVowfTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQ 267 | # MA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxIzAh 268 | # BgNVBAMTGkNPTU9ETyBSU0EgQ29kZSBTaWduaW5nIENBMIIBIjANBgkqhkiG9w0B 269 | # AQEFAAOCAQ8AMIIBCgKCAQEAppiQY3eRNH+K0d3pZzER68we/TEds7liVz+TvFvj 270 | # nx4kMhEna7xRkafPnp4ls1+BqBgPHR4gMA77YXuGCbPj/aJonRwsnb9y4+R1oOU1 271 | # I47Jiu4aDGTH2EKhe7VSA0s6sI4jS0tj4CKUN3vVeZAKFBhRLOb+wRLwHD9hYQqM 272 | # otz2wzCqzSgYdUjBeVoIzbuMVYz31HaQOjNGUHOYXPSFSmsPgN1e1r39qS/AJfX5 273 | # eNeNXxDCRFU8kDwxRstwrgepCuOvwQFvkBoj4l8428YIXUezg0HwLgA3FLkSqnmS 274 | # Us2HD3vYYimkfjC9G7WMcrRI8uPoIfleTGJ5iwIGn3/VCwIDAQABo4IBUTCCAU0w 275 | # HwYDVR0jBBgwFoAUu69+Aj36pvE8hI6t7jiY7NkyMtQwHQYDVR0OBBYEFCmRYP+K 276 | # Tfrr+aZquM/55ku9Sc4SMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8ECDAGAQH/ 277 | # AgEAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMBEGA1UdIAQKMAgwBgYEVR0gADBMBgNV 278 | # HR8ERTBDMEGgP6A9hjtodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9SU0FD 279 | # ZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDBxBggrBgEFBQcBAQRlMGMwOwYIKwYB 280 | # BQUHMAKGL2h0dHA6Ly9jcnQuY29tb2RvY2EuY29tL0NPTU9ET1JTQUFkZFRydXN0 281 | # Q0EuY3J0MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wDQYJ 282 | # KoZIhvcNAQEMBQADggIBAAI/AjnD7vjKO4neDG1NsfFOkk+vwjgsBMzFYxGrCWOv 283 | # q6LXAj/MbxnDPdYaCJT/JdipiKcrEBrgm7EHIhpRHDrU4ekJv+YkdK8eexYxbiPv 284 | # VFEtUgLidQgFTPG3UeFRAMaH9mzuEER2V2rx31hrIapJ1Hw3Tr3/tnVUQBg2V2cR 285 | # zU8C5P7z2vx1F9vst/dlCSNJH0NXg+p+IHdhyE3yu2VNqPeFRQevemknZZApQIvf 286 | # ezpROYyoH3B5rW1CIKLPDGwDjEzNcweU51qOOgS6oqF8H8tjOhWn1BUbp1JHMqn0 287 | # v2RH0aofU04yMHPCb7d4gp1c/0a7ayIdiAv4G6o0pvyM9d1/ZYyMMVcx0DbsR6HP 288 | # y4uo7xwYWMUGd8pLm1GvTAhKeo/io1Lijo7MJuSy2OU4wqjtxoGcNWupWGFKCpe0 289 | # S0K2VZ2+medwbVn4bSoMfxlgXwyaiGwwrFIJkBYb/yud29AgyonqKH4yjhnfe0gz 290 | # Htdl+K7J+IMUk3Z9ZNCOzr41ff9yMU2fnr0ebC+ojwwGUPuMJ7N2yfTm18M04oyH 291 | # IYZh/r9VdOEhdwMKaGy75Mmp5s9ZJet87EUOeWZo6CLNuO+YhU2WETwJitB/vCgo 292 | # E/tqylSNklzNwmWYBp7OSFvUtTeTRkF8B93P+kPvumdh/31J4LswfVyA4+YWOUun 293 | # MYIEezCCBHcCAQEwgZIwfTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIg 294 | # TWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENB 295 | # IExpbWl0ZWQxIzAhBgNVBAMTGkNPTU9ETyBSU0EgQ29kZSBTaWduaW5nIENBAhEA 296 | # +CGT8y+uLXmA2UBOFe5VGzAJBgUrDgMCGgUAoHgwGAYKKwYBBAGCNwIBDDEKMAig 297 | # AoAAoQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgEL 298 | # MQ4wDAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQUVs7ALskhAejAR7kburHq 299 | # +SlxTNIwDQYJKoZIhvcNAQEBBQAEggEAm3ZkxLaAI3mA6ZQjGYbEmswNeSdPxU4I 300 | # 0Wr28PUKSySiOXnPxjpF7TqQzrsyXOyRV7Qu0aNNHhjRjYMxXIBYH+4AsXAxHX9b 301 | # eesJPuv4xYX1ejZfF09AwJWgiAEVaAYvQ4BBrVGHHYnb0F3QvzjAAMDpYc/CAj5v 302 | # b4IphCyTYUMx+rQieBgrzLd9dedtsEjO9PNQClXStCyKi/Y5rWjoVQy3bOMVem8p 303 | # FgkNQYTryJ9Anz6SlnAigthqQ1pX3iS+RxUXv2bR3zslfdZemojv0+a0O6AwiTz9 304 | # LTsGpfEYcFk41q7HsLtnzvD6Kd6nj85or6BwtrtvWllhlwbEwbG3xaGCAkMwggI/ 305 | # BgkqhkiG9w0BCQYxggIwMIICLAIBADCBqTCBlTELMAkGA1UEBhMCVVMxCzAJBgNV 306 | # BAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVT 307 | # RVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5j 308 | # b20xHTAbBgNVBAMTFFVUTi1VU0VSRmlyc3QtT2JqZWN0Ag8WiPA5JV5jjmkUOQfm 309 | # MwswCQYFKw4DAhoFAKBdMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZI 310 | # hvcNAQkFMQ8XDTE3MDExMjIzMDY1NVowIwYJKoZIhvcNAQkEMRYEFDcCcZgmPpj6 311 | # Nwxe931PsI0bCqU7MA0GCSqGSIb3DQEBAQUABIIBAGtPGCxpIpEo6YNbW2dak4m+ 312 | # rAlA9XtzRPiN5RtiHJjiM5Ys6dKvmSJd7LkSOmlZ2F6hbL8QKXmnmvkhonWGhrBU 313 | # 5a+cstVwAkpmmw6kwHwgzcQn42eN9YvW+hDrairBolljjHfGOfm+QqOQa6I0+Fvb 314 | # 50SQ5King64xGv2+YQMAY+8hTdJWJX/yDf4beq+/iBEuV2A4IfIxg7+AkLIrImjm 315 | # rE829XxvsnmTMISqQZ7OT8Gv6vURndiONDd7y+iilyknY8CAkTRPN+WQXXCfs/MG 316 | # UkHPQ+RoVYBMHjgsdypBlljEsmFITMz4I0Y9sczgvSP3oeoC747O2peJUaxWFT0= 317 | # SIG # End signature block 318 | -------------------------------------------------------------------------------- /Code/Expand-ZipFile.ps1: -------------------------------------------------------------------------------- 1 | #requires -version 5.0 2 | ############################################################################### 3 | # WintellectPowerShell Module 4 | # Copyright (c) 2010-2017 - John Robbins/Wintellect 5 | # 6 | # Do whatever you want with this module, but please do give credit. 7 | ############################################################################### 8 | 9 | # Always make sure all variables are defined and all best practices are 10 | # followed. 11 | Set-StrictMode -version Latest 12 | 13 | ############################################################################### 14 | # Public Cmdlets 15 | ############################################################################### 16 | function Expand-ZipFile 17 | { 18 | <# 19 | .SYNOPSIS 20 | DEPRECATED! PowerShell 5.0+ offers Expand-Archive. This cmdlet now just wraps 21 | it. 22 | 23 | .DESCRIPTION 24 | Using no external ZIP utilities, expands a .ZIP file to a specified directory. 25 | 26 | .PARAMETER ZipFile 27 | The .ZIP file to expand. 28 | 29 | .PARAMETER Destination 30 | The output directory for the ZipFile. If this directory does not exist, it will 31 | be created. 32 | 33 | .LINK 34 | http://www.wintellect.com/devcenter/author/jrobbins 35 | https://github.com/Wintellect/WintellectPowerShell 36 | 37 | #> 38 | 39 | param ( 40 | [Parameter(Mandatory=$true, 41 | HelpMessage="Please specify the zip file to expand")] 42 | [string] $ZipFile , 43 | [Parameter(Mandatory=$true, 44 | HelpMessage="Please specify the directory to expand into")] 45 | [string] $Destination 46 | ) 47 | 48 | Expand-Archive -Path $ZipFile -DestinationPath $Destination 49 | } 50 | 51 | # SIG # Begin signature block 52 | # MIIUywYJKoZIhvcNAQcCoIIUvDCCFLgCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB 53 | # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR 54 | # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUckLXkPru+MW9XZxLpDgKDaCX 55 | # vkuggg+6MIIEmTCCA4GgAwIBAgIPFojwOSVeY45pFDkH5jMLMA0GCSqGSIb3DQEB 56 | # BQUAMIGVMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQg 57 | # TGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNV 58 | # BAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTEdMBsGA1UEAxMUVVROLVVTRVJG 59 | # aXJzdC1PYmplY3QwHhcNMTUxMjMxMDAwMDAwWhcNMTkwNzA5MTg0MDM2WjCBhDEL 60 | # MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE 61 | # BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKjAoBgNVBAMT 62 | # IUNPTU9ETyBTSEEtMSBUaW1lIFN0YW1waW5nIFNpZ25lcjCCASIwDQYJKoZIhvcN 63 | # AQEBBQADggEPADCCAQoCggEBAOnpPd/XNwjJHjiyUlNCbSLxscQGBGue/YJ0UEN9 64 | # xqC7H075AnEmse9D2IOMSPznD5d6muuc3qajDjscRBh1jnilF2n+SRik4rtcTv6O 65 | # KlR6UPDV9syR55l51955lNeWM/4Og74iv2MWLKPdKBuvPavql9LxvwQQ5z1IRf0f 66 | # aGXBf1mZacAiMQxibqdcZQEhsGPEIhgn7ub80gA9Ry6ouIZWXQTcExclbhzfRA8V 67 | # zbfbpVd2Qm8AaIKZ0uPB3vCLlFdM7AiQIiHOIiuYDELmQpOUmJPv/QbZP7xbm1Q8 68 | # ILHuatZHesWrgOkwmt7xpD9VTQoJNIp1KdJprZcPUL/4ygkCAwEAAaOB9DCB8TAf 69 | # BgNVHSMEGDAWgBTa7WR0FJwUPKvdmam9WyhNizzJ2DAdBgNVHQ4EFgQUjmstM2v0 70 | # M6eTsxOapeAK9xI1aogwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwFgYD 71 | # VR0lAQH/BAwwCgYIKwYBBQUHAwgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2Ny 72 | # bC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmlyc3QtT2JqZWN0LmNybDA1BggrBgEF 73 | # BQcBAQQpMCcwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnVzZXJ0cnVzdC5jb20w 74 | # DQYJKoZIhvcNAQEFBQADggEBALozJEBAjHzbWJ+zYJiy9cAx/usfblD2CuDk5oGt 75 | # Joei3/2z2vRz8wD7KRuJGxU+22tSkyvErDmB1zxnV5o5NuAoCJrjOU+biQl/e8Vh 76 | # f1mJMiUKaq4aPvCiJ6i2w7iH9xYESEE9XNjsn00gMQTZZaHtzWkHUxY93TYCCojr 77 | # QOUGMAu4Fkvc77xVCf/GPhIudrPczkLv+XZX4bcKBUCYWJpdcRaTcYxlgepv84n3 78 | # +3OttOe/2Y5vqgtPJfO44dXddZhogfiqwNGAwsTEOYnB9smebNd0+dmX+E/CmgrN 79 | # Xo/4GengpZ/E8JIh5i15Jcki+cPwOoRXrToW9GOUEB1d0MYwggU1MIIEHaADAgEC 80 | # AhEA+CGT8y+uLXmA2UBOFe5VGzANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJH 81 | # QjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3Jk 82 | # MRowGAYDVQQKExFDT01PRE8gQ0EgTGltaXRlZDEjMCEGA1UEAxMaQ09NT0RPIFJT 83 | # QSBDb2RlIFNpZ25pbmcgQ0EwHhcNMTYwMjE4MDAwMDAwWhcNMTgxMDI4MjM1OTU5 84 | # WjCBnTELMAkGA1UEBhMCVVMxDjAMBgNVBBEMBTM3OTMyMQswCQYDVQQIDAJUTjES 85 | # MBAGA1UEBwwJS25veHZpbGxlMRIwEAYDVQQJDAlTdWl0ZSAzMDIxHzAdBgNVBAkM 86 | # FjEwMjA3IFRlY2hub2xvZ3kgRHJpdmUxEzARBgNVBAoMCldpbnRlbGxlY3QxEzAR 87 | # BgNVBAMMCldpbnRlbGxlY3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB 88 | # AQDfLujuIe3yrrTfTOdYfstwFDZrI7XezoeFPA33GRxY/MSbKuUvPcN8XqU8Jpg4 89 | # NUkByzoSjPsq9Yjx3anHflcNendqa/8gbkPdiEMg+6kRVmtv1QHfGt+UbEMfrUk0 90 | # Ltm0DE+6OIZFx8hjsxifJvWrQ/jG9lat6e2YwIdNAqyG2htqCrmBN90lW+0+zU9s 91 | # YJIVD0ZfyZJVkvbeay+HwlbojW7JQyyhdGOSa61zUqlD85RX6HzcCbb1WHf5bZRO 92 | # 2idaVNAOw1YHqJAUjY4oJY4lqWwg5Inza4f33Wt82zJAgKY4S01bddkvjPi6iMnG 93 | # y8bI1EfWAdFFC+UM2qKsNc2/AgMBAAGjggGNMIIBiTAfBgNVHSMEGDAWgBQpkWD/ 94 | # ik366/mmarjP+eZLvUnOEjAdBgNVHQ4EFgQUZdNFdxzRtMVCZCvcFV4g7vsL8vgw 95 | # DgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwEwYDVR0lBAwwCgYIKwYBBQUH 96 | # AwMwEQYJYIZIAYb4QgEBBAQDAgQQMEYGA1UdIAQ/MD0wOwYMKwYBBAGyMQECAQMC 97 | # MCswKQYIKwYBBQUHAgEWHWh0dHBzOi8vc2VjdXJlLmNvbW9kby5uZXQvQ1BTMEMG 98 | # A1UdHwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL0NPTU9ET1JT 99 | # QUNvZGVTaWduaW5nQ0EuY3JsMHQGCCsGAQUFBwEBBGgwZjA+BggrBgEFBQcwAoYy 100 | # aHR0cDovL2NydC5jb21vZG9jYS5jb20vQ09NT0RPUlNBQ29kZVNpZ25pbmdDQS5j 101 | # cnQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9kb2NhLmNvbTANBgkqhkiG 102 | # 9w0BAQsFAAOCAQEAnSVG6TXbazSxczonyo/Q+pjX+6JERtMZ0sz3Fc3PTMDcb9DS 103 | # tALjZiZhOgOoRNC+5OHgE3tTPLCT6ZGktfedzp6J9mICzoJIIBelfdiIwJNkPTzR 104 | # I2krUn/6ld5coh0zyM85lCjXkqzZmyQmRRNQoycWtxUwxsNlkiGlRIiIJHztbg1I 105 | # lv9C90zCZ1nAhfOpv+maUohLtz22F9wXCJuIUQapOhPG5n/opM/AUQV2WuDa3AZP 106 | # VYleK90zOgHLDgLICxrx57z2JRlXyW2ga2N5J6DXzwGmxpCe0LbzYCj4h42SjUuf 107 | # 9hOQtORlSjYEj8RFpxatyxcmIIpej9/NDNXgIzCCBeAwggPIoAMCAQICEC58h8wO 108 | # k0pS/pT9HLfNNK8wDQYJKoZIhvcNAQEMBQAwgYUxCzAJBgNVBAYTAkdCMRswGQYD 109 | # VQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxGjAYBgNV 110 | # BAoTEUNPTU9ETyBDQSBMaW1pdGVkMSswKQYDVQQDEyJDT01PRE8gUlNBIENlcnRp 111 | # ZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDUwOTAwMDAwMFoXDTI4MDUwODIzNTk1 112 | # OVowfTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQ 113 | # MA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxIzAh 114 | # BgNVBAMTGkNPTU9ETyBSU0EgQ29kZSBTaWduaW5nIENBMIIBIjANBgkqhkiG9w0B 115 | # AQEFAAOCAQ8AMIIBCgKCAQEAppiQY3eRNH+K0d3pZzER68we/TEds7liVz+TvFvj 116 | # nx4kMhEna7xRkafPnp4ls1+BqBgPHR4gMA77YXuGCbPj/aJonRwsnb9y4+R1oOU1 117 | # I47Jiu4aDGTH2EKhe7VSA0s6sI4jS0tj4CKUN3vVeZAKFBhRLOb+wRLwHD9hYQqM 118 | # otz2wzCqzSgYdUjBeVoIzbuMVYz31HaQOjNGUHOYXPSFSmsPgN1e1r39qS/AJfX5 119 | # eNeNXxDCRFU8kDwxRstwrgepCuOvwQFvkBoj4l8428YIXUezg0HwLgA3FLkSqnmS 120 | # Us2HD3vYYimkfjC9G7WMcrRI8uPoIfleTGJ5iwIGn3/VCwIDAQABo4IBUTCCAU0w 121 | # HwYDVR0jBBgwFoAUu69+Aj36pvE8hI6t7jiY7NkyMtQwHQYDVR0OBBYEFCmRYP+K 122 | # Tfrr+aZquM/55ku9Sc4SMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8ECDAGAQH/ 123 | # AgEAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMBEGA1UdIAQKMAgwBgYEVR0gADBMBgNV 124 | # HR8ERTBDMEGgP6A9hjtodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9SU0FD 125 | # ZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDBxBggrBgEFBQcBAQRlMGMwOwYIKwYB 126 | # BQUHMAKGL2h0dHA6Ly9jcnQuY29tb2RvY2EuY29tL0NPTU9ET1JTQUFkZFRydXN0 127 | # Q0EuY3J0MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wDQYJ 128 | # KoZIhvcNAQEMBQADggIBAAI/AjnD7vjKO4neDG1NsfFOkk+vwjgsBMzFYxGrCWOv 129 | # q6LXAj/MbxnDPdYaCJT/JdipiKcrEBrgm7EHIhpRHDrU4ekJv+YkdK8eexYxbiPv 130 | # VFEtUgLidQgFTPG3UeFRAMaH9mzuEER2V2rx31hrIapJ1Hw3Tr3/tnVUQBg2V2cR 131 | # zU8C5P7z2vx1F9vst/dlCSNJH0NXg+p+IHdhyE3yu2VNqPeFRQevemknZZApQIvf 132 | # ezpROYyoH3B5rW1CIKLPDGwDjEzNcweU51qOOgS6oqF8H8tjOhWn1BUbp1JHMqn0 133 | # v2RH0aofU04yMHPCb7d4gp1c/0a7ayIdiAv4G6o0pvyM9d1/ZYyMMVcx0DbsR6HP 134 | # y4uo7xwYWMUGd8pLm1GvTAhKeo/io1Lijo7MJuSy2OU4wqjtxoGcNWupWGFKCpe0 135 | # S0K2VZ2+medwbVn4bSoMfxlgXwyaiGwwrFIJkBYb/yud29AgyonqKH4yjhnfe0gz 136 | # Htdl+K7J+IMUk3Z9ZNCOzr41ff9yMU2fnr0ebC+ojwwGUPuMJ7N2yfTm18M04oyH 137 | # IYZh/r9VdOEhdwMKaGy75Mmp5s9ZJet87EUOeWZo6CLNuO+YhU2WETwJitB/vCgo 138 | # E/tqylSNklzNwmWYBp7OSFvUtTeTRkF8B93P+kPvumdh/31J4LswfVyA4+YWOUun 139 | # MYIEezCCBHcCAQEwgZIwfTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIg 140 | # TWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENB 141 | # IExpbWl0ZWQxIzAhBgNVBAMTGkNPTU9ETyBSU0EgQ29kZSBTaWduaW5nIENBAhEA 142 | # +CGT8y+uLXmA2UBOFe5VGzAJBgUrDgMCGgUAoHgwGAYKKwYBBAGCNwIBDDEKMAig 143 | # AoAAoQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgEL 144 | # MQ4wDAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQU2VlHivxpe/yiEeKiBIIt 145 | # Nmu80cwwDQYJKoZIhvcNAQEBBQAEggEARVhq1mQrshHsY6/8Vr9ISAbcV/1ViSZ6 146 | # x8ENWvq8R1+PmQmQ+KYJNW+FbnE67Pudt6wPm/iAW8jcgfNVM8A4E13flY2rj/Qj 147 | # T+iSj8SkvX53vUzGjZt9p9Z4d5CJpfx3wYlZjNoVisnHMtbaDdogaVmIeET1pj1d 148 | # h/ueMIaRc5bbB5Puoq43wCBNhqzjK3nuLwj5smg6rdaeL//bpt5s1zORQbI3btWP 149 | # ooNCWX5dWApHFryOeWZ/8SB0dEXzniUkpcxkvGCuxhfUY8fNqOOXcZOQHPTWitFj 150 | # aAjSM/NJhXRIBIrWt0/CtHXg9TMiECRpns7Ho9l9y5iYi6Bpio6I/aGCAkMwggI/ 151 | # BgkqhkiG9w0BCQYxggIwMIICLAIBADCBqTCBlTELMAkGA1UEBhMCVVMxCzAJBgNV 152 | # BAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVT 153 | # RVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5j 154 | # b20xHTAbBgNVBAMTFFVUTi1VU0VSRmlyc3QtT2JqZWN0Ag8WiPA5JV5jjmkUOQfm 155 | # MwswCQYFKw4DAhoFAKBdMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZI 156 | # hvcNAQkFMQ8XDTE3MDExMjIzMDY1OFowIwYJKoZIhvcNAQkEMRYEFOi1fcyFvaKf 157 | # JDwdmword5hfwtRsMA0GCSqGSIb3DQEBAQUABIIBACVsDxRBjAoUkGwKcifeoALb 158 | # CHhtXkH7RbXjrECfy09n2/t2gO0OwHByiDhfLEhsg/b1gDF4hQussXBS1hoeJVsN 159 | # TF0N4KP6GWZ+7SIJWBj01MB6NIcoFoBVqN9u4eKaQNkQMJlAsYJictQS2JmVEWZG 160 | # Qy4ASYYou73GJO6gvcV8C2o3JnITlBwV1RdyzpkfUtAJUQ/iM+ULVtEttL8esc+9 161 | # bDAbPFWjKA5MjY5MtQXhKZDFVAplRplNkaouG/Rijw7003SvAm4nLJOi943/Gn5x 162 | # cj6uU3k8GmoisQpZVRJ9chwUjmcuxzxpR/04IStJvmfKOgBLR+7/sF8LwLmt1so= 163 | # SIG # End signature block 164 | -------------------------------------------------------------------------------- /Code/Get-DumpAnalysis.ps1: -------------------------------------------------------------------------------- 1 |  2 | ############################################################################### 3 | # WintellectPowerShell Module 4 | # Copyright (c) 2015-2017 - John Robbins/Wintellect 5 | # 6 | # Do whatever you want with this module, but please do give credit. 7 | ############################################################################### 8 | 9 | # Always make sure all variables are defined and all best practices are 10 | # followed. 11 | Set-StrictMode -version Latest 12 | 13 | function Get-DumpAnalysis 14 | { 15 | <# 16 | .SYNOPSIS 17 | Automates minidump analysis. 18 | 19 | .DESCRIPTION 20 | The CDB $< command allows you read in a text file and each line be executed 21 | in the CDB command line. When you start CDB with the -c command line switch 22 | you can tell it to execute specific commands. Thus if you use the following 23 | -c option, you can script CDB. 24 | 25 | cdb.exe -c "$$-.log 32 | 33 | .PARAMETER Files 34 | The minidump files to process. 35 | 36 | .PARAMETER DebuggingScript 37 | The script file to pass to CDB. You specify the CDB commands in this file one 38 | line at a time. For comments, CDB supports using the "*" character at the start 39 | of the line. 40 | 41 | .PARAMETER CdbProgramPath 42 | By default this script assumes that CDB is the PATH environment variable. If you 43 | would like to specify the particular CDB to run, put the full path and CDB.EXE 44 | into this parameter. 45 | 46 | .EXAMPLE 47 | Get-DumpAnalysis -Files .\MyMiniDump.dmp -DebuggingScript .\BasicAnalysis.txt 48 | 49 | This will run the commands in BasicAnalysis.txt on MyMiniDump.dmp and the output will be 50 | writting to MyMiniDump.dmp-BasicAnalysis.txt.log 51 | 52 | .EXAMPLE 53 | Get-ChildItem *.dmp | Get-DumpAnalysis -DebuggingScript .\MoreStuff.txt 54 | 55 | For all mini dump files will be piped to Get-DumpAnalysis and have the debug script 56 | MoreStuff.txt run on each one. 57 | 58 | .NOTES 59 | Here is an example of a debugging script. Note that asterisks are treated as comments 60 | by CDB but are output to the log. It's a good idea to use comments so you can identify 61 | where different commands run so you can use a regular expression to pull them out. 62 | 63 | * Do the basic analysis 64 | !analyze -v 65 | * Get all the loaded modules 66 | lmv 67 | 68 | .LINK 69 | http://www.wintellect.com/devcenter/author/jrobbins 70 | https://github.com/Wintellect/WintellectPowerShell 71 | 72 | #> 73 | 74 | [CmdletBinding(SupportsShouldProcess=$true)] 75 | param 76 | ( 77 | [Parameter(ValueFromPipeline=$true, 78 | ValueFromPipelineByPropertyName=$true, 79 | Mandatory=$true, 80 | HelpMessage="Please enter the minidump file to process")] 81 | [Alias('FullName')] 82 | [string]$Files, 83 | 84 | [Parameter(Mandatory=$true, 85 | HelpMessage="Please enter WinDBG script file to use")] 86 | [ValidateScript({ Test-Path -Path $_ -PathType Leaf })] 87 | [string]$DebuggingScript, 88 | 89 | [AllowEmptyString()] 90 | [string]$CdbProgramPath="" 91 | ) 92 | 93 | begin 94 | { 95 | Set-StrictMode -Version Latest 96 | 97 | # If the path to the version of cdb is null, use the first one 98 | # found in the path. 99 | if ($CdbProgramPath.Length -eq 0) 100 | { 101 | $CdbProgramPath = (Get-Command -Name "cdb.exe" -ErrorAction Stop).Source 102 | } 103 | 104 | Test-Path -Path $CdbProgramPath -ErrorAction Stop | Out-Null 105 | 106 | Write-Verbose -Message "Using cdb from $CdbProgramPath" 107 | } 108 | process 109 | { 110 | foreach ($file in $Files) 111 | { 112 | $scriptName = [System.IO.Path]::GetFileName($DebuggingScript) 113 | $fullScriptPath = (Resolve-Path -Path $DebuggingScript).Path 114 | 115 | $file = (Resolve-Path -Path $file).Path 116 | $logFile = $file + "-" + $scriptName + ".log" 117 | 118 | Write-Verbose -Message "Logging to file $logFile" 119 | 120 | if ($PSCmdlet.ShouldProcess("$CdbProgramPath -z $file -c `"`$$<$fullScriptPath;q`"", "Executing")) 121 | { 122 | &$CdbProgramPath -z $file -c "`$`$<$fullScriptPath;Q" | Tee-Object -FilePath $logFile 123 | } 124 | } 125 | } 126 | } 127 | 128 | # SIG # Begin signature block 129 | # MIIUywYJKoZIhvcNAQcCoIIUvDCCFLgCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB 130 | # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR 131 | # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUFlLoseBwRUWiAvJLdTAskLK0 132 | # OXyggg+6MIIEmTCCA4GgAwIBAgIPFojwOSVeY45pFDkH5jMLMA0GCSqGSIb3DQEB 133 | # BQUAMIGVMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQg 134 | # TGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNV 135 | # BAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTEdMBsGA1UEAxMUVVROLVVTRVJG 136 | # aXJzdC1PYmplY3QwHhcNMTUxMjMxMDAwMDAwWhcNMTkwNzA5MTg0MDM2WjCBhDEL 137 | # MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE 138 | # BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKjAoBgNVBAMT 139 | # IUNPTU9ETyBTSEEtMSBUaW1lIFN0YW1waW5nIFNpZ25lcjCCASIwDQYJKoZIhvcN 140 | # AQEBBQADggEPADCCAQoCggEBAOnpPd/XNwjJHjiyUlNCbSLxscQGBGue/YJ0UEN9 141 | # xqC7H075AnEmse9D2IOMSPznD5d6muuc3qajDjscRBh1jnilF2n+SRik4rtcTv6O 142 | # KlR6UPDV9syR55l51955lNeWM/4Og74iv2MWLKPdKBuvPavql9LxvwQQ5z1IRf0f 143 | # aGXBf1mZacAiMQxibqdcZQEhsGPEIhgn7ub80gA9Ry6ouIZWXQTcExclbhzfRA8V 144 | # zbfbpVd2Qm8AaIKZ0uPB3vCLlFdM7AiQIiHOIiuYDELmQpOUmJPv/QbZP7xbm1Q8 145 | # ILHuatZHesWrgOkwmt7xpD9VTQoJNIp1KdJprZcPUL/4ygkCAwEAAaOB9DCB8TAf 146 | # BgNVHSMEGDAWgBTa7WR0FJwUPKvdmam9WyhNizzJ2DAdBgNVHQ4EFgQUjmstM2v0 147 | # M6eTsxOapeAK9xI1aogwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwFgYD 148 | # VR0lAQH/BAwwCgYIKwYBBQUHAwgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2Ny 149 | # bC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmlyc3QtT2JqZWN0LmNybDA1BggrBgEF 150 | # BQcBAQQpMCcwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnVzZXJ0cnVzdC5jb20w 151 | # DQYJKoZIhvcNAQEFBQADggEBALozJEBAjHzbWJ+zYJiy9cAx/usfblD2CuDk5oGt 152 | # Joei3/2z2vRz8wD7KRuJGxU+22tSkyvErDmB1zxnV5o5NuAoCJrjOU+biQl/e8Vh 153 | # f1mJMiUKaq4aPvCiJ6i2w7iH9xYESEE9XNjsn00gMQTZZaHtzWkHUxY93TYCCojr 154 | # QOUGMAu4Fkvc77xVCf/GPhIudrPczkLv+XZX4bcKBUCYWJpdcRaTcYxlgepv84n3 155 | # +3OttOe/2Y5vqgtPJfO44dXddZhogfiqwNGAwsTEOYnB9smebNd0+dmX+E/CmgrN 156 | # Xo/4GengpZ/E8JIh5i15Jcki+cPwOoRXrToW9GOUEB1d0MYwggU1MIIEHaADAgEC 157 | # AhEA+CGT8y+uLXmA2UBOFe5VGzANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJH 158 | # QjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3Jk 159 | # MRowGAYDVQQKExFDT01PRE8gQ0EgTGltaXRlZDEjMCEGA1UEAxMaQ09NT0RPIFJT 160 | # QSBDb2RlIFNpZ25pbmcgQ0EwHhcNMTYwMjE4MDAwMDAwWhcNMTgxMDI4MjM1OTU5 161 | # WjCBnTELMAkGA1UEBhMCVVMxDjAMBgNVBBEMBTM3OTMyMQswCQYDVQQIDAJUTjES 162 | # MBAGA1UEBwwJS25veHZpbGxlMRIwEAYDVQQJDAlTdWl0ZSAzMDIxHzAdBgNVBAkM 163 | # FjEwMjA3IFRlY2hub2xvZ3kgRHJpdmUxEzARBgNVBAoMCldpbnRlbGxlY3QxEzAR 164 | # BgNVBAMMCldpbnRlbGxlY3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB 165 | # AQDfLujuIe3yrrTfTOdYfstwFDZrI7XezoeFPA33GRxY/MSbKuUvPcN8XqU8Jpg4 166 | # NUkByzoSjPsq9Yjx3anHflcNendqa/8gbkPdiEMg+6kRVmtv1QHfGt+UbEMfrUk0 167 | # Ltm0DE+6OIZFx8hjsxifJvWrQ/jG9lat6e2YwIdNAqyG2htqCrmBN90lW+0+zU9s 168 | # YJIVD0ZfyZJVkvbeay+HwlbojW7JQyyhdGOSa61zUqlD85RX6HzcCbb1WHf5bZRO 169 | # 2idaVNAOw1YHqJAUjY4oJY4lqWwg5Inza4f33Wt82zJAgKY4S01bddkvjPi6iMnG 170 | # y8bI1EfWAdFFC+UM2qKsNc2/AgMBAAGjggGNMIIBiTAfBgNVHSMEGDAWgBQpkWD/ 171 | # ik366/mmarjP+eZLvUnOEjAdBgNVHQ4EFgQUZdNFdxzRtMVCZCvcFV4g7vsL8vgw 172 | # DgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwEwYDVR0lBAwwCgYIKwYBBQUH 173 | # AwMwEQYJYIZIAYb4QgEBBAQDAgQQMEYGA1UdIAQ/MD0wOwYMKwYBBAGyMQECAQMC 174 | # MCswKQYIKwYBBQUHAgEWHWh0dHBzOi8vc2VjdXJlLmNvbW9kby5uZXQvQ1BTMEMG 175 | # A1UdHwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL0NPTU9ET1JT 176 | # QUNvZGVTaWduaW5nQ0EuY3JsMHQGCCsGAQUFBwEBBGgwZjA+BggrBgEFBQcwAoYy 177 | # aHR0cDovL2NydC5jb21vZG9jYS5jb20vQ09NT0RPUlNBQ29kZVNpZ25pbmdDQS5j 178 | # cnQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9kb2NhLmNvbTANBgkqhkiG 179 | # 9w0BAQsFAAOCAQEAnSVG6TXbazSxczonyo/Q+pjX+6JERtMZ0sz3Fc3PTMDcb9DS 180 | # tALjZiZhOgOoRNC+5OHgE3tTPLCT6ZGktfedzp6J9mICzoJIIBelfdiIwJNkPTzR 181 | # I2krUn/6ld5coh0zyM85lCjXkqzZmyQmRRNQoycWtxUwxsNlkiGlRIiIJHztbg1I 182 | # lv9C90zCZ1nAhfOpv+maUohLtz22F9wXCJuIUQapOhPG5n/opM/AUQV2WuDa3AZP 183 | # VYleK90zOgHLDgLICxrx57z2JRlXyW2ga2N5J6DXzwGmxpCe0LbzYCj4h42SjUuf 184 | # 9hOQtORlSjYEj8RFpxatyxcmIIpej9/NDNXgIzCCBeAwggPIoAMCAQICEC58h8wO 185 | # k0pS/pT9HLfNNK8wDQYJKoZIhvcNAQEMBQAwgYUxCzAJBgNVBAYTAkdCMRswGQYD 186 | # VQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxGjAYBgNV 187 | # BAoTEUNPTU9ETyBDQSBMaW1pdGVkMSswKQYDVQQDEyJDT01PRE8gUlNBIENlcnRp 188 | # ZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDUwOTAwMDAwMFoXDTI4MDUwODIzNTk1 189 | # OVowfTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQ 190 | # MA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxIzAh 191 | # BgNVBAMTGkNPTU9ETyBSU0EgQ29kZSBTaWduaW5nIENBMIIBIjANBgkqhkiG9w0B 192 | # AQEFAAOCAQ8AMIIBCgKCAQEAppiQY3eRNH+K0d3pZzER68we/TEds7liVz+TvFvj 193 | # nx4kMhEna7xRkafPnp4ls1+BqBgPHR4gMA77YXuGCbPj/aJonRwsnb9y4+R1oOU1 194 | # I47Jiu4aDGTH2EKhe7VSA0s6sI4jS0tj4CKUN3vVeZAKFBhRLOb+wRLwHD9hYQqM 195 | # otz2wzCqzSgYdUjBeVoIzbuMVYz31HaQOjNGUHOYXPSFSmsPgN1e1r39qS/AJfX5 196 | # eNeNXxDCRFU8kDwxRstwrgepCuOvwQFvkBoj4l8428YIXUezg0HwLgA3FLkSqnmS 197 | # Us2HD3vYYimkfjC9G7WMcrRI8uPoIfleTGJ5iwIGn3/VCwIDAQABo4IBUTCCAU0w 198 | # HwYDVR0jBBgwFoAUu69+Aj36pvE8hI6t7jiY7NkyMtQwHQYDVR0OBBYEFCmRYP+K 199 | # Tfrr+aZquM/55ku9Sc4SMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8ECDAGAQH/ 200 | # AgEAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMBEGA1UdIAQKMAgwBgYEVR0gADBMBgNV 201 | # HR8ERTBDMEGgP6A9hjtodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9SU0FD 202 | # ZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDBxBggrBgEFBQcBAQRlMGMwOwYIKwYB 203 | # BQUHMAKGL2h0dHA6Ly9jcnQuY29tb2RvY2EuY29tL0NPTU9ET1JTQUFkZFRydXN0 204 | # Q0EuY3J0MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wDQYJ 205 | # KoZIhvcNAQEMBQADggIBAAI/AjnD7vjKO4neDG1NsfFOkk+vwjgsBMzFYxGrCWOv 206 | # q6LXAj/MbxnDPdYaCJT/JdipiKcrEBrgm7EHIhpRHDrU4ekJv+YkdK8eexYxbiPv 207 | # VFEtUgLidQgFTPG3UeFRAMaH9mzuEER2V2rx31hrIapJ1Hw3Tr3/tnVUQBg2V2cR 208 | # zU8C5P7z2vx1F9vst/dlCSNJH0NXg+p+IHdhyE3yu2VNqPeFRQevemknZZApQIvf 209 | # ezpROYyoH3B5rW1CIKLPDGwDjEzNcweU51qOOgS6oqF8H8tjOhWn1BUbp1JHMqn0 210 | # v2RH0aofU04yMHPCb7d4gp1c/0a7ayIdiAv4G6o0pvyM9d1/ZYyMMVcx0DbsR6HP 211 | # y4uo7xwYWMUGd8pLm1GvTAhKeo/io1Lijo7MJuSy2OU4wqjtxoGcNWupWGFKCpe0 212 | # S0K2VZ2+medwbVn4bSoMfxlgXwyaiGwwrFIJkBYb/yud29AgyonqKH4yjhnfe0gz 213 | # Htdl+K7J+IMUk3Z9ZNCOzr41ff9yMU2fnr0ebC+ojwwGUPuMJ7N2yfTm18M04oyH 214 | # IYZh/r9VdOEhdwMKaGy75Mmp5s9ZJet87EUOeWZo6CLNuO+YhU2WETwJitB/vCgo 215 | # E/tqylSNklzNwmWYBp7OSFvUtTeTRkF8B93P+kPvumdh/31J4LswfVyA4+YWOUun 216 | # MYIEezCCBHcCAQEwgZIwfTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIg 217 | # TWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENB 218 | # IExpbWl0ZWQxIzAhBgNVBAMTGkNPTU9ETyBSU0EgQ29kZSBTaWduaW5nIENBAhEA 219 | # +CGT8y+uLXmA2UBOFe5VGzAJBgUrDgMCGgUAoHgwGAYKKwYBBAGCNwIBDDEKMAig 220 | # AoAAoQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgEL 221 | # MQ4wDAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQUUx9G5Ly54PpQas8w7e6a 222 | # BXwLyo0wDQYJKoZIhvcNAQEBBQAEggEAwJTC3Rg4V39QPORBCr3y0CDqi88u8Iz5 223 | # uFuES2cmqapxx9pDX+uyGcWFKjv4Mxusbst3X1hpiR1hV5gCLdS3nkG00CAbczHO 224 | # rOMJ5AniM8R+SaTzqbbFMH/lGqkraa/Ir2waWB/IwBPHp5U0sJADHwdTtG6AlqJU 225 | # Yt81qlQfaFc5+66ZsKsFSpz5G+beVWifKfOmcia1+K4sEMn1Hu+GxEFruAnnYlb7 226 | # Ln7eOhv5IL7AQkPgM2ZI3FIbsNSPf1I/NhGMe7+xUI2RYY2PZKAvNh0OJvdhwsCY 227 | # pkBBmdGnXubtfS90JrRYknUEOxPbqmRW/U4xWWxWd362btxOEpwYL6GCAkMwggI/ 228 | # BgkqhkiG9w0BCQYxggIwMIICLAIBADCBqTCBlTELMAkGA1UEBhMCVVMxCzAJBgNV 229 | # BAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVT 230 | # RVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5j 231 | # b20xHTAbBgNVBAMTFFVUTi1VU0VSRmlyc3QtT2JqZWN0Ag8WiPA5JV5jjmkUOQfm 232 | # MwswCQYFKw4DAhoFAKBdMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZI 233 | # hvcNAQkFMQ8XDTE3MDExMjIzMDcwMVowIwYJKoZIhvcNAQkEMRYEFISPkeuhlZVK 234 | # YnJw1CX6Tw2k5h/SMA0GCSqGSIb3DQEBAQUABIIBACX2m6QxlEo7fb7nbWD9ObYt 235 | # LVZDrri+PF5snWr56nRQnRRvprLTiBNuXPr9yhiKeGduUGdx5E1RLpWQ/5hj5puG 236 | # nakYbyrH0OKt/gYrWvlvqdpSxXGt+luMbrjh8I4j8TarvYlX8uM4M8irQ+O5Hrtq 237 | # L6t/VKQHJRWzN4+JAnX8b5gmfB1cNH7FkuidV12HwKSW6cu40AsfK31Cvr6xiRA2 238 | # UsGcALCiuBpYZw3SwC9gyiXngqMohogeF9uJQxGSHVa2bisbFy6pmRXmRO4frMhF 239 | # Lf1eJQOc9w1a2CfCmM8SSHhOt/GR1MK0mvfNmbx19S25Rgwft/a06Ll+3qO+Kw4= 240 | # SIG # End signature block 241 | -------------------------------------------------------------------------------- /Code/Get-SysinternalsSuite.ps1: -------------------------------------------------------------------------------- 1 | #requires -version 5.0 2 | ############################################################################### 3 | # WintellectPowerShell Module 4 | # Copyright (c) 2010-2017 - John Robbins/Wintellect 5 | # 6 | # Do whatever you want with this module, but please do give credit. 7 | ############################################################################### 8 | 9 | # Always make sure all variables are defined and all best practices are 10 | # followed. 11 | Set-StrictMode -version Latest 12 | 13 | ############################################################################### 14 | # Public Cmdlets 15 | ############################################################################### 16 | function Get-SysinternalsSuite 17 | { 18 | <# 19 | .SYNOPSIS 20 | Gets all the wonderful Sysinternals tools. 21 | 22 | .DESCRIPTION 23 | Downloads and extracts the Sysinternal tools to the directory you specify. 24 | 25 | .PARAMETER ExtractTo 26 | The directory where you want to extract the Sysinternal tools. 27 | 28 | .PARAMETER Save 29 | The default is to download the SysinternalsSuite.zip file and remove it after 30 | extracting the contents. If you want to keep the file, specify the save directory 31 | with this parameter. 32 | 33 | .LINK 34 | http://www.wintellect.com/devcenter/author/jrobbins 35 | https://github.com/Wintellect/WintellectPowerShell 36 | 37 | #> 38 | param ( 39 | [Parameter(Mandatory=$true, 40 | HelpMessage="Please specify the extract directory")] 41 | [Alias("Extract")] 42 | [string] $ExtractTo , 43 | [Parameter(HelpMessage="Please specify the directory to expand into")] 44 | [string] $Save="" 45 | ) 46 | 47 | New-Item -ItemType Directory -Path $ExtractTo -ErrorAction SilentlyContinue > $null 48 | 49 | [Boolean]$deleteZipFile = $TRUE 50 | [String]$downloadFile = "" 51 | if ( $Save.Length -gt 0 ) 52 | { 53 | New-Item -ItemType Directory -Path $Save -ErrorAction SilentlyContinue > $null 54 | $downloadFile = $Save 55 | $deleteZipFile = $FALSE 56 | } 57 | else 58 | { 59 | # Use the %TEMP% path for the user. 60 | $downloadFile = $env:temp 61 | } 62 | 63 | # Build up the full location and filename. 64 | $downloadFile = $(Get-item -Path $downloadFile).FullName 65 | $downloadFile = Join-Path -path $downloadFile -childpath "SysinternalsSuite.zip" 66 | 67 | # Let the download begin! 68 | Invoke-WebRequest -Uri "http://download.sysinternals.com/files/SysinternalsSuite.zip" -OutFile $downloadFile 69 | 70 | # Because the SysinternalsSuite.zip is quite large, I've seen very random instances where 71 | # the Expand-Archive fails because some anti-virus lock the file in exclusive mode. 72 | # I hate doing this but don't see any other way around the issue. 73 | Start-Sleep -Seconds 1 74 | 75 | # Now expand away. 76 | Expand-Archive -Path $downloadFile -DestinationPath $ExtractTo -Force 77 | 78 | # Strip off the NTFS stream marking the files as downloaded. We trust Mark. :) 79 | Unblock-File -Path $ExtractTo 80 | 81 | if ($deleteZipFile -eq $true) 82 | { 83 | Remove-Item -Path $downloadFile 84 | } 85 | } 86 | 87 | # SIG # Begin signature block 88 | # MIIaQwYJKoZIhvcNAQcCoIIaNDCCGjACAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB 89 | # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR 90 | # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUfuFoz1Q88y4dtvuUFICi9ZDo 91 | # 1M6gghUyMIIEmTCCA4GgAwIBAgIPFojwOSVeY45pFDkH5jMLMA0GCSqGSIb3DQEB 92 | # BQUAMIGVMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQg 93 | # TGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNV 94 | # BAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTEdMBsGA1UEAxMUVVROLVVTRVJG 95 | # aXJzdC1PYmplY3QwHhcNMTUxMjMxMDAwMDAwWhcNMTkwNzA5MTg0MDM2WjCBhDEL 96 | # MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE 97 | # BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKjAoBgNVBAMT 98 | # IUNPTU9ETyBTSEEtMSBUaW1lIFN0YW1waW5nIFNpZ25lcjCCASIwDQYJKoZIhvcN 99 | # AQEBBQADggEPADCCAQoCggEBAOnpPd/XNwjJHjiyUlNCbSLxscQGBGue/YJ0UEN9 100 | # xqC7H075AnEmse9D2IOMSPznD5d6muuc3qajDjscRBh1jnilF2n+SRik4rtcTv6O 101 | # KlR6UPDV9syR55l51955lNeWM/4Og74iv2MWLKPdKBuvPavql9LxvwQQ5z1IRf0f 102 | # aGXBf1mZacAiMQxibqdcZQEhsGPEIhgn7ub80gA9Ry6ouIZWXQTcExclbhzfRA8V 103 | # zbfbpVd2Qm8AaIKZ0uPB3vCLlFdM7AiQIiHOIiuYDELmQpOUmJPv/QbZP7xbm1Q8 104 | # ILHuatZHesWrgOkwmt7xpD9VTQoJNIp1KdJprZcPUL/4ygkCAwEAAaOB9DCB8TAf 105 | # BgNVHSMEGDAWgBTa7WR0FJwUPKvdmam9WyhNizzJ2DAdBgNVHQ4EFgQUjmstM2v0 106 | # M6eTsxOapeAK9xI1aogwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwFgYD 107 | # VR0lAQH/BAwwCgYIKwYBBQUHAwgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2Ny 108 | # bC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmlyc3QtT2JqZWN0LmNybDA1BggrBgEF 109 | # BQcBAQQpMCcwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnVzZXJ0cnVzdC5jb20w 110 | # DQYJKoZIhvcNAQEFBQADggEBALozJEBAjHzbWJ+zYJiy9cAx/usfblD2CuDk5oGt 111 | # Joei3/2z2vRz8wD7KRuJGxU+22tSkyvErDmB1zxnV5o5NuAoCJrjOU+biQl/e8Vh 112 | # f1mJMiUKaq4aPvCiJ6i2w7iH9xYESEE9XNjsn00gMQTZZaHtzWkHUxY93TYCCojr 113 | # QOUGMAu4Fkvc77xVCf/GPhIudrPczkLv+XZX4bcKBUCYWJpdcRaTcYxlgepv84n3 114 | # +3OttOe/2Y5vqgtPJfO44dXddZhogfiqwNGAwsTEOYnB9smebNd0+dmX+E/CmgrN 115 | # Xo/4GengpZ/E8JIh5i15Jcki+cPwOoRXrToW9GOUEB1d0MYwggU1MIIEHaADAgEC 116 | # AhEA+CGT8y+uLXmA2UBOFe5VGzANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJH 117 | # QjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3Jk 118 | # MRowGAYDVQQKExFDT01PRE8gQ0EgTGltaXRlZDEjMCEGA1UEAxMaQ09NT0RPIFJT 119 | # QSBDb2RlIFNpZ25pbmcgQ0EwHhcNMTYwMjE4MDAwMDAwWhcNMTgxMDI4MjM1OTU5 120 | # WjCBnTELMAkGA1UEBhMCVVMxDjAMBgNVBBEMBTM3OTMyMQswCQYDVQQIDAJUTjES 121 | # MBAGA1UEBwwJS25veHZpbGxlMRIwEAYDVQQJDAlTdWl0ZSAzMDIxHzAdBgNVBAkM 122 | # FjEwMjA3IFRlY2hub2xvZ3kgRHJpdmUxEzARBgNVBAoMCldpbnRlbGxlY3QxEzAR 123 | # BgNVBAMMCldpbnRlbGxlY3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB 124 | # AQDfLujuIe3yrrTfTOdYfstwFDZrI7XezoeFPA33GRxY/MSbKuUvPcN8XqU8Jpg4 125 | # NUkByzoSjPsq9Yjx3anHflcNendqa/8gbkPdiEMg+6kRVmtv1QHfGt+UbEMfrUk0 126 | # Ltm0DE+6OIZFx8hjsxifJvWrQ/jG9lat6e2YwIdNAqyG2htqCrmBN90lW+0+zU9s 127 | # YJIVD0ZfyZJVkvbeay+HwlbojW7JQyyhdGOSa61zUqlD85RX6HzcCbb1WHf5bZRO 128 | # 2idaVNAOw1YHqJAUjY4oJY4lqWwg5Inza4f33Wt82zJAgKY4S01bddkvjPi6iMnG 129 | # y8bI1EfWAdFFC+UM2qKsNc2/AgMBAAGjggGNMIIBiTAfBgNVHSMEGDAWgBQpkWD/ 130 | # ik366/mmarjP+eZLvUnOEjAdBgNVHQ4EFgQUZdNFdxzRtMVCZCvcFV4g7vsL8vgw 131 | # DgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwEwYDVR0lBAwwCgYIKwYBBQUH 132 | # AwMwEQYJYIZIAYb4QgEBBAQDAgQQMEYGA1UdIAQ/MD0wOwYMKwYBBAGyMQECAQMC 133 | # MCswKQYIKwYBBQUHAgEWHWh0dHBzOi8vc2VjdXJlLmNvbW9kby5uZXQvQ1BTMEMG 134 | # A1UdHwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL0NPTU9ET1JT 135 | # QUNvZGVTaWduaW5nQ0EuY3JsMHQGCCsGAQUFBwEBBGgwZjA+BggrBgEFBQcwAoYy 136 | # aHR0cDovL2NydC5jb21vZG9jYS5jb20vQ09NT0RPUlNBQ29kZVNpZ25pbmdDQS5j 137 | # cnQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9kb2NhLmNvbTANBgkqhkiG 138 | # 9w0BAQsFAAOCAQEAnSVG6TXbazSxczonyo/Q+pjX+6JERtMZ0sz3Fc3PTMDcb9DS 139 | # tALjZiZhOgOoRNC+5OHgE3tTPLCT6ZGktfedzp6J9mICzoJIIBelfdiIwJNkPTzR 140 | # I2krUn/6ld5coh0zyM85lCjXkqzZmyQmRRNQoycWtxUwxsNlkiGlRIiIJHztbg1I 141 | # lv9C90zCZ1nAhfOpv+maUohLtz22F9wXCJuIUQapOhPG5n/opM/AUQV2WuDa3AZP 142 | # VYleK90zOgHLDgLICxrx57z2JRlXyW2ga2N5J6DXzwGmxpCe0LbzYCj4h42SjUuf 143 | # 9hOQtORlSjYEj8RFpxatyxcmIIpej9/NDNXgIzCCBXQwggRcoAMCAQICECdm7lbr 144 | # SfOOq9dwovyE3iIwDQYJKoZIhvcNAQEMBQAwbzELMAkGA1UEBhMCU0UxFDASBgNV 145 | # BAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5hbCBUVFAg 146 | # TmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9vdDAeFw0w 147 | # MDA1MzAxMDQ4MzhaFw0yMDA1MzAxMDQ4MzhaMIGFMQswCQYDVQQGEwJHQjEbMBkG 148 | # A1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYD 149 | # VQQKExFDT01PRE8gQ0EgTGltaXRlZDErMCkGA1UEAxMiQ09NT0RPIFJTQSBDZXJ0 150 | # aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC 151 | # ggIBAJHoVJLSClaxrA0k3cXPRGd0mSs3o30jcABxvFPfxPoqEo9LfxBWvZ9wcrdh 152 | # f8lLDxenPeOwBGHu/xGXx/SGPgr6Plz5k+Y0etkUa+ecs4Wggnp2r3GQ1+z9Dfqc 153 | # bPrfsIL0FH75vsSmL09/mX+1/GdDcr0MANaJ62ss0+2PmBwUq37l42782KjkkiTa 154 | # Q2tiuFX96sG8bLaL8w6NmuSbbGmZ+HhIMEXVreENPEVg/DKWUSe8Z8PKLrZr6kbH 155 | # xyCgsR9l3kgIuqROqfKDRjeE6+jMgUhDZ05yKptcvUwbKIpcInu0q5jZ7uBRg8MJ 156 | # Rk5tPpn6lRfafDNXQTyNUe0LtlyvLGMa31fIP7zpXcSbr0WZ4qNaJLS6qVY9z2+q 157 | # /0lYvvCo//S4rek3+7q49As6+ehDQh6J2ITLE/HZu+GJYLiMKFasFB2cCudx688O 158 | # 3T2plqFIvTz3r7UNIkzAEYHsVjv206LiW7eyBCJSlYCTaeiOTGXxkQMtcHQC6otn 159 | # FSlpUgK7199QalVGv6CjKGF/cNDDoqosIapHziicBkV2v4IYJ7TVrrTLUOZr9EyG 160 | # cTDppt8WhuDY/0Dd+9BCiH+jMzouXB5BEYFjzhhxayvspoq3MVw6akfgw3lZ1iAa 161 | # r/JqmKpyvFdK0kuduxD8sExB5e0dPV4onZzMv7NR2qdH5YRTAgMBAAGjgfQwgfEw 162 | # HwYDVR0jBBgwFoAUrb2YejS0Jvf6xCZU7wO94CTLVBowHQYDVR0OBBYEFLuvfgI9 163 | # +qbxPISOre44mOzZMjLUMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/ 164 | # MBEGA1UdIAQKMAgwBgYEVR0gADBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vY3Js 165 | # LnVzZXJ0cnVzdC5jb20vQWRkVHJ1c3RFeHRlcm5hbENBUm9vdC5jcmwwNQYIKwYB 166 | # BQUHAQEEKTAnMCUGCCsGAQUFBzABhhlodHRwOi8vb2NzcC51c2VydHJ1c3QuY29t 167 | # MA0GCSqGSIb3DQEBDAUAA4IBAQBkv4PxX5qF0M24oSlXDeha99HpPvJ2BG7xUnC7 168 | # Hjz/TQ10asyBgiXTw6AqXUz1uouhbcRUCXXH4ycOXYR5N0ATd/W0rBzQO6sXEtbv 169 | # NBh+K+l506tXRQyvKPrQ2+VQlYi734VXaX2S2FLKc4G/HPPmuG5mEQWzHpQtf5GV 170 | # klnxTM6jkXFMfEcMOwsZ9qGxbIY+XKrELoLL+QeWukhNkPKUyKlzousGeyOd3qLz 171 | # TVWfemFFmBhox15AayP1eXrvjLVri7dvRvR78T1LBNiTgFla4EEkHbKPFWBYR9vv 172 | # bkb9FfXZX5qz29i45ECzzZc5roW7HY683Ieb0abv8TtvEDhvMIIF4DCCA8igAwIB 173 | # AgIQLnyHzA6TSlL+lP0ct800rzANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UEBhMC 174 | # R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9y 175 | # ZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBS 176 | # U0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTMwNTA5MDAwMDAwWhcNMjgw 177 | # NTA4MjM1OTU5WjB9MQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3JlYXRlciBNYW5j 178 | # aGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01PRE8gQ0EgTGlt 179 | # aXRlZDEjMCEGA1UEAxMaQ09NT0RPIFJTQSBDb2RlIFNpZ25pbmcgQ0EwggEiMA0G 180 | # CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCmmJBjd5E0f4rR3elnMRHrzB79MR2z 181 | # uWJXP5O8W+OfHiQyESdrvFGRp8+eniWzX4GoGA8dHiAwDvthe4YJs+P9omidHCyd 182 | # v3Lj5HWg5TUjjsmK7hoMZMfYQqF7tVIDSzqwjiNLS2PgIpQ3e9V5kAoUGFEs5v7B 183 | # EvAcP2FhCoyi3PbDMKrNKBh1SMF5WgjNu4xVjPfUdpA6M0ZQc5hc9IVKaw+A3V7W 184 | # vf2pL8Al9fl4141fEMJEVTyQPDFGy3CuB6kK46/BAW+QGiPiXzjbxghdR7ODQfAu 185 | # ADcUuRKqeZJSzYcPe9hiKaR+ML0btYxytEjy4+gh+V5MYnmLAgaff9ULAgMBAAGj 186 | # ggFRMIIBTTAfBgNVHSMEGDAWgBS7r34CPfqm8TyEjq3uOJjs2TIy1DAdBgNVHQ4E 187 | # FgQUKZFg/4pN+uv5pmq4z/nmS71JzhIwDgYDVR0PAQH/BAQDAgGGMBIGA1UdEwEB 188 | # /wQIMAYBAf8CAQAwEwYDVR0lBAwwCgYIKwYBBQUHAwMwEQYDVR0gBAowCDAGBgRV 189 | # HSAAMEwGA1UdHwRFMEMwQaA/oD2GO2h0dHA6Ly9jcmwuY29tb2RvY2EuY29tL0NP 190 | # TU9ET1JTQUNlcnRpZmljYXRpb25BdXRob3JpdHkuY3JsMHEGCCsGAQUFBwEBBGUw 191 | # YzA7BggrBgEFBQcwAoYvaHR0cDovL2NydC5jb21vZG9jYS5jb20vQ09NT0RPUlNB 192 | # QWRkVHJ1c3RDQS5jcnQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9kb2Nh 193 | # LmNvbTANBgkqhkiG9w0BAQwFAAOCAgEAAj8COcPu+Mo7id4MbU2x8U6ST6/COCwE 194 | # zMVjEasJY6+rotcCP8xvGcM91hoIlP8l2KmIpysQGuCbsQciGlEcOtTh6Qm/5iR0 195 | # rx57FjFuI+9UUS1SAuJ1CAVM8bdR4VEAxof2bO4QRHZXavHfWGshqknUfDdOvf+2 196 | # dVRAGDZXZxHNTwLk/vPa/HUX2+y392UJI0kfQ1eD6n4gd2HITfK7ZU2o94VFB696 197 | # aSdlkClAi997OlE5jKgfcHmtbUIgos8MbAOMTM1zB5TnWo46BLqioXwfy2M6FafU 198 | # FRunUkcyqfS/ZEfRqh9TTjIwc8Jvt3iCnVz/RrtrIh2IC/gbqjSm/Iz13X9ljIwx 199 | # VzHQNuxHoc/Li6jvHBhYxQZ3ykubUa9MCEp6j+KjUuKOjswm5LLY5TjCqO3GgZw1 200 | # a6lYYUoKl7RLQrZVnb6Z53BtWfhtKgx/GWBfDJqIbDCsUgmQFhv/K53b0CDKieoo 201 | # fjKOGd97SDMe12X4rsn4gxSTdn1k0I7OvjV9/3IxTZ+evR5sL6iPDAZQ+4wns3bJ 202 | # 9ObXwzTijIchhmH+v1V04SF3AwpobLvkyanmz1kl63zsRQ55ZmjoIs2475iFTZYR 203 | # PAmK0H+8KCgT+2rKVI2SXM3CZZgGns5IW9S1N5NGQXwH3c/6Q++6Z2H/fUnguzB9 204 | # XIDj5hY5S6cxggR7MIIEdwIBATCBkjB9MQswCQYDVQQGEwJHQjEbMBkGA1UECBMS 205 | # R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD 206 | # T01PRE8gQ0EgTGltaXRlZDEjMCEGA1UEAxMaQ09NT0RPIFJTQSBDb2RlIFNpZ25p 207 | # bmcgQ0ECEQD4IZPzL64teYDZQE4V7lUbMAkGBSsOAwIaBQCgeDAYBgorBgEEAYI3 208 | # AgEMMQowCKACgAChAoAAMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisG 209 | # AQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMCMGCSqGSIb3DQEJBDEWBBSeb1LIelak 210 | # +uGdYPoDeprJUxdZdDANBgkqhkiG9w0BAQEFAASCAQChsl4F7nsVd6muVDx2QQmY 211 | # kE2vJhyAV5s2xyQNFqG0wstAd9/1jx70QWc1ISlcvdlonv4o90x0okYmcxB0KMjE 212 | # Tl39TAMbW1k/2l/z5aLq3xK0Q1RyoT0igwXeweo0sjD+NWyIqugzHcrFnKyNFiw3 213 | # qKc7GwsWV7m74W+CDt0EyRrVlaSuJ403DBBqPwSkK04wwC5s/zGkw44iKl3PNEAC 214 | # NUekh/6Jo5Al/Ms0lUnmw24U3F9RsRD8yLlusdUyKMJ89TuggMFtVnH7QUn+sKP5 215 | # WLqfRK99r5mZbfon8IEq7JzvhNzo0nnuv+ciLTuq1QzfTEVuZkvdkhUzoqz8rWJS 216 | # oYICQzCCAj8GCSqGSIb3DQEJBjGCAjAwggIsAgEBMIGpMIGVMQswCQYDVQQGEwJV 217 | # UzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQK 218 | # ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNl 219 | # cnRydXN0LmNvbTEdMBsGA1UEAxMUVVROLVVTRVJGaXJzdC1PYmplY3QCDxaI8Dkl 220 | # XmOOaRQ5B+YzCzAJBgUrDgMCGgUAoF0wGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEH 221 | # ATAcBgkqhkiG9w0BCQUxDxcNMTcwMjE4MTk0OTA5WjAjBgkqhkiG9w0BCQQxFgQU 222 | # t/dGbB6+WmH7BUrAFONxTU9T1bwwDQYJKoZIhvcNAQEBBQAEggEAOaS11g8iCzQ4 223 | # ltToC/8GxglFsXY3LqZ++4Fhq+bfQE5vQc9LzWpduALq8JKh82NnT3Nd3zdrrRA6 224 | # P/YHxD20SHoa8rTwymcSNNOEsg0LIt7ye+uaNQMc7QTjSgElvxSrrs0nxniIGpN9 225 | # 7YpAtZ8IJEnKkdcwqiWT3YVSSAeu2KMS56CujvLQ4ibMuPvQnRi1hvOxy3aTq8zj 226 | # bHGU5eUw3UJhRvpiKU1viDveqdEdVJuEAHaAIE/5MJZuqGM+m9tqOQER2tDdHiJu 227 | # +Mqy7oBOu99CidVnaZLLvBsPT9qLNv3wuSR6qCSjNgeUZkDLPGBOYQV3jFZae3Ej 228 | # UgwHNoCQdw== 229 | # SIG # End signature block 230 | -------------------------------------------------------------------------------- /Code/Get-Uptime.ps1: -------------------------------------------------------------------------------- 1 | #requires -version 5.0 2 | ############################################################################### 3 | # WintellectPowerShell Module 4 | # Copyright (c) 2010-2017 - John Robbins/Wintellect 5 | # 6 | # Do whatever you want with this module, but please do give credit. 7 | ############################################################################### 8 | 9 | # Always make sure all variables are defined and all best practices are 10 | # followed. 11 | Set-StrictMode -version Latest 12 | 13 | ############################################################################### 14 | # Public Cmdlets 15 | ############################################################################### 16 | function Get-Uptime 17 | { 18 | <# 19 | .SYNOPSIS 20 | Returns how long a computer has been running. 21 | 22 | .DESCRIPTION 23 | Returns the TimeSpan for how long a computer is running. If you'd like it 24 | formatted you can use: (Get-Uptime) -f {0} 25 | 26 | .OUTPUTS 27 | A TimeSpan type. 28 | 29 | .LINK 30 | http://www.wintellect.com/devcenter/author/jrobbins 31 | https://github.com/Wintellect/WintellectPowerShell 32 | 33 | #> 34 | $cmi = Get-CimInstance -ClassName Win32_OperatingSystem 35 | New-TimeSpan -Start $cmi.LastBootUpTime -End $(get-date) 36 | } 37 | 38 | # SIG # Begin signature block 39 | # MIIUywYJKoZIhvcNAQcCoIIUvDCCFLgCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB 40 | # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR 41 | # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUh4ZW4rtlwxT6i5u381y3WqHD 42 | # mU6ggg+6MIIEmTCCA4GgAwIBAgIPFojwOSVeY45pFDkH5jMLMA0GCSqGSIb3DQEB 43 | # BQUAMIGVMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQg 44 | # TGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNV 45 | # BAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTEdMBsGA1UEAxMUVVROLVVTRVJG 46 | # aXJzdC1PYmplY3QwHhcNMTUxMjMxMDAwMDAwWhcNMTkwNzA5MTg0MDM2WjCBhDEL 47 | # MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE 48 | # BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKjAoBgNVBAMT 49 | # IUNPTU9ETyBTSEEtMSBUaW1lIFN0YW1waW5nIFNpZ25lcjCCASIwDQYJKoZIhvcN 50 | # AQEBBQADggEPADCCAQoCggEBAOnpPd/XNwjJHjiyUlNCbSLxscQGBGue/YJ0UEN9 51 | # xqC7H075AnEmse9D2IOMSPznD5d6muuc3qajDjscRBh1jnilF2n+SRik4rtcTv6O 52 | # KlR6UPDV9syR55l51955lNeWM/4Og74iv2MWLKPdKBuvPavql9LxvwQQ5z1IRf0f 53 | # aGXBf1mZacAiMQxibqdcZQEhsGPEIhgn7ub80gA9Ry6ouIZWXQTcExclbhzfRA8V 54 | # zbfbpVd2Qm8AaIKZ0uPB3vCLlFdM7AiQIiHOIiuYDELmQpOUmJPv/QbZP7xbm1Q8 55 | # ILHuatZHesWrgOkwmt7xpD9VTQoJNIp1KdJprZcPUL/4ygkCAwEAAaOB9DCB8TAf 56 | # BgNVHSMEGDAWgBTa7WR0FJwUPKvdmam9WyhNizzJ2DAdBgNVHQ4EFgQUjmstM2v0 57 | # M6eTsxOapeAK9xI1aogwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwFgYD 58 | # VR0lAQH/BAwwCgYIKwYBBQUHAwgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2Ny 59 | # bC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmlyc3QtT2JqZWN0LmNybDA1BggrBgEF 60 | # BQcBAQQpMCcwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnVzZXJ0cnVzdC5jb20w 61 | # DQYJKoZIhvcNAQEFBQADggEBALozJEBAjHzbWJ+zYJiy9cAx/usfblD2CuDk5oGt 62 | # Joei3/2z2vRz8wD7KRuJGxU+22tSkyvErDmB1zxnV5o5NuAoCJrjOU+biQl/e8Vh 63 | # f1mJMiUKaq4aPvCiJ6i2w7iH9xYESEE9XNjsn00gMQTZZaHtzWkHUxY93TYCCojr 64 | # QOUGMAu4Fkvc77xVCf/GPhIudrPczkLv+XZX4bcKBUCYWJpdcRaTcYxlgepv84n3 65 | # +3OttOe/2Y5vqgtPJfO44dXddZhogfiqwNGAwsTEOYnB9smebNd0+dmX+E/CmgrN 66 | # Xo/4GengpZ/E8JIh5i15Jcki+cPwOoRXrToW9GOUEB1d0MYwggU1MIIEHaADAgEC 67 | # AhEA+CGT8y+uLXmA2UBOFe5VGzANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJH 68 | # QjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3Jk 69 | # MRowGAYDVQQKExFDT01PRE8gQ0EgTGltaXRlZDEjMCEGA1UEAxMaQ09NT0RPIFJT 70 | # QSBDb2RlIFNpZ25pbmcgQ0EwHhcNMTYwMjE4MDAwMDAwWhcNMTgxMDI4MjM1OTU5 71 | # WjCBnTELMAkGA1UEBhMCVVMxDjAMBgNVBBEMBTM3OTMyMQswCQYDVQQIDAJUTjES 72 | # MBAGA1UEBwwJS25veHZpbGxlMRIwEAYDVQQJDAlTdWl0ZSAzMDIxHzAdBgNVBAkM 73 | # FjEwMjA3IFRlY2hub2xvZ3kgRHJpdmUxEzARBgNVBAoMCldpbnRlbGxlY3QxEzAR 74 | # BgNVBAMMCldpbnRlbGxlY3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB 75 | # AQDfLujuIe3yrrTfTOdYfstwFDZrI7XezoeFPA33GRxY/MSbKuUvPcN8XqU8Jpg4 76 | # NUkByzoSjPsq9Yjx3anHflcNendqa/8gbkPdiEMg+6kRVmtv1QHfGt+UbEMfrUk0 77 | # Ltm0DE+6OIZFx8hjsxifJvWrQ/jG9lat6e2YwIdNAqyG2htqCrmBN90lW+0+zU9s 78 | # YJIVD0ZfyZJVkvbeay+HwlbojW7JQyyhdGOSa61zUqlD85RX6HzcCbb1WHf5bZRO 79 | # 2idaVNAOw1YHqJAUjY4oJY4lqWwg5Inza4f33Wt82zJAgKY4S01bddkvjPi6iMnG 80 | # y8bI1EfWAdFFC+UM2qKsNc2/AgMBAAGjggGNMIIBiTAfBgNVHSMEGDAWgBQpkWD/ 81 | # ik366/mmarjP+eZLvUnOEjAdBgNVHQ4EFgQUZdNFdxzRtMVCZCvcFV4g7vsL8vgw 82 | # DgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwEwYDVR0lBAwwCgYIKwYBBQUH 83 | # AwMwEQYJYIZIAYb4QgEBBAQDAgQQMEYGA1UdIAQ/MD0wOwYMKwYBBAGyMQECAQMC 84 | # MCswKQYIKwYBBQUHAgEWHWh0dHBzOi8vc2VjdXJlLmNvbW9kby5uZXQvQ1BTMEMG 85 | # A1UdHwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL0NPTU9ET1JT 86 | # QUNvZGVTaWduaW5nQ0EuY3JsMHQGCCsGAQUFBwEBBGgwZjA+BggrBgEFBQcwAoYy 87 | # aHR0cDovL2NydC5jb21vZG9jYS5jb20vQ09NT0RPUlNBQ29kZVNpZ25pbmdDQS5j 88 | # cnQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9kb2NhLmNvbTANBgkqhkiG 89 | # 9w0BAQsFAAOCAQEAnSVG6TXbazSxczonyo/Q+pjX+6JERtMZ0sz3Fc3PTMDcb9DS 90 | # tALjZiZhOgOoRNC+5OHgE3tTPLCT6ZGktfedzp6J9mICzoJIIBelfdiIwJNkPTzR 91 | # I2krUn/6ld5coh0zyM85lCjXkqzZmyQmRRNQoycWtxUwxsNlkiGlRIiIJHztbg1I 92 | # lv9C90zCZ1nAhfOpv+maUohLtz22F9wXCJuIUQapOhPG5n/opM/AUQV2WuDa3AZP 93 | # VYleK90zOgHLDgLICxrx57z2JRlXyW2ga2N5J6DXzwGmxpCe0LbzYCj4h42SjUuf 94 | # 9hOQtORlSjYEj8RFpxatyxcmIIpej9/NDNXgIzCCBeAwggPIoAMCAQICEC58h8wO 95 | # k0pS/pT9HLfNNK8wDQYJKoZIhvcNAQEMBQAwgYUxCzAJBgNVBAYTAkdCMRswGQYD 96 | # VQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxGjAYBgNV 97 | # BAoTEUNPTU9ETyBDQSBMaW1pdGVkMSswKQYDVQQDEyJDT01PRE8gUlNBIENlcnRp 98 | # ZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDUwOTAwMDAwMFoXDTI4MDUwODIzNTk1 99 | # OVowfTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQ 100 | # MA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxIzAh 101 | # BgNVBAMTGkNPTU9ETyBSU0EgQ29kZSBTaWduaW5nIENBMIIBIjANBgkqhkiG9w0B 102 | # AQEFAAOCAQ8AMIIBCgKCAQEAppiQY3eRNH+K0d3pZzER68we/TEds7liVz+TvFvj 103 | # nx4kMhEna7xRkafPnp4ls1+BqBgPHR4gMA77YXuGCbPj/aJonRwsnb9y4+R1oOU1 104 | # I47Jiu4aDGTH2EKhe7VSA0s6sI4jS0tj4CKUN3vVeZAKFBhRLOb+wRLwHD9hYQqM 105 | # otz2wzCqzSgYdUjBeVoIzbuMVYz31HaQOjNGUHOYXPSFSmsPgN1e1r39qS/AJfX5 106 | # eNeNXxDCRFU8kDwxRstwrgepCuOvwQFvkBoj4l8428YIXUezg0HwLgA3FLkSqnmS 107 | # Us2HD3vYYimkfjC9G7WMcrRI8uPoIfleTGJ5iwIGn3/VCwIDAQABo4IBUTCCAU0w 108 | # HwYDVR0jBBgwFoAUu69+Aj36pvE8hI6t7jiY7NkyMtQwHQYDVR0OBBYEFCmRYP+K 109 | # Tfrr+aZquM/55ku9Sc4SMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8ECDAGAQH/ 110 | # AgEAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMBEGA1UdIAQKMAgwBgYEVR0gADBMBgNV 111 | # HR8ERTBDMEGgP6A9hjtodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9SU0FD 112 | # ZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDBxBggrBgEFBQcBAQRlMGMwOwYIKwYB 113 | # BQUHMAKGL2h0dHA6Ly9jcnQuY29tb2RvY2EuY29tL0NPTU9ET1JTQUFkZFRydXN0 114 | # Q0EuY3J0MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wDQYJ 115 | # KoZIhvcNAQEMBQADggIBAAI/AjnD7vjKO4neDG1NsfFOkk+vwjgsBMzFYxGrCWOv 116 | # q6LXAj/MbxnDPdYaCJT/JdipiKcrEBrgm7EHIhpRHDrU4ekJv+YkdK8eexYxbiPv 117 | # VFEtUgLidQgFTPG3UeFRAMaH9mzuEER2V2rx31hrIapJ1Hw3Tr3/tnVUQBg2V2cR 118 | # zU8C5P7z2vx1F9vst/dlCSNJH0NXg+p+IHdhyE3yu2VNqPeFRQevemknZZApQIvf 119 | # ezpROYyoH3B5rW1CIKLPDGwDjEzNcweU51qOOgS6oqF8H8tjOhWn1BUbp1JHMqn0 120 | # v2RH0aofU04yMHPCb7d4gp1c/0a7ayIdiAv4G6o0pvyM9d1/ZYyMMVcx0DbsR6HP 121 | # y4uo7xwYWMUGd8pLm1GvTAhKeo/io1Lijo7MJuSy2OU4wqjtxoGcNWupWGFKCpe0 122 | # S0K2VZ2+medwbVn4bSoMfxlgXwyaiGwwrFIJkBYb/yud29AgyonqKH4yjhnfe0gz 123 | # Htdl+K7J+IMUk3Z9ZNCOzr41ff9yMU2fnr0ebC+ojwwGUPuMJ7N2yfTm18M04oyH 124 | # IYZh/r9VdOEhdwMKaGy75Mmp5s9ZJet87EUOeWZo6CLNuO+YhU2WETwJitB/vCgo 125 | # E/tqylSNklzNwmWYBp7OSFvUtTeTRkF8B93P+kPvumdh/31J4LswfVyA4+YWOUun 126 | # MYIEezCCBHcCAQEwgZIwfTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIg 127 | # TWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENB 128 | # IExpbWl0ZWQxIzAhBgNVBAMTGkNPTU9ETyBSU0EgQ29kZSBTaWduaW5nIENBAhEA 129 | # +CGT8y+uLXmA2UBOFe5VGzAJBgUrDgMCGgUAoHgwGAYKKwYBBAGCNwIBDDEKMAig 130 | # AoAAoQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgEL 131 | # MQ4wDAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQUKrtzBKo0j2BoT92bT15z 132 | # k/6MVIIwDQYJKoZIhvcNAQEBBQAEggEAvniQzEWDm7FP78Wwq9RGVFrXYvbg0W8u 133 | # FcH7UPSxK06qNHmffWUuvpxdP2+FBXD8RkqGvY5W2oAmNX85LjX8cR++c/Cv5jUB 134 | # GtYy7rMJmgEJD2I59lQsLptcRpC29wFOKmSIgY9SSRUKO69yWYJ3RDbsFIkUiA+b 135 | # U6LKnXH9M3OtY8mO21NpqwslLI9WiYKPJf79OG++6UxECfgP/VkdwMAyTh24AkDF 136 | # qEYqVEiJ3eT5kgvPQZrh9ywDUJtykcECjP8tr0oWiYXJ/+om0ehxAIQyByvCK7mJ 137 | # dVE/w9V6+5J4eCNUmtMiDSMd+e+0n2SMTGRQ2WfWTtkY6tioKhd4U6GCAkMwggI/ 138 | # BgkqhkiG9w0BCQYxggIwMIICLAIBADCBqTCBlTELMAkGA1UEBhMCVVMxCzAJBgNV 139 | # BAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVT 140 | # RVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5j 141 | # b20xHTAbBgNVBAMTFFVUTi1VU0VSRmlyc3QtT2JqZWN0Ag8WiPA5JV5jjmkUOQfm 142 | # MwswCQYFKw4DAhoFAKBdMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZI 143 | # hvcNAQkFMQ8XDTE3MDExMjIzMDcwN1owIwYJKoZIhvcNAQkEMRYEFJa1dwy77MQy 144 | # 8O7tvZaVTppwKXSIMA0GCSqGSIb3DQEBAQUABIIBAIL1cHSXiFRHYGWKpcN+0JeR 145 | # A0+5yCMHgfgBEfrcsIx2DAmDi1hGPrBa5ddXSXBoSr0xsC0omOH7QLJfYVbPPvtS 146 | # NEE71uvMtqwDAhG2zkIci1KP96yr+9zVJLLLfCeaVdIUb9Fj3860ghyNI5Q5pM3q 147 | # lD/LrXnxk+gFkGXGjk3zFZDHVKQC8Lnsbtwy+jVBsLMIklw1zs6+3BKfdRcXOQW8 148 | # MlXPup8eSTXzq4qsSCtckoNUEiJlBV1tg/R4Y5WiaSYqeX38b1aDGvfkSHdhSHSu 149 | # rEBEkCZdMS62MdEzBma33+zyiTBkuwlBMw8+kwKAuJhAOwzceNqdRvU2idNimD0= 150 | # SIG # End signature block 151 | -------------------------------------------------------------------------------- /Code/Import-VisualStudioEnvironment.ps1: -------------------------------------------------------------------------------- 1 | #requires -version 5.0 2 | ############################################################################### 3 | # WintellectPowerShell Module 4 | # Copyright (c) 2010-2017 - John Robbins/Wintellect 5 | # 6 | # Do whatever you want with this module, but please do give credit. 7 | ############################################################################### 8 | 9 | # Always make sure all variables are defined and all best practices are 10 | # followed. 11 | Set-StrictMode -version Latest 12 | 13 | ############################################################################### 14 | # Public Cmdlets 15 | ############################################################################### 16 | function Import-VisualStudioEnvironment 17 | { 18 | <# 19 | .SYNOPSIS 20 | Sets up the current PowerShell instance with the Visual Studio environment 21 | variables so you can use those tools at the command line. 22 | 23 | .DESCRIPTION 24 | Command line usage is the way to go, but Visual Studio requires numerous 25 | environment variables set in order to properly work. Since those are controlled 26 | by the vcvarsall.bat or VSDEVCMD.cmd cmd scripts, it's a pain to get working. 27 | This cmdlet does the work of calling the specific vcvarsall.bat/VSDEVCMD.CMD file 28 | for the specific version of Visual Studio you want to use. On VS 2015 and prior 29 | if the vcvarsall.bat file does not exist, which happens if you do not install the 30 | C++ tools, this cmdlet will use vsdevcmd.bat instead. 31 | 32 | This implementation uses the registry to look up the installed Visual Studio 33 | versions and does not rely on any preset environment variables such as 34 | VS110COMNTOOLS. 35 | 36 | .PARAMETER VSVersion 37 | The version of Visual Studio you want to use. If left to the default, Latest, the 38 | script will look for the latest version of Visual Studio installed on the computer 39 | as the tools to use. Specify 2013, 2015, or 2017 for a specific version. 40 | 41 | .PARAMETER Architecture 42 | The tools architecture to use. This defaults to the $env:PROCESSOR_ARCHITECTURE 43 | environment variable so x86 and x64 are automatically handled. The valid architecture 44 | values are x86, amd64, and arm. If the C++ tools were not installed, this parameter 45 | is ignored for VS 2015 and prior because their vsdevcmd.bat only sets the environment 46 | for 32-bit tools. 47 | 48 | .PARAMETER AdditionalOptions 49 | Starting with VS 2017, there are additional options such as -app_platform and -winsdk. 50 | If you want to set those options add them here. The string value is passed directly to 51 | the VS 2017+ VSDEVCMD.CMD with no checking. 52 | 53 | .NOTES 54 | There is a bug in the VS 2017 RC environment batch files. If you used this cmdlet to 55 | import the VS 2015 environment and then attempt to import the VS 2017 environment in 56 | the same shell, the VS 2017 batch files fail because of an improperly formed command. 57 | 58 | .LINK 59 | http://www.wintellect.com/devcenter/author/jrobbins 60 | https://github.com/Wintellect/WintellectPowerShell 61 | 62 | #> 63 | 64 | # This triggers on $vsDirectory even though it is used everywhere. 65 | [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseDeclaredVarsMoreThanAssignments", "", Scope="Function")] 66 | param 67 | ( 68 | [Parameter(Position=0)] 69 | [ValidateSet("Latest", "2013", "2015", "2017")] 70 | [string] $VSVersion = "Latest", 71 | [Parameter(Position=1)] 72 | [ValidateSet("x86", "amd64", "arm")] 73 | [string] $Architecture = ($Env:PROCESSOR_ARCHITECTURE).ToLower(), 74 | [string]$AdditionalOptions = "" 75 | ) 76 | 77 | $versionSearchKey = "HKLM:\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\SxS\VS7" 78 | if ([IntPtr]::size -ne 8) 79 | { 80 | $versionSearchKey = "HKLM:\SOFTWARE\Microsoft\VisualStudio\SxS\VS7" 81 | } 82 | 83 | $vsDirectory = "" 84 | 85 | # The saved off version number as I'll need it later to determine if this is VS 2017 or higher. 86 | $usingVersion = 0.0 87 | 88 | if ($VSVersion -eq 'Latest') 89 | { 90 | # Find the largest number in the install lookup directory and that will 91 | # be the latest version. 92 | $biggest = 0.0 93 | Get-RegistryKeyPropertiesAndValues $versionSearchKey | 94 | ForEach-Object { 95 | if ([System.Convert]::ToDecimal($_.Property, [CultureInfo]::InvariantCulture) -gt ` 96 | [System.Convert]::ToDecimal($biggest, [CultureInfo]::InvariantCulture)) 97 | { 98 | $biggest = $_.Property 99 | $vsDirectory = $_.Value 100 | } 101 | } 102 | 103 | $usingVersion = $biggest 104 | } 105 | else 106 | { 107 | $propVal = switch($VSVersion) 108 | { 109 | "2013" { "12.0" } 110 | "2015" { "14.0" } 111 | "2017" { "15.0" } 112 | default { throw "Unknown version of Visual Studio!" } 113 | } 114 | 115 | $usingVersion = [System.Convert]::ToDecimal($propVal, [CultureInfo]::InvariantCulture) 116 | 117 | if (Test-PathReg -Path $versionSearchKey -Property $propVal) 118 | { 119 | $vsDirectory = (Get-ItemProperty -Path $versionSearchKey -WarningAction SilentlyContinue).$propVal 120 | } 121 | else 122 | { 123 | $vsDirectory = $null 124 | } 125 | } 126 | 127 | if ([String]::IsNullOrEmpty($vsDirectory)) 128 | { 129 | throw "The requested Visual Studio version is not installed" 130 | } 131 | 132 | # Turns out some people install VS without the C++ tools. Crazy, I know! 133 | # This check works for VS 2105 and prior. 134 | if (Test-Path -Path "$vsDirectory\vc\vcvarsall.bat") 135 | { 136 | # Got the VS directory, now setup to make the call. 137 | Invoke-CmdScript -script "$vsDirectory\vc\vcvarsall.bat" -parameters "$Architecture" 138 | } 139 | else 140 | { 141 | # Have to do another check here. VSDEVCMD.BAT has changed with VS 2017+ It 142 | # supports parameters and is the main file. 143 | if ($usingVersion -lt 15.0) 144 | { 145 | Write-Verbose -Message "Falling back to VSDEVCMD.BAT for VS 2015 and prior, which only supports the 32-bit tools." 146 | 147 | # Use VsDevCmd.bat instead. 148 | Invoke-CmdScript -script "$vsDirectory\Common7\Tools\VsDevCmd.bat" 149 | } 150 | else 151 | { 152 | # This is VS 2017+ so poke on the architecture value. 153 | $parameters = "-no_logo -arch=$Architecture -host_arch=$Architecture" 154 | if ($AdditionalOptions -ne "") 155 | { 156 | $parameters += " $AdditionalOptions" 157 | } 158 | 159 | Invoke-CmdScript -script "$vsDirectory\Common7\Tools\VsDevCmd.bat" -parameters $parameters 160 | } 161 | } 162 | } 163 | 164 | # SIG # Begin signature block 165 | # MIIUywYJKoZIhvcNAQcCoIIUvDCCFLgCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB 166 | # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR 167 | # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQU3a25s3h95HBDVr0Y7WPwxyF6 168 | # Kq2ggg+6MIIEmTCCA4GgAwIBAgIPFojwOSVeY45pFDkH5jMLMA0GCSqGSIb3DQEB 169 | # BQUAMIGVMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQg 170 | # TGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNV 171 | # BAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTEdMBsGA1UEAxMUVVROLVVTRVJG 172 | # aXJzdC1PYmplY3QwHhcNMTUxMjMxMDAwMDAwWhcNMTkwNzA5MTg0MDM2WjCBhDEL 173 | # MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE 174 | # BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKjAoBgNVBAMT 175 | # IUNPTU9ETyBTSEEtMSBUaW1lIFN0YW1waW5nIFNpZ25lcjCCASIwDQYJKoZIhvcN 176 | # AQEBBQADggEPADCCAQoCggEBAOnpPd/XNwjJHjiyUlNCbSLxscQGBGue/YJ0UEN9 177 | # xqC7H075AnEmse9D2IOMSPznD5d6muuc3qajDjscRBh1jnilF2n+SRik4rtcTv6O 178 | # KlR6UPDV9syR55l51955lNeWM/4Og74iv2MWLKPdKBuvPavql9LxvwQQ5z1IRf0f 179 | # aGXBf1mZacAiMQxibqdcZQEhsGPEIhgn7ub80gA9Ry6ouIZWXQTcExclbhzfRA8V 180 | # zbfbpVd2Qm8AaIKZ0uPB3vCLlFdM7AiQIiHOIiuYDELmQpOUmJPv/QbZP7xbm1Q8 181 | # ILHuatZHesWrgOkwmt7xpD9VTQoJNIp1KdJprZcPUL/4ygkCAwEAAaOB9DCB8TAf 182 | # BgNVHSMEGDAWgBTa7WR0FJwUPKvdmam9WyhNizzJ2DAdBgNVHQ4EFgQUjmstM2v0 183 | # M6eTsxOapeAK9xI1aogwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwFgYD 184 | # VR0lAQH/BAwwCgYIKwYBBQUHAwgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2Ny 185 | # bC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmlyc3QtT2JqZWN0LmNybDA1BggrBgEF 186 | # BQcBAQQpMCcwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnVzZXJ0cnVzdC5jb20w 187 | # DQYJKoZIhvcNAQEFBQADggEBALozJEBAjHzbWJ+zYJiy9cAx/usfblD2CuDk5oGt 188 | # Joei3/2z2vRz8wD7KRuJGxU+22tSkyvErDmB1zxnV5o5NuAoCJrjOU+biQl/e8Vh 189 | # f1mJMiUKaq4aPvCiJ6i2w7iH9xYESEE9XNjsn00gMQTZZaHtzWkHUxY93TYCCojr 190 | # QOUGMAu4Fkvc77xVCf/GPhIudrPczkLv+XZX4bcKBUCYWJpdcRaTcYxlgepv84n3 191 | # +3OttOe/2Y5vqgtPJfO44dXddZhogfiqwNGAwsTEOYnB9smebNd0+dmX+E/CmgrN 192 | # Xo/4GengpZ/E8JIh5i15Jcki+cPwOoRXrToW9GOUEB1d0MYwggU1MIIEHaADAgEC 193 | # AhEA+CGT8y+uLXmA2UBOFe5VGzANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJH 194 | # QjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3Jk 195 | # MRowGAYDVQQKExFDT01PRE8gQ0EgTGltaXRlZDEjMCEGA1UEAxMaQ09NT0RPIFJT 196 | # QSBDb2RlIFNpZ25pbmcgQ0EwHhcNMTYwMjE4MDAwMDAwWhcNMTgxMDI4MjM1OTU5 197 | # WjCBnTELMAkGA1UEBhMCVVMxDjAMBgNVBBEMBTM3OTMyMQswCQYDVQQIDAJUTjES 198 | # MBAGA1UEBwwJS25veHZpbGxlMRIwEAYDVQQJDAlTdWl0ZSAzMDIxHzAdBgNVBAkM 199 | # FjEwMjA3IFRlY2hub2xvZ3kgRHJpdmUxEzARBgNVBAoMCldpbnRlbGxlY3QxEzAR 200 | # BgNVBAMMCldpbnRlbGxlY3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB 201 | # AQDfLujuIe3yrrTfTOdYfstwFDZrI7XezoeFPA33GRxY/MSbKuUvPcN8XqU8Jpg4 202 | # NUkByzoSjPsq9Yjx3anHflcNendqa/8gbkPdiEMg+6kRVmtv1QHfGt+UbEMfrUk0 203 | # Ltm0DE+6OIZFx8hjsxifJvWrQ/jG9lat6e2YwIdNAqyG2htqCrmBN90lW+0+zU9s 204 | # YJIVD0ZfyZJVkvbeay+HwlbojW7JQyyhdGOSa61zUqlD85RX6HzcCbb1WHf5bZRO 205 | # 2idaVNAOw1YHqJAUjY4oJY4lqWwg5Inza4f33Wt82zJAgKY4S01bddkvjPi6iMnG 206 | # y8bI1EfWAdFFC+UM2qKsNc2/AgMBAAGjggGNMIIBiTAfBgNVHSMEGDAWgBQpkWD/ 207 | # ik366/mmarjP+eZLvUnOEjAdBgNVHQ4EFgQUZdNFdxzRtMVCZCvcFV4g7vsL8vgw 208 | # DgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwEwYDVR0lBAwwCgYIKwYBBQUH 209 | # AwMwEQYJYIZIAYb4QgEBBAQDAgQQMEYGA1UdIAQ/MD0wOwYMKwYBBAGyMQECAQMC 210 | # MCswKQYIKwYBBQUHAgEWHWh0dHBzOi8vc2VjdXJlLmNvbW9kby5uZXQvQ1BTMEMG 211 | # A1UdHwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL0NPTU9ET1JT 212 | # QUNvZGVTaWduaW5nQ0EuY3JsMHQGCCsGAQUFBwEBBGgwZjA+BggrBgEFBQcwAoYy 213 | # aHR0cDovL2NydC5jb21vZG9jYS5jb20vQ09NT0RPUlNBQ29kZVNpZ25pbmdDQS5j 214 | # cnQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9kb2NhLmNvbTANBgkqhkiG 215 | # 9w0BAQsFAAOCAQEAnSVG6TXbazSxczonyo/Q+pjX+6JERtMZ0sz3Fc3PTMDcb9DS 216 | # tALjZiZhOgOoRNC+5OHgE3tTPLCT6ZGktfedzp6J9mICzoJIIBelfdiIwJNkPTzR 217 | # I2krUn/6ld5coh0zyM85lCjXkqzZmyQmRRNQoycWtxUwxsNlkiGlRIiIJHztbg1I 218 | # lv9C90zCZ1nAhfOpv+maUohLtz22F9wXCJuIUQapOhPG5n/opM/AUQV2WuDa3AZP 219 | # VYleK90zOgHLDgLICxrx57z2JRlXyW2ga2N5J6DXzwGmxpCe0LbzYCj4h42SjUuf 220 | # 9hOQtORlSjYEj8RFpxatyxcmIIpej9/NDNXgIzCCBeAwggPIoAMCAQICEC58h8wO 221 | # k0pS/pT9HLfNNK8wDQYJKoZIhvcNAQEMBQAwgYUxCzAJBgNVBAYTAkdCMRswGQYD 222 | # VQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxGjAYBgNV 223 | # BAoTEUNPTU9ETyBDQSBMaW1pdGVkMSswKQYDVQQDEyJDT01PRE8gUlNBIENlcnRp 224 | # ZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDUwOTAwMDAwMFoXDTI4MDUwODIzNTk1 225 | # OVowfTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQ 226 | # MA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxIzAh 227 | # BgNVBAMTGkNPTU9ETyBSU0EgQ29kZSBTaWduaW5nIENBMIIBIjANBgkqhkiG9w0B 228 | # AQEFAAOCAQ8AMIIBCgKCAQEAppiQY3eRNH+K0d3pZzER68we/TEds7liVz+TvFvj 229 | # nx4kMhEna7xRkafPnp4ls1+BqBgPHR4gMA77YXuGCbPj/aJonRwsnb9y4+R1oOU1 230 | # I47Jiu4aDGTH2EKhe7VSA0s6sI4jS0tj4CKUN3vVeZAKFBhRLOb+wRLwHD9hYQqM 231 | # otz2wzCqzSgYdUjBeVoIzbuMVYz31HaQOjNGUHOYXPSFSmsPgN1e1r39qS/AJfX5 232 | # eNeNXxDCRFU8kDwxRstwrgepCuOvwQFvkBoj4l8428YIXUezg0HwLgA3FLkSqnmS 233 | # Us2HD3vYYimkfjC9G7WMcrRI8uPoIfleTGJ5iwIGn3/VCwIDAQABo4IBUTCCAU0w 234 | # HwYDVR0jBBgwFoAUu69+Aj36pvE8hI6t7jiY7NkyMtQwHQYDVR0OBBYEFCmRYP+K 235 | # Tfrr+aZquM/55ku9Sc4SMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8ECDAGAQH/ 236 | # AgEAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMBEGA1UdIAQKMAgwBgYEVR0gADBMBgNV 237 | # HR8ERTBDMEGgP6A9hjtodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9SU0FD 238 | # ZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDBxBggrBgEFBQcBAQRlMGMwOwYIKwYB 239 | # BQUHMAKGL2h0dHA6Ly9jcnQuY29tb2RvY2EuY29tL0NPTU9ET1JTQUFkZFRydXN0 240 | # Q0EuY3J0MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wDQYJ 241 | # KoZIhvcNAQEMBQADggIBAAI/AjnD7vjKO4neDG1NsfFOkk+vwjgsBMzFYxGrCWOv 242 | # q6LXAj/MbxnDPdYaCJT/JdipiKcrEBrgm7EHIhpRHDrU4ekJv+YkdK8eexYxbiPv 243 | # VFEtUgLidQgFTPG3UeFRAMaH9mzuEER2V2rx31hrIapJ1Hw3Tr3/tnVUQBg2V2cR 244 | # zU8C5P7z2vx1F9vst/dlCSNJH0NXg+p+IHdhyE3yu2VNqPeFRQevemknZZApQIvf 245 | # ezpROYyoH3B5rW1CIKLPDGwDjEzNcweU51qOOgS6oqF8H8tjOhWn1BUbp1JHMqn0 246 | # v2RH0aofU04yMHPCb7d4gp1c/0a7ayIdiAv4G6o0pvyM9d1/ZYyMMVcx0DbsR6HP 247 | # y4uo7xwYWMUGd8pLm1GvTAhKeo/io1Lijo7MJuSy2OU4wqjtxoGcNWupWGFKCpe0 248 | # S0K2VZ2+medwbVn4bSoMfxlgXwyaiGwwrFIJkBYb/yud29AgyonqKH4yjhnfe0gz 249 | # Htdl+K7J+IMUk3Z9ZNCOzr41ff9yMU2fnr0ebC+ojwwGUPuMJ7N2yfTm18M04oyH 250 | # IYZh/r9VdOEhdwMKaGy75Mmp5s9ZJet87EUOeWZo6CLNuO+YhU2WETwJitB/vCgo 251 | # E/tqylSNklzNwmWYBp7OSFvUtTeTRkF8B93P+kPvumdh/31J4LswfVyA4+YWOUun 252 | # MYIEezCCBHcCAQEwgZIwfTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIg 253 | # TWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENB 254 | # IExpbWl0ZWQxIzAhBgNVBAMTGkNPTU9ETyBSU0EgQ29kZSBTaWduaW5nIENBAhEA 255 | # +CGT8y+uLXmA2UBOFe5VGzAJBgUrDgMCGgUAoHgwGAYKKwYBBAGCNwIBDDEKMAig 256 | # AoAAoQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgEL 257 | # MQ4wDAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQUP+cLk2aWPBAFJNszJFAZ 258 | # 1Olm6yQwDQYJKoZIhvcNAQEBBQAEggEANDijJ6ayvy52VZAbQBbsaIgVohnaQl9E 259 | # CnmvC5QaeqfpsKGIoeka2okmBeY5FLIqQHjSBmwwOt6CEMOoGQ/DkZ+bdn9hAjew 260 | # 5hfj7s0XzueY9uNod3uIwW1o4pcFtnRVB+w8C0n8bRnLqidY9jTYVb5wtN4devt7 261 | # n/d3Z0FXAtxandXyJ/+8vi0v6o+/60DroOfvV/JOE0ASojC0uYochtdUwedqeOiG 262 | # W8G+dpatwVbLZTIbtSiq/dDbmOg9bY0NlYKwm7UTJyWoBOHzt+2Mms45EpXacqZv 263 | # QZt8TnEcjAKDaxM1/fiRv2sC96wDMnf+8NY2AtqBU/sS1RedKliHtqGCAkMwggI/ 264 | # BgkqhkiG9w0BCQYxggIwMIICLAIBATCBqTCBlTELMAkGA1UEBhMCVVMxCzAJBgNV 265 | # BAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVT 266 | # RVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5j 267 | # b20xHTAbBgNVBAMTFFVUTi1VU0VSRmlyc3QtT2JqZWN0Ag8WiPA5JV5jjmkUOQfm 268 | # MwswCQYFKw4DAhoFAKBdMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZI 269 | # hvcNAQkFMQ8XDTE3MDIyNTE1Mjc1OVowIwYJKoZIhvcNAQkEMRYEFFajADKLSS8I 270 | # BEB3waHjp4aMLCcwMA0GCSqGSIb3DQEBAQUABIIBAN9wHC6U6G01RjwlRrr0XP3o 271 | # xJVkFvi/x+sL8XsmV3ckoZ5hriUL3wuCLB+LeyuQWhqKtwB03pLbR4KrR8X2PaOh 272 | # 0kCE0rPgOJ21yOD/b6MK21ivU2V/9iKjsLXisWmrW+9natXwXw+6WJbtgUZiH4XI 273 | # 7bV3JXHycWomu/YUFjYSWRbugmavqFRIOTQuKP1NvbVf9dB9sxdYPA7WnhoJ5Ekc 274 | # paddIGgYjuFebh+S/W8L2KIH90KxGXS1PikQpttcnvwukQoNNO0L4AmxPrpf3KA8 275 | # CzOSG3W8lB1Hd3OQ9OxqZ9SrwjBsi6Yw6LApe+S3AoxTDhVyWy0D/2W45xqpwdM= 276 | # SIG # End signature block 277 | -------------------------------------------------------------------------------- /Code/Internal.ps1: -------------------------------------------------------------------------------- 1 |  2 | #requires -version 5.0 3 | ############################################################################### 4 | # WintellectPowerShell Module 5 | # Copyright (c) 2010-2017 - John Robbins/Wintellect 6 | # 7 | # Do whatever you want with this module, but please do give credit. 8 | ############################################################################### 9 | 10 | # Always make sure all variables are defined and all best practices are 11 | # followed. 12 | Set-StrictMode -version Latest 13 | 14 | # The location format for the CurrentSettings.vssettings files. 15 | $script:settingsFileFormat = "{0}\Visual Studio {1}\Settings\CurrentSettings.vssettings" 16 | 17 | # The XPath format for getting at individual Debugger properties. 18 | $script:dbgPropertyXPath = "//UserSettings/Category[@name='Debugger']/PropertyValue[@name='{0}']" 19 | 20 | 21 | # Takes care of opening the settings file for a specific VS version. 22 | # Returns $null if the file does not exist. 23 | function OpenSettingsFile($vsVersion) 24 | { 25 | [xml]$result = $null 26 | 27 | # Get the documents directory for the user. 28 | $documentDir = [System.Environment]::GetFolderPath("MyDocuments") 29 | 30 | # Build up the filename to open. 31 | $currFilename = $script:settingsFileFormat -f $documentDir, $vsVersion 32 | 33 | # Does the file exist? 34 | if (Test-Path -Path $currFilename) 35 | { 36 | $result = Get-Content -Path $currFilename 37 | } 38 | 39 | return $result 40 | } 41 | 42 | # Writes out the settings file for the VS version. 43 | function WriteSettingsFile($vsVersion,[xml]$xmlData) 44 | { 45 | $documentDir = [System.Environment]::GetFolderPath("MyDocuments") 46 | 47 | $filename = $script:settingsFileFormat -f $documentDir, $vsVersion 48 | 49 | $xmlData.Save($filename) 50 | } 51 | 52 | function Get-RegistryKeyPropertiesAndValues 53 | { 54 | <# 55 | .Synopsis 56 | This function accepts a registry path and returns all reg key properties and values 57 | 58 | .Description 59 | This function returns registry key properies and values. 60 | 61 | .Example 62 | Get-RegistryKeyPropertiesAndValues -path 'HKCU:\Volatile Environment' 63 | 64 | Returns all of the registry property values under the \volatile environment key 65 | 66 | .Parameter path 67 | The path to the registry key 68 | 69 | .Notes 70 | NAME: Get-RegistryKeyPropertiesAndValues 71 | AUTHOR: ed wilson, msft 72 | LASTEDIT: 05/09/2012 15:18:41 73 | KEYWORDS: Operating System, Registry, Scripting Techniques, Getting Started 74 | HSG: 5-11-12 75 | .Link 76 | Http://www.ScriptingGuys.com/blog 77 | #> 78 | 79 | [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Scope="Function")] 80 | Param( [Parameter(Mandatory=$true)] 81 | [string]$path) 82 | 83 | Push-Location 84 | Set-Location -Path $path 85 | Get-Item -Path . | 86 | Select-Object -ExpandProperty property | 87 | ForEach-Object { 88 | New-Object -TypeName psobject -Property @{"property"=$_; 89 | "Value" = (Get-ItemProperty -Path . -Name $_).$_}} 90 | Pop-Location 91 | 92 | } 93 | 94 | function LatestVSRegistryKeyVersion 95 | { 96 | $versionSearchKey = "HKLM:\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\SxS\VS7" 97 | if ([IntPtr]::size -ne 8) 98 | { 99 | $versionSearchKey = "HKLM:\SOFTWARE\Microsoft\VisualStudio\SxS\VS7" 100 | } 101 | $biggest = 0.0 102 | Get-RegistryKeyPropertiesAndValues $versionSearchKey | 103 | ForEach-Object { 104 | if ([System.Convert]::ToDecimal($_.Property) -gt [System.Convert]::ToDecimal($biggest)) 105 | { 106 | $biggest = $_.Property 107 | } 108 | } 109 | 110 | $biggest 111 | } 112 | 113 | # SIG # Begin signature block 114 | # MIIUywYJKoZIhvcNAQcCoIIUvDCCFLgCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB 115 | # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR 116 | # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUpGSO1dHpkfSgkYMFMy9e+BUz 117 | # Uzeggg+6MIIEmTCCA4GgAwIBAgIPFojwOSVeY45pFDkH5jMLMA0GCSqGSIb3DQEB 118 | # BQUAMIGVMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQg 119 | # TGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNV 120 | # BAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTEdMBsGA1UEAxMUVVROLVVTRVJG 121 | # aXJzdC1PYmplY3QwHhcNMTUxMjMxMDAwMDAwWhcNMTkwNzA5MTg0MDM2WjCBhDEL 122 | # MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE 123 | # BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKjAoBgNVBAMT 124 | # IUNPTU9ETyBTSEEtMSBUaW1lIFN0YW1waW5nIFNpZ25lcjCCASIwDQYJKoZIhvcN 125 | # AQEBBQADggEPADCCAQoCggEBAOnpPd/XNwjJHjiyUlNCbSLxscQGBGue/YJ0UEN9 126 | # xqC7H075AnEmse9D2IOMSPznD5d6muuc3qajDjscRBh1jnilF2n+SRik4rtcTv6O 127 | # KlR6UPDV9syR55l51955lNeWM/4Og74iv2MWLKPdKBuvPavql9LxvwQQ5z1IRf0f 128 | # aGXBf1mZacAiMQxibqdcZQEhsGPEIhgn7ub80gA9Ry6ouIZWXQTcExclbhzfRA8V 129 | # zbfbpVd2Qm8AaIKZ0uPB3vCLlFdM7AiQIiHOIiuYDELmQpOUmJPv/QbZP7xbm1Q8 130 | # ILHuatZHesWrgOkwmt7xpD9VTQoJNIp1KdJprZcPUL/4ygkCAwEAAaOB9DCB8TAf 131 | # BgNVHSMEGDAWgBTa7WR0FJwUPKvdmam9WyhNizzJ2DAdBgNVHQ4EFgQUjmstM2v0 132 | # M6eTsxOapeAK9xI1aogwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwFgYD 133 | # VR0lAQH/BAwwCgYIKwYBBQUHAwgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2Ny 134 | # bC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmlyc3QtT2JqZWN0LmNybDA1BggrBgEF 135 | # BQcBAQQpMCcwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnVzZXJ0cnVzdC5jb20w 136 | # DQYJKoZIhvcNAQEFBQADggEBALozJEBAjHzbWJ+zYJiy9cAx/usfblD2CuDk5oGt 137 | # Joei3/2z2vRz8wD7KRuJGxU+22tSkyvErDmB1zxnV5o5NuAoCJrjOU+biQl/e8Vh 138 | # f1mJMiUKaq4aPvCiJ6i2w7iH9xYESEE9XNjsn00gMQTZZaHtzWkHUxY93TYCCojr 139 | # QOUGMAu4Fkvc77xVCf/GPhIudrPczkLv+XZX4bcKBUCYWJpdcRaTcYxlgepv84n3 140 | # +3OttOe/2Y5vqgtPJfO44dXddZhogfiqwNGAwsTEOYnB9smebNd0+dmX+E/CmgrN 141 | # Xo/4GengpZ/E8JIh5i15Jcki+cPwOoRXrToW9GOUEB1d0MYwggU1MIIEHaADAgEC 142 | # AhEA+CGT8y+uLXmA2UBOFe5VGzANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJH 143 | # QjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3Jk 144 | # MRowGAYDVQQKExFDT01PRE8gQ0EgTGltaXRlZDEjMCEGA1UEAxMaQ09NT0RPIFJT 145 | # QSBDb2RlIFNpZ25pbmcgQ0EwHhcNMTYwMjE4MDAwMDAwWhcNMTgxMDI4MjM1OTU5 146 | # WjCBnTELMAkGA1UEBhMCVVMxDjAMBgNVBBEMBTM3OTMyMQswCQYDVQQIDAJUTjES 147 | # MBAGA1UEBwwJS25veHZpbGxlMRIwEAYDVQQJDAlTdWl0ZSAzMDIxHzAdBgNVBAkM 148 | # FjEwMjA3IFRlY2hub2xvZ3kgRHJpdmUxEzARBgNVBAoMCldpbnRlbGxlY3QxEzAR 149 | # BgNVBAMMCldpbnRlbGxlY3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB 150 | # AQDfLujuIe3yrrTfTOdYfstwFDZrI7XezoeFPA33GRxY/MSbKuUvPcN8XqU8Jpg4 151 | # NUkByzoSjPsq9Yjx3anHflcNendqa/8gbkPdiEMg+6kRVmtv1QHfGt+UbEMfrUk0 152 | # Ltm0DE+6OIZFx8hjsxifJvWrQ/jG9lat6e2YwIdNAqyG2htqCrmBN90lW+0+zU9s 153 | # YJIVD0ZfyZJVkvbeay+HwlbojW7JQyyhdGOSa61zUqlD85RX6HzcCbb1WHf5bZRO 154 | # 2idaVNAOw1YHqJAUjY4oJY4lqWwg5Inza4f33Wt82zJAgKY4S01bddkvjPi6iMnG 155 | # y8bI1EfWAdFFC+UM2qKsNc2/AgMBAAGjggGNMIIBiTAfBgNVHSMEGDAWgBQpkWD/ 156 | # ik366/mmarjP+eZLvUnOEjAdBgNVHQ4EFgQUZdNFdxzRtMVCZCvcFV4g7vsL8vgw 157 | # DgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwEwYDVR0lBAwwCgYIKwYBBQUH 158 | # AwMwEQYJYIZIAYb4QgEBBAQDAgQQMEYGA1UdIAQ/MD0wOwYMKwYBBAGyMQECAQMC 159 | # MCswKQYIKwYBBQUHAgEWHWh0dHBzOi8vc2VjdXJlLmNvbW9kby5uZXQvQ1BTMEMG 160 | # A1UdHwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL0NPTU9ET1JT 161 | # QUNvZGVTaWduaW5nQ0EuY3JsMHQGCCsGAQUFBwEBBGgwZjA+BggrBgEFBQcwAoYy 162 | # aHR0cDovL2NydC5jb21vZG9jYS5jb20vQ09NT0RPUlNBQ29kZVNpZ25pbmdDQS5j 163 | # cnQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9kb2NhLmNvbTANBgkqhkiG 164 | # 9w0BAQsFAAOCAQEAnSVG6TXbazSxczonyo/Q+pjX+6JERtMZ0sz3Fc3PTMDcb9DS 165 | # tALjZiZhOgOoRNC+5OHgE3tTPLCT6ZGktfedzp6J9mICzoJIIBelfdiIwJNkPTzR 166 | # I2krUn/6ld5coh0zyM85lCjXkqzZmyQmRRNQoycWtxUwxsNlkiGlRIiIJHztbg1I 167 | # lv9C90zCZ1nAhfOpv+maUohLtz22F9wXCJuIUQapOhPG5n/opM/AUQV2WuDa3AZP 168 | # VYleK90zOgHLDgLICxrx57z2JRlXyW2ga2N5J6DXzwGmxpCe0LbzYCj4h42SjUuf 169 | # 9hOQtORlSjYEj8RFpxatyxcmIIpej9/NDNXgIzCCBeAwggPIoAMCAQICEC58h8wO 170 | # k0pS/pT9HLfNNK8wDQYJKoZIhvcNAQEMBQAwgYUxCzAJBgNVBAYTAkdCMRswGQYD 171 | # VQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxGjAYBgNV 172 | # BAoTEUNPTU9ETyBDQSBMaW1pdGVkMSswKQYDVQQDEyJDT01PRE8gUlNBIENlcnRp 173 | # ZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDUwOTAwMDAwMFoXDTI4MDUwODIzNTk1 174 | # OVowfTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQ 175 | # MA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxIzAh 176 | # BgNVBAMTGkNPTU9ETyBSU0EgQ29kZSBTaWduaW5nIENBMIIBIjANBgkqhkiG9w0B 177 | # AQEFAAOCAQ8AMIIBCgKCAQEAppiQY3eRNH+K0d3pZzER68we/TEds7liVz+TvFvj 178 | # nx4kMhEna7xRkafPnp4ls1+BqBgPHR4gMA77YXuGCbPj/aJonRwsnb9y4+R1oOU1 179 | # I47Jiu4aDGTH2EKhe7VSA0s6sI4jS0tj4CKUN3vVeZAKFBhRLOb+wRLwHD9hYQqM 180 | # otz2wzCqzSgYdUjBeVoIzbuMVYz31HaQOjNGUHOYXPSFSmsPgN1e1r39qS/AJfX5 181 | # eNeNXxDCRFU8kDwxRstwrgepCuOvwQFvkBoj4l8428YIXUezg0HwLgA3FLkSqnmS 182 | # Us2HD3vYYimkfjC9G7WMcrRI8uPoIfleTGJ5iwIGn3/VCwIDAQABo4IBUTCCAU0w 183 | # HwYDVR0jBBgwFoAUu69+Aj36pvE8hI6t7jiY7NkyMtQwHQYDVR0OBBYEFCmRYP+K 184 | # Tfrr+aZquM/55ku9Sc4SMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8ECDAGAQH/ 185 | # AgEAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMBEGA1UdIAQKMAgwBgYEVR0gADBMBgNV 186 | # HR8ERTBDMEGgP6A9hjtodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9SU0FD 187 | # ZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDBxBggrBgEFBQcBAQRlMGMwOwYIKwYB 188 | # BQUHMAKGL2h0dHA6Ly9jcnQuY29tb2RvY2EuY29tL0NPTU9ET1JTQUFkZFRydXN0 189 | # Q0EuY3J0MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wDQYJ 190 | # KoZIhvcNAQEMBQADggIBAAI/AjnD7vjKO4neDG1NsfFOkk+vwjgsBMzFYxGrCWOv 191 | # q6LXAj/MbxnDPdYaCJT/JdipiKcrEBrgm7EHIhpRHDrU4ekJv+YkdK8eexYxbiPv 192 | # VFEtUgLidQgFTPG3UeFRAMaH9mzuEER2V2rx31hrIapJ1Hw3Tr3/tnVUQBg2V2cR 193 | # zU8C5P7z2vx1F9vst/dlCSNJH0NXg+p+IHdhyE3yu2VNqPeFRQevemknZZApQIvf 194 | # ezpROYyoH3B5rW1CIKLPDGwDjEzNcweU51qOOgS6oqF8H8tjOhWn1BUbp1JHMqn0 195 | # v2RH0aofU04yMHPCb7d4gp1c/0a7ayIdiAv4G6o0pvyM9d1/ZYyMMVcx0DbsR6HP 196 | # y4uo7xwYWMUGd8pLm1GvTAhKeo/io1Lijo7MJuSy2OU4wqjtxoGcNWupWGFKCpe0 197 | # S0K2VZ2+medwbVn4bSoMfxlgXwyaiGwwrFIJkBYb/yud29AgyonqKH4yjhnfe0gz 198 | # Htdl+K7J+IMUk3Z9ZNCOzr41ff9yMU2fnr0ebC+ojwwGUPuMJ7N2yfTm18M04oyH 199 | # IYZh/r9VdOEhdwMKaGy75Mmp5s9ZJet87EUOeWZo6CLNuO+YhU2WETwJitB/vCgo 200 | # E/tqylSNklzNwmWYBp7OSFvUtTeTRkF8B93P+kPvumdh/31J4LswfVyA4+YWOUun 201 | # MYIEezCCBHcCAQEwgZIwfTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIg 202 | # TWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENB 203 | # IExpbWl0ZWQxIzAhBgNVBAMTGkNPTU9ETyBSU0EgQ29kZSBTaWduaW5nIENBAhEA 204 | # +CGT8y+uLXmA2UBOFe5VGzAJBgUrDgMCGgUAoHgwGAYKKwYBBAGCNwIBDDEKMAig 205 | # AoAAoQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgEL 206 | # MQ4wDAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQUzgQWmEE2aZ12/hP4PlX0 207 | # Iwx38KEwDQYJKoZIhvcNAQEBBQAEggEAao8OlASPDAEldJccbIBeA8dzN9nOwPQW 208 | # alCKGGaLASjgnR9T0gRbyBI5BdBRp20YqlMYtzi5b1XPp6jdKTdf219cBn98YkUY 209 | # 4wKbSAUqybk7r+CNJ5bjthsqtX1KfD5OOPSXKxGWJ5RYDet/C98l+3dTBwoD5I/F 210 | # q7B9Jv+TempLi8f1OkBE928C/QRkfSwyjAleVHPltQpw/94cZ+8IcFOanU9caTrZ 211 | # Gv2mCs9Gd2mzq2gPgIilLEocPnygvBiLnuIX4pNzSTIfmsXN4j9+KkYv0ev3onmH 212 | # dh+5p7YmOgHJHhes5uT6q85jj5XcB/DiXD6DJ3opm1mRoi42NRagZqGCAkMwggI/ 213 | # BgkqhkiG9w0BCQYxggIwMIICLAIBADCBqTCBlTELMAkGA1UEBhMCVVMxCzAJBgNV 214 | # BAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVT 215 | # RVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5j 216 | # b20xHTAbBgNVBAMTFFVUTi1VU0VSRmlyc3QtT2JqZWN0Ag8WiPA5JV5jjmkUOQfm 217 | # MwswCQYFKw4DAhoFAKBdMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZI 218 | # hvcNAQkFMQ8XDTE3MDExMjIzMDcxM1owIwYJKoZIhvcNAQkEMRYEFOHkrtdeo0zW 219 | # jKW9PuMEjBsYxwC+MA0GCSqGSIb3DQEBAQUABIIBAJ2D+8m5Rvit6XvvG6c9zqti 220 | # 1uLgWCS3y5hjJMgg1Gm0REuTzB4+bGQCNzWfj7xQf/UHIoOLOhlae6m6d38Z7ied 221 | # hV5G2i/sJVrbGiaMCB6Kn0vyIilcBqocfTBveRxVC0z4qqfEbmCAq1F/O0q7H2VU 222 | # +WnZhfK7z3OkJnBPC2QTVotxppKdM1xEV16GBc791FY7KAbKeDKLN71SFamY4Kbz 223 | # 2vu92PXH45HAJ2MkBmnn8lEis1VNJ5K7yBF4MdNFVksGkNW2ZGSzaQ6+jcGM8gQk 224 | # IVOxUHq5l0Ln3Fhn1VbCzZLlzySr3aDJvl2WcTx1DsLUQujx3jdUtUJeg7jo5bY= 225 | # SIG # End signature block 226 | -------------------------------------------------------------------------------- /Code/Invoke-CmdScript.ps1: -------------------------------------------------------------------------------- 1 | #requires -version 5.0 2 | ############################################################################### 3 | # WintellectPowerShell Module 4 | # Copyright (c) 2010-2017 - John Robbins/Wintellect 5 | # 6 | # Do whatever you want with this module, but please do give credit. 7 | ############################################################################### 8 | 9 | # Always make sure all variables are defined and all best practices are 10 | # followed. 11 | Set-StrictMode -version Latest 12 | 13 | function Invoke-CmdScript 14 | { 15 | <# 16 | .SYNOPSIS 17 | Executes the specified command script and imports the environment into current 18 | PowerShell instance. 19 | 20 | .DESCRIPTION 21 | Running development tools at the command line in PowerShell can be a hassle since 22 | they rely on environment varibles and those are set through batch files. This 23 | cmdlet runs those batch files and imports any set environment variables into 24 | the running PowerShell instance. 25 | 26 | .PARAMETER script 27 | The required batch file to run. 28 | 29 | .PARAMETER parameters 30 | The optional parameters to pass to the batch file. 31 | 32 | .NOTES 33 | The original script is by Lee Holmes. I updated the script to make removing environment variables 34 | work. 35 | 36 | .LINK 37 | http://www.leeholmes.com/blog/2006/05/11/nothing-solves-everything-%e2%80%93-powershell-and-other-technologies/ 38 | https://github.com/Wintellect/WintellectPowerShell 39 | #> 40 | param 41 | ( 42 | [Parameter(Mandatory=$true, 43 | Position=0, 44 | HelpMessage="Please specify the command script to execute.")] 45 | [string] $script, 46 | [Parameter(Position=1)] 47 | [string] $parameters="" 48 | ) 49 | 50 | # Save off the current environment variables in case there's an issue 51 | $oldVars = $(Get-ChildItem -Path env:\) 52 | $tempFile = [IO.Path]::GetTempFileName() 53 | 54 | try 55 | { 56 | ## Store the output of cmd.exe. We also ask cmd.exe to output 57 | ## the environment table after the batch file completes 58 | cmd /c " `"$script`" $parameters && set > `"$tempFile`" " 59 | 60 | if ($LASTEXITCODE -ne 0) 61 | { 62 | throw "Error executing CMD.EXE: $LASTEXITCODE" 63 | } 64 | 65 | # Before we delete the environment variables get the output into a string 66 | # array. 67 | $vars = Get-Content -Path $tempFile 68 | 69 | # Clear out all current environment variables in PowerShell. 70 | Get-ChildItem -Path env:\ | Foreach-Object { 71 | set-item -force -path "ENV:\$($_.Name)" -value "" 72 | } 73 | 74 | 75 | ## Go through the environment variables in the temp file. 76 | ## For each of them, set the variable in our local environment. 77 | $vars | Foreach-Object { 78 | if($_ -match "^(.*?)=(.*)$") 79 | { 80 | Set-Content -Path "env:\$($matches[1])" -Value $matches[2] 81 | } 82 | } 83 | } 84 | catch 85 | { 86 | "ERROR: $_" 87 | 88 | # Any problems, restore the old environment variables. 89 | $oldVars | ForEach-Object { Set-Item -Force -Path "ENV:\$($_.Name)" -value $_.Value } 90 | } 91 | finally 92 | { 93 | Remove-Item -Path $tempFile -Force -ErrorAction SilentlyContinue 94 | } 95 | } 96 | 97 | # SIG # Begin signature block 98 | # MIIUywYJKoZIhvcNAQcCoIIUvDCCFLgCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB 99 | # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR 100 | # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUlhxOeyiqn+j3naljdmd2FjUx 101 | # okCggg+6MIIEmTCCA4GgAwIBAgIPFojwOSVeY45pFDkH5jMLMA0GCSqGSIb3DQEB 102 | # BQUAMIGVMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQg 103 | # TGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNV 104 | # BAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTEdMBsGA1UEAxMUVVROLVVTRVJG 105 | # aXJzdC1PYmplY3QwHhcNMTUxMjMxMDAwMDAwWhcNMTkwNzA5MTg0MDM2WjCBhDEL 106 | # MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE 107 | # BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKjAoBgNVBAMT 108 | # IUNPTU9ETyBTSEEtMSBUaW1lIFN0YW1waW5nIFNpZ25lcjCCASIwDQYJKoZIhvcN 109 | # AQEBBQADggEPADCCAQoCggEBAOnpPd/XNwjJHjiyUlNCbSLxscQGBGue/YJ0UEN9 110 | # xqC7H075AnEmse9D2IOMSPznD5d6muuc3qajDjscRBh1jnilF2n+SRik4rtcTv6O 111 | # KlR6UPDV9syR55l51955lNeWM/4Og74iv2MWLKPdKBuvPavql9LxvwQQ5z1IRf0f 112 | # aGXBf1mZacAiMQxibqdcZQEhsGPEIhgn7ub80gA9Ry6ouIZWXQTcExclbhzfRA8V 113 | # zbfbpVd2Qm8AaIKZ0uPB3vCLlFdM7AiQIiHOIiuYDELmQpOUmJPv/QbZP7xbm1Q8 114 | # ILHuatZHesWrgOkwmt7xpD9VTQoJNIp1KdJprZcPUL/4ygkCAwEAAaOB9DCB8TAf 115 | # BgNVHSMEGDAWgBTa7WR0FJwUPKvdmam9WyhNizzJ2DAdBgNVHQ4EFgQUjmstM2v0 116 | # M6eTsxOapeAK9xI1aogwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwFgYD 117 | # VR0lAQH/BAwwCgYIKwYBBQUHAwgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2Ny 118 | # bC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmlyc3QtT2JqZWN0LmNybDA1BggrBgEF 119 | # BQcBAQQpMCcwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnVzZXJ0cnVzdC5jb20w 120 | # DQYJKoZIhvcNAQEFBQADggEBALozJEBAjHzbWJ+zYJiy9cAx/usfblD2CuDk5oGt 121 | # Joei3/2z2vRz8wD7KRuJGxU+22tSkyvErDmB1zxnV5o5NuAoCJrjOU+biQl/e8Vh 122 | # f1mJMiUKaq4aPvCiJ6i2w7iH9xYESEE9XNjsn00gMQTZZaHtzWkHUxY93TYCCojr 123 | # QOUGMAu4Fkvc77xVCf/GPhIudrPczkLv+XZX4bcKBUCYWJpdcRaTcYxlgepv84n3 124 | # +3OttOe/2Y5vqgtPJfO44dXddZhogfiqwNGAwsTEOYnB9smebNd0+dmX+E/CmgrN 125 | # Xo/4GengpZ/E8JIh5i15Jcki+cPwOoRXrToW9GOUEB1d0MYwggU1MIIEHaADAgEC 126 | # AhEA+CGT8y+uLXmA2UBOFe5VGzANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJH 127 | # QjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3Jk 128 | # MRowGAYDVQQKExFDT01PRE8gQ0EgTGltaXRlZDEjMCEGA1UEAxMaQ09NT0RPIFJT 129 | # QSBDb2RlIFNpZ25pbmcgQ0EwHhcNMTYwMjE4MDAwMDAwWhcNMTgxMDI4MjM1OTU5 130 | # WjCBnTELMAkGA1UEBhMCVVMxDjAMBgNVBBEMBTM3OTMyMQswCQYDVQQIDAJUTjES 131 | # MBAGA1UEBwwJS25veHZpbGxlMRIwEAYDVQQJDAlTdWl0ZSAzMDIxHzAdBgNVBAkM 132 | # FjEwMjA3IFRlY2hub2xvZ3kgRHJpdmUxEzARBgNVBAoMCldpbnRlbGxlY3QxEzAR 133 | # BgNVBAMMCldpbnRlbGxlY3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB 134 | # AQDfLujuIe3yrrTfTOdYfstwFDZrI7XezoeFPA33GRxY/MSbKuUvPcN8XqU8Jpg4 135 | # NUkByzoSjPsq9Yjx3anHflcNendqa/8gbkPdiEMg+6kRVmtv1QHfGt+UbEMfrUk0 136 | # Ltm0DE+6OIZFx8hjsxifJvWrQ/jG9lat6e2YwIdNAqyG2htqCrmBN90lW+0+zU9s 137 | # YJIVD0ZfyZJVkvbeay+HwlbojW7JQyyhdGOSa61zUqlD85RX6HzcCbb1WHf5bZRO 138 | # 2idaVNAOw1YHqJAUjY4oJY4lqWwg5Inza4f33Wt82zJAgKY4S01bddkvjPi6iMnG 139 | # y8bI1EfWAdFFC+UM2qKsNc2/AgMBAAGjggGNMIIBiTAfBgNVHSMEGDAWgBQpkWD/ 140 | # ik366/mmarjP+eZLvUnOEjAdBgNVHQ4EFgQUZdNFdxzRtMVCZCvcFV4g7vsL8vgw 141 | # DgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwEwYDVR0lBAwwCgYIKwYBBQUH 142 | # AwMwEQYJYIZIAYb4QgEBBAQDAgQQMEYGA1UdIAQ/MD0wOwYMKwYBBAGyMQECAQMC 143 | # MCswKQYIKwYBBQUHAgEWHWh0dHBzOi8vc2VjdXJlLmNvbW9kby5uZXQvQ1BTMEMG 144 | # A1UdHwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL0NPTU9ET1JT 145 | # QUNvZGVTaWduaW5nQ0EuY3JsMHQGCCsGAQUFBwEBBGgwZjA+BggrBgEFBQcwAoYy 146 | # aHR0cDovL2NydC5jb21vZG9jYS5jb20vQ09NT0RPUlNBQ29kZVNpZ25pbmdDQS5j 147 | # cnQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9kb2NhLmNvbTANBgkqhkiG 148 | # 9w0BAQsFAAOCAQEAnSVG6TXbazSxczonyo/Q+pjX+6JERtMZ0sz3Fc3PTMDcb9DS 149 | # tALjZiZhOgOoRNC+5OHgE3tTPLCT6ZGktfedzp6J9mICzoJIIBelfdiIwJNkPTzR 150 | # I2krUn/6ld5coh0zyM85lCjXkqzZmyQmRRNQoycWtxUwxsNlkiGlRIiIJHztbg1I 151 | # lv9C90zCZ1nAhfOpv+maUohLtz22F9wXCJuIUQapOhPG5n/opM/AUQV2WuDa3AZP 152 | # VYleK90zOgHLDgLICxrx57z2JRlXyW2ga2N5J6DXzwGmxpCe0LbzYCj4h42SjUuf 153 | # 9hOQtORlSjYEj8RFpxatyxcmIIpej9/NDNXgIzCCBeAwggPIoAMCAQICEC58h8wO 154 | # k0pS/pT9HLfNNK8wDQYJKoZIhvcNAQEMBQAwgYUxCzAJBgNVBAYTAkdCMRswGQYD 155 | # VQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxGjAYBgNV 156 | # BAoTEUNPTU9ETyBDQSBMaW1pdGVkMSswKQYDVQQDEyJDT01PRE8gUlNBIENlcnRp 157 | # ZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDUwOTAwMDAwMFoXDTI4MDUwODIzNTk1 158 | # OVowfTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQ 159 | # MA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxIzAh 160 | # BgNVBAMTGkNPTU9ETyBSU0EgQ29kZSBTaWduaW5nIENBMIIBIjANBgkqhkiG9w0B 161 | # AQEFAAOCAQ8AMIIBCgKCAQEAppiQY3eRNH+K0d3pZzER68we/TEds7liVz+TvFvj 162 | # nx4kMhEna7xRkafPnp4ls1+BqBgPHR4gMA77YXuGCbPj/aJonRwsnb9y4+R1oOU1 163 | # I47Jiu4aDGTH2EKhe7VSA0s6sI4jS0tj4CKUN3vVeZAKFBhRLOb+wRLwHD9hYQqM 164 | # otz2wzCqzSgYdUjBeVoIzbuMVYz31HaQOjNGUHOYXPSFSmsPgN1e1r39qS/AJfX5 165 | # eNeNXxDCRFU8kDwxRstwrgepCuOvwQFvkBoj4l8428YIXUezg0HwLgA3FLkSqnmS 166 | # Us2HD3vYYimkfjC9G7WMcrRI8uPoIfleTGJ5iwIGn3/VCwIDAQABo4IBUTCCAU0w 167 | # HwYDVR0jBBgwFoAUu69+Aj36pvE8hI6t7jiY7NkyMtQwHQYDVR0OBBYEFCmRYP+K 168 | # Tfrr+aZquM/55ku9Sc4SMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8ECDAGAQH/ 169 | # AgEAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMBEGA1UdIAQKMAgwBgYEVR0gADBMBgNV 170 | # HR8ERTBDMEGgP6A9hjtodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9SU0FD 171 | # ZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDBxBggrBgEFBQcBAQRlMGMwOwYIKwYB 172 | # BQUHMAKGL2h0dHA6Ly9jcnQuY29tb2RvY2EuY29tL0NPTU9ET1JTQUFkZFRydXN0 173 | # Q0EuY3J0MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wDQYJ 174 | # KoZIhvcNAQEMBQADggIBAAI/AjnD7vjKO4neDG1NsfFOkk+vwjgsBMzFYxGrCWOv 175 | # q6LXAj/MbxnDPdYaCJT/JdipiKcrEBrgm7EHIhpRHDrU4ekJv+YkdK8eexYxbiPv 176 | # VFEtUgLidQgFTPG3UeFRAMaH9mzuEER2V2rx31hrIapJ1Hw3Tr3/tnVUQBg2V2cR 177 | # zU8C5P7z2vx1F9vst/dlCSNJH0NXg+p+IHdhyE3yu2VNqPeFRQevemknZZApQIvf 178 | # ezpROYyoH3B5rW1CIKLPDGwDjEzNcweU51qOOgS6oqF8H8tjOhWn1BUbp1JHMqn0 179 | # v2RH0aofU04yMHPCb7d4gp1c/0a7ayIdiAv4G6o0pvyM9d1/ZYyMMVcx0DbsR6HP 180 | # y4uo7xwYWMUGd8pLm1GvTAhKeo/io1Lijo7MJuSy2OU4wqjtxoGcNWupWGFKCpe0 181 | # S0K2VZ2+medwbVn4bSoMfxlgXwyaiGwwrFIJkBYb/yud29AgyonqKH4yjhnfe0gz 182 | # Htdl+K7J+IMUk3Z9ZNCOzr41ff9yMU2fnr0ebC+ojwwGUPuMJ7N2yfTm18M04oyH 183 | # IYZh/r9VdOEhdwMKaGy75Mmp5s9ZJet87EUOeWZo6CLNuO+YhU2WETwJitB/vCgo 184 | # E/tqylSNklzNwmWYBp7OSFvUtTeTRkF8B93P+kPvumdh/31J4LswfVyA4+YWOUun 185 | # MYIEezCCBHcCAQEwgZIwfTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIg 186 | # TWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENB 187 | # IExpbWl0ZWQxIzAhBgNVBAMTGkNPTU9ETyBSU0EgQ29kZSBTaWduaW5nIENBAhEA 188 | # +CGT8y+uLXmA2UBOFe5VGzAJBgUrDgMCGgUAoHgwGAYKKwYBBAGCNwIBDDEKMAig 189 | # AoAAoQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgEL 190 | # MQ4wDAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQUqwZWxRoTeTp1OMWH28Ne 191 | # yGKn//AwDQYJKoZIhvcNAQEBBQAEggEA3vvv9s596np4+qcfGxDShL8YdWLZvqgP 192 | # GLL7IkING4psISTx/bLAF2kQn6nRLxIyAJDh3lSMGoMexgr4xobPxwaTFRZNOq5V 193 | # 6trJ1YWyhQbcSpwb8GpW65nSvA1T5vEUybByTX5p/Lem2FMw/CkkevvKOxvDMFGw 194 | # O3Z6Hgd4k3gdl6Jwkt1sFbZjt+n0VFylYuHcnUzLjHxFUiM0/swoXuTxczT20EG1 195 | # dp931UIJJkhWzJ9befyJ4HIsnUTO96ACXWN2g12E3OaHQmVQxNQmTj0T4UqlYqkZ 196 | # mL4IZYcKGeS/TByTMXiRlejpGjucnT+RdO/iIpHE0Ng3mzZQnILeYaGCAkMwggI/ 197 | # BgkqhkiG9w0BCQYxggIwMIICLAIBADCBqTCBlTELMAkGA1UEBhMCVVMxCzAJBgNV 198 | # BAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVT 199 | # RVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5j 200 | # b20xHTAbBgNVBAMTFFVUTi1VU0VSRmlyc3QtT2JqZWN0Ag8WiPA5JV5jjmkUOQfm 201 | # MwswCQYFKw4DAhoFAKBdMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZI 202 | # hvcNAQkFMQ8XDTE3MDExMjIzMDcxNlowIwYJKoZIhvcNAQkEMRYEFAPoxifmSmGt 203 | # xpYtKjQRTV8xNHPoMA0GCSqGSIb3DQEBAQUABIIBALUKY/dOOOkcih/jiTXaUk5V 204 | # II5IZbX+WcMupkgI9gd2T4HuwA3waUec3kzNPlawo9qjoImMdqRFiAozm34Cwo8V 205 | # 22Mc8OwRwwr8hfKDa7/UFt//0FWYEQ8ULs/VTeF3LzMapzATtCCmejYcscm2QRJ1 206 | # GSD241DAIl5sS8HAeEGO0c0ncu/BYJ3wToV2X2J8Enx6hJC+dEmngAQNcySyb7kl 207 | # fVbAJY8XWMgsJam1efdWJ2fG/Sr3eyCbNRaHYJXlI29xVgwU+PopWljuff8YHu7s 208 | # QG1Wor9Lr2lW26sQEPr9X0YNkaAmAO00eqXy0cw1cw9WDJzwmQskkk58QCKsS1o= 209 | # SIG # End signature block 210 | -------------------------------------------------------------------------------- /Code/Merge-HashTables.ps1: -------------------------------------------------------------------------------- 1 | 2 | function Merge-HashTables 3 | { 4 | # I hate suppressing this warning, but I created this cmdlet long before the 5 | # script analyzer came out. If someone has this in a script, changing the 6 | # cmdlet name will break them. 7 | [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Scope="Function")] 8 | param ($htold=$null, $htnew=$null) 9 | <# 10 | .SYNOPSIS 11 | Merges two has tables based on their keys. 12 | 13 | .DESCRIPTION 14 | Thanks jon Z! 15 | 16 | .LINK 17 | http://stackoverflow.com/questions/8800375/merging-hashtables-in-powershell-how 18 | #> 19 | $keys = $htold.getenumerator() | foreach-object {$_.key} 20 | $keys | foreach-object { 21 | $key = $_ 22 | if ($htnew.containskey($key)) 23 | { 24 | $htold.remove($key) 25 | } 26 | } 27 | $htnew = $htold + $htnew 28 | return $htnew 29 | } 30 | 31 | 32 | # SIG # Begin signature block 33 | # MIIUywYJKoZIhvcNAQcCoIIUvDCCFLgCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB 34 | # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR 35 | # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUNKpjaNlLT2JycTY1N7VsZF4f 36 | # hM+ggg+6MIIEmTCCA4GgAwIBAgIPFojwOSVeY45pFDkH5jMLMA0GCSqGSIb3DQEB 37 | # BQUAMIGVMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQg 38 | # TGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNV 39 | # BAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTEdMBsGA1UEAxMUVVROLVVTRVJG 40 | # aXJzdC1PYmplY3QwHhcNMTUxMjMxMDAwMDAwWhcNMTkwNzA5MTg0MDM2WjCBhDEL 41 | # MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE 42 | # BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKjAoBgNVBAMT 43 | # IUNPTU9ETyBTSEEtMSBUaW1lIFN0YW1waW5nIFNpZ25lcjCCASIwDQYJKoZIhvcN 44 | # AQEBBQADggEPADCCAQoCggEBAOnpPd/XNwjJHjiyUlNCbSLxscQGBGue/YJ0UEN9 45 | # xqC7H075AnEmse9D2IOMSPznD5d6muuc3qajDjscRBh1jnilF2n+SRik4rtcTv6O 46 | # KlR6UPDV9syR55l51955lNeWM/4Og74iv2MWLKPdKBuvPavql9LxvwQQ5z1IRf0f 47 | # aGXBf1mZacAiMQxibqdcZQEhsGPEIhgn7ub80gA9Ry6ouIZWXQTcExclbhzfRA8V 48 | # zbfbpVd2Qm8AaIKZ0uPB3vCLlFdM7AiQIiHOIiuYDELmQpOUmJPv/QbZP7xbm1Q8 49 | # ILHuatZHesWrgOkwmt7xpD9VTQoJNIp1KdJprZcPUL/4ygkCAwEAAaOB9DCB8TAf 50 | # BgNVHSMEGDAWgBTa7WR0FJwUPKvdmam9WyhNizzJ2DAdBgNVHQ4EFgQUjmstM2v0 51 | # M6eTsxOapeAK9xI1aogwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwFgYD 52 | # VR0lAQH/BAwwCgYIKwYBBQUHAwgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2Ny 53 | # bC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmlyc3QtT2JqZWN0LmNybDA1BggrBgEF 54 | # BQcBAQQpMCcwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnVzZXJ0cnVzdC5jb20w 55 | # DQYJKoZIhvcNAQEFBQADggEBALozJEBAjHzbWJ+zYJiy9cAx/usfblD2CuDk5oGt 56 | # Joei3/2z2vRz8wD7KRuJGxU+22tSkyvErDmB1zxnV5o5NuAoCJrjOU+biQl/e8Vh 57 | # f1mJMiUKaq4aPvCiJ6i2w7iH9xYESEE9XNjsn00gMQTZZaHtzWkHUxY93TYCCojr 58 | # QOUGMAu4Fkvc77xVCf/GPhIudrPczkLv+XZX4bcKBUCYWJpdcRaTcYxlgepv84n3 59 | # +3OttOe/2Y5vqgtPJfO44dXddZhogfiqwNGAwsTEOYnB9smebNd0+dmX+E/CmgrN 60 | # Xo/4GengpZ/E8JIh5i15Jcki+cPwOoRXrToW9GOUEB1d0MYwggU1MIIEHaADAgEC 61 | # AhEA+CGT8y+uLXmA2UBOFe5VGzANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJH 62 | # QjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3Jk 63 | # MRowGAYDVQQKExFDT01PRE8gQ0EgTGltaXRlZDEjMCEGA1UEAxMaQ09NT0RPIFJT 64 | # QSBDb2RlIFNpZ25pbmcgQ0EwHhcNMTYwMjE4MDAwMDAwWhcNMTgxMDI4MjM1OTU5 65 | # WjCBnTELMAkGA1UEBhMCVVMxDjAMBgNVBBEMBTM3OTMyMQswCQYDVQQIDAJUTjES 66 | # MBAGA1UEBwwJS25veHZpbGxlMRIwEAYDVQQJDAlTdWl0ZSAzMDIxHzAdBgNVBAkM 67 | # FjEwMjA3IFRlY2hub2xvZ3kgRHJpdmUxEzARBgNVBAoMCldpbnRlbGxlY3QxEzAR 68 | # BgNVBAMMCldpbnRlbGxlY3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB 69 | # AQDfLujuIe3yrrTfTOdYfstwFDZrI7XezoeFPA33GRxY/MSbKuUvPcN8XqU8Jpg4 70 | # NUkByzoSjPsq9Yjx3anHflcNendqa/8gbkPdiEMg+6kRVmtv1QHfGt+UbEMfrUk0 71 | # Ltm0DE+6OIZFx8hjsxifJvWrQ/jG9lat6e2YwIdNAqyG2htqCrmBN90lW+0+zU9s 72 | # YJIVD0ZfyZJVkvbeay+HwlbojW7JQyyhdGOSa61zUqlD85RX6HzcCbb1WHf5bZRO 73 | # 2idaVNAOw1YHqJAUjY4oJY4lqWwg5Inza4f33Wt82zJAgKY4S01bddkvjPi6iMnG 74 | # y8bI1EfWAdFFC+UM2qKsNc2/AgMBAAGjggGNMIIBiTAfBgNVHSMEGDAWgBQpkWD/ 75 | # ik366/mmarjP+eZLvUnOEjAdBgNVHQ4EFgQUZdNFdxzRtMVCZCvcFV4g7vsL8vgw 76 | # DgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwEwYDVR0lBAwwCgYIKwYBBQUH 77 | # AwMwEQYJYIZIAYb4QgEBBAQDAgQQMEYGA1UdIAQ/MD0wOwYMKwYBBAGyMQECAQMC 78 | # MCswKQYIKwYBBQUHAgEWHWh0dHBzOi8vc2VjdXJlLmNvbW9kby5uZXQvQ1BTMEMG 79 | # A1UdHwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL0NPTU9ET1JT 80 | # QUNvZGVTaWduaW5nQ0EuY3JsMHQGCCsGAQUFBwEBBGgwZjA+BggrBgEFBQcwAoYy 81 | # aHR0cDovL2NydC5jb21vZG9jYS5jb20vQ09NT0RPUlNBQ29kZVNpZ25pbmdDQS5j 82 | # cnQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9kb2NhLmNvbTANBgkqhkiG 83 | # 9w0BAQsFAAOCAQEAnSVG6TXbazSxczonyo/Q+pjX+6JERtMZ0sz3Fc3PTMDcb9DS 84 | # tALjZiZhOgOoRNC+5OHgE3tTPLCT6ZGktfedzp6J9mICzoJIIBelfdiIwJNkPTzR 85 | # I2krUn/6ld5coh0zyM85lCjXkqzZmyQmRRNQoycWtxUwxsNlkiGlRIiIJHztbg1I 86 | # lv9C90zCZ1nAhfOpv+maUohLtz22F9wXCJuIUQapOhPG5n/opM/AUQV2WuDa3AZP 87 | # VYleK90zOgHLDgLICxrx57z2JRlXyW2ga2N5J6DXzwGmxpCe0LbzYCj4h42SjUuf 88 | # 9hOQtORlSjYEj8RFpxatyxcmIIpej9/NDNXgIzCCBeAwggPIoAMCAQICEC58h8wO 89 | # k0pS/pT9HLfNNK8wDQYJKoZIhvcNAQEMBQAwgYUxCzAJBgNVBAYTAkdCMRswGQYD 90 | # VQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxGjAYBgNV 91 | # BAoTEUNPTU9ETyBDQSBMaW1pdGVkMSswKQYDVQQDEyJDT01PRE8gUlNBIENlcnRp 92 | # ZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDUwOTAwMDAwMFoXDTI4MDUwODIzNTk1 93 | # OVowfTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQ 94 | # MA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxIzAh 95 | # BgNVBAMTGkNPTU9ETyBSU0EgQ29kZSBTaWduaW5nIENBMIIBIjANBgkqhkiG9w0B 96 | # AQEFAAOCAQ8AMIIBCgKCAQEAppiQY3eRNH+K0d3pZzER68we/TEds7liVz+TvFvj 97 | # nx4kMhEna7xRkafPnp4ls1+BqBgPHR4gMA77YXuGCbPj/aJonRwsnb9y4+R1oOU1 98 | # I47Jiu4aDGTH2EKhe7VSA0s6sI4jS0tj4CKUN3vVeZAKFBhRLOb+wRLwHD9hYQqM 99 | # otz2wzCqzSgYdUjBeVoIzbuMVYz31HaQOjNGUHOYXPSFSmsPgN1e1r39qS/AJfX5 100 | # eNeNXxDCRFU8kDwxRstwrgepCuOvwQFvkBoj4l8428YIXUezg0HwLgA3FLkSqnmS 101 | # Us2HD3vYYimkfjC9G7WMcrRI8uPoIfleTGJ5iwIGn3/VCwIDAQABo4IBUTCCAU0w 102 | # HwYDVR0jBBgwFoAUu69+Aj36pvE8hI6t7jiY7NkyMtQwHQYDVR0OBBYEFCmRYP+K 103 | # Tfrr+aZquM/55ku9Sc4SMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8ECDAGAQH/ 104 | # AgEAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMBEGA1UdIAQKMAgwBgYEVR0gADBMBgNV 105 | # HR8ERTBDMEGgP6A9hjtodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9SU0FD 106 | # ZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDBxBggrBgEFBQcBAQRlMGMwOwYIKwYB 107 | # BQUHMAKGL2h0dHA6Ly9jcnQuY29tb2RvY2EuY29tL0NPTU9ET1JTQUFkZFRydXN0 108 | # Q0EuY3J0MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wDQYJ 109 | # KoZIhvcNAQEMBQADggIBAAI/AjnD7vjKO4neDG1NsfFOkk+vwjgsBMzFYxGrCWOv 110 | # q6LXAj/MbxnDPdYaCJT/JdipiKcrEBrgm7EHIhpRHDrU4ekJv+YkdK8eexYxbiPv 111 | # VFEtUgLidQgFTPG3UeFRAMaH9mzuEER2V2rx31hrIapJ1Hw3Tr3/tnVUQBg2V2cR 112 | # zU8C5P7z2vx1F9vst/dlCSNJH0NXg+p+IHdhyE3yu2VNqPeFRQevemknZZApQIvf 113 | # ezpROYyoH3B5rW1CIKLPDGwDjEzNcweU51qOOgS6oqF8H8tjOhWn1BUbp1JHMqn0 114 | # v2RH0aofU04yMHPCb7d4gp1c/0a7ayIdiAv4G6o0pvyM9d1/ZYyMMVcx0DbsR6HP 115 | # y4uo7xwYWMUGd8pLm1GvTAhKeo/io1Lijo7MJuSy2OU4wqjtxoGcNWupWGFKCpe0 116 | # S0K2VZ2+medwbVn4bSoMfxlgXwyaiGwwrFIJkBYb/yud29AgyonqKH4yjhnfe0gz 117 | # Htdl+K7J+IMUk3Z9ZNCOzr41ff9yMU2fnr0ebC+ojwwGUPuMJ7N2yfTm18M04oyH 118 | # IYZh/r9VdOEhdwMKaGy75Mmp5s9ZJet87EUOeWZo6CLNuO+YhU2WETwJitB/vCgo 119 | # E/tqylSNklzNwmWYBp7OSFvUtTeTRkF8B93P+kPvumdh/31J4LswfVyA4+YWOUun 120 | # MYIEezCCBHcCAQEwgZIwfTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIg 121 | # TWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENB 122 | # IExpbWl0ZWQxIzAhBgNVBAMTGkNPTU9ETyBSU0EgQ29kZSBTaWduaW5nIENBAhEA 123 | # +CGT8y+uLXmA2UBOFe5VGzAJBgUrDgMCGgUAoHgwGAYKKwYBBAGCNwIBDDEKMAig 124 | # AoAAoQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgEL 125 | # MQ4wDAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQU+kWZiU9gCdmIhz3Zu9+a 126 | # qGcaMvgwDQYJKoZIhvcNAQEBBQAEggEAdwiM2wV0I2tMtzk3lSD6bqVEGzbSGXw2 127 | # BCKScUW292YrO8ZdyJRoh4ZOjk3txBlA2hBbupHSyC5Dgo5DteCQk/NfiNLZ/Ye5 128 | # +FXpgjm0YKZZeL8T1iTgF9vjzkEjNkNoV6fGqAUmWCA2/7fizTUPdLQh9t0qsEP/ 129 | # Zd04zFM/z7SdHXkj6wDN6tJUE6UFKjdVcNyshONvQCWPmgPWfPXgfw7Tb8d3GbmJ 130 | # lAPxyn5qltp+1GGMcxC16HWlKwU3vz20CidanrusdoYuG5gQsRQG8T9AYBBuCvL3 131 | # SzsRGqtIxMupM1Mx9pGZ3rNE27Gcx/IgZcFdUqkTLkV7HiFCLv7Tk6GCAkMwggI/ 132 | # BgkqhkiG9w0BCQYxggIwMIICLAIBADCBqTCBlTELMAkGA1UEBhMCVVMxCzAJBgNV 133 | # BAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVT 134 | # RVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5j 135 | # b20xHTAbBgNVBAMTFFVUTi1VU0VSRmlyc3QtT2JqZWN0Ag8WiPA5JV5jjmkUOQfm 136 | # MwswCQYFKw4DAhoFAKBdMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZI 137 | # hvcNAQkFMQ8XDTE3MDExMjIzMDcxOVowIwYJKoZIhvcNAQkEMRYEFBx701L3owFi 138 | # wcEvkY4SoGuHArmfMA0GCSqGSIb3DQEBAQUABIIBALSgXft115vrTQrLLxoj3agL 139 | # WXGrb4tu1SGYeR0RYFLNxBK1HMtxxbPxNBtPi/NuZZPoTFRludVmPc780B4RfLgl 140 | # 8RJMl3aa17n9V3NwE0B7lXtxPKLDIPkxyP7MYcYcgMJj983j7DH2syyVE1/+bTOi 141 | # GEv7apP7kRUHhxd7LCjRoFJQ2x8ir2DFRRWM7zCI0oWgVeZ1HKvH61kI1j33w9jL 142 | # W71vky2RfQe9tsM0l616/cORh2lziygJLrWohsJgj5gr4qtMCfe00mGOWF6MRRDv 143 | # BAYiXrBezZdLCh36LCiOWidSYEKziUenGW90GwoiKiBf68ae4j5YqVSWKWsGv+w= 144 | # SIG # End signature block 145 | -------------------------------------------------------------------------------- /Code/Remove-IntelliTraceFile.ps1: -------------------------------------------------------------------------------- 1 | #requires -version 5.0 2 | ############################################################################### 3 | # WintellectPowerShell Module 4 | # Copyright (c) 2010-2017 - John Robbins/Wintellect 5 | # 6 | # Do whatever you want with this module, but please do give credit. 7 | ############################################################################### 8 | 9 | # Always make sure all variables are defined and all best practices are 10 | # followed. 11 | Set-StrictMode -version Latest 12 | 13 | ############################################################################### 14 | # Public Cmdlets 15 | ############################################################################### 16 | function Remove-IntelliTraceFiles 17 | { 18 | <# 19 | .SYNOPSIS 20 | Removes extra IntelliTrace files that may have been left over from your 21 | debugging sessions. 22 | 23 | .DESCRIPTION 24 | Best practice with day to day debugging with IntelliTrace is to have the 25 | debugger store the IntelliTrace files. This is important because you will gain 26 | the ability to open the files after debugging. This option is not on by default, 27 | but can be turned on by going to the VS Options dialog, IntelliTrace, Advanced 28 | property page and checking "Store IntelliTrace recordings in this directory." 29 | 30 | Once you have your IntelliTrace files being saved you have a small issue that 31 | VS does not always properly clean up the files after shutting down. This 32 | cmdlet checks to see if you are storing the files and if you are, deletes any 33 | files found in the storage directory. Since IntelliTrace files can take up a 34 | lot of disk space, it's good to clean out that directory every once in a while. 35 | 36 | By default, this script works with Visual Studio 2013, 2015 and 2017 with the 37 | default being VS 2017. 38 | 39 | .PARAMETER VSVersion 40 | Removes the stored IntelliTrace files for VS 2017 by default, specify VS 2013 or 41 | VS 2015 for those versions. 42 | 43 | .LINK 44 | http://www.wintellect.com/devcenter/author/jrobbins 45 | https://github.com/Wintellect/WintellectPowerShell 46 | 47 | #> 48 | [CmdLetBinding(SupportsShouldProcess=$true)] 49 | # I hate suppressing this warning, but I created this cmdlet long before the 50 | # script analyzer came out. If someone has this in a script, changing the 51 | # cmdlet name will break them. 52 | [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Scope="Function")] 53 | param ( 54 | [ValidateSet("VS2013", "VS2015", "VS2017", "Latest")] 55 | [string] $VSVersion = "Latest" 56 | ) 57 | 58 | # First check if VS is running. If so, we can't continue as it may be using 59 | # the .iTrace files. 60 | $proc = Get-Process -Name devenv -ErrorAction SilentlyContinue 61 | if ($null -ne $proc) 62 | { 63 | throw "Visual Studio is running. Please close all instances." 64 | } 65 | 66 | # Default to VS 2017. 67 | $regVer = "15.0" 68 | 69 | switch ($VSVersion) 70 | { 71 | "VS2013" { $regVer = "12.0" } 72 | "VS2015" { $regVer = "14.0" } 73 | "VS2017" { $regVer = "15.0" } 74 | "Latest" { $regVer = LatestVSRegistryKeyVersion } 75 | } 76 | 77 | [string]$storageDir = "" 78 | 79 | # Am I supposed to look for VS 2017 or higher? If so, we have work to do because VS 2017 completely changed the 80 | # way version detection and the registry are handled. These changes are excellent for performance, but cause 81 | # more work on my side. Oh well. :) 82 | 83 | if ($regVer -lt "15.0") 84 | { 85 | # Handle older versions of Visual Studio. 86 | $regKey = "HKCU:\SOFTWARE\Microsoft\VisualStudio\$regVer\ApplicationPrivateSettings\Microsoft\VisualStudio\TraceLogPackage\ToolsOptionAdvanced" 87 | 88 | if ($regVer -lt "14.0") 89 | { 90 | $regKey = "HKCU:\Software\Microsoft\VisualStudio\" + 91 | $regVer + 92 | "\DialogPage\Microsoft.VisualStudio.TraceLogPackage.ToolsOptionAdvanced" 93 | } 94 | 95 | # Check to see if the user has set the options to save files. If not bail out. 96 | if (((Test-PathReg -Path $regKey -Property "SaveRecordings") -eq $false) -or 97 | ((Get-ItemProperty -Path $regKey).SaveRecordings -match "False")) 98 | { 99 | throw "You have not configured IntelliTrace to save recordings. " + 100 | "In the Options dialog, IntelliTtrace Advanced page, check the " + 101 | "Store IntelliTrace recordings in this directory check box." 102 | } 103 | 104 | if ((Test-PathReg -Path $regKey -Property "RecordingPath") -ne $false) 105 | { 106 | # Get the storage directory for those files. 107 | $storageDir = (Get-ItemProperty -Path $regKey).RecordingPath 108 | } 109 | 110 | # If this is version 14.0 or greater it will have some gunk on the beginning. 111 | if ($storageDir.StartsWith("1*System.String*")) 112 | { 113 | $storageDir = $storageDir.Substring("1*System.String*".Length) 114 | } 115 | } 116 | else 117 | { 118 | # OK, I'm supposed to do the spiffy new versions. 119 | # 1. See if any VS 2017 versions are installed and if any are Enterprise versions 120 | # Load my helper that wraps the VS 2017+ setup configuration component. 121 | $loadResult = Get-ChildItem -Path $PSScriptRoot -File "WintellectPowerShellHelper.DLL" -ErrorAction Stop | ForEach-Object {[Reflection.Assembly]::LoadFile($_.FullName)} 122 | 123 | if ($null -eq $loadResult) 124 | { 125 | throw "Unable to find the required WintellectPowerShellHelper.DLL in the WintellectPowerShell module directory" 126 | } 127 | 128 | $vsInstalls = [WintellectPowerShellHelper.VisualStudioSetup]::GetInstalledInstances() 129 | if ($vsInstalls.Count -eq 0) 130 | { 131 | throw "No Visual Studio 2017+ instances installed on this computer" 132 | } 133 | 134 | # 2. Get the instance ID for the Enterprise version that matches the one the user want to clean up. 135 | $vsToProcess = $null 136 | for ($i = 0; $i -lt $vsInstalls.Count; $i++) 137 | { 138 | if (($vsInstalls[$i].ProductName.Contains("Enterprise")) -and 139 | ($vsInstalls[$i].InstalledVersionNumber.Substring(0,2) -eq $regVer.SubString(0,2))) 140 | { 141 | $vsToProcess = $vsInstalls[$i] 142 | break 143 | } 144 | } 145 | 146 | if ($null -eq $vsToProcess) 147 | { 148 | throw "The Visual Studio version you requested is not an Enterprise edition" 149 | } 150 | 151 | # 3. Open the registry file in privateregistry.bin and read the value. 152 | $regFilePath = $env:LOCALAPPDATA + "\Microsoft\VisualStudio\" + $regVer + "_" + $vsToProcess.InstanceId + "\privateregistry.bin" 153 | 154 | if (! (Test-Path $regFilePath)) 155 | { 156 | throw "The privateregistry.bin file does not exist" 157 | } 158 | 159 | $regKey = "Software\Microsoft\VisualStudio\15.0_" + $vsToProcess.InstanceId + "\ApplicationPrivateSettings\Microsoft\VisualStudio\TraceLogPackage\ToolsOptionAdvanced" 160 | 161 | $storageDir = [WintellectPowerShellHelper.PrivateRegistry]::ReadValue($regFilePath, $regKey, "RecordingPath") 162 | 163 | if ($storageDir.StartsWith("1*System.String*")) 164 | { 165 | $storageDir = $storageDir.Substring("1*System.String*".Length) 166 | } 167 | 168 | } 169 | 170 | if ($storageDir.Length -eq 0) 171 | { 172 | throw "The IntelliTrace recording directory is empty. Check the " + 173 | "Options dialog, IntelliTrace Advanced page to set the "+ 174 | "directory." 175 | } 176 | 177 | if ($PSCmdlet.ShouldProcess($storageDir,"Deleting files in")) 178 | { 179 | # Clean up those files but only do the ones in the main directory so if the 180 | # user may have created paths and put other files there we don't delete those. 181 | Get-ChildItem -Path $storageDir -Filter "*.iTrace" | Remove-Item -Force 182 | } 183 | } 184 | # SIG # Begin signature block 185 | # MIIUywYJKoZIhvcNAQcCoIIUvDCCFLgCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB 186 | # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR 187 | # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUGFtrotEPc58Tn6zgjTibodby 188 | # PZ2ggg+6MIIEmTCCA4GgAwIBAgIPFojwOSVeY45pFDkH5jMLMA0GCSqGSIb3DQEB 189 | # BQUAMIGVMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQg 190 | # TGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNV 191 | # BAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTEdMBsGA1UEAxMUVVROLVVTRVJG 192 | # aXJzdC1PYmplY3QwHhcNMTUxMjMxMDAwMDAwWhcNMTkwNzA5MTg0MDM2WjCBhDEL 193 | # MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE 194 | # BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKjAoBgNVBAMT 195 | # IUNPTU9ETyBTSEEtMSBUaW1lIFN0YW1waW5nIFNpZ25lcjCCASIwDQYJKoZIhvcN 196 | # AQEBBQADggEPADCCAQoCggEBAOnpPd/XNwjJHjiyUlNCbSLxscQGBGue/YJ0UEN9 197 | # xqC7H075AnEmse9D2IOMSPznD5d6muuc3qajDjscRBh1jnilF2n+SRik4rtcTv6O 198 | # KlR6UPDV9syR55l51955lNeWM/4Og74iv2MWLKPdKBuvPavql9LxvwQQ5z1IRf0f 199 | # aGXBf1mZacAiMQxibqdcZQEhsGPEIhgn7ub80gA9Ry6ouIZWXQTcExclbhzfRA8V 200 | # zbfbpVd2Qm8AaIKZ0uPB3vCLlFdM7AiQIiHOIiuYDELmQpOUmJPv/QbZP7xbm1Q8 201 | # ILHuatZHesWrgOkwmt7xpD9VTQoJNIp1KdJprZcPUL/4ygkCAwEAAaOB9DCB8TAf 202 | # BgNVHSMEGDAWgBTa7WR0FJwUPKvdmam9WyhNizzJ2DAdBgNVHQ4EFgQUjmstM2v0 203 | # M6eTsxOapeAK9xI1aogwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwFgYD 204 | # VR0lAQH/BAwwCgYIKwYBBQUHAwgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2Ny 205 | # bC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmlyc3QtT2JqZWN0LmNybDA1BggrBgEF 206 | # BQcBAQQpMCcwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnVzZXJ0cnVzdC5jb20w 207 | # DQYJKoZIhvcNAQEFBQADggEBALozJEBAjHzbWJ+zYJiy9cAx/usfblD2CuDk5oGt 208 | # Joei3/2z2vRz8wD7KRuJGxU+22tSkyvErDmB1zxnV5o5NuAoCJrjOU+biQl/e8Vh 209 | # f1mJMiUKaq4aPvCiJ6i2w7iH9xYESEE9XNjsn00gMQTZZaHtzWkHUxY93TYCCojr 210 | # QOUGMAu4Fkvc77xVCf/GPhIudrPczkLv+XZX4bcKBUCYWJpdcRaTcYxlgepv84n3 211 | # +3OttOe/2Y5vqgtPJfO44dXddZhogfiqwNGAwsTEOYnB9smebNd0+dmX+E/CmgrN 212 | # Xo/4GengpZ/E8JIh5i15Jcki+cPwOoRXrToW9GOUEB1d0MYwggU1MIIEHaADAgEC 213 | # AhEA+CGT8y+uLXmA2UBOFe5VGzANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJH 214 | # QjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3Jk 215 | # MRowGAYDVQQKExFDT01PRE8gQ0EgTGltaXRlZDEjMCEGA1UEAxMaQ09NT0RPIFJT 216 | # QSBDb2RlIFNpZ25pbmcgQ0EwHhcNMTYwMjE4MDAwMDAwWhcNMTgxMDI4MjM1OTU5 217 | # WjCBnTELMAkGA1UEBhMCVVMxDjAMBgNVBBEMBTM3OTMyMQswCQYDVQQIDAJUTjES 218 | # MBAGA1UEBwwJS25veHZpbGxlMRIwEAYDVQQJDAlTdWl0ZSAzMDIxHzAdBgNVBAkM 219 | # FjEwMjA3IFRlY2hub2xvZ3kgRHJpdmUxEzARBgNVBAoMCldpbnRlbGxlY3QxEzAR 220 | # BgNVBAMMCldpbnRlbGxlY3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB 221 | # AQDfLujuIe3yrrTfTOdYfstwFDZrI7XezoeFPA33GRxY/MSbKuUvPcN8XqU8Jpg4 222 | # NUkByzoSjPsq9Yjx3anHflcNendqa/8gbkPdiEMg+6kRVmtv1QHfGt+UbEMfrUk0 223 | # Ltm0DE+6OIZFx8hjsxifJvWrQ/jG9lat6e2YwIdNAqyG2htqCrmBN90lW+0+zU9s 224 | # YJIVD0ZfyZJVkvbeay+HwlbojW7JQyyhdGOSa61zUqlD85RX6HzcCbb1WHf5bZRO 225 | # 2idaVNAOw1YHqJAUjY4oJY4lqWwg5Inza4f33Wt82zJAgKY4S01bddkvjPi6iMnG 226 | # y8bI1EfWAdFFC+UM2qKsNc2/AgMBAAGjggGNMIIBiTAfBgNVHSMEGDAWgBQpkWD/ 227 | # ik366/mmarjP+eZLvUnOEjAdBgNVHQ4EFgQUZdNFdxzRtMVCZCvcFV4g7vsL8vgw 228 | # DgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwEwYDVR0lBAwwCgYIKwYBBQUH 229 | # AwMwEQYJYIZIAYb4QgEBBAQDAgQQMEYGA1UdIAQ/MD0wOwYMKwYBBAGyMQECAQMC 230 | # MCswKQYIKwYBBQUHAgEWHWh0dHBzOi8vc2VjdXJlLmNvbW9kby5uZXQvQ1BTMEMG 231 | # A1UdHwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL0NPTU9ET1JT 232 | # QUNvZGVTaWduaW5nQ0EuY3JsMHQGCCsGAQUFBwEBBGgwZjA+BggrBgEFBQcwAoYy 233 | # aHR0cDovL2NydC5jb21vZG9jYS5jb20vQ09NT0RPUlNBQ29kZVNpZ25pbmdDQS5j 234 | # cnQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9kb2NhLmNvbTANBgkqhkiG 235 | # 9w0BAQsFAAOCAQEAnSVG6TXbazSxczonyo/Q+pjX+6JERtMZ0sz3Fc3PTMDcb9DS 236 | # tALjZiZhOgOoRNC+5OHgE3tTPLCT6ZGktfedzp6J9mICzoJIIBelfdiIwJNkPTzR 237 | # I2krUn/6ld5coh0zyM85lCjXkqzZmyQmRRNQoycWtxUwxsNlkiGlRIiIJHztbg1I 238 | # lv9C90zCZ1nAhfOpv+maUohLtz22F9wXCJuIUQapOhPG5n/opM/AUQV2WuDa3AZP 239 | # VYleK90zOgHLDgLICxrx57z2JRlXyW2ga2N5J6DXzwGmxpCe0LbzYCj4h42SjUuf 240 | # 9hOQtORlSjYEj8RFpxatyxcmIIpej9/NDNXgIzCCBeAwggPIoAMCAQICEC58h8wO 241 | # k0pS/pT9HLfNNK8wDQYJKoZIhvcNAQEMBQAwgYUxCzAJBgNVBAYTAkdCMRswGQYD 242 | # VQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxGjAYBgNV 243 | # BAoTEUNPTU9ETyBDQSBMaW1pdGVkMSswKQYDVQQDEyJDT01PRE8gUlNBIENlcnRp 244 | # ZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDUwOTAwMDAwMFoXDTI4MDUwODIzNTk1 245 | # OVowfTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQ 246 | # MA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxIzAh 247 | # BgNVBAMTGkNPTU9ETyBSU0EgQ29kZSBTaWduaW5nIENBMIIBIjANBgkqhkiG9w0B 248 | # AQEFAAOCAQ8AMIIBCgKCAQEAppiQY3eRNH+K0d3pZzER68we/TEds7liVz+TvFvj 249 | # nx4kMhEna7xRkafPnp4ls1+BqBgPHR4gMA77YXuGCbPj/aJonRwsnb9y4+R1oOU1 250 | # I47Jiu4aDGTH2EKhe7VSA0s6sI4jS0tj4CKUN3vVeZAKFBhRLOb+wRLwHD9hYQqM 251 | # otz2wzCqzSgYdUjBeVoIzbuMVYz31HaQOjNGUHOYXPSFSmsPgN1e1r39qS/AJfX5 252 | # eNeNXxDCRFU8kDwxRstwrgepCuOvwQFvkBoj4l8428YIXUezg0HwLgA3FLkSqnmS 253 | # Us2HD3vYYimkfjC9G7WMcrRI8uPoIfleTGJ5iwIGn3/VCwIDAQABo4IBUTCCAU0w 254 | # HwYDVR0jBBgwFoAUu69+Aj36pvE8hI6t7jiY7NkyMtQwHQYDVR0OBBYEFCmRYP+K 255 | # Tfrr+aZquM/55ku9Sc4SMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8ECDAGAQH/ 256 | # AgEAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMBEGA1UdIAQKMAgwBgYEVR0gADBMBgNV 257 | # HR8ERTBDMEGgP6A9hjtodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9SU0FD 258 | # ZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDBxBggrBgEFBQcBAQRlMGMwOwYIKwYB 259 | # BQUHMAKGL2h0dHA6Ly9jcnQuY29tb2RvY2EuY29tL0NPTU9ET1JTQUFkZFRydXN0 260 | # Q0EuY3J0MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wDQYJ 261 | # KoZIhvcNAQEMBQADggIBAAI/AjnD7vjKO4neDG1NsfFOkk+vwjgsBMzFYxGrCWOv 262 | # q6LXAj/MbxnDPdYaCJT/JdipiKcrEBrgm7EHIhpRHDrU4ekJv+YkdK8eexYxbiPv 263 | # VFEtUgLidQgFTPG3UeFRAMaH9mzuEER2V2rx31hrIapJ1Hw3Tr3/tnVUQBg2V2cR 264 | # zU8C5P7z2vx1F9vst/dlCSNJH0NXg+p+IHdhyE3yu2VNqPeFRQevemknZZApQIvf 265 | # ezpROYyoH3B5rW1CIKLPDGwDjEzNcweU51qOOgS6oqF8H8tjOhWn1BUbp1JHMqn0 266 | # v2RH0aofU04yMHPCb7d4gp1c/0a7ayIdiAv4G6o0pvyM9d1/ZYyMMVcx0DbsR6HP 267 | # y4uo7xwYWMUGd8pLm1GvTAhKeo/io1Lijo7MJuSy2OU4wqjtxoGcNWupWGFKCpe0 268 | # S0K2VZ2+medwbVn4bSoMfxlgXwyaiGwwrFIJkBYb/yud29AgyonqKH4yjhnfe0gz 269 | # Htdl+K7J+IMUk3Z9ZNCOzr41ff9yMU2fnr0ebC+ojwwGUPuMJ7N2yfTm18M04oyH 270 | # IYZh/r9VdOEhdwMKaGy75Mmp5s9ZJet87EUOeWZo6CLNuO+YhU2WETwJitB/vCgo 271 | # E/tqylSNklzNwmWYBp7OSFvUtTeTRkF8B93P+kPvumdh/31J4LswfVyA4+YWOUun 272 | # MYIEezCCBHcCAQEwgZIwfTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIg 273 | # TWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENB 274 | # IExpbWl0ZWQxIzAhBgNVBAMTGkNPTU9ETyBSU0EgQ29kZSBTaWduaW5nIENBAhEA 275 | # +CGT8y+uLXmA2UBOFe5VGzAJBgUrDgMCGgUAoHgwGAYKKwYBBAGCNwIBDDEKMAig 276 | # AoAAoQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgEL 277 | # MQ4wDAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQUlo3+yd8djr4Z8DqYSlGV 278 | # fYEsSiMwDQYJKoZIhvcNAQEBBQAEggEALLg9AywkktL0bDZeeRxboCyK3ew3doYA 279 | # jN+Ghpf6A4/5oBX2m4Qt6/mUVlVJ1fqisPYJp6gSOmQPP3Nk4CuKb0fPDoX6doBI 280 | # Ep1JiTaCTMIgJEXJORVuxf7URU4+BV8zOP4lvCakb7/uJH40l+IenwecaBCrRfO7 281 | # ztoHyh+HXatuoymXnS1HpX6F6J88RKo6pxpIcaGxJ48MGRkJD4EU3LY9KCpzHt0P 282 | # sxI4hZiKmTQuAC6VeV1bndNAGfBEIa8SwIoQhhfD4v/HoTBsXyMDbE+N/6LRA3Ut 283 | # WjI0DkppZGjYVK7CJESl1pXPAvvyPh6GETr6xjNs1pW54eJTg595WqGCAkMwggI/ 284 | # BgkqhkiG9w0BCQYxggIwMIICLAIBADCBqTCBlTELMAkGA1UEBhMCVVMxCzAJBgNV 285 | # BAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVT 286 | # RVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5j 287 | # b20xHTAbBgNVBAMTFFVUTi1VU0VSRmlyc3QtT2JqZWN0Ag8WiPA5JV5jjmkUOQfm 288 | # MwswCQYFKw4DAhoFAKBdMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZI 289 | # hvcNAQkFMQ8XDTE3MDExMjIzMDcyMlowIwYJKoZIhvcNAQkEMRYEFLZ0o44SlFOg 290 | # cay4JDW9b6LqooFaMA0GCSqGSIb3DQEBAQUABIIBAAVHzb7gvhK2e7NIGQ84xrbi 291 | # 7FfGjheBcYU7G2icZRjzSBtnYhHI50RDiqui33s2MOQuxevZueWaLIt0FPOBFXeH 292 | # hUQHf1Dlt9jz0dYya6/pbndPpHmBzdLdW2NbieHGy9GF+17/QsvEt/uZDcP7XdB+ 293 | # HhrWWSlghgEcazQpe0u/OixbjDjXo88M1UvDpVMKldldAqaw6KObuOpBQWi/+j1H 294 | # wKHQJrF2Lh4szccNXqa8AkMLB0AqD+FuS/j5d6ahbLcW46auYLi4iE23luKzbOKf 295 | # KuER/fYoUgmWr26fXJ+yVGKLnWGUgv9JtIONi6xq36VrBh/s2Ss2Xv00FjUMtCI= 296 | # SIG # End signature block 297 | -------------------------------------------------------------------------------- /Code/Set-Environment.ps1: -------------------------------------------------------------------------------- 1 | #requires -version 5.0 2 | ############################################################################### 3 | # WintellectPowerShell Module 4 | # Copyright (c) 2010-2017 - John Robbins/Wintellect 5 | # 6 | # Do whatever you want with this module, but please do give credit. 7 | ############################################################################### 8 | 9 | # Always make sure all variables are defined and all best practices are 10 | # followed. 11 | Set-StrictMode -version Latest 12 | 13 | function Set-Environment 14 | { 15 | <# 16 | .SYNOPSIS 17 | Brings the CMD SET command back to PowerShell. 18 | 19 | .DESCRIPTION 20 | PowerShell has a powerfull way to set environment variables, but many of us 21 | have the DOS SET command burned into our fingers. This function keeps us 22 | productive. :) 23 | 24 | Full credit to Wes Haggard at http://weblogs.asp.net/whaggard for this gem. 25 | 26 | To replace the default set alias with the one provided by WintellectPowerShell, 27 | execute the following command before importing the this module. 28 | 29 | Remove-Item alias:set -Force -ErrorAction SilentlyContinue 30 | 31 | 32 | .PARAMETER Var 33 | The environment variable in SET format, "var=value". If you want to clear an 34 | environment variable, use "var=". If no parameter is specified, this will dump 35 | all environment variables currently defined. 36 | 37 | .LINK 38 | http://weblogs.asp.net/whaggard/archive/2007/02/08/powershell-version-of-cmd-set.aspx 39 | https://github.com/Wintellect/WintellectPowerShell 40 | 41 | #> 42 | [CmdletBinding(SupportsShouldProcess=$true)] 43 | param 44 | ( 45 | [string]$var 46 | ) 47 | 48 | if ($var -eq "") 49 | { 50 | get-childitem -Path env: | sort-object -Property name 51 | } 52 | else 53 | { 54 | if ($var -match "^(\S*?)\s*=\s*(.*)$") 55 | { 56 | if ($PSCmdlet.ShouldProcess($matches[1], "Setting environment variable")) 57 | { 58 | set-item -force -path "env:$($matches[1])" -value $matches[2]; 59 | } 60 | } 61 | else 62 | { 63 | write-error -Message "ERROR Usage: VAR=VALUE" 64 | } 65 | } 66 | } 67 | 68 | # SIG # Begin signature block 69 | # MIIUywYJKoZIhvcNAQcCoIIUvDCCFLgCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB 70 | # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR 71 | # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUJICeRLIVlb/Ms8JUeta7nESw 72 | # T+Kggg+6MIIEmTCCA4GgAwIBAgIPFojwOSVeY45pFDkH5jMLMA0GCSqGSIb3DQEB 73 | # BQUAMIGVMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQg 74 | # TGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNV 75 | # BAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTEdMBsGA1UEAxMUVVROLVVTRVJG 76 | # aXJzdC1PYmplY3QwHhcNMTUxMjMxMDAwMDAwWhcNMTkwNzA5MTg0MDM2WjCBhDEL 77 | # MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE 78 | # BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKjAoBgNVBAMT 79 | # IUNPTU9ETyBTSEEtMSBUaW1lIFN0YW1waW5nIFNpZ25lcjCCASIwDQYJKoZIhvcN 80 | # AQEBBQADggEPADCCAQoCggEBAOnpPd/XNwjJHjiyUlNCbSLxscQGBGue/YJ0UEN9 81 | # xqC7H075AnEmse9D2IOMSPznD5d6muuc3qajDjscRBh1jnilF2n+SRik4rtcTv6O 82 | # KlR6UPDV9syR55l51955lNeWM/4Og74iv2MWLKPdKBuvPavql9LxvwQQ5z1IRf0f 83 | # aGXBf1mZacAiMQxibqdcZQEhsGPEIhgn7ub80gA9Ry6ouIZWXQTcExclbhzfRA8V 84 | # zbfbpVd2Qm8AaIKZ0uPB3vCLlFdM7AiQIiHOIiuYDELmQpOUmJPv/QbZP7xbm1Q8 85 | # ILHuatZHesWrgOkwmt7xpD9VTQoJNIp1KdJprZcPUL/4ygkCAwEAAaOB9DCB8TAf 86 | # BgNVHSMEGDAWgBTa7WR0FJwUPKvdmam9WyhNizzJ2DAdBgNVHQ4EFgQUjmstM2v0 87 | # M6eTsxOapeAK9xI1aogwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwFgYD 88 | # VR0lAQH/BAwwCgYIKwYBBQUHAwgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2Ny 89 | # bC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmlyc3QtT2JqZWN0LmNybDA1BggrBgEF 90 | # BQcBAQQpMCcwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnVzZXJ0cnVzdC5jb20w 91 | # DQYJKoZIhvcNAQEFBQADggEBALozJEBAjHzbWJ+zYJiy9cAx/usfblD2CuDk5oGt 92 | # Joei3/2z2vRz8wD7KRuJGxU+22tSkyvErDmB1zxnV5o5NuAoCJrjOU+biQl/e8Vh 93 | # f1mJMiUKaq4aPvCiJ6i2w7iH9xYESEE9XNjsn00gMQTZZaHtzWkHUxY93TYCCojr 94 | # QOUGMAu4Fkvc77xVCf/GPhIudrPczkLv+XZX4bcKBUCYWJpdcRaTcYxlgepv84n3 95 | # +3OttOe/2Y5vqgtPJfO44dXddZhogfiqwNGAwsTEOYnB9smebNd0+dmX+E/CmgrN 96 | # Xo/4GengpZ/E8JIh5i15Jcki+cPwOoRXrToW9GOUEB1d0MYwggU1MIIEHaADAgEC 97 | # AhEA+CGT8y+uLXmA2UBOFe5VGzANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJH 98 | # QjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3Jk 99 | # MRowGAYDVQQKExFDT01PRE8gQ0EgTGltaXRlZDEjMCEGA1UEAxMaQ09NT0RPIFJT 100 | # QSBDb2RlIFNpZ25pbmcgQ0EwHhcNMTYwMjE4MDAwMDAwWhcNMTgxMDI4MjM1OTU5 101 | # WjCBnTELMAkGA1UEBhMCVVMxDjAMBgNVBBEMBTM3OTMyMQswCQYDVQQIDAJUTjES 102 | # MBAGA1UEBwwJS25veHZpbGxlMRIwEAYDVQQJDAlTdWl0ZSAzMDIxHzAdBgNVBAkM 103 | # FjEwMjA3IFRlY2hub2xvZ3kgRHJpdmUxEzARBgNVBAoMCldpbnRlbGxlY3QxEzAR 104 | # BgNVBAMMCldpbnRlbGxlY3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB 105 | # AQDfLujuIe3yrrTfTOdYfstwFDZrI7XezoeFPA33GRxY/MSbKuUvPcN8XqU8Jpg4 106 | # NUkByzoSjPsq9Yjx3anHflcNendqa/8gbkPdiEMg+6kRVmtv1QHfGt+UbEMfrUk0 107 | # Ltm0DE+6OIZFx8hjsxifJvWrQ/jG9lat6e2YwIdNAqyG2htqCrmBN90lW+0+zU9s 108 | # YJIVD0ZfyZJVkvbeay+HwlbojW7JQyyhdGOSa61zUqlD85RX6HzcCbb1WHf5bZRO 109 | # 2idaVNAOw1YHqJAUjY4oJY4lqWwg5Inza4f33Wt82zJAgKY4S01bddkvjPi6iMnG 110 | # y8bI1EfWAdFFC+UM2qKsNc2/AgMBAAGjggGNMIIBiTAfBgNVHSMEGDAWgBQpkWD/ 111 | # ik366/mmarjP+eZLvUnOEjAdBgNVHQ4EFgQUZdNFdxzRtMVCZCvcFV4g7vsL8vgw 112 | # DgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwEwYDVR0lBAwwCgYIKwYBBQUH 113 | # AwMwEQYJYIZIAYb4QgEBBAQDAgQQMEYGA1UdIAQ/MD0wOwYMKwYBBAGyMQECAQMC 114 | # MCswKQYIKwYBBQUHAgEWHWh0dHBzOi8vc2VjdXJlLmNvbW9kby5uZXQvQ1BTMEMG 115 | # A1UdHwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL0NPTU9ET1JT 116 | # QUNvZGVTaWduaW5nQ0EuY3JsMHQGCCsGAQUFBwEBBGgwZjA+BggrBgEFBQcwAoYy 117 | # aHR0cDovL2NydC5jb21vZG9jYS5jb20vQ09NT0RPUlNBQ29kZVNpZ25pbmdDQS5j 118 | # cnQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9kb2NhLmNvbTANBgkqhkiG 119 | # 9w0BAQsFAAOCAQEAnSVG6TXbazSxczonyo/Q+pjX+6JERtMZ0sz3Fc3PTMDcb9DS 120 | # tALjZiZhOgOoRNC+5OHgE3tTPLCT6ZGktfedzp6J9mICzoJIIBelfdiIwJNkPTzR 121 | # I2krUn/6ld5coh0zyM85lCjXkqzZmyQmRRNQoycWtxUwxsNlkiGlRIiIJHztbg1I 122 | # lv9C90zCZ1nAhfOpv+maUohLtz22F9wXCJuIUQapOhPG5n/opM/AUQV2WuDa3AZP 123 | # VYleK90zOgHLDgLICxrx57z2JRlXyW2ga2N5J6DXzwGmxpCe0LbzYCj4h42SjUuf 124 | # 9hOQtORlSjYEj8RFpxatyxcmIIpej9/NDNXgIzCCBeAwggPIoAMCAQICEC58h8wO 125 | # k0pS/pT9HLfNNK8wDQYJKoZIhvcNAQEMBQAwgYUxCzAJBgNVBAYTAkdCMRswGQYD 126 | # VQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxGjAYBgNV 127 | # BAoTEUNPTU9ETyBDQSBMaW1pdGVkMSswKQYDVQQDEyJDT01PRE8gUlNBIENlcnRp 128 | # ZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDUwOTAwMDAwMFoXDTI4MDUwODIzNTk1 129 | # OVowfTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQ 130 | # MA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxIzAh 131 | # BgNVBAMTGkNPTU9ETyBSU0EgQ29kZSBTaWduaW5nIENBMIIBIjANBgkqhkiG9w0B 132 | # AQEFAAOCAQ8AMIIBCgKCAQEAppiQY3eRNH+K0d3pZzER68we/TEds7liVz+TvFvj 133 | # nx4kMhEna7xRkafPnp4ls1+BqBgPHR4gMA77YXuGCbPj/aJonRwsnb9y4+R1oOU1 134 | # I47Jiu4aDGTH2EKhe7VSA0s6sI4jS0tj4CKUN3vVeZAKFBhRLOb+wRLwHD9hYQqM 135 | # otz2wzCqzSgYdUjBeVoIzbuMVYz31HaQOjNGUHOYXPSFSmsPgN1e1r39qS/AJfX5 136 | # eNeNXxDCRFU8kDwxRstwrgepCuOvwQFvkBoj4l8428YIXUezg0HwLgA3FLkSqnmS 137 | # Us2HD3vYYimkfjC9G7WMcrRI8uPoIfleTGJ5iwIGn3/VCwIDAQABo4IBUTCCAU0w 138 | # HwYDVR0jBBgwFoAUu69+Aj36pvE8hI6t7jiY7NkyMtQwHQYDVR0OBBYEFCmRYP+K 139 | # Tfrr+aZquM/55ku9Sc4SMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8ECDAGAQH/ 140 | # AgEAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMBEGA1UdIAQKMAgwBgYEVR0gADBMBgNV 141 | # HR8ERTBDMEGgP6A9hjtodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9SU0FD 142 | # ZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDBxBggrBgEFBQcBAQRlMGMwOwYIKwYB 143 | # BQUHMAKGL2h0dHA6Ly9jcnQuY29tb2RvY2EuY29tL0NPTU9ET1JTQUFkZFRydXN0 144 | # Q0EuY3J0MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wDQYJ 145 | # KoZIhvcNAQEMBQADggIBAAI/AjnD7vjKO4neDG1NsfFOkk+vwjgsBMzFYxGrCWOv 146 | # q6LXAj/MbxnDPdYaCJT/JdipiKcrEBrgm7EHIhpRHDrU4ekJv+YkdK8eexYxbiPv 147 | # VFEtUgLidQgFTPG3UeFRAMaH9mzuEER2V2rx31hrIapJ1Hw3Tr3/tnVUQBg2V2cR 148 | # zU8C5P7z2vx1F9vst/dlCSNJH0NXg+p+IHdhyE3yu2VNqPeFRQevemknZZApQIvf 149 | # ezpROYyoH3B5rW1CIKLPDGwDjEzNcweU51qOOgS6oqF8H8tjOhWn1BUbp1JHMqn0 150 | # v2RH0aofU04yMHPCb7d4gp1c/0a7ayIdiAv4G6o0pvyM9d1/ZYyMMVcx0DbsR6HP 151 | # y4uo7xwYWMUGd8pLm1GvTAhKeo/io1Lijo7MJuSy2OU4wqjtxoGcNWupWGFKCpe0 152 | # S0K2VZ2+medwbVn4bSoMfxlgXwyaiGwwrFIJkBYb/yud29AgyonqKH4yjhnfe0gz 153 | # Htdl+K7J+IMUk3Z9ZNCOzr41ff9yMU2fnr0ebC+ojwwGUPuMJ7N2yfTm18M04oyH 154 | # IYZh/r9VdOEhdwMKaGy75Mmp5s9ZJet87EUOeWZo6CLNuO+YhU2WETwJitB/vCgo 155 | # E/tqylSNklzNwmWYBp7OSFvUtTeTRkF8B93P+kPvumdh/31J4LswfVyA4+YWOUun 156 | # MYIEezCCBHcCAQEwgZIwfTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIg 157 | # TWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENB 158 | # IExpbWl0ZWQxIzAhBgNVBAMTGkNPTU9ETyBSU0EgQ29kZSBTaWduaW5nIENBAhEA 159 | # +CGT8y+uLXmA2UBOFe5VGzAJBgUrDgMCGgUAoHgwGAYKKwYBBAGCNwIBDDEKMAig 160 | # AoAAoQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgEL 161 | # MQ4wDAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQUVFY4RtIvW2DohXeiftOC 162 | # QJivvwgwDQYJKoZIhvcNAQEBBQAEggEADJIuEa4jnNR8eGy1BIAC9/yXNsgrJyjT 163 | # 5zr/Mc4SvGvP6EOdYTOGKWM65h7BGRs7uP5qm6x1h9Nil8R0F2B5OjfT3mp+ZPMu 164 | # 6uF8/hxc1GWpu7zyiW2Y6SaqYIO7Clr5ckJncsC8OiGiuTHoEE3ORvrUxeqnoO2i 165 | # A6PyAQmRFKoJvfBjMSTUmWjkgtBJ8pUa66D4eLn5HWIyAAmmtFKPcvg0rdyrBRuL 166 | # ay3rZ+WTpG2YCz8O0Ipcu3N10qnudjTLJRlGmd5OhA0C0im2DvrODsuY85EahEWr 167 | # adCwSjyBp3DF02JZtwAO/Meg2xqw0Vkw8ohVUhmK0gwiybAYTTW846GCAkMwggI/ 168 | # BgkqhkiG9w0BCQYxggIwMIICLAIBATCBqTCBlTELMAkGA1UEBhMCVVMxCzAJBgNV 169 | # BAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVT 170 | # RVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5j 171 | # b20xHTAbBgNVBAMTFFVUTi1VU0VSRmlyc3QtT2JqZWN0Ag8WiPA5JV5jjmkUOQfm 172 | # MwswCQYFKw4DAhoFAKBdMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZI 173 | # hvcNAQkFMQ8XDTE3MTIyMDIwMjQ1MlowIwYJKoZIhvcNAQkEMRYEFJZkVLMCZHjj 174 | # pVIk2MdBzZk+Zs+TMA0GCSqGSIb3DQEBAQUABIIBAKsLrQQsVkWYh0gkZ14klu3n 175 | # FRw9j2TZdwd3/B8yBgp9FP/M34v1P0i+TuLPaloVhg7Vz8mx+x7uAK4PhU9qs1Ws 176 | # pwB/QgMFaBoJvyEf2I76nwsqaeO2GS8cxbHUjtosIG2yoN5Pl9a2wnVxJAzJi+SU 177 | # CGXDHUKdXuDDyk0+TMEOej0QEnF88bT4mSK6Jl6cfKX4yiFFBQOwjFR7qlOLxgxD 178 | # UDldnmV0Hl/Cl3N7oYQjVX069X+Kp94kWKxEe8sEIzHUK4TiwkCw4bhiCdS2O4B4 179 | # Xh+2DjHBWAw5eYOud1PWLEagNIs8HTh1RygHCawfTApyyg5bxdNdQVhD7odVzgM= 180 | # SIG # End signature block 181 | -------------------------------------------------------------------------------- /Code/Set-Signatures.ps1: -------------------------------------------------------------------------------- 1 | #requires -version 5.0 2 | ############################################################################### 3 | # WintellectPowerShell Module 4 | # Copyright (c) 2014-2017 - John Robbins/Wintellect 5 | # 6 | # Do whatever you want with this module, but please do give credit. 7 | ############################################################################### 8 | 9 | # Always make sure all variables are defined and all best practices are 10 | # followed. 11 | Set-StrictMode -version Latest 12 | 13 | function Set-Signatures 14 | { 15 | <# 16 | .SYNOPSIS 17 | Simple wrapper script for digitally signing files 18 | .DESCRIPTION 19 | Automatically grabs the first code signing certificate in CurrentUser\My and 20 | uses the Comodo time stamp server so you just have to worry about the files. 21 | .PARAMETER Files 22 | The files to digitally sign. Any files that can be normally digitally 23 | signed can be passed here. 24 | .PARAMETER Certificate 25 | Defaults to first code signing certificate in the cert:\CurrentUser\My 26 | certificate storage that does not have Azure in the name. 27 | .PARAMETER TimeStampServer 28 | The timestamp server to use. Defaults to 29 | http://timestamp.comodoca.com/authenticode 30 | .LINK 31 | http://www.wintellectnow.com 32 | http://www.wintellect.com/devcenter/author/jrobbins 33 | #> 34 | 35 | # I hate suppressing this warning, but I created this cmdlet long before the 36 | # script analyzer came out. If someone has this in a script, changing the 37 | # cmdlet name will break them. 38 | [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Scope="Function")] 39 | [CmdletBinding(SupportsShouldProcess=$true)] 40 | param 41 | ( 42 | [Parameter(ValueFromPipeline=$true, 43 | ValueFromPipelineByPropertyName=$true, 44 | Mandatory=$true, 45 | HelpMessage="Please enter the PowerShell files to sign")] 46 | [Alias('FullName')] 47 | $Files, 48 | [ValidateNotNull()] 49 | $Certificate = @(Get-ChildItem -Path cert:\CurrentUser\My -CodeSigning | 50 | Where-Object { $_.Subject -notlike "*Azure*" } | 51 | Select-Object -First 1)[0], 52 | [ValidateNotNull()] 53 | $TimeStampServer = "http://timestamp.comodoca.com/authenticode" 54 | ) 55 | 56 | begin 57 | { 58 | # Because this is a script file, nothing can come between the params 59 | # and begin statements. Interestingly, if something does PowerShell 60 | # ignores the begin and when it hits the process, treats it as the 61 | # alias Get-Process. :) 62 | Set-StrictMode -Version Latest 63 | } 64 | process 65 | { 66 | foreach ($file in $Files) 67 | { 68 | # Always support -whatif 69 | if ($PSCmdlet.ShouldProcess("$_", "Set-AuthenticodeSignature")) 70 | { 71 | Set-AuthenticodeSignature -FilePath $file ` 72 | -Certificate $Certificate ` 73 | -TimestampServer $TimeStampServer 74 | } 75 | } 76 | } 77 | } 78 | 79 | 80 | # SIG # Begin signature block 81 | # MIIUywYJKoZIhvcNAQcCoIIUvDCCFLgCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB 82 | # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR 83 | # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUAzgWOPFu1fk3xov62Ov/YjTF 84 | # BMOggg+6MIIEmTCCA4GgAwIBAgIPFojwOSVeY45pFDkH5jMLMA0GCSqGSIb3DQEB 85 | # BQUAMIGVMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQg 86 | # TGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNV 87 | # BAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTEdMBsGA1UEAxMUVVROLVVTRVJG 88 | # aXJzdC1PYmplY3QwHhcNMTUxMjMxMDAwMDAwWhcNMTkwNzA5MTg0MDM2WjCBhDEL 89 | # MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE 90 | # BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKjAoBgNVBAMT 91 | # IUNPTU9ETyBTSEEtMSBUaW1lIFN0YW1waW5nIFNpZ25lcjCCASIwDQYJKoZIhvcN 92 | # AQEBBQADggEPADCCAQoCggEBAOnpPd/XNwjJHjiyUlNCbSLxscQGBGue/YJ0UEN9 93 | # xqC7H075AnEmse9D2IOMSPznD5d6muuc3qajDjscRBh1jnilF2n+SRik4rtcTv6O 94 | # KlR6UPDV9syR55l51955lNeWM/4Og74iv2MWLKPdKBuvPavql9LxvwQQ5z1IRf0f 95 | # aGXBf1mZacAiMQxibqdcZQEhsGPEIhgn7ub80gA9Ry6ouIZWXQTcExclbhzfRA8V 96 | # zbfbpVd2Qm8AaIKZ0uPB3vCLlFdM7AiQIiHOIiuYDELmQpOUmJPv/QbZP7xbm1Q8 97 | # ILHuatZHesWrgOkwmt7xpD9VTQoJNIp1KdJprZcPUL/4ygkCAwEAAaOB9DCB8TAf 98 | # BgNVHSMEGDAWgBTa7WR0FJwUPKvdmam9WyhNizzJ2DAdBgNVHQ4EFgQUjmstM2v0 99 | # M6eTsxOapeAK9xI1aogwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwFgYD 100 | # VR0lAQH/BAwwCgYIKwYBBQUHAwgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2Ny 101 | # bC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmlyc3QtT2JqZWN0LmNybDA1BggrBgEF 102 | # BQcBAQQpMCcwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnVzZXJ0cnVzdC5jb20w 103 | # DQYJKoZIhvcNAQEFBQADggEBALozJEBAjHzbWJ+zYJiy9cAx/usfblD2CuDk5oGt 104 | # Joei3/2z2vRz8wD7KRuJGxU+22tSkyvErDmB1zxnV5o5NuAoCJrjOU+biQl/e8Vh 105 | # f1mJMiUKaq4aPvCiJ6i2w7iH9xYESEE9XNjsn00gMQTZZaHtzWkHUxY93TYCCojr 106 | # QOUGMAu4Fkvc77xVCf/GPhIudrPczkLv+XZX4bcKBUCYWJpdcRaTcYxlgepv84n3 107 | # +3OttOe/2Y5vqgtPJfO44dXddZhogfiqwNGAwsTEOYnB9smebNd0+dmX+E/CmgrN 108 | # Xo/4GengpZ/E8JIh5i15Jcki+cPwOoRXrToW9GOUEB1d0MYwggU1MIIEHaADAgEC 109 | # AhEA+CGT8y+uLXmA2UBOFe5VGzANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJH 110 | # QjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3Jk 111 | # MRowGAYDVQQKExFDT01PRE8gQ0EgTGltaXRlZDEjMCEGA1UEAxMaQ09NT0RPIFJT 112 | # QSBDb2RlIFNpZ25pbmcgQ0EwHhcNMTYwMjE4MDAwMDAwWhcNMTgxMDI4MjM1OTU5 113 | # WjCBnTELMAkGA1UEBhMCVVMxDjAMBgNVBBEMBTM3OTMyMQswCQYDVQQIDAJUTjES 114 | # MBAGA1UEBwwJS25veHZpbGxlMRIwEAYDVQQJDAlTdWl0ZSAzMDIxHzAdBgNVBAkM 115 | # FjEwMjA3IFRlY2hub2xvZ3kgRHJpdmUxEzARBgNVBAoMCldpbnRlbGxlY3QxEzAR 116 | # BgNVBAMMCldpbnRlbGxlY3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB 117 | # AQDfLujuIe3yrrTfTOdYfstwFDZrI7XezoeFPA33GRxY/MSbKuUvPcN8XqU8Jpg4 118 | # NUkByzoSjPsq9Yjx3anHflcNendqa/8gbkPdiEMg+6kRVmtv1QHfGt+UbEMfrUk0 119 | # Ltm0DE+6OIZFx8hjsxifJvWrQ/jG9lat6e2YwIdNAqyG2htqCrmBN90lW+0+zU9s 120 | # YJIVD0ZfyZJVkvbeay+HwlbojW7JQyyhdGOSa61zUqlD85RX6HzcCbb1WHf5bZRO 121 | # 2idaVNAOw1YHqJAUjY4oJY4lqWwg5Inza4f33Wt82zJAgKY4S01bddkvjPi6iMnG 122 | # y8bI1EfWAdFFC+UM2qKsNc2/AgMBAAGjggGNMIIBiTAfBgNVHSMEGDAWgBQpkWD/ 123 | # ik366/mmarjP+eZLvUnOEjAdBgNVHQ4EFgQUZdNFdxzRtMVCZCvcFV4g7vsL8vgw 124 | # DgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwEwYDVR0lBAwwCgYIKwYBBQUH 125 | # AwMwEQYJYIZIAYb4QgEBBAQDAgQQMEYGA1UdIAQ/MD0wOwYMKwYBBAGyMQECAQMC 126 | # MCswKQYIKwYBBQUHAgEWHWh0dHBzOi8vc2VjdXJlLmNvbW9kby5uZXQvQ1BTMEMG 127 | # A1UdHwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL0NPTU9ET1JT 128 | # QUNvZGVTaWduaW5nQ0EuY3JsMHQGCCsGAQUFBwEBBGgwZjA+BggrBgEFBQcwAoYy 129 | # aHR0cDovL2NydC5jb21vZG9jYS5jb20vQ09NT0RPUlNBQ29kZVNpZ25pbmdDQS5j 130 | # cnQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9kb2NhLmNvbTANBgkqhkiG 131 | # 9w0BAQsFAAOCAQEAnSVG6TXbazSxczonyo/Q+pjX+6JERtMZ0sz3Fc3PTMDcb9DS 132 | # tALjZiZhOgOoRNC+5OHgE3tTPLCT6ZGktfedzp6J9mICzoJIIBelfdiIwJNkPTzR 133 | # I2krUn/6ld5coh0zyM85lCjXkqzZmyQmRRNQoycWtxUwxsNlkiGlRIiIJHztbg1I 134 | # lv9C90zCZ1nAhfOpv+maUohLtz22F9wXCJuIUQapOhPG5n/opM/AUQV2WuDa3AZP 135 | # VYleK90zOgHLDgLICxrx57z2JRlXyW2ga2N5J6DXzwGmxpCe0LbzYCj4h42SjUuf 136 | # 9hOQtORlSjYEj8RFpxatyxcmIIpej9/NDNXgIzCCBeAwggPIoAMCAQICEC58h8wO 137 | # k0pS/pT9HLfNNK8wDQYJKoZIhvcNAQEMBQAwgYUxCzAJBgNVBAYTAkdCMRswGQYD 138 | # VQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxGjAYBgNV 139 | # BAoTEUNPTU9ETyBDQSBMaW1pdGVkMSswKQYDVQQDEyJDT01PRE8gUlNBIENlcnRp 140 | # ZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDUwOTAwMDAwMFoXDTI4MDUwODIzNTk1 141 | # OVowfTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQ 142 | # MA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxIzAh 143 | # BgNVBAMTGkNPTU9ETyBSU0EgQ29kZSBTaWduaW5nIENBMIIBIjANBgkqhkiG9w0B 144 | # AQEFAAOCAQ8AMIIBCgKCAQEAppiQY3eRNH+K0d3pZzER68we/TEds7liVz+TvFvj 145 | # nx4kMhEna7xRkafPnp4ls1+BqBgPHR4gMA77YXuGCbPj/aJonRwsnb9y4+R1oOU1 146 | # I47Jiu4aDGTH2EKhe7VSA0s6sI4jS0tj4CKUN3vVeZAKFBhRLOb+wRLwHD9hYQqM 147 | # otz2wzCqzSgYdUjBeVoIzbuMVYz31HaQOjNGUHOYXPSFSmsPgN1e1r39qS/AJfX5 148 | # eNeNXxDCRFU8kDwxRstwrgepCuOvwQFvkBoj4l8428YIXUezg0HwLgA3FLkSqnmS 149 | # Us2HD3vYYimkfjC9G7WMcrRI8uPoIfleTGJ5iwIGn3/VCwIDAQABo4IBUTCCAU0w 150 | # HwYDVR0jBBgwFoAUu69+Aj36pvE8hI6t7jiY7NkyMtQwHQYDVR0OBBYEFCmRYP+K 151 | # Tfrr+aZquM/55ku9Sc4SMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8ECDAGAQH/ 152 | # AgEAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMBEGA1UdIAQKMAgwBgYEVR0gADBMBgNV 153 | # HR8ERTBDMEGgP6A9hjtodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9SU0FD 154 | # ZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDBxBggrBgEFBQcBAQRlMGMwOwYIKwYB 155 | # BQUHMAKGL2h0dHA6Ly9jcnQuY29tb2RvY2EuY29tL0NPTU9ET1JTQUFkZFRydXN0 156 | # Q0EuY3J0MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wDQYJ 157 | # KoZIhvcNAQEMBQADggIBAAI/AjnD7vjKO4neDG1NsfFOkk+vwjgsBMzFYxGrCWOv 158 | # q6LXAj/MbxnDPdYaCJT/JdipiKcrEBrgm7EHIhpRHDrU4ekJv+YkdK8eexYxbiPv 159 | # VFEtUgLidQgFTPG3UeFRAMaH9mzuEER2V2rx31hrIapJ1Hw3Tr3/tnVUQBg2V2cR 160 | # zU8C5P7z2vx1F9vst/dlCSNJH0NXg+p+IHdhyE3yu2VNqPeFRQevemknZZApQIvf 161 | # ezpROYyoH3B5rW1CIKLPDGwDjEzNcweU51qOOgS6oqF8H8tjOhWn1BUbp1JHMqn0 162 | # v2RH0aofU04yMHPCb7d4gp1c/0a7ayIdiAv4G6o0pvyM9d1/ZYyMMVcx0DbsR6HP 163 | # y4uo7xwYWMUGd8pLm1GvTAhKeo/io1Lijo7MJuSy2OU4wqjtxoGcNWupWGFKCpe0 164 | # S0K2VZ2+medwbVn4bSoMfxlgXwyaiGwwrFIJkBYb/yud29AgyonqKH4yjhnfe0gz 165 | # Htdl+K7J+IMUk3Z9ZNCOzr41ff9yMU2fnr0ebC+ojwwGUPuMJ7N2yfTm18M04oyH 166 | # IYZh/r9VdOEhdwMKaGy75Mmp5s9ZJet87EUOeWZo6CLNuO+YhU2WETwJitB/vCgo 167 | # E/tqylSNklzNwmWYBp7OSFvUtTeTRkF8B93P+kPvumdh/31J4LswfVyA4+YWOUun 168 | # MYIEezCCBHcCAQEwgZIwfTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIg 169 | # TWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENB 170 | # IExpbWl0ZWQxIzAhBgNVBAMTGkNPTU9ETyBSU0EgQ29kZSBTaWduaW5nIENBAhEA 171 | # +CGT8y+uLXmA2UBOFe5VGzAJBgUrDgMCGgUAoHgwGAYKKwYBBAGCNwIBDDEKMAig 172 | # AoAAoQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgEL 173 | # MQ4wDAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQU4JPa1NrM1WTu13t+7zk0 174 | # OSIvwmMwDQYJKoZIhvcNAQEBBQAEggEAIlpHn6bTOSH7zy/wdJRevo5sdl/Ebf4c 175 | # MOGNx3B7pMhBv4vBfYiJQDYt3FvLgJQOBo5CDCmuAiBBozLsJAZgeiI9cECNdcZH 176 | # wYJOHk3To5N5HgrDwk9BKK3R4+4V3khBAgK8u0x1UatEqW4A3gkWgsVyafWTfLF8 177 | # d+0FxUK67sAk2lJfUxnKH1CvXHpB2965p9+PzaIt7riSTHG6I9A620uXdqiykuio 178 | # ba7qWNMzK3R5LN5Zywe4RhmiqU2PAVUMA0feZQcWaiwNjeQru5VRiCl/LYbJ9EWo 179 | # gOsJztzrLh02psBcvQDQhg/KSzi9lCeaFEYCCYonCSP4dlei9CZyOqGCAkMwggI/ 180 | # BgkqhkiG9w0BCQYxggIwMIICLAIBADCBqTCBlTELMAkGA1UEBhMCVVMxCzAJBgNV 181 | # BAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVT 182 | # RVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5j 183 | # b20xHTAbBgNVBAMTFFVUTi1VU0VSRmlyc3QtT2JqZWN0Ag8WiPA5JV5jjmkUOQfm 184 | # MwswCQYFKw4DAhoFAKBdMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZI 185 | # hvcNAQkFMQ8XDTE3MDExMjIzMDczMVowIwYJKoZIhvcNAQkEMRYEFCod9TMUaa2H 186 | # i0n3y1nf/ul4oRk8MA0GCSqGSIb3DQEBAQUABIIBAAPaYhjkmZgZynaRJUt13C/T 187 | # 1TN/vtviJVje9FDW+VHNSgDzoZWyII83XLhf4L2743ym1HR4dAhvWExLYC7Xe1bF 188 | # nxmPvSh2SMoIoLTS4vj0GvwARxwq5iSjdXuRNW9A/R1c8ywb0Aj1msru7lBODdhf 189 | # RIpaQtdJ/DcpOgHn4H8Wx/F2svBHHpQ3aFHq0XaIUTEUVj78SQCXDdN9Umi40Joe 190 | # BUCjIoDgsmR4yoYGG+kIXghKmeU7lih/P0vQgUFxUN5z/XVlHaS0GshYqVNUQNri 191 | # aO17sczBlCusMBm6xRnMi9ive9mr0cBxe2hF0GE8Og59ma8PsOJyi+vEzCelSEQ= 192 | # SIG # End signature block 193 | -------------------------------------------------------------------------------- /Code/Test-PathReg.ps1: -------------------------------------------------------------------------------- 1 | #requires -version 5.0 2 | ############################################################################### 3 | # WintellectPowerShell Module 4 | # Copyright (c) 2010-2017 - John Robbins/Wintellect 5 | # 6 | # Do whatever you want with this module, but please do give credit. 7 | ############################################################################### 8 | 9 | # Always make sure all variables are defined and all best practices are 10 | # followed. 11 | Set-StrictMode -version Latest 12 | 13 | ############################################################################### 14 | # Public Cmdlets 15 | ############################################################################### 16 | function Test-PathReg 17 | { 18 | <# 19 | .SYNOPSIS 20 | Validates the existence of a registry key 21 | 22 | .DESCRIPTION 23 | This function searches for the registry value (Property attribute) under the 24 | given registry key (Path attribute) and returns $true if it exists. 25 | Author: Can Dedeoglu (Thanks Can!) 26 | 27 | .PARAMETER Path 28 | Specifies the Registry path. 29 | 30 | .PARAMETER Property 31 | Specifies the name of the registry property that will be searched for under the 32 | given Registry path. 33 | 34 | .EXAMPLE 35 | C:\PS> Test-PathReg -Path HKLM:\SYSTEM\CurrentControlSet\services\Tcpip\Parameters -Property Hostname 36 | 37 | Checks to see if the Hostname property exists in the HKLM:\SYSTEM\CurrentControlSet\services\Tcpip\Parameters registry key 38 | 39 | .LINK 40 | http://blogs.msdn.com/candede 41 | 42 | #> 43 | param ( 44 | [Parameter(mandatory=$true,position=0)] 45 | [string]$Path, 46 | [Parameter(mandatory=$true,position=1)] 47 | [string]$Property ) 48 | 49 | $gipReturn = Get-ItemProperty -LiteralPath $Path -ErrorAction SilentlyContinue 50 | if ($null -eq $gipReturn) 51 | { 52 | return $false 53 | } 54 | 55 | $compare = $gipReturn.psbase.members | ` 56 | ForEach-Object {$_.name} | ` 57 | Compare-Object $Property -IncludeEqual -ExcludeDifferent 58 | if($null -eq $compare) 59 | { 60 | return $false 61 | } 62 | if($compare.SideIndicator -like "==") 63 | { 64 | return $true 65 | } 66 | else 67 | { 68 | return $false 69 | } 70 | } 71 | 72 | # SIG # Begin signature block 73 | # MIIaQwYJKoZIhvcNAQcCoIIaNDCCGjACAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB 74 | # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR 75 | # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUNk9kJNGEGSchJ4MYiFS5ehQ4 76 | # onCgghUyMIIEmTCCA4GgAwIBAgIPFojwOSVeY45pFDkH5jMLMA0GCSqGSIb3DQEB 77 | # BQUAMIGVMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQg 78 | # TGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNV 79 | # BAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTEdMBsGA1UEAxMUVVROLVVTRVJG 80 | # aXJzdC1PYmplY3QwHhcNMTUxMjMxMDAwMDAwWhcNMTkwNzA5MTg0MDM2WjCBhDEL 81 | # MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE 82 | # BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKjAoBgNVBAMT 83 | # IUNPTU9ETyBTSEEtMSBUaW1lIFN0YW1waW5nIFNpZ25lcjCCASIwDQYJKoZIhvcN 84 | # AQEBBQADggEPADCCAQoCggEBAOnpPd/XNwjJHjiyUlNCbSLxscQGBGue/YJ0UEN9 85 | # xqC7H075AnEmse9D2IOMSPznD5d6muuc3qajDjscRBh1jnilF2n+SRik4rtcTv6O 86 | # KlR6UPDV9syR55l51955lNeWM/4Og74iv2MWLKPdKBuvPavql9LxvwQQ5z1IRf0f 87 | # aGXBf1mZacAiMQxibqdcZQEhsGPEIhgn7ub80gA9Ry6ouIZWXQTcExclbhzfRA8V 88 | # zbfbpVd2Qm8AaIKZ0uPB3vCLlFdM7AiQIiHOIiuYDELmQpOUmJPv/QbZP7xbm1Q8 89 | # ILHuatZHesWrgOkwmt7xpD9VTQoJNIp1KdJprZcPUL/4ygkCAwEAAaOB9DCB8TAf 90 | # BgNVHSMEGDAWgBTa7WR0FJwUPKvdmam9WyhNizzJ2DAdBgNVHQ4EFgQUjmstM2v0 91 | # M6eTsxOapeAK9xI1aogwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwFgYD 92 | # VR0lAQH/BAwwCgYIKwYBBQUHAwgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2Ny 93 | # bC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmlyc3QtT2JqZWN0LmNybDA1BggrBgEF 94 | # BQcBAQQpMCcwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnVzZXJ0cnVzdC5jb20w 95 | # DQYJKoZIhvcNAQEFBQADggEBALozJEBAjHzbWJ+zYJiy9cAx/usfblD2CuDk5oGt 96 | # Joei3/2z2vRz8wD7KRuJGxU+22tSkyvErDmB1zxnV5o5NuAoCJrjOU+biQl/e8Vh 97 | # f1mJMiUKaq4aPvCiJ6i2w7iH9xYESEE9XNjsn00gMQTZZaHtzWkHUxY93TYCCojr 98 | # QOUGMAu4Fkvc77xVCf/GPhIudrPczkLv+XZX4bcKBUCYWJpdcRaTcYxlgepv84n3 99 | # +3OttOe/2Y5vqgtPJfO44dXddZhogfiqwNGAwsTEOYnB9smebNd0+dmX+E/CmgrN 100 | # Xo/4GengpZ/E8JIh5i15Jcki+cPwOoRXrToW9GOUEB1d0MYwggU1MIIEHaADAgEC 101 | # AhEA+CGT8y+uLXmA2UBOFe5VGzANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJH 102 | # QjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3Jk 103 | # MRowGAYDVQQKExFDT01PRE8gQ0EgTGltaXRlZDEjMCEGA1UEAxMaQ09NT0RPIFJT 104 | # QSBDb2RlIFNpZ25pbmcgQ0EwHhcNMTYwMjE4MDAwMDAwWhcNMTgxMDI4MjM1OTU5 105 | # WjCBnTELMAkGA1UEBhMCVVMxDjAMBgNVBBEMBTM3OTMyMQswCQYDVQQIDAJUTjES 106 | # MBAGA1UEBwwJS25veHZpbGxlMRIwEAYDVQQJDAlTdWl0ZSAzMDIxHzAdBgNVBAkM 107 | # FjEwMjA3IFRlY2hub2xvZ3kgRHJpdmUxEzARBgNVBAoMCldpbnRlbGxlY3QxEzAR 108 | # BgNVBAMMCldpbnRlbGxlY3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB 109 | # AQDfLujuIe3yrrTfTOdYfstwFDZrI7XezoeFPA33GRxY/MSbKuUvPcN8XqU8Jpg4 110 | # NUkByzoSjPsq9Yjx3anHflcNendqa/8gbkPdiEMg+6kRVmtv1QHfGt+UbEMfrUk0 111 | # Ltm0DE+6OIZFx8hjsxifJvWrQ/jG9lat6e2YwIdNAqyG2htqCrmBN90lW+0+zU9s 112 | # YJIVD0ZfyZJVkvbeay+HwlbojW7JQyyhdGOSa61zUqlD85RX6HzcCbb1WHf5bZRO 113 | # 2idaVNAOw1YHqJAUjY4oJY4lqWwg5Inza4f33Wt82zJAgKY4S01bddkvjPi6iMnG 114 | # y8bI1EfWAdFFC+UM2qKsNc2/AgMBAAGjggGNMIIBiTAfBgNVHSMEGDAWgBQpkWD/ 115 | # ik366/mmarjP+eZLvUnOEjAdBgNVHQ4EFgQUZdNFdxzRtMVCZCvcFV4g7vsL8vgw 116 | # DgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwEwYDVR0lBAwwCgYIKwYBBQUH 117 | # AwMwEQYJYIZIAYb4QgEBBAQDAgQQMEYGA1UdIAQ/MD0wOwYMKwYBBAGyMQECAQMC 118 | # MCswKQYIKwYBBQUHAgEWHWh0dHBzOi8vc2VjdXJlLmNvbW9kby5uZXQvQ1BTMEMG 119 | # A1UdHwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL0NPTU9ET1JT 120 | # QUNvZGVTaWduaW5nQ0EuY3JsMHQGCCsGAQUFBwEBBGgwZjA+BggrBgEFBQcwAoYy 121 | # aHR0cDovL2NydC5jb21vZG9jYS5jb20vQ09NT0RPUlNBQ29kZVNpZ25pbmdDQS5j 122 | # cnQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9kb2NhLmNvbTANBgkqhkiG 123 | # 9w0BAQsFAAOCAQEAnSVG6TXbazSxczonyo/Q+pjX+6JERtMZ0sz3Fc3PTMDcb9DS 124 | # tALjZiZhOgOoRNC+5OHgE3tTPLCT6ZGktfedzp6J9mICzoJIIBelfdiIwJNkPTzR 125 | # I2krUn/6ld5coh0zyM85lCjXkqzZmyQmRRNQoycWtxUwxsNlkiGlRIiIJHztbg1I 126 | # lv9C90zCZ1nAhfOpv+maUohLtz22F9wXCJuIUQapOhPG5n/opM/AUQV2WuDa3AZP 127 | # VYleK90zOgHLDgLICxrx57z2JRlXyW2ga2N5J6DXzwGmxpCe0LbzYCj4h42SjUuf 128 | # 9hOQtORlSjYEj8RFpxatyxcmIIpej9/NDNXgIzCCBXQwggRcoAMCAQICECdm7lbr 129 | # SfOOq9dwovyE3iIwDQYJKoZIhvcNAQEMBQAwbzELMAkGA1UEBhMCU0UxFDASBgNV 130 | # BAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5hbCBUVFAg 131 | # TmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9vdDAeFw0w 132 | # MDA1MzAxMDQ4MzhaFw0yMDA1MzAxMDQ4MzhaMIGFMQswCQYDVQQGEwJHQjEbMBkG 133 | # A1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYD 134 | # VQQKExFDT01PRE8gQ0EgTGltaXRlZDErMCkGA1UEAxMiQ09NT0RPIFJTQSBDZXJ0 135 | # aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC 136 | # ggIBAJHoVJLSClaxrA0k3cXPRGd0mSs3o30jcABxvFPfxPoqEo9LfxBWvZ9wcrdh 137 | # f8lLDxenPeOwBGHu/xGXx/SGPgr6Plz5k+Y0etkUa+ecs4Wggnp2r3GQ1+z9Dfqc 138 | # bPrfsIL0FH75vsSmL09/mX+1/GdDcr0MANaJ62ss0+2PmBwUq37l42782KjkkiTa 139 | # Q2tiuFX96sG8bLaL8w6NmuSbbGmZ+HhIMEXVreENPEVg/DKWUSe8Z8PKLrZr6kbH 140 | # xyCgsR9l3kgIuqROqfKDRjeE6+jMgUhDZ05yKptcvUwbKIpcInu0q5jZ7uBRg8MJ 141 | # Rk5tPpn6lRfafDNXQTyNUe0LtlyvLGMa31fIP7zpXcSbr0WZ4qNaJLS6qVY9z2+q 142 | # /0lYvvCo//S4rek3+7q49As6+ehDQh6J2ITLE/HZu+GJYLiMKFasFB2cCudx688O 143 | # 3T2plqFIvTz3r7UNIkzAEYHsVjv206LiW7eyBCJSlYCTaeiOTGXxkQMtcHQC6otn 144 | # FSlpUgK7199QalVGv6CjKGF/cNDDoqosIapHziicBkV2v4IYJ7TVrrTLUOZr9EyG 145 | # cTDppt8WhuDY/0Dd+9BCiH+jMzouXB5BEYFjzhhxayvspoq3MVw6akfgw3lZ1iAa 146 | # r/JqmKpyvFdK0kuduxD8sExB5e0dPV4onZzMv7NR2qdH5YRTAgMBAAGjgfQwgfEw 147 | # HwYDVR0jBBgwFoAUrb2YejS0Jvf6xCZU7wO94CTLVBowHQYDVR0OBBYEFLuvfgI9 148 | # +qbxPISOre44mOzZMjLUMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/ 149 | # MBEGA1UdIAQKMAgwBgYEVR0gADBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vY3Js 150 | # LnVzZXJ0cnVzdC5jb20vQWRkVHJ1c3RFeHRlcm5hbENBUm9vdC5jcmwwNQYIKwYB 151 | # BQUHAQEEKTAnMCUGCCsGAQUFBzABhhlodHRwOi8vb2NzcC51c2VydHJ1c3QuY29t 152 | # MA0GCSqGSIb3DQEBDAUAA4IBAQBkv4PxX5qF0M24oSlXDeha99HpPvJ2BG7xUnC7 153 | # Hjz/TQ10asyBgiXTw6AqXUz1uouhbcRUCXXH4ycOXYR5N0ATd/W0rBzQO6sXEtbv 154 | # NBh+K+l506tXRQyvKPrQ2+VQlYi734VXaX2S2FLKc4G/HPPmuG5mEQWzHpQtf5GV 155 | # klnxTM6jkXFMfEcMOwsZ9qGxbIY+XKrELoLL+QeWukhNkPKUyKlzousGeyOd3qLz 156 | # TVWfemFFmBhox15AayP1eXrvjLVri7dvRvR78T1LBNiTgFla4EEkHbKPFWBYR9vv 157 | # bkb9FfXZX5qz29i45ECzzZc5roW7HY683Ieb0abv8TtvEDhvMIIF4DCCA8igAwIB 158 | # AgIQLnyHzA6TSlL+lP0ct800rzANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UEBhMC 159 | # R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9y 160 | # ZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBS 161 | # U0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTMwNTA5MDAwMDAwWhcNMjgw 162 | # NTA4MjM1OTU5WjB9MQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3JlYXRlciBNYW5j 163 | # aGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01PRE8gQ0EgTGlt 164 | # aXRlZDEjMCEGA1UEAxMaQ09NT0RPIFJTQSBDb2RlIFNpZ25pbmcgQ0EwggEiMA0G 165 | # CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCmmJBjd5E0f4rR3elnMRHrzB79MR2z 166 | # uWJXP5O8W+OfHiQyESdrvFGRp8+eniWzX4GoGA8dHiAwDvthe4YJs+P9omidHCyd 167 | # v3Lj5HWg5TUjjsmK7hoMZMfYQqF7tVIDSzqwjiNLS2PgIpQ3e9V5kAoUGFEs5v7B 168 | # EvAcP2FhCoyi3PbDMKrNKBh1SMF5WgjNu4xVjPfUdpA6M0ZQc5hc9IVKaw+A3V7W 169 | # vf2pL8Al9fl4141fEMJEVTyQPDFGy3CuB6kK46/BAW+QGiPiXzjbxghdR7ODQfAu 170 | # ADcUuRKqeZJSzYcPe9hiKaR+ML0btYxytEjy4+gh+V5MYnmLAgaff9ULAgMBAAGj 171 | # ggFRMIIBTTAfBgNVHSMEGDAWgBS7r34CPfqm8TyEjq3uOJjs2TIy1DAdBgNVHQ4E 172 | # FgQUKZFg/4pN+uv5pmq4z/nmS71JzhIwDgYDVR0PAQH/BAQDAgGGMBIGA1UdEwEB 173 | # /wQIMAYBAf8CAQAwEwYDVR0lBAwwCgYIKwYBBQUHAwMwEQYDVR0gBAowCDAGBgRV 174 | # HSAAMEwGA1UdHwRFMEMwQaA/oD2GO2h0dHA6Ly9jcmwuY29tb2RvY2EuY29tL0NP 175 | # TU9ET1JTQUNlcnRpZmljYXRpb25BdXRob3JpdHkuY3JsMHEGCCsGAQUFBwEBBGUw 176 | # YzA7BggrBgEFBQcwAoYvaHR0cDovL2NydC5jb21vZG9jYS5jb20vQ09NT0RPUlNB 177 | # QWRkVHJ1c3RDQS5jcnQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9kb2Nh 178 | # LmNvbTANBgkqhkiG9w0BAQwFAAOCAgEAAj8COcPu+Mo7id4MbU2x8U6ST6/COCwE 179 | # zMVjEasJY6+rotcCP8xvGcM91hoIlP8l2KmIpysQGuCbsQciGlEcOtTh6Qm/5iR0 180 | # rx57FjFuI+9UUS1SAuJ1CAVM8bdR4VEAxof2bO4QRHZXavHfWGshqknUfDdOvf+2 181 | # dVRAGDZXZxHNTwLk/vPa/HUX2+y392UJI0kfQ1eD6n4gd2HITfK7ZU2o94VFB696 182 | # aSdlkClAi997OlE5jKgfcHmtbUIgos8MbAOMTM1zB5TnWo46BLqioXwfy2M6FafU 183 | # FRunUkcyqfS/ZEfRqh9TTjIwc8Jvt3iCnVz/RrtrIh2IC/gbqjSm/Iz13X9ljIwx 184 | # VzHQNuxHoc/Li6jvHBhYxQZ3ykubUa9MCEp6j+KjUuKOjswm5LLY5TjCqO3GgZw1 185 | # a6lYYUoKl7RLQrZVnb6Z53BtWfhtKgx/GWBfDJqIbDCsUgmQFhv/K53b0CDKieoo 186 | # fjKOGd97SDMe12X4rsn4gxSTdn1k0I7OvjV9/3IxTZ+evR5sL6iPDAZQ+4wns3bJ 187 | # 9ObXwzTijIchhmH+v1V04SF3AwpobLvkyanmz1kl63zsRQ55ZmjoIs2475iFTZYR 188 | # PAmK0H+8KCgT+2rKVI2SXM3CZZgGns5IW9S1N5NGQXwH3c/6Q++6Z2H/fUnguzB9 189 | # XIDj5hY5S6cxggR7MIIEdwIBATCBkjB9MQswCQYDVQQGEwJHQjEbMBkGA1UECBMS 190 | # R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD 191 | # T01PRE8gQ0EgTGltaXRlZDEjMCEGA1UEAxMaQ09NT0RPIFJTQSBDb2RlIFNpZ25p 192 | # bmcgQ0ECEQD4IZPzL64teYDZQE4V7lUbMAkGBSsOAwIaBQCgeDAYBgorBgEEAYI3 193 | # AgEMMQowCKACgAChAoAAMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisG 194 | # AQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMCMGCSqGSIb3DQEJBDEWBBTvcp8hYByd 195 | # luwPvQ8kuIPfpDpBTTANBgkqhkiG9w0BAQEFAASCAQAie61lNDGwO0izg3LcLaWm 196 | # /NJ95A4KY0J0CZ79ojBRElKzXWYCf/Rgg5vUaDbq6jK1nasCyqGFVpPSGzUnaMzl 197 | # PkjBMs7SwlmHB4A8s+k2NaTq1c9JPIn8UI0fp8alO8gCkne4VR0OEeIwvzsSvMm0 198 | # RFEoAFSEgObOY6OrBSqKALnbIFM/fLPKMiY5+AafmGesSmyLMHDWp5lMfCCSU0P5 199 | # FHg4tKV3D5lTocm+p9R7y1nh4O2NlmkUv4DIBZ3azA6/e7Djic03h51OmLmzKrn4 200 | # 8HA4cRJHGVvcwqXKL+8Lp46UEhpAVcJRYQ8/kXyEOYSCJCNj+aVDTLGDhEAzGiSz 201 | # oYICQzCCAj8GCSqGSIb3DQEJBjGCAjAwggIsAgEBMIGpMIGVMQswCQYDVQQGEwJV 202 | # UzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQK 203 | # ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNl 204 | # cnRydXN0LmNvbTEdMBsGA1UEAxMUVVROLVVTRVJGaXJzdC1PYmplY3QCDxaI8Dkl 205 | # XmOOaRQ5B+YzCzAJBgUrDgMCGgUAoF0wGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEH 206 | # ATAcBgkqhkiG9w0BCQUxDxcNMTcwMjE4MTk0OTEyWjAjBgkqhkiG9w0BCQQxFgQU 207 | # c6tqSefRr9NMDnhiKubYxlD8ovYwDQYJKoZIhvcNAQEBBQAEggEAzYUElfMW2j9J 208 | # p80rrDcQCLtbjnq66PgUKhaJ/S6VG1N6Y0jkcBqB9b8ZVSpgGynUErkRfSgJ9BKB 209 | # IMHXvaWLPKgghqJFdPkQ1OBOBac21nU/yE46I7A/XK8zIM76A9W8FHmcqtKSyBbo 210 | # ZJg/2fOOYdPbNPv3VjB13RIIM5ZI22EIA4ksjcN2Dwhl7oG+qQ2FKK2nzRRwb5Au 211 | # oda24DHyvmlnDMUNTJnQdi6KPGI1N7ommCaUI53zCTJmkMlH3A4D4Zr6NIFgB7LL 212 | # P9412zHXRJFO2RWQWFidY1nX9KphIy0XKli7u5nTyuxGAWOTWU60n3NhucQk8YEz 213 | # c8rqr/ihCw== 214 | # SIG # End signature block 215 | -------------------------------------------------------------------------------- /Code/WintellectPowerShellHelper.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Wintellect/WintellectPowerShell/43cdadad1fa23ab1ac53b5517ce5b98e569d6ccd/Code/WintellectPowerShellHelper.dll -------------------------------------------------------------------------------- /License.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2015 Wintellect. All rights reserved. 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); you may not use 4 | these files except in compliance with the License. You may obtain a copy of the 5 | License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software distributed 10 | under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR 11 | CONDITIONS OF ANY KIND, either express or implied. See the License for the 12 | specific language governing permissions and limitations under the License. -------------------------------------------------------------------------------- /ReadMe.md: -------------------------------------------------------------------------------- 1 | # Wintellect PowerShell Module # 2 | 3 | After posting many random PowerShell scripts in my [blog ](http://www.wintellect.com/devcenter/author/jrobbins), I packaged them up into a common module to make sharing and incorporating easier. Please fork and let me know if there's any bugs you find. I hope you find it useful. 4 | 5 | WintellectPowerShell is in the [PowerShell Gallery](https://www.powershellgallery.com/packages/WintellectPowerShell/). To install, execute the following command: 6 | 7 | Install-Module -Name WintellectPowerShell -Scope CurrentUser 8 | 9 | If you had a previous version of WintellectPowerShell installed and you get an error about the 'Authenticode issuer' that is because I had to renew my code signature file. Add the -SkipPublisherCheck to the above command. All required files are properly digitally signed. 10 | 11 | Here's the about text showing all cmdlets. Of course, all cmdlets have detailed help for more information. 12 | 13 | TOPIC 14 | about_WintellectPowerShell 15 | 16 | SHORT DESCRIPTION 17 | Provides cmdlets for setting up symbol servers and other 18 | functionality related to debugging and performance tuning. 19 | 20 | LONG DESCRIPTION 21 | This module makes setting up symbol servers and source server debugging 22 | functionality easier to control for Visual Studio 2013 through 2017 23 | and WinDBG. Setting up a development machine for symbol server 24 | access is more difficult than it needs to be but no more. 25 | 26 | You can have any combination of Visual Studio 2013 through 2017, and 27 | WinDBG on the computer for these cmdlets to work. 28 | 29 | These cmdlets had been originally developed as PowerShell scripts by John 30 | Robbins and released on his blog. This module combines all the separate 31 | scripts to make everything easier to manage. 32 | 33 | If you have any questions, suggestions, or bug reports, please contact John 34 | at john@wintellect.com. 35 | 36 | The following cmdlets are included. 37 | 38 | 39 | Cmdlet Description 40 | ------------------ ---------------------------------------------- 41 | Set-SymbolAndSourceServer Sets up a computer to use a symbol and source 42 | server. (Combines Set-SymbolServer and 43 | Set-Source Server) 44 | 45 | Set-SymbolServer Sets up a computer to use a symbol server. 46 | 47 | Get-SymbolServer Returns a hashtable of the current symbol 48 | server settings. 49 | 50 | Set-SourceServer Sets the source server directory. 51 | 52 | Get-SourceServer Returns a hashtable of the current source 53 | server settings 54 | 55 | Get-SourceServerFiles Prepopulate your symbol cache with all your 56 | Source Server extracted source code. 57 | 58 | Get-SysinternalsSuite Gets all the wonderful Sysinternals tools 59 | 60 | Get-Uptime Returns how long a computer has been running. 61 | 62 | Test-PathReg Utility function to test is a registry key 63 | property exists in a key. 64 | 65 | Remove-IntelliTraceFiles Removes no longer needed IntelliTrace files. 66 | 67 | Compare-Directories Compares two directories. 68 | 69 | Merge-HashTables Utility function to merge two hash tables 70 | together. 71 | 72 | Set-ProjectProperties Makes setting Visual Studio project options 73 | super easy. 74 | 75 | Add-NgenPdbs Easily create PDB files from NGEN'd images on 76 | a machine. 77 | 78 | Set-Environment Alias to "set" to bring the DOS set command 79 | to PowerShell. 80 | 81 | Invoke-CmdScript Executes a CMD script and imports the 82 | environment variables set in the script to 83 | the current PowerShell instance. 84 | 85 | Import-VisualStudioEnvironment Executes the specified Visual Studio 86 | VCVARSALL.BAT file importing the environment 87 | variables into PowerShell for command line 88 | usage. 89 | 90 | Set-Signatures Makes digitally signing files a lot easier by 91 | looking for the first non-Azure code signing 92 | file and picking the timestamp server. 93 | 94 | Get-DumpAnalysis Automates analyzing a bunch of minidump 95 | files using CDB and debug scripts. 96 | 97 | 98 | SEE ALSO 99 | Online help and updates: 100 | http://www.wintellect.com/devcenter/author/jrobbins 101 | GitHub repository : 102 | https://github.com/Wintellect/WintellectPowerShell -------------------------------------------------------------------------------- /Support/SignWintellectPowerShell.ps1: -------------------------------------------------------------------------------- 1 | Set-StrictMode -version Latest 2 | 3 | $cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0] 4 | $timeServer = "http://timestamp.comodoca.com/authenticode" 5 | # Build my list of files to sign. 6 | $files = Get-ChildItem -Path ..\Code\*.* -Include *.ps*,*.dll 7 | $files += Get-ChildItem -Path ..\* -Include *.ps* 8 | 9 | Set-AuthenticodeSignature -FilePath $files -Certificate $cert -TimestampServer $timeServer 10 | -------------------------------------------------------------------------------- /Support/UpdateSignatures.ps1: -------------------------------------------------------------------------------- 1 | Get-ChildItem -Recurse ..\*.ps* -Exclude *Support* | Get-AuthenticodeSignature | Where-Object { $_.Status -eq "HashMismatch"} | Select-Object Path | ForEach-Object { $_.Path } | Set-Signatures -------------------------------------------------------------------------------- /Support/UploadWintellectPowerShell.ps1: -------------------------------------------------------------------------------- 1 | param 2 | ( 3 | [Parameter(Mandatory=$true, 4 | HelpMessage="Please specify the api key")] 5 | [string] $apiKey 6 | ) 7 | 8 | Publish-Module -NuGetApiKey $apiKey -Path ..\ -Verbose 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /WintellectPowerShell.psd1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Wintellect/WintellectPowerShell/43cdadad1fa23ab1ac53b5517ce5b98e569d6ccd/WintellectPowerShell.psd1 -------------------------------------------------------------------------------- /WintellectPowerShell.psm1: -------------------------------------------------------------------------------- 1 | #requires -version 5.0 2 | ############################################################################### 3 | # WintellectPowerShell Module 4 | # Copyright (c) 2010-2017 - John Robbins/Wintellect 5 | # 6 | # Do whatever you want with this module, but please do give credit. 7 | ############################################################################### 8 | 9 | # Sub module directory 10 | $script:CodeDirectory = "$psScriptRoot\Code" 11 | 12 | Get-ChildItem -Path $script:CodeDirectory -Filter *.ps1 | ` 13 | ForEach-Object { . $_.FullName } 14 | 15 | # SIG # Begin signature block 16 | # MIIUywYJKoZIhvcNAQcCoIIUvDCCFLgCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB 17 | # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR 18 | # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQU0Zj++xGbIqNX3PhA8wgdTWac 19 | # 3HWggg+6MIIEmTCCA4GgAwIBAgIPFojwOSVeY45pFDkH5jMLMA0GCSqGSIb3DQEB 20 | # BQUAMIGVMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQg 21 | # TGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNV 22 | # BAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTEdMBsGA1UEAxMUVVROLVVTRVJG 23 | # aXJzdC1PYmplY3QwHhcNMTUxMjMxMDAwMDAwWhcNMTkwNzA5MTg0MDM2WjCBhDEL 24 | # MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE 25 | # BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKjAoBgNVBAMT 26 | # IUNPTU9ETyBTSEEtMSBUaW1lIFN0YW1waW5nIFNpZ25lcjCCASIwDQYJKoZIhvcN 27 | # AQEBBQADggEPADCCAQoCggEBAOnpPd/XNwjJHjiyUlNCbSLxscQGBGue/YJ0UEN9 28 | # xqC7H075AnEmse9D2IOMSPznD5d6muuc3qajDjscRBh1jnilF2n+SRik4rtcTv6O 29 | # KlR6UPDV9syR55l51955lNeWM/4Og74iv2MWLKPdKBuvPavql9LxvwQQ5z1IRf0f 30 | # aGXBf1mZacAiMQxibqdcZQEhsGPEIhgn7ub80gA9Ry6ouIZWXQTcExclbhzfRA8V 31 | # zbfbpVd2Qm8AaIKZ0uPB3vCLlFdM7AiQIiHOIiuYDELmQpOUmJPv/QbZP7xbm1Q8 32 | # ILHuatZHesWrgOkwmt7xpD9VTQoJNIp1KdJprZcPUL/4ygkCAwEAAaOB9DCB8TAf 33 | # BgNVHSMEGDAWgBTa7WR0FJwUPKvdmam9WyhNizzJ2DAdBgNVHQ4EFgQUjmstM2v0 34 | # M6eTsxOapeAK9xI1aogwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwFgYD 35 | # VR0lAQH/BAwwCgYIKwYBBQUHAwgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2Ny 36 | # bC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmlyc3QtT2JqZWN0LmNybDA1BggrBgEF 37 | # BQcBAQQpMCcwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnVzZXJ0cnVzdC5jb20w 38 | # DQYJKoZIhvcNAQEFBQADggEBALozJEBAjHzbWJ+zYJiy9cAx/usfblD2CuDk5oGt 39 | # Joei3/2z2vRz8wD7KRuJGxU+22tSkyvErDmB1zxnV5o5NuAoCJrjOU+biQl/e8Vh 40 | # f1mJMiUKaq4aPvCiJ6i2w7iH9xYESEE9XNjsn00gMQTZZaHtzWkHUxY93TYCCojr 41 | # QOUGMAu4Fkvc77xVCf/GPhIudrPczkLv+XZX4bcKBUCYWJpdcRaTcYxlgepv84n3 42 | # +3OttOe/2Y5vqgtPJfO44dXddZhogfiqwNGAwsTEOYnB9smebNd0+dmX+E/CmgrN 43 | # Xo/4GengpZ/E8JIh5i15Jcki+cPwOoRXrToW9GOUEB1d0MYwggU1MIIEHaADAgEC 44 | # AhEA+CGT8y+uLXmA2UBOFe5VGzANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJH 45 | # QjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3Jk 46 | # MRowGAYDVQQKExFDT01PRE8gQ0EgTGltaXRlZDEjMCEGA1UEAxMaQ09NT0RPIFJT 47 | # QSBDb2RlIFNpZ25pbmcgQ0EwHhcNMTYwMjE4MDAwMDAwWhcNMTgxMDI4MjM1OTU5 48 | # WjCBnTELMAkGA1UEBhMCVVMxDjAMBgNVBBEMBTM3OTMyMQswCQYDVQQIDAJUTjES 49 | # MBAGA1UEBwwJS25veHZpbGxlMRIwEAYDVQQJDAlTdWl0ZSAzMDIxHzAdBgNVBAkM 50 | # FjEwMjA3IFRlY2hub2xvZ3kgRHJpdmUxEzARBgNVBAoMCldpbnRlbGxlY3QxEzAR 51 | # BgNVBAMMCldpbnRlbGxlY3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB 52 | # AQDfLujuIe3yrrTfTOdYfstwFDZrI7XezoeFPA33GRxY/MSbKuUvPcN8XqU8Jpg4 53 | # NUkByzoSjPsq9Yjx3anHflcNendqa/8gbkPdiEMg+6kRVmtv1QHfGt+UbEMfrUk0 54 | # Ltm0DE+6OIZFx8hjsxifJvWrQ/jG9lat6e2YwIdNAqyG2htqCrmBN90lW+0+zU9s 55 | # YJIVD0ZfyZJVkvbeay+HwlbojW7JQyyhdGOSa61zUqlD85RX6HzcCbb1WHf5bZRO 56 | # 2idaVNAOw1YHqJAUjY4oJY4lqWwg5Inza4f33Wt82zJAgKY4S01bddkvjPi6iMnG 57 | # y8bI1EfWAdFFC+UM2qKsNc2/AgMBAAGjggGNMIIBiTAfBgNVHSMEGDAWgBQpkWD/ 58 | # ik366/mmarjP+eZLvUnOEjAdBgNVHQ4EFgQUZdNFdxzRtMVCZCvcFV4g7vsL8vgw 59 | # DgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwEwYDVR0lBAwwCgYIKwYBBQUH 60 | # AwMwEQYJYIZIAYb4QgEBBAQDAgQQMEYGA1UdIAQ/MD0wOwYMKwYBBAGyMQECAQMC 61 | # MCswKQYIKwYBBQUHAgEWHWh0dHBzOi8vc2VjdXJlLmNvbW9kby5uZXQvQ1BTMEMG 62 | # A1UdHwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL0NPTU9ET1JT 63 | # QUNvZGVTaWduaW5nQ0EuY3JsMHQGCCsGAQUFBwEBBGgwZjA+BggrBgEFBQcwAoYy 64 | # aHR0cDovL2NydC5jb21vZG9jYS5jb20vQ09NT0RPUlNBQ29kZVNpZ25pbmdDQS5j 65 | # cnQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9kb2NhLmNvbTANBgkqhkiG 66 | # 9w0BAQsFAAOCAQEAnSVG6TXbazSxczonyo/Q+pjX+6JERtMZ0sz3Fc3PTMDcb9DS 67 | # tALjZiZhOgOoRNC+5OHgE3tTPLCT6ZGktfedzp6J9mICzoJIIBelfdiIwJNkPTzR 68 | # I2krUn/6ld5coh0zyM85lCjXkqzZmyQmRRNQoycWtxUwxsNlkiGlRIiIJHztbg1I 69 | # lv9C90zCZ1nAhfOpv+maUohLtz22F9wXCJuIUQapOhPG5n/opM/AUQV2WuDa3AZP 70 | # VYleK90zOgHLDgLICxrx57z2JRlXyW2ga2N5J6DXzwGmxpCe0LbzYCj4h42SjUuf 71 | # 9hOQtORlSjYEj8RFpxatyxcmIIpej9/NDNXgIzCCBeAwggPIoAMCAQICEC58h8wO 72 | # k0pS/pT9HLfNNK8wDQYJKoZIhvcNAQEMBQAwgYUxCzAJBgNVBAYTAkdCMRswGQYD 73 | # VQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxGjAYBgNV 74 | # BAoTEUNPTU9ETyBDQSBMaW1pdGVkMSswKQYDVQQDEyJDT01PRE8gUlNBIENlcnRp 75 | # ZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDUwOTAwMDAwMFoXDTI4MDUwODIzNTk1 76 | # OVowfTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQ 77 | # MA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxIzAh 78 | # BgNVBAMTGkNPTU9ETyBSU0EgQ29kZSBTaWduaW5nIENBMIIBIjANBgkqhkiG9w0B 79 | # AQEFAAOCAQ8AMIIBCgKCAQEAppiQY3eRNH+K0d3pZzER68we/TEds7liVz+TvFvj 80 | # nx4kMhEna7xRkafPnp4ls1+BqBgPHR4gMA77YXuGCbPj/aJonRwsnb9y4+R1oOU1 81 | # I47Jiu4aDGTH2EKhe7VSA0s6sI4jS0tj4CKUN3vVeZAKFBhRLOb+wRLwHD9hYQqM 82 | # otz2wzCqzSgYdUjBeVoIzbuMVYz31HaQOjNGUHOYXPSFSmsPgN1e1r39qS/AJfX5 83 | # eNeNXxDCRFU8kDwxRstwrgepCuOvwQFvkBoj4l8428YIXUezg0HwLgA3FLkSqnmS 84 | # Us2HD3vYYimkfjC9G7WMcrRI8uPoIfleTGJ5iwIGn3/VCwIDAQABo4IBUTCCAU0w 85 | # HwYDVR0jBBgwFoAUu69+Aj36pvE8hI6t7jiY7NkyMtQwHQYDVR0OBBYEFCmRYP+K 86 | # Tfrr+aZquM/55ku9Sc4SMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8ECDAGAQH/ 87 | # AgEAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMBEGA1UdIAQKMAgwBgYEVR0gADBMBgNV 88 | # HR8ERTBDMEGgP6A9hjtodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9SU0FD 89 | # ZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDBxBggrBgEFBQcBAQRlMGMwOwYIKwYB 90 | # BQUHMAKGL2h0dHA6Ly9jcnQuY29tb2RvY2EuY29tL0NPTU9ET1JTQUFkZFRydXN0 91 | # Q0EuY3J0MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wDQYJ 92 | # KoZIhvcNAQEMBQADggIBAAI/AjnD7vjKO4neDG1NsfFOkk+vwjgsBMzFYxGrCWOv 93 | # q6LXAj/MbxnDPdYaCJT/JdipiKcrEBrgm7EHIhpRHDrU4ekJv+YkdK8eexYxbiPv 94 | # VFEtUgLidQgFTPG3UeFRAMaH9mzuEER2V2rx31hrIapJ1Hw3Tr3/tnVUQBg2V2cR 95 | # zU8C5P7z2vx1F9vst/dlCSNJH0NXg+p+IHdhyE3yu2VNqPeFRQevemknZZApQIvf 96 | # ezpROYyoH3B5rW1CIKLPDGwDjEzNcweU51qOOgS6oqF8H8tjOhWn1BUbp1JHMqn0 97 | # v2RH0aofU04yMHPCb7d4gp1c/0a7ayIdiAv4G6o0pvyM9d1/ZYyMMVcx0DbsR6HP 98 | # y4uo7xwYWMUGd8pLm1GvTAhKeo/io1Lijo7MJuSy2OU4wqjtxoGcNWupWGFKCpe0 99 | # S0K2VZ2+medwbVn4bSoMfxlgXwyaiGwwrFIJkBYb/yud29AgyonqKH4yjhnfe0gz 100 | # Htdl+K7J+IMUk3Z9ZNCOzr41ff9yMU2fnr0ebC+ojwwGUPuMJ7N2yfTm18M04oyH 101 | # IYZh/r9VdOEhdwMKaGy75Mmp5s9ZJet87EUOeWZo6CLNuO+YhU2WETwJitB/vCgo 102 | # E/tqylSNklzNwmWYBp7OSFvUtTeTRkF8B93P+kPvumdh/31J4LswfVyA4+YWOUun 103 | # MYIEezCCBHcCAQEwgZIwfTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIg 104 | # TWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENB 105 | # IExpbWl0ZWQxIzAhBgNVBAMTGkNPTU9ETyBSU0EgQ29kZSBTaWduaW5nIENBAhEA 106 | # +CGT8y+uLXmA2UBOFe5VGzAJBgUrDgMCGgUAoHgwGAYKKwYBBAGCNwIBDDEKMAig 107 | # AoAAoQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgEL 108 | # MQ4wDAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQUVzlJsl1yx5pzrR2R6zzw 109 | # cFfAvm8wDQYJKoZIhvcNAQEBBQAEggEAoDJpdeb3bVwdDRhg9fJvEKI+RXasAJ7a 110 | # ZrjJRc/bDItHTB7vLbmCe0/d3gyTkkljxOCFqDAjWyLz3ETP7+0oslKd/EbykBJF 111 | # INPXh3yzStcE7Si4pWrZxck7mT76v4VDF/hChNsGRORmu5u+BFE0N/tn/KoYisac 112 | # xCqSF0umjP7m6QIgjQ3fyZaeTpNgJrgYgszK5jbfFQqD7ZScJ6TpjkMh1gPkMqJz 113 | # tMfJd8UKUygCceFA4r5AxdZ8VO8dGibiI+/p2ZjIRb20eaW5ZM3C0z8P+aCQ/3y9 114 | # 4kXs9x7EcycVg229bBgdyrsJpe8mP7tcaNOeXIF4gn54u2rlPIcgL6GCAkMwggI/ 115 | # BgkqhkiG9w0BCQYxggIwMIICLAIBADCBqTCBlTELMAkGA1UEBhMCVVMxCzAJBgNV 116 | # BAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVT 117 | # RVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5j 118 | # b20xHTAbBgNVBAMTFFVUTi1VU0VSRmlyc3QtT2JqZWN0Ag8WiPA5JV5jjmkUOQfm 119 | # MwswCQYFKw4DAhoFAKBdMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZI 120 | # hvcNAQkFMQ8XDTE3MDExMjIzMDc0NlowIwYJKoZIhvcNAQkEMRYEFABi5/VUyH4I 121 | # FqIBwzB09QnG/vAJMA0GCSqGSIb3DQEBAQUABIIBAH22M731JZV5g5zxRDSoE0O5 122 | # lGogCNTb6x3pR8qmq75TicpME4kkhqcwvJhTyPX2QzMPvGTgFVccbVlzyi34Tkjy 123 | # fS3xOgHba72WWDSMl8d27WhN6KLMHfOjFhoc6MFDF96rXv/q+xYvHOAUC3Tr/ZZw 124 | # JJqQSccgvcsQ1cVWNMhfDi/J42IOdfs8wGL8EMtfeFfIRj/YqlfUqvs189R9YOgu 125 | # uz8E0b+kmUg4sP4DtUps1I+pAzeRc49F3gtT+pp59EJbYJEQYeLrgLwWiI7bsS50 126 | # LZC22MLacrVlvo4Mi4olxAlY9bcUoBx59wrAOza+i3u3LHmAGlU0Vc8Q7/9zsQ0= 127 | # SIG # End signature block 128 | -------------------------------------------------------------------------------- /WintellectPowerShellHelper/DumpVSInstalls/App.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /WintellectPowerShellHelper/DumpVSInstalls/DumpVSInstalls.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {EB9A2C1B-C4C7-47CA-95D1-243CCC77F82A} 8 | Exe 9 | DumpVSInstalls 10 | DumpVSInstalls 11 | v4.5.2 12 | 512 13 | true 14 | 15 | 16 | AnyCPU 17 | true 18 | full 19 | false 20 | ..\Debug\ 21 | DEBUG;TRACE 22 | prompt 23 | 4 24 | true 25 | true 26 | true 27 | 28 | 29 | 30 | 31 | AnyCPU 32 | pdbonly 33 | true 34 | ..\Release\ 35 | TRACE 36 | prompt 37 | 4 38 | true 39 | true 40 | true 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | {927a6a0f-ca05-4ca6-8493-d859b2280624} 64 | WintellectPowerShellHelper 65 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /WintellectPowerShellHelper/DumpVSInstalls/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | using WintellectPowerShellHelper; 7 | 8 | namespace DumpVSInstalls 9 | { 10 | class Program 11 | { 12 | static void Main(string[] args) 13 | { 14 | IList instances = VisualStudioSetup.GetInstalledInstances(includeAllPackages: true); 15 | 16 | foreach (var instance in instances) 17 | { 18 | Console.WriteLine("--------------------"); 19 | Console.WriteLine($"Product Name : {instance.ProductName}"); 20 | Console.WriteLine($"Display Name : {instance.DisplayName}"); 21 | Console.WriteLine($"Description : {instance.Description}"); 22 | Console.WriteLine($"Instance ID : {instance.InstanceId}"); 23 | Console.WriteLine($"Status : {instance.Status}"); 24 | Console.WriteLine($"Install Path : {instance.InstallationPath}"); 25 | Console.WriteLine($"Version : {instance.InstalledVersionNumber}"); 26 | 27 | Console.WriteLine($"Product Count : {instance.Products.Count}"); 28 | DumpPackageReferences(instance.Products); 29 | 30 | Console.WriteLine($"Workload Count : {instance.Workloads.Count}"); 31 | DumpPackageReferences(instance.Workloads); 32 | 33 | Console.WriteLine($"Component Count : {instance.Components.Count}"); 34 | DumpPackageReferences(instance.Components); 35 | 36 | Console.WriteLine($"Vsix Count : {instance.Visx.Count}"); 37 | DumpPackageReferences(instance.Visx); 38 | 39 | Console.WriteLine($"Exe Count : {instance.Exe.Count}"); 40 | DumpPackageReferences(instance.Exe); 41 | 42 | Console.WriteLine($"Msi Count : {instance.Msi.Count}"); 43 | DumpPackageReferences(instance.Msi); 44 | 45 | Console.WriteLine($"Msu Count : {instance.Msu.Count}"); 46 | DumpPackageReferences(instance.Msu); 47 | 48 | Console.WriteLine($"Group Count : {instance.Group.Count}"); 49 | DumpPackageReferences(instance.Group); 50 | 51 | Console.WriteLine($"WinFeature Count : {instance.WindowsFeature.Count}"); 52 | DumpPackageReferences(instance.WindowsFeature); 53 | } 54 | 55 | } 56 | 57 | static void DumpPackageReferences(IList itemList) 58 | { 59 | foreach (var item in itemList) 60 | { 61 | Console.WriteLine($" Id : {item.Id}"); 62 | 63 | if (!String.IsNullOrEmpty(item.Branch)) 64 | { 65 | Console.WriteLine($" Branch : {item.Branch}"); 66 | } 67 | 68 | if (!String.IsNullOrEmpty(item.Chip)) 69 | { 70 | Console.WriteLine($" Chip : {item.Chip}"); 71 | } 72 | 73 | if (item.IsExtension) 74 | { 75 | Console.WriteLine($" Extension : {item.IsExtension}"); 76 | } 77 | 78 | if (!String.IsNullOrEmpty(item.Language)) 79 | { 80 | Console.WriteLine($" Language : {item.Language}"); 81 | } 82 | 83 | if (!String.IsNullOrEmpty(item.UniqueId)) 84 | { 85 | Console.WriteLine($" UniqueId : {item.UniqueId}"); 86 | } 87 | 88 | if (!String.IsNullOrEmpty(item.Version)) 89 | { 90 | Console.WriteLine($" Version : {item.Version}"); 91 | } 92 | } 93 | } 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /WintellectPowerShellHelper/DumpVSInstalls/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("DumpVSInstalls")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("DumpVSInstalls")] 13 | [assembly: AssemblyCopyright("Copyright © 2016")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("eb9a2c1b-c4c7-47ca-95d1-243ccc77f82a")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /WintellectPowerShellHelper/WintellectPowerShellHelper.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 15 4 | VisualStudioVersion = 15.0.26014.0 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WintellectPowerShellHelper", "WintellectPowerShellHelper\WintellectPowerShellHelper.csproj", "{927A6A0F-CA05-4CA6-8493-D859B2280624}" 7 | EndProject 8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DumpVSInstalls", "DumpVSInstalls\DumpVSInstalls.csproj", "{EB9A2C1B-C4C7-47CA-95D1-243CCC77F82A}" 9 | EndProject 10 | Global 11 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 12 | Debug|Any CPU = Debug|Any CPU 13 | Release|Any CPU = Release|Any CPU 14 | EndGlobalSection 15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 16 | {927A6A0F-CA05-4CA6-8493-D859B2280624}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 17 | {927A6A0F-CA05-4CA6-8493-D859B2280624}.Debug|Any CPU.Build.0 = Debug|Any CPU 18 | {927A6A0F-CA05-4CA6-8493-D859B2280624}.Release|Any CPU.ActiveCfg = Release|Any CPU 19 | {927A6A0F-CA05-4CA6-8493-D859B2280624}.Release|Any CPU.Build.0 = Release|Any CPU 20 | {EB9A2C1B-C4C7-47CA-95D1-243CCC77F82A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 21 | {EB9A2C1B-C4C7-47CA-95D1-243CCC77F82A}.Debug|Any CPU.Build.0 = Debug|Any CPU 22 | {EB9A2C1B-C4C7-47CA-95D1-243CCC77F82A}.Release|Any CPU.ActiveCfg = Release|Any CPU 23 | {EB9A2C1B-C4C7-47CA-95D1-243CCC77F82A}.Release|Any CPU.Build.0 = Release|Any CPU 24 | EndGlobalSection 25 | GlobalSection(SolutionProperties) = preSolution 26 | HideSolutionNode = FALSE 27 | EndGlobalSection 28 | EndGlobal 29 | -------------------------------------------------------------------------------- /WintellectPowerShellHelper/WintellectPowerShellHelper/Dictionary.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Wintellect 8 | Visx 9 | Msi 10 | Msu 11 | RegLoadAppKey 12 | 13 | 14 | ComPlus 15 | 16 | 17 | 18 | 19 | Pi 20 | 21 | 22 | -------------------------------------------------------------------------------- /WintellectPowerShellHelper/WintellectPowerShellHelper/GlobalSuppressions.cs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Wintellect/WintellectPowerShell/43cdadad1fa23ab1ac53b5517ce5b98e569d6ccd/WintellectPowerShellHelper/WintellectPowerShellHelper/GlobalSuppressions.cs -------------------------------------------------------------------------------- /WintellectPowerShellHelper/WintellectPowerShellHelper/NativeMethods.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Runtime.InteropServices; 3 | using Microsoft.VisualStudio.Setup.Configuration; 4 | 5 | namespace WintellectPowerShellHelper 6 | { 7 | internal static class NativeMethods 8 | { 9 | [Flags] 10 | internal enum RegSAM 11 | { 12 | AllAccess = 0x000f003f, 13 | Read = 0x20019, 14 | Write = 0x20006, 15 | } 16 | 17 | [DllImport("Microsoft.VisualStudio.Setup.Configuration.Native.dll", ExactSpelling = true, PreserveSig = true)] 18 | internal static extern int GetSetupConfiguration([MarshalAs(UnmanagedType.Interface), Out] out ISetupConfiguration configuration, 19 | IntPtr reserved); 20 | 21 | [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)] 22 | internal static extern int RegLoadAppKey(String hiveFile, out int hKey, RegSAM samDesired, int options, int reserved); 23 | 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /WintellectPowerShellHelper/WintellectPowerShellHelper/PrivateRegistry.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Win32; 2 | using Microsoft.Win32.SafeHandles; 3 | using System; 4 | using System.Collections.Generic; 5 | using System.ComponentModel; 6 | using System.Linq; 7 | using System.Text; 8 | using System.Threading.Tasks; 9 | 10 | namespace WintellectPowerShellHelper 11 | { 12 | /// 13 | /// Helps make reading and writing the VS 2017+ private registry files easier. 14 | /// 15 | public static class PrivateRegistry 16 | { 17 | /// 18 | /// Reads a the specified value out of the specified privateregistry.bin file. 19 | /// 20 | /// 21 | /// The Visual Studio 2017+ privateregistry.bin file. This must be the full 22 | /// path to the file including the instance id. 23 | /// 24 | /// 25 | /// The registry key to read. 26 | /// 27 | /// 28 | /// The value to read. 29 | /// 30 | /// 31 | /// Null if the value does not exist or is not set. Otherwise, the registry value. 32 | /// 33 | /// 34 | /// Thrown if any paramaters are null or empty. 35 | /// 36 | public static String ReadValue(String fileName, String keyName, String value) 37 | { 38 | if (String.IsNullOrEmpty(fileName)) 39 | { 40 | throw new ArgumentException("fileName cannot be null"); 41 | } 42 | 43 | if (String.IsNullOrEmpty(keyName)) 44 | { 45 | throw new ArgumentException("key cannot be null"); 46 | } 47 | 48 | if (String.IsNullOrEmpty(value)) 49 | { 50 | throw new ArgumentException("value cannot be null"); 51 | } 52 | 53 | Int32 regHandle = OpenPrivateRegistry(fileName); 54 | 55 | String result = null; 56 | 57 | // Now this, my friends, is the beauty of a using statement! 58 | using (var safeRegistryHandle = new SafeRegistryHandle(new IntPtr(regHandle), true)) 59 | using (var appKey = RegistryKey.FromHandle(safeRegistryHandle)) 60 | using (var openedKey = appKey.OpenSubKey(keyName, true)) 61 | { 62 | if (openedKey != null) 63 | { 64 | Object val = openedKey.GetValue(value); 65 | result = val.ToString(); 66 | } 67 | } 68 | 69 | return result; 70 | } 71 | 72 | private static Int32 OpenPrivateRegistry(String regFileName) 73 | { 74 | Int32 returnCode = NativeMethods.RegLoadAppKey(regFileName, 75 | out var result, 76 | NativeMethods.RegSAM.Read, 77 | 0, 78 | 0); 79 | if (returnCode != 0) 80 | { 81 | throw new Win32Exception(returnCode, "RegLoadAppKey failed opening " + regFileName); 82 | } 83 | return result; 84 | } 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /WintellectPowerShellHelper/WintellectPowerShellHelper/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Reflection; 3 | using System.Runtime.CompilerServices; 4 | using System.Runtime.InteropServices; 5 | 6 | [assembly: CLSCompliant(true)] 7 | 8 | // General Information about an assembly is controlled through the following 9 | // set of attributes. Change these attribute values to modify the information 10 | // associated with an assembly. 11 | [assembly: AssemblyTitle("WintellectPowerShellHelper")] 12 | [assembly: AssemblyDescription("Provides helper functionality for the WintellectPowerShell module")] 13 | [assembly: AssemblyConfiguration("")] 14 | [assembly: AssemblyCompany("John Robbins/Wintellect")] 15 | [assembly: AssemblyProduct("WintellectPowerShellHelper")] 16 | [assembly: AssemblyCopyright("Copyright © 2016")] 17 | [assembly: AssemblyTrademark("")] 18 | [assembly: AssemblyCulture("")] 19 | 20 | // Setting ComVisible to false makes the types in this assembly not visible 21 | // to COM components. If you need to access a type in this assembly from 22 | // COM, set the ComVisible attribute to true on that type. 23 | [assembly: ComVisible(false)] 24 | 25 | // The following GUID is for the ID of the typelib if this project is exposed to COM 26 | [assembly: Guid("927a6a0f-ca05-4ca6-8493-d859b2280624")] 27 | 28 | // Version information for an assembly consists of the following four values: 29 | // 30 | // Major Version 31 | // Minor Version 32 | // Build Number 33 | // Revision 34 | // 35 | // You can specify all the values or you can default the Build and Revision Numbers 36 | // by using the '*' as shown below: 37 | // [assembly: AssemblyVersion("1.0.*")] 38 | [assembly: AssemblyVersion("1.0.0.0")] 39 | [assembly: AssemblyFileVersion("1.0.0.0")] 40 | -------------------------------------------------------------------------------- /WintellectPowerShellHelper/WintellectPowerShellHelper/VisualStudioInstance.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace WintellectPowerShellHelper 8 | { 9 | /// 10 | /// Maps to the Microsoft.VisualStudio.Setup.Configuration.InstanceState enum so it does not have to be exported. 11 | /// 12 | public enum InstanceStatus : Int32 13 | { 14 | /// 15 | /// The instance state is not determined. 16 | /// 17 | None = 0, 18 | 19 | /// 20 | /// The instance installation path exists 21 | /// 22 | Local = 1, 23 | 24 | /// 25 | /// A product is regisistered to teh instance 26 | /// 27 | Registered = 2, 28 | 29 | /// 30 | /// No reboot is required for the insance. 31 | /// 32 | NoRebootRequired = 4, 33 | 34 | /// 35 | /// The instance represents a complete installation. 36 | /// 37 | Complete = Int32.MaxValue 38 | 39 | } 40 | 41 | /// 42 | /// Represents an installation package that is part of a Visual Studio 2017 installation. 43 | /// 44 | public class PackageReference 45 | { 46 | /// 47 | /// Gets the build branch of the package. 48 | /// 49 | public String Branch { internal set; get; } 50 | 51 | /// 52 | /// Gets the target process architecture of the package 53 | /// 54 | public String Chip { internal set; get; } 55 | 56 | /// 57 | /// Gets the general package identifier. 58 | /// 59 | public String Id { internal set; get; } 60 | 61 | /// 62 | /// A value indicating whether the package refers to an external extension. 63 | /// 64 | public Boolean IsExtension { internal set; get; } 65 | 66 | /// 67 | /// Gets the language and optional region identifier. 68 | /// 69 | public String Language { internal set; get; } 70 | 71 | /// 72 | /// Gets the unique identifier consisting of all defined tokens. 73 | /// 74 | public String UniqueId { internal set; get; } 75 | 76 | /// 77 | /// Gets the version of the package. 78 | /// 79 | public String Version { internal set; get; } 80 | 81 | } 82 | 83 | /// 84 | /// Represents all the information about an individual Visual Studio 2017, or higher, installtion. 85 | /// 86 | public class VisualStudioInstance 87 | { 88 | /// 89 | /// The instance ID for the installation. 90 | /// 91 | public String InstanceId { internal set; get; } 92 | 93 | /// 94 | /// The state of this installation. 95 | /// 96 | public InstanceStatus Status { internal set; get; } 97 | 98 | /// 99 | /// The converted version string. 100 | /// 101 | public String InstalledVersionNumber { internal set; get; } 102 | 103 | /// 104 | /// The path to the installation root. 105 | /// 106 | public String InstallationPath { internal set; get; } 107 | 108 | /// 109 | /// The product name. 110 | /// 111 | public String ProductName { internal set; get; } 112 | 113 | /// 114 | /// Returns the description of the product. 115 | /// 116 | public String Description { internal set; get; } 117 | 118 | /// 119 | /// Returns the display name of the product. 120 | /// 121 | public String DisplayName { internal set; get; } 122 | 123 | /// 124 | /// Returns the list of products for this installation. 125 | /// 126 | public IList Products { get; } = new List(); 127 | 128 | /// 129 | /// Returns the list of workloads for this installation. 130 | /// 131 | public IList Workloads { get; } = new List(); 132 | 133 | /// 134 | /// Returns the list of components for this installation. 135 | /// 136 | public IList Components { get; } = new List(); 137 | 138 | /// 139 | /// Returns the list of Vsix for this installation. 140 | /// 141 | public IList Visx { get; } = new List(); 142 | 143 | /// 144 | /// Returns teh list of Exe for this installation. 145 | /// 146 | public IList Exe { get; } = new List(); 147 | 148 | /// 149 | /// Returns the list of Msi for this installation. 150 | /// 151 | public IList Msi { get; } = new List(); 152 | 153 | /// 154 | /// Returns the list of Msu for this installation. 155 | /// 156 | public IList Msu { get; } = new List(); 157 | 158 | /// 159 | /// Returns the list of Group for this installation. 160 | /// 161 | public IList Group { get; } = new List(); 162 | 163 | /// 164 | /// Returns the list of Windows Features for this installation. 165 | /// 166 | public IList WindowsFeature { get; } = new List(); 167 | 168 | /// 169 | /// Returns the list of other package types. 170 | /// 171 | public IList OtherPackages { get; } = new List(); 172 | } 173 | } 174 | -------------------------------------------------------------------------------- /WintellectPowerShellHelper/WintellectPowerShellHelper/VisualStudioSetup.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | using Microsoft.VisualStudio.Setup.Configuration; 7 | using System.Runtime.InteropServices; 8 | using System.Diagnostics; 9 | using System.Globalization; 10 | 11 | namespace WintellectPowerShellHelper 12 | { 13 | /// 14 | /// Helper class for getting all Visual Studio Instances. 15 | /// 16 | public static class VisualStudioSetup 17 | { 18 | private const int REGDB_E_CLASSNOTREG = unchecked((int)0x80040154); 19 | 20 | /// 21 | /// Returns the list of representing the installed 22 | /// Visual Studio instances on the machine. 23 | /// 24 | /// 25 | /// The local id to use for returning internationalized strings. 26 | /// 27 | /// 28 | /// If true, does all instances, even those that are incomplete. If false, the default, 29 | /// does just completed instances. 30 | /// 31 | /// 32 | /// If true, includes all packages with the returned results. The default is to only 33 | /// return the main installation data. 34 | /// 35 | /// 36 | /// The list of installed instances. An empty list if none are installed. 37 | /// 38 | public static IList GetInstalledInstances(int lcid = 0, 39 | Boolean includeIncompleteInstances = false, 40 | Boolean includeAllPackages = false) 41 | { 42 | List resultList = new List(); 43 | 44 | // Grab the config interface and enumerate the instances. 45 | var setupConfig = GetSetupConfig(); 46 | 47 | if (setupConfig != null) 48 | { 49 | 50 | IEnumSetupInstances instanceList = null; 51 | if (includeIncompleteInstances == false) 52 | { 53 | instanceList = setupConfig.EnumInstances(); 54 | } 55 | else 56 | { 57 | instanceList = setupConfig.EnumAllInstances(); 58 | } 59 | 60 | // Now it is time to loop! 61 | int fetched; 62 | ISetupInstance2[] instance = new ISetupInstance2[1]; 63 | do 64 | { 65 | instanceList.Next(1, instance, out fetched); 66 | if (fetched > 0) 67 | { 68 | var filledInstance = FillInInstanceData(instance[0], 69 | lcid, 70 | includeAllPackages); 71 | resultList.Add(filledInstance); 72 | } 73 | 74 | } while (fetched > 0); 75 | } 76 | 77 | return resultList; 78 | } 79 | 80 | private static VisualStudioInstance FillInInstanceData(ISetupInstance2 instance, 81 | int lcid, 82 | Boolean includePackages) 83 | { 84 | VisualStudioInstance result = new VisualStudioInstance() 85 | { 86 | InstanceId = instance.GetInstanceId(), 87 | InstalledVersionNumber = instance.GetInstallationVersion(), 88 | Description = instance.GetDescription(lcid), 89 | DisplayName = instance.GetDisplayName(lcid) 90 | }; 91 | 92 | // Hides the non-CLS clompliant uint. 93 | var tempState = instance.GetState(); 94 | if (tempState == InstanceState.Complete) 95 | { 96 | result.Status = InstanceStatus.Complete; 97 | } 98 | else 99 | { 100 | result.Status = (InstanceStatus)tempState; 101 | } 102 | 103 | result.InstallationPath = instance.GetInstallationPath(); 104 | 105 | ISetupPackageReference prod = instance.GetProduct(); 106 | if (prod != null) 107 | { 108 | result.ProductName = prod.GetId(); 109 | } 110 | 111 | if ((result.Status & InstanceStatus.Local) == InstanceStatus.Local) 112 | { 113 | result.InstallationPath = instance.GetInstallationPath(); 114 | } 115 | 116 | 117 | if (includePackages) 118 | { 119 | ProcessPackages(instance, result); 120 | } 121 | 122 | return result; 123 | } 124 | 125 | private static void ProcessPackages(ISetupInstance2 instance, VisualStudioInstance result) 126 | { 127 | ISetupPackageReference[] packages = instance.GetPackages(); 128 | 129 | foreach (var package in packages) 130 | { 131 | String packageType = package.GetType(); 132 | 133 | PackageReference refPackage = CreatePackageReference(package); 134 | 135 | switch (packageType.ToUpper(CultureInfo.InvariantCulture)) 136 | { 137 | case "PRODUCT": 138 | result.Products.Add(refPackage); 139 | break; 140 | case "WORKLOAD": 141 | result.Workloads.Add(refPackage); 142 | break; 143 | case "COMPONENT": 144 | result.Components.Add(refPackage); 145 | break; 146 | case "VSIX": 147 | result.Visx.Add(refPackage); 148 | break; 149 | case "EXE": 150 | result.Exe.Add(refPackage); 151 | break; 152 | case "MSI": 153 | result.Msi.Add(refPackage); 154 | break; 155 | case "MSU": 156 | result.Msu.Add(refPackage); 157 | break; 158 | case "GROUP": 159 | result.Group.Add(refPackage); 160 | break; 161 | case "WINDOWSFEATURE": 162 | result.WindowsFeature.Add(refPackage); 163 | break; 164 | default: 165 | Trace.WriteLine(packageType); 166 | result.OtherPackages.Add(refPackage); 167 | break; 168 | 169 | } 170 | 171 | } 172 | } 173 | 174 | private static PackageReference CreatePackageReference(ISetupPackageReference package) 175 | { 176 | PackageReference refPackage = new PackageReference() 177 | { 178 | Branch = package.GetBranch(), 179 | Chip = package.GetChip(), 180 | Id = package.GetId(), 181 | IsExtension = package.GetIsExtension(), 182 | Language = package.GetLanguage(), 183 | UniqueId = package.GetUniqueId(), 184 | Version = package.GetVersion() 185 | }; 186 | 187 | return refPackage; 188 | } 189 | 190 | private static ISetupConfiguration2 GetSetupConfig() 191 | { 192 | try 193 | { 194 | // Do the CoCreate dance first. 195 | return (ISetupConfiguration2)(new SetupConfiguration()); 196 | } 197 | catch (COMException ex) when (ex.HResult == REGDB_E_CLASSNOTREG) 198 | { 199 | // Try it with the app-local call. 200 | var result = NativeMethods.GetSetupConfiguration(out var query, IntPtr.Zero); 201 | if (result < 0) 202 | { 203 | // This means VS 2017+ is not installed. 204 | return null; 205 | } 206 | 207 | return (ISetupConfiguration2)query; 208 | } 209 | } 210 | } 211 | 212 | } 213 | -------------------------------------------------------------------------------- /WintellectPowerShellHelper/WintellectPowerShellHelper/WintellectPowerShellHelper.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {927A6A0F-CA05-4CA6-8493-D859B2280624} 8 | Library 9 | Properties 10 | WintellectPowerShellHelper 11 | WintellectPowerShellHelper 12 | v4.5.2 13 | 512 14 | 15 | 16 | true 17 | full 18 | false 19 | ..\Debug\ 20 | DEBUG;TRACE 21 | prompt 22 | 4 23 | true 24 | true 25 | true 26 | ..\Debug\WintellectPowerShellHelper.XML 27 | AllRules.ruleset 28 | 29 | 30 | pdbonly 31 | true 32 | ..\Release\ 33 | TRACE 34 | prompt 35 | 4 36 | true 37 | true 38 | true 39 | ..\Release\WintellectPowerShellHelper.XML 40 | AllRules.ruleset 41 | 42 | 43 | 44 | ..\packages\Microsoft.VisualStudio.Setup.Configuration.Interop.1.3.269-rc\lib\net35\Microsoft.VisualStudio.Setup.Configuration.Interop.dll 45 | True 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | copy $(OutDir)\$(TargetFileName) ..\..\Code\ 73 | 74 | -------------------------------------------------------------------------------- /WintellectPowerShellHelper/WintellectPowerShellHelper/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | -------------------------------------------------------------------------------- /about_WintellectPowerShell.help.txt: -------------------------------------------------------------------------------- 1 | TOPIC 2 | about_WintellectPowerShell 3 | 4 | SHORT DESCRIPTION 5 | Provides cmdlets for setting up symbol servers and other 6 | functionality related to debugging and performance tuning. 7 | 8 | LONG DESCRIPTION 9 | This module makes setting up symbol servers and source server debugging 10 | functionality easier to control for Visual Studio 2013 through 2017 11 | and WinDBG. Setting up a development machine for symbol server 12 | access is more difficult than it needs to be but no more. 13 | 14 | You can have any combination of Visual Studio 2013 through 2017, and 15 | WinDBG on the computer for these cmdlets to work. 16 | 17 | These cmdlets had been originally developed as PowerShell scripts by John 18 | Robbins and released on his blog. This module combines all the separate 19 | scripts to make everything easier to manage. 20 | 21 | If you have any questions, suggestions, or bug reports, please contact John 22 | at john@wintellect.com. 23 | 24 | The following cmdlets are included. 25 | 26 | Cmdlet Description 27 | ------------------ ---------------------------------------------- 28 | Set-SymbolAndSourceServer Sets up a computer to use a symbol and source 29 | server. (Combines Set-SymbolServer and 30 | Set-Source Server) 31 | 32 | Set-SymbolServer Sets up a computer to use a symbol server. 33 | 34 | Get-SymbolServer Returns a hashtable of the current symbol 35 | server settings. 36 | 37 | Set-SourceServer Sets the source server directory. 38 | 39 | Get-SourceServer Returns a hashtable of the current source 40 | server settings 41 | 42 | Get-SourceServerFiles Prepopulate your symbol cache with all your 43 | Source Server extracted source code. 44 | 45 | Get-SysinternalsSuite Gets all the wonderful Sysinternals tools 46 | 47 | Get-Uptime Returns how long a computer has been running. 48 | 49 | Test-PathReg Utility function to test is a registry key 50 | property exists in a key. 51 | 52 | Remove-IntelliTraceFiles Removes no longer needed IntelliTrace files. 53 | 54 | Compare-Directories Compares two directories. 55 | 56 | Merge-HashTables Utility function to merge two hash tables 57 | together. 58 | 59 | Set-ProjectProperties Makes setting Visual Studio project options 60 | super easy. 61 | 62 | Add-NgenPdbs Easily create PDB files from NGEN'd images on 63 | a machine. 64 | 65 | Set-Environment Alias to "set" to bring the DOS set command 66 | to PowerShell. 67 | 68 | Invoke-CmdScript Executes a CMD script and imports the 69 | environment variables set in the script to 70 | the current PowerShell instance. 71 | 72 | Import-VisualStudioEnvironment Executes the specified Visual Studio 73 | environment batch file importing the environment 74 | variables into PowerShell for command line 75 | usage. 76 | 77 | Set-Signatures Makes digitally signing files a lot easier by 78 | looking for the first non-Azure code signing 79 | file and picking the timestamp server. 80 | 81 | Get-DumpAnalysis Automates analyzing a bunch of minidump files 82 | using CDB and debug scripts. 83 | 84 | SEE ALSO 85 | Online help and updates: 86 | http://www.wintellect.com/devcenter/author/jrobbins 87 | GitHub repository : 88 | https://github.com/Wintellect/WintellectPowerShell --------------------------------------------------------------------------------