diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 00000000..76b46d82 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,276 @@ +version: 2.1 +parameters: + buildReleaseType: + description: "Semantic Version increment type of the release. Valid values: major, minor, patch" + default: "patch" + type: enum + enum: ["major", "minor", "patch"] +orbs: + win: circleci/windows@2.2.0 + slack: circleci/slack@4.1 + +build-and-sign-ADMU: &build-and-sign-ADMU + - Build + - Pester Tests: + requires: + - Build + # - Sign Executable: + # requires: + # - Build + # - Pester Tests + # context: secrethub-credentials + - Build Module: + requires: + - Build + - Pester Tests + - Sign Exe + # requires: + # - Build + # - Pester Tests + # - Build Module + + - Build Help Files: + requires: + - Build + - Pester Tests + # - Sign Executable + - Build Module + - Build Nuspec: + requires: + - Build + - Pester Tests + # - Sign Executable + - Build Module + - Build Help Files + - Publish: + requires: + - Build + - Pester Tests + # - Sign Executable + - Build Module + - Build Help Files + - Build Nuspec + context: aws-credentials + - Invoke Git Commit: + requires: + - Build + - Pester Tests + # - Sign Executable + - Build Module + - Build Help Files + - Build Nuspec + - Upload Artifact: + requires: + - Build + - Pester Tests + # - Sign Executable + - Build Module + - Build Help Files + - Build Nuspec + +workflows: + version: 2 + ci: + jobs: *build-and-sign-ADMU + +jobs: + Build: # name of your job + executor: win/default # executor type + steps: + # Commands are run in a Windows + # virtual machine environment + - checkout + - run: + name: Install Required Modules + shell: powershell.exe + command: | + Install-Module -Name:('ps2exe') -Force + - run: + name: Build + shell: powershell.exe + command: | + $ErrorActionPreference = 'Stop' + ./Deploy/Build.ps1 $env:CIRCLE_WORKING_DIRECTORY + - persist_to_workspace: + root: . + paths: + - . + Pester Tests: + executor: win/default + steps: + - attach_workspace: + at: . + - run: + name: Test Setup + shell: powershell.exe + command: | + $ErrorActionPreference = 'Stop' + . ./Deploy/TestSetup.ps1 -TestOrgConnectKey:($env:PesterConnectKey) + - run: + name: Install Required Modules & Set Env Variables for testing + shell: powershell.exe + command: | + Install-Module -Name:('PSScriptAnalyzer') -Force + Install-Module -Name:('JumpCloud') -Force + If (-not [System.String]::IsNullOrEmpty($env:JCApiKey) -and -not [System.String]::IsNullOrEmpty($env:JCOrgId)) + { + Write-Host ('[VALIDATION] JCApiKey AND JCOrgId have been populated.') + } + Else + { + Write-Error ("Unable to test because JCApiKey and JCOrgId have not been set.") + } + - run: + name: Invoke Pester + shell: powershell.exe + command: | + $ErrorActionPreference = 'Stop' + ./jumpcloud-ADMU/Powershell/InvokePester.ps1 << pipeline.parameters.buildReleaseType >> + - store_test_results: + name: Uploading test results for ADMU' + path: ./jumpcloud-ADMU/test_results/ + + Sign Executable: + executor: win/default + steps: + - attach_workspace: + at: . + - run: + name: Sign .exe + shell: powershell.exe + command: | + ./Deploy/Sign.ps1 + Build Module: + executor: win/default + steps: + - attach_workspace: + at: . + - run: + name: Build Module + shell: powershell.exe + command: | + $ErrorActionPreference = 'Stop' + ./Deploy/Build-Module.ps1 -ModuleVersionType:("<< pipeline.parameters.buildReleaseType >>") -ModuleName:('JumpCloud.ADMU') + - persist_to_workspace: + root: . + paths: + - . + Build Help Files: + executor: win/default + steps: + - attach_workspace: + at: . + - run: + name: Build Help Files + shell: powershell.exe + command: | + $ErrorActionPreference = 'Stop' + ./Deploy/Build-HelpFiles.ps1 -ModuleVersionType:("<< pipeline.parameters.buildReleaseType >>") -ModuleName:('JumpCloud.ADMU') + - persist_to_workspace: + root: . + paths: + - . + Build Nuspec: + executor: win/default + steps: + - attach_workspace: + at: . + - run: + name: Build .nuspec + shell: powershell.exe + command: | + $ErrorActionPreference = 'Stop' + ./Deploy/BuildNuspecFromPsd1.ps1 -ModuleVersionType:("<< pipeline.parameters.buildReleaseType >>") -ModuleName:('JumpCloud.ADMU') -buildNumber:("$Env:CIRCLE_BUILD_NUM") + - persist_to_workspace: + root: . + paths: + - . + Publish: + executor: win/default + steps: + - attach_workspace: + at: . + - run: + name: Install Dependencies + shell: pwsh.exe + command: | + Install-Module -Name PowerShellGet -AllowPrerelease -RequiredVersion '3.0.0-beta10' -Force + Install-Module -Name AWS.Tools.Common -Force + Install-Module -Name AWS.Tools.CodeArtifact -Force + if ( -not ( Test-Path -Path ./Deploy/utils ) ) { + mkdir ./Deploy/utils + invoke-WebRequest https://dist.nuget.org/win-x86-commandline/v3.3.0/nuget.exe -Outfile ./Deploy/utils/nuget.exe + } + - run: + name: Add nuget sources + shell: pwsh.exe + command: | + Set-AWSCredential -AccessKey:($env:AWS_ACCESS_KEY_ID) -SecretKey:($env:AWS_SECRET_ACCESS_KEY) + $CARepoEndpoint = "$(Get-CARepositoryEndpoint -Domain jumpcloud-artifacts -Region us-east-1 -Repository jumpcloud-nuget-modules -Format nuget)v3/index.json" + dotnet nuget add source $CARepoEndpoint --name CodeArtifact --username aws --password (Get-CAAuthorizationToken -Domain:("jumpcloud-artifacts") -Region:("us-east-1")).AuthorizationToken + dotnet nuget add source "https://www.powershellgallery.com/api/v2" --name PSGallery + - deploy-nupkg: + source: CodeArtifact + Invoke Git Commit: + executor: win/default + steps: + - checkout + - add_ssh_keys: + fingerprints: + - "6b:97:dc:6d:d1:d1:3f:67:62:c4:ad:2d:96:3c:9a:d7" + - attach_workspace: + at: . + - run: + when: on_success + name: "Commit ADMU Module to << pipeline.git.branch >>" + shell: pwsh.exe + command: | + $UserEmail = If ($env:CIRCLE_PROJECT_USERNAME) { $env:CIRCLE_PROJECT_USERNAME } Else { ($env:USERNAME).Replace(' ', '') + '@FakeEmail.com' } + $UserName = If ($env:CIRCLE_PROJECT_USERNAME) { $env:CIRCLE_PROJECT_USERNAME } Else { $env:USERNAME } + git config user.email "$UserEmail" + git config user.name "$UserName" + git pull + git add -A + git status + git commit -m "Updating ADMU Module;[skip ci]" + git push origin << pipeline.git.branch >> + Upload Artifact: + executor: win/default + steps: + - checkout + - attach_workspace: + at: . + - store_artifacts: + path: ./ + destination: artifact-file + Sign Exe: + docker: + - image: cimg/base:2021.04 + steps: + - run: + name: Sign unsigned exe + command: | + if [ "${CIRCLE_PULL_REQUEST##*/}" != "" ];then + curl --request POST --url 'https://api.github.com/repos/TheJumpCloud/jumpcloud-ghactions-testing/dispatches' --header "authorization: Bearer $GITHUB_TOKEN_SA_KEN" --data '{"event_type": "Sign Exe"}' + else + echo "Not a PR" + fi +commands: + deploy-nupkg: + parameters: + source: + description: Name of the source to deploy to + type: string + steps: + - run: + name: Pack nuspec + command: | + ./Deploy/utils/nuget.exe pack ./jumpcloud-ADMU/JumpCloud.ADMU.nuspec + - run: + name: Publishing to "<< parameters.source >>" repo + shell: pwsh.exe + command: | + $NupkgPath = (Get-ChildItem -Path:("./*.nupkg")).FullName + If('<< parameters.source >>' -eq 'CodeArtifact'){dotnet nuget push $NupkgPath --source << parameters.source >>} + ElseIf('<< parameters.source >>' -eq 'PSGallery'){dotnet nuget push $NupkgPath --source << parameters.source >> --api-key $env:NuGetApiKey} + Else {Write-Error "Unknown source value: << parameters.source >>"} \ No newline at end of file diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 00000000..9b945cc9 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,10 @@ +## Issues +* [](https://jumpcloud.atlassian.net/browse/) - + +## What does this solve? + +## Is there anything particularly tricky? + +## How should this be tested? + +## Screenshots \ No newline at end of file diff --git a/.github/workflows/config.yml b/.github/workflows/config.yml new file mode 100644 index 00000000..09ef9428 --- /dev/null +++ b/.github/workflows/config.yml @@ -0,0 +1,12 @@ +on: repository_dispatch +jobs: + build: + runs-on: windows-latest + steps: + - uses: actions/checkout@v2 + - shell: pwsh + env: + BASE64_ENCODED_SELF_SIGNED_CERT: ${{ secrets.BASE64_ENCODED_SELF_SIGNED_CERT }} + CERTPASS: ${{ secrets.CERTPASS }} + run: | + echo Dispatch ran \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..18abf76e --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.DS_Store +*/.DS_Store \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..c6474238 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,14 @@ +{ + "spellright.language": [ + "en" + ], + "spellright.documentTypes": [ + "markdown", + "latex", + "plaintext", + "yaml", + "powershell" + ], + "powershell.scriptAnalysis.settingsPath": "jumpcloud-ADMU/Powershell/Tests/PSScriptAnalyzerSettings.psd1", + "powershell.scriptAnalysis.enable": true +} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 7f53f5c8..00000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,89 +0,0 @@ -## 1.2.5 - -#### RELEASE DATE - -December 2, 2019 - -#### RELEASE NOTES - -- ConvertSID Function updated to work on windows 7 and powershell 2.0 - -## 1.2.4 - -#### RELEASE DATE - -November 26, 2019 - -#### RELEASE NOTES - -- Add $AzureADProfile Parameter to allow conversion via migration.ps1 script - -## 1.2.3 - -#### RELEASE DATE - -November 19, 2019 - -#### RELEASE NOTES - -- Force reboot without delay or keypress to work with CLI deployments -- Update Boolean options for EULA, Agent, LeaveDomain & ForceReboot - -## 1.2.2 - -#### RELEASE DATE - -October 29, 2019 - -#### RELEASE NOTES - -- Fix Win7/Powershell 2.0 SID conversion query used in local admin check in GUI - -## 1.2.1 - -#### RELEASE DATE - -October 14, 2019 - -#### RELEASE NOTES - -- Improve further and reduce migapp.xml & miguser.xml entrys. This will reduce overall file count and scanning times. - -- Aditional Pester tests and azure pipeline CI for improved automated testing. - -## 1.2.0 - -#### RELEASE DATE - -September 27, 2019 - -#### RELEASE NOTES - -- Improve and reduce migapp.xml & miguser.xml entrys. This will reduce overall file count and scanning times. - -- Add UI loading feedback using write-progress. - -- Add localadmin column to UI for profiles. - -- Add profile size column to UI for profiles. Also add system c:\ available space to UI. - -- Introduce Pester tests and azure pipeline CI for improved automated testing. - - -## 1.1.0 - -#### RELEASE DATE - -September 6, 2019 - -#### RELEASE NOTES - -- Fix netbios name to use better function and account for cases where netbios name is different than domain name. - -- Change ADK install path to use default. - -- Improve install and running of USMT on x86 and x64 systems. - -- Introduce custom config.xml to remove APAPI prompt. - -- Introduce custom migapp.xml and miguser.xml to add more applications and downloads folder migration. diff --git a/Deploy/ADMU.ps1 b/Deploy/ADMU.ps1 new file mode 100644 index 00000000..f9177155 Binary files /dev/null and b/Deploy/ADMU.ps1 differ diff --git a/Deploy/Build-HelpFiles.ps1 b/Deploy/Build-HelpFiles.ps1 new file mode 100644 index 00000000..6a716310 --- /dev/null +++ b/Deploy/Build-HelpFiles.ps1 @@ -0,0 +1,36 @@ +[CmdletBinding()] +param ( + [Parameter()] + [System.string] + $ModuleVersionType, + [Parameter()] + [System.string] + $ModuleName +) +. $PSScriptRoot\Get-Config.ps1 -ModuleVersionType:($ModuleVersionType) -ModuleName:($ModuleName) + +########################################################################### +Write-Host ('[status]Importing current module: ' + $ModuleName) +Import-Module ($FilePath_psd1) -Force +# Install module onto system +If (-not (Get-InstalledModule -Name:('PlatyPS') -ErrorAction SilentlyContinue)) { Install-Module -Force -Name:('PlatyPS') } +# Import module into session +If (-not (Get-Module -Name:('PlatyPS'))) { Import-Module -Force -Name:('PlatyPS') } +Write-Host ('[status]Creating/Updating help files') +$Functions_Public | ForEach-Object { + $FunctionName = $_.BaseName + $FilePath_Md = $FolderPath_Docs + '/' + $FunctionName + '.md' + If (Test-Path -Path:($FilePath_Md)) + { + # Write-Host ('Updating: ' + $FunctionName + '.md') + Update-MarkdownHelp -Path:($FilePath_Md) -Force -ExcludeDontShow -UpdateInputOutput -UseFullTypeName + } + Else + { + # Write-Host ('Creating: ' + $FunctionName + '.md') + New-MarkdownHelp -Command:($FunctionName) -OutputFolder:($FolderPath_Docs) -Force -ExcludeDontShow -OnlineVersionUrl:($GitHubWikiUrl + $FunctionName) -UseFullTypeName + } +} +# Create new ExternalHelp file. +Write-Host ('[status]Creating new external help file') +New-ExternalHelp -Path:($FolderPath_Docs) -OutputPath:($FolderPath_enUS) -Force diff --git a/Deploy/Build-Module.ps1 b/Deploy/Build-Module.ps1 new file mode 100644 index 00000000..0d844638 --- /dev/null +++ b/Deploy/Build-Module.ps1 @@ -0,0 +1,41 @@ +[CmdletBinding()] +param ( + [Parameter()] + [System.string] + $ModuleVersionType, + [Parameter()] + [System.string] + $ModuleName +) + +. $PSScriptRoot\Get-Config.ps1 -ModuleVersionType:($ModuleVersionType) -ModuleName:($ModuleName) +########################################################################### +# Region Checking PowerShell Gallery module version +Write-Host ('[status]Check PowerShell Gallery for module version info') +$PSGalleryInfo = Get-PSGalleryModuleVersion -Name:($ModuleName) -ReleaseType:($RELEASETYPE) #('Major', 'Minor', 'Patch') +$ModuleVersion = $PSGalleryInfo.NextVersion +Write-Host ('[status]PowerShell Gallery Name:' + $PSGalleryInfo.Name + ';CurrentVersion:' + $PSGalleryInfo.Version + '; NextVersion:' + $ModuleVersion ) +# EndRegion Checking PowerShell Gallery module version + +# Region Building New-JCModuleManifest +Write-Host ('[status]Building New-ModuleManifest') +New-ModuleManifest -Path:($FilePath_psd1) ` + -FunctionsToExport:($Functions_Public.BaseName | Sort-Object) ` + -RootModule:((Get-Item -Path:($FilePath_psm1)).Name) ` + -ModuleVersion:($ModuleVersion) ` + -Author:('JumpCloud Solutions Architect Team') ` + -CompanyName:('JumpCloud') ` + -Copyright:('(c) JumpCloud. All rights reserved.') ` + -Description:('Powershell Module to run JumpCloud Active Directory Migration Utility.') + +# EndRegion Building New-JCModuleManifest + +# Region Updating module change log +Write-Host ('[status]Updating module change log: "' + $FilePath_ModuleChangelog + '"') +$ModuleChangelog = Get-Content -Path:($FilePath_ModuleChangelog) +$NewModuleChangelogRecord = New-ModuleChangelog -LatestVersion:($ModuleVersion) -ReleaseNotes:('{{Fill in the Release Notes}}') -Features:('{{Fill in the Features}}') -Improvements:('{{Fill in the Improvements}}') -BugFixes('{{Fill in the Bug Fixes}}') +If (!(($ModuleChangelog | Select-Object -First 1) -match $ModuleVersion)) +{ + ($NewModuleChangelogRecord + ($ModuleChangelog | Out-String)).Trim() | Set-Content -Path:($FilePath_ModuleChangelog) -Force +} +# EndRegion Updating module change log diff --git a/Deploy/Build.ps1 b/Deploy/Build.ps1 new file mode 100644 index 00000000..b58b6716 --- /dev/null +++ b/Deploy/Build.ps1 @@ -0,0 +1,61 @@ +[CmdletBinding()] +param ( + [Parameter(Mandatory = $true)] + [System.string] + $RootPath +) + +$Output = $RootPath + '\Deploy\ADMU.ps1' +$FormPath = $RootPath + '\jumpcloud-ADMU\Powershell\Form.ps1' +$VersionRegex = [regex]'(?<=Title="JumpCloud ADMU )([0-9]+)\.([0-9]+)\.([0-9]+)' +# Clear existing file +If (Test-Path -Path:($Output)) { Remove-Item -Path:($Output) } + +# Get file contents +$StartJCADMU = (Get-Content -Path:($RootPath + '\jumpcloud-ADMU\Powershell\Start-JCADMU.ps1') -Raw) -Replace ("`r", "") +$Functions = (Get-Content -Path:($RootPath + '\jumpcloud-ADMU\Powershell\Start-Migration.ps1') -Raw) -Replace ("`r", "") +$Form = (Get-Content -Path:($RootPath + '\jumpcloud-ADMU\Powershell\Form.ps1') -Raw) -Replace ("`r", "") +# String manipulation +$NewContent = $StartJCADMU +$NewContent = $NewContent.Replace('# Get script path' + "`n", '') +$NewContent = $NewContent.Replace('$scriptPath = (Split-Path -Path:($MyInvocation.MyCommand.Path))' + "`n", '') +$NewContent = $NewContent.Replace('. ($scriptPath + ''\Start-Migration.ps1'')', $Functions) +$NewContent = $NewContent.Replace('$formResults = Invoke-Expression -Command:(''. "'' + $scriptPath + ''\Form.ps1"'')' + "`n", $Form) +$NewContent = $NewContent.Replace('Return $FormResults' + "`n" + '}', '') +$NewContent = $NewContent + "`n" + '}' +$NewContent = $NewContent -split "`n" | ForEach-Object { If ($_.Trim()) { $_ } } +# Export combined file +If (-not [System.String]::IsNullOrEmpty($NewContent)) +{ + $NewContent | Out-File -FilePath:($Output) + #Build exe + $Version = Select-String -Path:($FormPath) -Pattern:($VersionRegex) + If (-not [System.String]::IsNullOrEmpty($Version)) + { + ps2exe -inputFile $Output -outputFile ($RootPath + '\jumpcloud-ADMU\exe\gui_jcadmu.exe') -title 'JumpCloud ADMU' -product 'JumpCloud ADMU' -description 'JumpCloud AD Migration Utility' -copyright '(c) 2021' -version $Version.Matches.Value -company 'JumpCloud' -requireAdmin -iconfile '.\Deploy\admu.ico' + Write-Host "gui_jcadmu.exe was generated successfully" + } + Else + { + Write-Error ('Unable to find version number in "' + $FormPath + '" using regex "' + $VersionRegex + '"') + } +} +Else +{ + Write-Error ('Build.ps1 failed. Transform process outputted an empty ADMU.ps1 file.') +} + + +# Use Git to figure out changes +$uwpPath = $RootPath + '\Deploy\uwp_jcadmu.ps1' +$changes = git diff origin/master... -- $uwpPath + +if (-not [System.String]::IsNullOrEmpty($changes)) +{ + Invoke-ps2exe -inputFile ($uwpPath) -outputFile ($RootPath + '\jumpcloud-ADMU\exe\uwp_jcadmu.exe') -title 'JumpCloud ADMU UWP Fix' -product 'JumpCloud ADMU' -description 'JumpCloud AD Migration Utility UWP Fix Executable' -copyright '(c) 2021' -company 'JumpCloud' -iconfile ($RootPath + '\Deploy\admu.ico') + Write-Host "upw_jcadmu.exe was generated successfully" +} +else +{ + Write-Host "No changes to uwp_jcadmu.ps1 file" +} \ No newline at end of file diff --git a/Deploy/BuildNuspecFromPsd1.ps1 b/Deploy/BuildNuspecFromPsd1.ps1 new file mode 100644 index 00000000..3c6cf9a0 --- /dev/null +++ b/Deploy/BuildNuspecFromPsd1.ps1 @@ -0,0 +1,166 @@ +[CmdletBinding()] +param ( + [Parameter()] + [System.string] + $ModuleVersionType, + [Parameter()] + [System.string] + $ModuleName, + [Parameter()] + [System.string] + $buildNumber +) +. $PSScriptRoot\Get-Config.ps1 -ModuleVersionType:($ModuleVersionType) -ModuleName:($ModuleName) + +# Set Variables for New-NuspecFile +$ManifestPath = "$($FilePath_psd1)" +$OutputPath = "$($FolderPath_Module)" +$Psd1 = Import-PowerShellDataFile -Path:($ManifestPath) +$Id = $(Get-Item ($ManifestPath)).BaseName +$Version = $Psd1.ModuleVersion + ".$buildNumber" +$Description = $Psd1.Description +$Authors = $Psd1.Author +$Owners = $Psd1.CompanyName +$ReleaseNotes = $Psd1.PrivateData.PSData.ReleaseNotes +$Copyright = $Psd1.Copyright +$Tags = $Psd1.PrivateData.PSData.Tags +$LicenseUrl = $Psd1.PrivateData.PSData.LicenseUri +$ProjectUrl = $Psd1.PrivateData.PSData.ProjectUri +$IconUrl = $Psd1.PrivateData.PSData.IconUri +$Dependencies = $Psd1.RequiredModules + +# Addapted from PowerShell Get +# https://github.com/PowerShell/PowerShellGetv2/blob/7de99ee0c38611556e5c583ffaca98bb1922a0d4/src/PowerShellGet/private/functions/New-NuspecFile.ps1 +function New-NuspecFile { + [CmdletBinding()] + Param( + [Parameter(Mandatory = $true)] + [string]$OutputPath, + + [Parameter(Mandatory = $true)] + [string]$Id, + + [Parameter(Mandatory = $true)] + [string]$Version, + + [Parameter(Mandatory = $true)] + [string]$Description, + + [Parameter(Mandatory = $true)] + [string[]]$Authors, + + [Parameter()] + [string[]]$Owners, + + [Parameter()] + [string]$ReleaseNotes, + + [Parameter()] + [bool]$RequireLicenseAcceptance, + + [Parameter()] + [string]$Copyright, + + [Parameter()] + [string[]]$Tags, + + [Parameter()] + [string]$LicenseUrl, + + [Parameter()] + [string]$ProjectUrl, + + [Parameter()] + [string]$IconUrl, + + [Parameter()] + [PSObject[]]$Dependencies, + + [Parameter()] + [PSObject[]]$Files + + ) + Set-StrictMode -Off + + Write-Verbose "Calling New-NuspecFile" + + $nameSpaceUri = "http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd" + [xml]$xml = New-Object System.Xml.XmlDocument + + $xmlDeclaration = $xml.CreateXmlDeclaration("1.0", "utf-8", $null) + $xml.AppendChild($xmlDeclaration) | Out-Null + + #create top-level elements + $packageElement = $xml.CreateElement("package", $nameSpaceUri) + $metaDataElement = $xml.CreateElement("metadata", $nameSpaceUri) + + # warn we're over 4000 characters for standard nuget servers + $tagsString = $Tags -Join " " + if ($tagsString.Length -gt 4000) { + Write-Warning -Message "Tag list exceeded 4000 characters and may not be accepted by some Nuget feeds." + } + + $metaDataElementsHash = [ordered]@{ + id = $Id + version = $Version + description = $Description + authors = $Authors -Join "," + owners = $Owners -Join "," + releaseNotes = $ReleaseNotes + requireLicenseAcceptance = $RequireLicenseAcceptance.ToString().ToLower() + copyright = $Copyright + tags = $tagsString + } + + if ($LicenseUrl) { $metaDataElementsHash.Add("licenseUrl", $LicenseUrl) } + if ($ProjectUrl) { $metaDataElementsHash.Add("projectUrl", $ProjectUrl) } + if ($IconUrl) { $metaDataElementsHash.Add("iconUrl", $IconUrl) } + + foreach ($key in $metaDataElementsHash.Keys) { + $element = $xml.CreateElement($key, $nameSpaceUri) + $elementInnerText = $metaDataElementsHash.item($key) + $element.InnerText = $elementInnerText + + $metaDataElement.AppendChild($element) | Out-Null + } + + + if ($Dependencies) { + $dependenciesElement = $xml.CreateElement("dependencies", $nameSpaceUri) + + foreach ($dependency in $Dependencies) { + $element = $xml.CreateElement("dependency", $nameSpaceUri) + # $element. + $element.SetAttribute("id", $dependency) + if ($dependency.version) { $element.SetAttribute("version", $dependency.version) } + + $dependenciesElement.AppendChild($element) | Out-Null + } + $metaDataElement.AppendChild($dependenciesElement) | Out-Null + } + + if ($Files) { + $filesElement = $xml.CreateElement("files", $nameSpaceUri) + + foreach ($file in $Files) { + $element = $xml.CreateElement("file", $nameSpaceUri) + $element.SetAttribute("src", $file.src) + if ($file.target) { $element.SetAttribute("target", $file.target) } + if ($file.exclude) { $element.SetAttribute("exclude", $file.exclude) } + + $filesElement.AppendChild($element) | Out-Null + } + } + + $packageElement.AppendChild($metaDataElement) | Out-Null + if ($filesElement) { $packageElement.AppendChild($filesElement) | Out-Null } + + $xml.AppendChild($packageElement) | Out-Null + + $nuspecFullName = Join-Path -Path $OutputPath -ChildPath "$Id.nuspec" + $xml.save($nuspecFullName) + + Write-Output $nuspecFullName +} + +New-NuspecFile -OutputPath $OutputPath -Id $Id -Version $Version -Description $Description -Authors $Authors -Owners $Owners -ReleaseNotes $ReleaseNotes -Copyright $Copyright -Tags $Tags -LicenseUrl $LicenseUrl -ProjectUrl $ProjectUrl -IconUrl $IconUrl -Dependencies $Dependencies diff --git a/Deploy/Functions/Get-PSGalleryModuleVersion.ps1 b/Deploy/Functions/Get-PSGalleryModuleVersion.ps1 new file mode 100644 index 00000000..079ee10c --- /dev/null +++ b/Deploy/Functions/Get-PSGalleryModuleVersion.ps1 @@ -0,0 +1,54 @@ +Function Get-PSGalleryModuleVersion +{ + Param ( + [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true, Position = 0)][ValidateNotNullOrEmpty()][string]$Name, + [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true, Position = 1)][ValidateNotNullOrEmpty()][ValidateSet('Major', 'Minor', 'Patch')][string]$RELEASETYPE + ) + # Check to see if module already exists to set version number + $PowerShellGalleryModule = Find-Module -Name:($Name) -ErrorAction:('Ignore') + If ([string]::IsNullOrEmpty($PowerShellGalleryModule)) + { + $ModuleVersion = [PSCustomObject]@{ + 'Name' = $Name; + 'Version' = 'N/A'; + 'Major' = 'N/A'; + 'Minor' = 'N/A'; + 'Patch' = 'N/A'; + } + $NextVersion = Switch ($RELEASETYPE) + { + 'Major' { $ModuleVersion.Major = '1.0.0' } + 'Minor' { $ModuleVersion.Minor = '0.1.0' } + 'Patch' { $ModuleVersion.Patch = '0.0.1' } + } + } + Else + { + $ModuleVersion = [PSCustomObject]@{ + 'Name' = $PowerShellGalleryModule.Name; + 'Version' = $PowerShellGalleryModule.Version; + 'Major' = [int]($PowerShellGalleryModule.Version -split '\.')[0]; + 'Minor' = [int]($PowerShellGalleryModule.Version -split '\.')[1]; + 'Patch' = [int]($PowerShellGalleryModule.Version -split '\.')[2]; + } + Switch ($RELEASETYPE) + { + 'Major' + { + $ModuleVersion.Major = $ModuleVersion.Major + 1 + $ModuleVersion.Minor = 0 + $ModuleVersion.Patch = 0 + } + 'Minor' + { + $ModuleVersion.Minor = $ModuleVersion.Minor + 1 + $ModuleVersion.Patch = 0 + } + 'Patch' { $ModuleVersion.Patch = $ModuleVersion.Patch + 1 } + } + + } + $NextVersion = ($ModuleVersion.Major, $ModuleVersion.Minor, $ModuleVersion.Patch) -join '.' + Add-Member -InputObject:($ModuleVersion) -MemberType:('NoteProperty') -Name:('NextVersion') -Value:($NextVersion) + Return $ModuleVersion +} \ No newline at end of file diff --git a/Deploy/Functions/New-ModuleChangLog.ps1 b/Deploy/Functions/New-ModuleChangLog.ps1 new file mode 100644 index 00000000..65950213 --- /dev/null +++ b/Deploy/Functions/New-ModuleChangLog.ps1 @@ -0,0 +1,35 @@ + +Function New-ModuleChangelog +{ + Param( + [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true, Position = 0)][ValidateNotNullOrEmpty()][System.String]$LatestVersion + , [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true, Position = 1)][ValidateNotNullOrEmpty()][System.String]$ReleaseNotes + , [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true, Position = 2)][ValidateNotNullOrEmpty()][System.String]$Features + , [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true, Position = 3)][ValidateNotNullOrEmpty()][System.String]$Improvements + , [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true, Position = 4)][ValidateNotNullOrEmpty()][System.String]$BugFixes + ) + $Content = "## {0} + +Release Date: $(Get-Date -UFormat:('%B %d, %Y')) + +#### RELEASE NOTES + +``````` +{1} +``````` + +#### FEATURES: + +{2} + +#### IMPROVEMENTS: + +{3} + +#### BUG FIXES: + +{4} + +" + Return ($Content -f $LatestVersion, $ReleaseNotes, $Features, $Improvements, $BugFixes) +} \ No newline at end of file diff --git a/Deploy/Get-Config.ps1 b/Deploy/Get-Config.ps1 new file mode 100644 index 00000000..37ee7261 --- /dev/null +++ b/Deploy/Get-Config.ps1 @@ -0,0 +1,82 @@ +[CmdletBinding()] +param ( + [Parameter()] + [System.string] + $ModuleVersionType, + [Parameter()] + [System.string] + $ModuleName +) +$env:ModuleVersionType = $ModuleVersionType +$env:MODULENAME = $ModuleName +# Populate variables +$ModuleFolderName = "$PSScriptroot/../JumpCloud-ADMU/" +$DEPLOYFOLDER = "$PSScriptroot" +$RELEASETYPE = $ModuleVersionType +$GitHubWikiUrl = 'https://github.com/TheJumpCloud/jumpcloud-ADMU/wiki/' +$ScriptRoot = Switch ($env:DEPLOYFOLDER) { $true { $env:DEPLOYFOLDER } Default { $PSScriptRoot } } +$FolderPath_ModuleRootPath = (Get-Item -Path:($ScriptRoot)).Parent.FullName +$FilePath_ModuleChangelog = $FolderPath_ModuleRootPath + '/ModuleChangelog.md' +# $FilePath_psd1 = "$ModuleFolderName/($env:MODULENAME.psd1)" +Switch ($env:DEPLOYFOLDER) { $true { $env:DEPLOYFOLDER } Default { $env:DEPLOYFOLDER = $PSScriptRoot } } +# Validate that variables have been populated +@('MODULENAME', 'MODULEFOLDERNAME', 'DEPLOYFOLDER', 'RELEASETYPE') | ForEach-Object { + $LocalVariable = (Get-Variable -Name:($_)).Value + $EnvVariable = [System.Environment]::GetEnvironmentVariable($_) + If (-not (-not [System.String]::IsNullOrEmpty($LocalVariable) -or -not [System.String]::IsNullOrEmpty($EnvVariable))) + { + Write-Error ('The env variable must be populated: $env:' + $_) + Break + } +} +# Log statuses +Write-Host ('[status]Platform: ' + [environment]::OSVersion.Platform) +Write-Host ('[status]PowerShell Version: ' + ($PSVersionTable.PSVersion -join '.')) +Write-Host ('[status]Host: ' + (Get-Host).Name) +Write-Host ('[status]UserName: ' + $env:USERNAME) +Write-Host ('[status]Loaded config: ' + $MyInvocation.MyCommand.Path) +# Set misc. variables +$FolderPath_ModuleRootPath = (Get-Item -Path:($DEPLOYFOLDER)).Parent.FullName +# Define required files and folders variables +$RequiredFiles = ('LICENSE', 'psm1', 'psd1') +$RequiredFolders = ('Docs', 'Private', 'Public', 'Tests', 'en-US') +# Define folder path variables +# $FolderPath_Module = $FolderPath_ModuleRootPath + '\' + $ModuleFolderName +$FolderPath_Module = $ModuleFolderName +$RequiredFolders | ForEach-Object { + $FolderName = $_ + $FolderPath = $FolderPath_Module + '\' + $FolderName + New-Variable -Name:('FolderName_' + $_.Replace('-', '')) -Value:($FolderName) -Force; + New-Variable -Name:('FolderPath_' + $_.Replace('-', '')) -Value:($FolderPath) -Force +} +$RequiredFiles | ForEach-Object { + $FileName = If ($_ -in ('psm1', 'psd1')) { $ModuleName + '.' + $_ } Else { $_ } + $FilePath = $FolderPath_Module + '\' + $FileName + New-Variable -Name:('FileName_' + $_) -Value:($FileName) -Force; + New-Variable -Name:('FilePath_' + $_) -Value:($FilePath) -Force; +} +# Load deploy functions +$DeployFunctions = @(Get-ChildItem -Path:($PSScriptRoot + '/Functions/*.ps1') -Recurse) +Foreach ($DeployFunction In $DeployFunctions) +{ + Try + { + . $DeployFunction.FullName + } + Catch + { + Write-Error -Message:('Failed to import function: ' + $DeployFunction.FullName) + } +} +# Install NuGet +If (!(Get-PackageProvider -Name:('NuGet') -ListAvailable -ErrorAction:('SilentlyContinue'))) +{ + Write-Host ('[status]Installing package provider NuGet'); Install-PackageProvider -Name:('NuGet') -Scope:('CurrentUser') -Force +} + +# Get module function names +$Functions_Public = @(Get-ChildItem -Path "$ModuleFolderName/Powershell/Start-Migration.ps1") + +# Import module in development +Write-Host ('Importing module: ' + $FilePath_psd1) +Import-Module $FilePath_psd1 -Force diff --git a/Deploy/Invoke-GitCommit.ps1 b/Deploy/Invoke-GitCommit.ps1 new file mode 100644 index 00000000..3003a72d --- /dev/null +++ b/Deploy/Invoke-GitCommit.ps1 @@ -0,0 +1,38 @@ +param ( + [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true, Position = 0)][ValidateNotNullOrEmpty()][string]$BranchName +) +If ($BranchName -like 'refs/*/merge') +{ + Write-Warning ('Skipping commit because branch matched "merge": ' + $BranchName) +} +Else +{ + #Logging + $CommitMessage = 'Push to ' + $BranchName + ';[skip ci]' + $UserEmail = 'AzurePipelines@FakeEmail.com' + $UserName = 'AzurePipelines' + Function Invoke-Git + { + Param($Arguments) + If ([environment]::OSVersion.Platform -eq 'Win32NT') { $env:GIT_REDIRECT_STDERR = '2>&1' } + $LASTEXITCODE = 0 + $Error.Clear() + $Command = 'git ' + $Arguments + Write-Host ('[GitCommand]' + $Command) + Invoke-Expression -Command:($Command) + If ($LASTEXITCODE) + { + Throw ('Git error, $LASTEXITCODE: ' + $LASTEXITCODE) + } + If ($Error) + { + Throw ('Git error, $Error: ' + $Error) + } + } + Invoke-Git -Arguments:('config user.email "' + $UserEmail + '";') + Invoke-Git -Arguments:('config user.name "' + $UserName + '";') + Invoke-Git -Arguments:('add -A;') + Invoke-Git -Arguments:('status;') + Invoke-Git -Arguments:('commit -m ' + '"' + $CommitMessage + '";') + Invoke-Git -Arguments:('push origin HEAD:' + $BranchName + ';') +} diff --git a/Deploy/Sign.ps1 b/Deploy/Sign.ps1 new file mode 100644 index 00000000..b85bd538 --- /dev/null +++ b/Deploy/Sign.ps1 @@ -0,0 +1,87 @@ +# Begin setup Steps + +# SecretHub Steps for Eventual CircleCI work +# # Setup Cert Directory +# $CertDirectory = "C:\cert\" +# if (!(Test-Path "$CertDirectory")) +# { +# new-item -path $CertDirectory -ItemType Directory +# } +# # Setup SecretHub +# Invoke-WebRequest https://get.secrethub.io/windows | Invoke-Expression +# secrethub --version +# secrethub credential ls +# secrethub read --out-file $CertDirectory/godaddy_windows_signing_cert.pfx JumpCloud/github/godaddy-win-signcert-pfx +# secrethub read --out-file $CertDirectory/godaddy_windows_signing_cert_notrim.pfx JumpCloud/github/godaddy-win-signcert-pfx-notrim + + +# Sign Variables +$signpath = 'C:\tools\signtool.exe' +$GUI_JCADMU = ($Env:BUILD_SOURCESDIRECTORY + '\jumpcloud-ADMU\Exe\gui_jcadmu.exe') +$UWP_JCADMU = ($Env:BUILD_SOURCESDIRECTORY + '\jumpcloud-ADMU\Exe\uwp_jcadmu.exe') + +$certdir = 'C:\agent\_work\_temp\' +$certFileName = "godaddy_windows_signing_cert.pfx" +$certPasswordFileName = "godaddy_windows_signing_cert_password.txt" +$certPath = Join-Path $certDir $certFileName +$passwordfile = $certdir + $certPasswordFileName +$password = Get-Content $passwordfile -Raw + +Write-Output "Signing binaries" + +New-Variable -Name MaxAttempts -Option Constant -Value 5 + +# Add backup TSA Servers (RFC 3161) in case we get rate-limited +$tsaServers = @( + "http://tsa.starfieldtech.com", + "https://timestamp.geotrust.com/tsa", + "http://timestamp.apple.com/ts01" +) + +$filesToSign = @( + $GUI_JCADMU, + $UWP_JCADMU +) + +foreach ($file in $filesToSign) { + $tsaIndex = 0 + $attempts = 1 + while ($True) { + Write-Output "attempting to sign with $($tsaServers[$tsaIndex])" + & $signpath sign ` + /f $certpath ` + /fd SHA256 ` + /p $password ` + $file + + #move above $file for tsachecks + #/tr $($tsaServers[$tsaIndex]) ` + #/td SHA256 ` + + if ( -not $? ) { + if ($attempts -le $MaxAttempts) { + Write-Output "attempt $attempts failed, retrying..." + $attempts++ + Start-Sleep -Seconds 15 + Continue + } + Else { + if ($tsaIndex -lt $tsaServers.Count) { + Write-Output "trying a different TSA Server $($tsaServers[$tsaIndex])" + $tsaIndex++ + $attempts = 1 + Continue + } + Else { + Write-Output "Failed to sign $file, error=$error" + Exit 1 + } + } + } + Else { + Break + } + } +} + +Write-Output "Done signing binaries" diff --git a/Deploy/TestSetup.ps1 b/Deploy/TestSetup.ps1 new file mode 100644 index 00000000..1abd5e2e --- /dev/null +++ b/Deploy/TestSetup.ps1 @@ -0,0 +1,77 @@ +Param( +[Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true, Position = 0)][ValidateNotNullOrEmpty()][System.String]$TestOrgConnectKey +) +process{ + + #if (Get-Module -ListAvailable -Name pester) { + # Write-Host "pester module installed" + # } else { + # Write-Host "Installing pester" + # Install-Module -Name:('Pester') -Force -Scope:('CurrentUser') -SkipPublisherCheck + #} + + # Load functions + . $PSScriptRoot\..\jumpcloud-ADMU\Powershell\Start-Migration.ps1 + + #USMT & VC Variables + $jcAdmuTempPath = 'C:\Windows\Temp\JCADMU\' + $usmtTempPath = 'C:\Windows\Temp\JCADMU\USMT\' + $msvc2013x64File = 'vc_redist.x64.exe' + $msvc2013x86File = 'vc_redist.x86.exe' + $msvc2013x86Link = 'http://download.microsoft.com/download/0/5/6/056dcda9-d667-4e27-8001-8a0c6971d6b1/vcredist_x86.exe' + $msvc2013x64Link = 'http://download.microsoft.com/download/0/5/6/056dcda9-d667-4e27-8001-8a0c6971d6b1/vcredist_x64.exe' + $msvc2013x86Install = "$usmtTempPath$msvc2013x86File /install /quiet /norestart" + $msvc2013x64Install = "$usmtTempPath$msvc2013x64File /install /quiet /norestart" + + # JumpCloud Agent Installation Variables + $AGENT_PATH = "${env:ProgramFiles}\JumpCloud" + # $AGENT_CONF_FILE = "\Plugins\Contrib\jcagent.conf" + $AGENT_BINARY_NAME = "JumpCloud-agent.exe" + # $AGENT_SERVICE_NAME = "JumpCloud-agent" + $AGENT_INSTALLER_URL = "https://s3.amazonaws.com/jumpcloud-windows-agent/production/JumpCloudInstaller.exe" + $AGENT_INSTALLER_PATH = "C:\windows\Temp\JCADMU\JumpCloudInstaller.exe" + # $OLD_AGENT_INSTALLER_PATH = "C:\tools\jcagent-0.10.80.exe" + # $AGENT_UNINSTALLER_NAME = "unins000.exe" + # $EVENT_LOGGER_KEY_NAME = "hklm:\SYSTEM\CurrentControlSet\services\eventlog\Application\JumpCloud-agent" + # $INSTALLER_BINARY_NAMES = "JumpCloudInstaller.exe,JumpCloudInstaller.tmp" + $JumpCloudConnectKey = $TestOrgConnectKey + + #Prechecks + #check if installer is stuck running and kill + # $process = get-process JumpCloudInstaller -ErrorAction SilentlyContinue + # $process2 = get-process JumpCloudInstaller.tmp -ErrorAction SilentlyContinue + # if (![System.String]::IsNullOrEmpty($process)){ + # $process.kill() + # } + # if (![System.String]::IsNullOrEmpty($process2)){ + # $process2.kill() + # } + #Clear Temp\JCADMU folder + if ((Test-Path 'C:\Windows\Temp\JCADMU') -eq $true){ + remove-item -Path 'C:\windows\Temp\JCADMU' -Force -Recurse + } + #Recreate JCADMU folder + New-Item -ItemType Directory -Path 'C:\windows\Temp\JCADMU' -Force + #Is agent installed? If so uninstall it + if (Test-ProgramInstalled -programName:('Jumpcloud')) { + #TODO: if uninstall doesn't exist, check service and stop & delete folder & regkeys + & cmd /C 'C:\Program Files\JumpCloud\unins000.exe' /Silent + } + #Is vcredistx86 & vcredistx64 installed? If so uninstall it + if ((Test-ProgramInstalled -programName('Microsoft Visual C\+\+ 2013 x64')) -or ((Test-ProgramInstalled -programName:([Regex]'(Microsoft Visual C\+\+ 2013 Redistributable \(x86\))(.*?)')))) { + Uninstall-Program -programName 'Microsoft Visual C' + } + #If JC directory still exists delete it + if (Test-Path 'C:\Program Files\JumpCloud') { + Start-Sleep -Seconds 5 + remove-item -path 'C:\Program Files\JumpCloud' -Force -Recurse + } + #install jcagent and prereq + if (!(Test-path $jcAdmuTempPath)) { + new-item -ItemType Directory -Force -Path $jcAdmuTempPath + } + if (!(Test-path $usmtTempPath)){ + new-item -ItemType Directory -Force -Path $usmtTempPath + } + Install-JumpCloudAgent -msvc2013x64link:($msvc2013x64Link) -msvc2013path:($jcAdmuTempPath) -msvc2013x64file:($msvc2013x64File) -msvc2013x64install:($msvc2013x64Install) -msvc2013x86link:($msvc2013x86Link) -msvc2013x86file:($msvc2013x86File) -msvc2013x86install:($msvc2013x86Install) -AGENT_INSTALLER_URL:($AGENT_INSTALLER_URL) -AGENT_INSTALLER_PATH:($AGENT_INSTALLER_PATH) -JumpCloudConnectKey:($JumpCloudConnectKey) -AGENT_PATH:($AGENT_PATH) -AGENT_BINARY_NAME:($AGENT_BINARY_NAME) +} diff --git a/Deploy/admu.ico b/Deploy/admu.ico new file mode 100644 index 00000000..3d5d0bc8 Binary files /dev/null and b/Deploy/admu.ico differ diff --git a/Deploy/uwp_jcadmu.ps1 b/Deploy/uwp_jcadmu.ps1 new file mode 100644 index 00000000..ad6a6058 Binary files /dev/null and b/Deploy/uwp_jcadmu.ps1 differ diff --git a/ModuleChangelog.md b/ModuleChangelog.md new file mode 100644 index 00000000..54a0bd79 --- /dev/null +++ b/ModuleChangelog.md @@ -0,0 +1,613 @@ +## 2.0.0 + +Release Date: September 16, 2021 + +#### RELEASE NOTES + +``` +* Added API Key form and parameter to allow for "Auto-Binding" the user during Migration + * If selected, both the API Key value must also be entered + * At the end of migration the ADMU will search the JumpCloud Organization for the username entered and bind the user to the system. If the user does not exist the ADMU log will produce a warning message. + * The GUI will validate that the JumpCloud user exists in the console before Migration +* GUI runs of the ADMU should prompt to view the log after migration +* The migration user's registry hive is saved as a unique filename (ex: NTUSER_original.DAT is now NTUSER_original_yyyy-mm-dd-HHMMSS) +* The 2.0.0 version of the tool no longer includes the Microsoft User State Migration Tool (USMT). Prior versions of the tool should be used if it's necessary to copy data from one profile to another. + * The default behavior of the 2.0.0 tool is to convert accounts with what was previously the `ConvertProfile` parameter. + * If profile data was mapped to a network share, the USMT could have a valid use case but the Custom XML would have to populated to migrate that data + * This is a breaking change for the CLI version of the tool, the convertProfile parameter does not exist in 2.0.0 + +``` + +#### FEATURES: + +* Migration users may be automatically bound to systems post-successful migration +* If the ADMU fails to migrate a user, the tool will attempt to remove the newly created local user so that the tool can be run again. + * This negates the need to manually remove the new local user if re-running the tool + +#### IMPROVEMENTS: + +* GUI version of the tool no longer queries account home directory size and should load much faster +* Option to Update Home Path has been removed from the GUI version of the tool + * Often times changing the home path from "migration_user" to "migration.user" would break app functionality and cause more confusion than it was intended to solve. the `UpdateHomePath` parameter can still be set to true through the CLI/ PowerShell Module Version of the tool + +#### BUG FIXES: + +* Given the case where the ADMU writes a registry backup, subsequently fails, exits and is run again, The registry backup should not be overwritten with the same name. + +## 1.6.8 + +Release Date: August 09, 2021 + +#### RELEASE NOTES + +``` +Fix for previous version 1.6.7 where after migrating a domain user with the same username as the system hostname +``` + +#### BUG FIXES: + +Domain users with the same name as the system hostname now initalize correctly and the GUI will allow for migration of these user accounts +## 1.6.7 + +Release Date: July 22, 2021 + +#### RELEASE NOTES + +``` +Block profile conversion via GUI where domain username matches system name. +``` + +#### IMPROVEMENTS: + +Block profile conversion via GUI where domain username matches system name. + +## 1.6.6 + +Release Date: July 8, 2021 + +#### RELEASE NOTES + +``` +Added AzureAD leave domain check, if not running as NTAUTHORITY\SYSTEM popup will inform in gui related wiki article. +``` + +#### IMPROVEMENTS: +``` +Add logic to only run AzureAD leave domain command if running as NTAUTHORITY\SYSTEM. If not AzureAD joined, it will leave domain as normal. +If not run as SYSTEM, the GUI will stop the param being passed and a dialog shown. In the migration script an error will be logged and continue without running the leave domain command in the case of not being run as SYSTEM and AzureAD joined. +``` + +#### BUG FIXES: + +Updated 'Accept EULA - more info' link to correct URL + +## 1.6.5 + +Release Date: June 15, 2021 + +#### RELEASE NOTES + +``` +Updated automated testing framework and pipeline for ADMU, no changes to the migration tool since version 1.6.4 +``` + +## 1.6.4 + +Release Date: June 14, 2021 + +#### RELEASE NOTES + +``` +Added ability to change the rename step in the profile home path step. This defaults to not renaming to better account for systems where the folder is in use or can't be renamed. Also helps with any applications hardcoded to previous home path. + +``` + +#### IMPROVEMENTS: + +``` +Adds 'Update Home Path' paramater and checkbox +``` + +## 1.6.3 + +Release Date: April 13, 2021 + +#### RELEASE NOTES + +``` +Some remote agents or RMM tools may invoke commands as NT Authority\System. If the ADMU is remotely invoked with those tools and run as the NT Authority\System account, previous versions of the ADMU would fail to migrate sucessfully. v1.6.3 addresses this and resets permissions of the blank profile so that NT Authority\System can delete the blank profile after it's NTUSER.DAT & UsrClass.dat files have been copied back to the user-to-migrate's profile. +``` + +#### IMPROVEMENTS: + +Exit 1 (error) conditions explicitly defined when the tool fails to complete migration. + +#### BUG FIXES: + +Fixes a bug for some remote agent or RMM tools which would cause the ADMU tool to fail migration. + +## 1.6.2 + +Release Date: March 29, 2021 + +#### RELEASE NOTES + +``` +Improve registry load, copy and unload steps. +``` + +#### IMPROVEMENTS: + +Registry load, copy and unload steps have been streamlined. Before modifying a user's registry, the files are first checked to unsure they can be loaded and unloaded without error. After loading the profiles for modification the copy step will only modify the backup registry file. Once all modifications are complete, the registry files recognized by windows are renamed for backup and the backup files are renamed so windows recognizes those files on profile login. This should prevent profiles being left in a half-migrated state if some step in the process fails. + +## 1.6.1 + +Release Date: March 16, 2021 + +#### RELEASE NOTES + +``` +Improve local user folder check for capitalization and other scenarios. +Fix Discovery AD query for GT $time. +Add ADMU version in log. +``` + +#### IMPROVEMENTS: + +Fix Discovery AD query to output correctly -gt + +#### BUG FIXES: + +Account for capitalization in AD username and local profile folder + +## 1.6.0 + +Release Date: February 24, 2021 + +#### RELEASE NOTES + +``` +Calling ADMU Start-Migration using WinRM no longer requires CredSSP to initialize the user profile account. +New user profile is initialized without spinning up a new process for that user. +``` + +#### FEATURES: + +Added example scripts for invoking ADMU & discovery scripts from RMM/ Agents on systems + +#### IMPROVEMENTS: + +New local user initialization is streamlined and no longer relies on passing the user's temporary credentials. + +#### BUG FIXES: + +Fixed a bug where new user accounts with the same name as the domain user account would be named "username.000" and not convert correctly. + +## 1.5.5 + +Release Date: February 18, 2021 + +#### RELEASE NOTES + +``` +Updates to the Invoke Migartion script for auto binding the migration changes before reboot. +``` + +#### BUG FIXES: + +Fix for the invoke migration script where the jumpcloud user was never bound to the system after migration. + +## 1.5.4 + +Release Date: February 11, 2021 + +#### RELEASE NOTES + +``` +Minor bug fixes to improve conversion process when run as foregin language. +Add monitor job and improve admu-discovery script. +``` + +#### IMPROVEMENTS: + +* Improve admu-discovery script and add monitor job function +#### BUG FIXES: + +* Add SID lookup to ACL function to account for foreign languages +* Add additional wait time for unload of user registry before conversion starts + +## 1.5.3 + +Release Date: January 18, 2021 + +#### RELEASE NOTES + +``` +Added ADMU advanced deployment scripts for use with mass deployments, added ability to utilize credssp for new user instantiation. +``` + +#### FEATURES: + +Added mass deployment scripts for discovery and invoke-admu + +#### IMPROVEMENTS: + +Time required to 'Convert User' has been significantly decreased. + +#### BUG FIXES: + +* Fix for profile path where similarly named profile paths evaluated to the same profile path +* Fix uwp_jcadmu.exe 0kb download bug + +## 1.5.2 + +Release Date: December 21, 2020 + +#### RELEASE NOTES + +``` +Added exit code check if error when creation of user for example if password does not meet complexity requirements. +``` + +#### IMPROVEMENTS: + +ADMU will error and exit if the new user creation step does not complete. + +## 1.5.1 + +Release Date: December 11, 2020 + +#### RELEASE NOTES + +``` +During login and after an account has been converted, a powershell window displayed while the uwp apps were registered to the new local account. This release includes an update to the uwp_jcadmu.exe to display the JumpCloud logo and a progress counter with progress percentage of the uwp apps registered to the new user. +``` + +#### FEATURES: + +* Splash screen added during first login to converted account + +## 1.5.0 + +Release Date: Dec 10, 2020 + +#### RELEASE NOTES + + +``` +Ability to convert rather than duplicate domain user accounts. User's AppData is kept intact. This conversion process is much faster than the default behaivor of migration and no addtitional storage space is required. + +The Convet User Process makes several changes to the registry. It is reccommended to take a backup before converting the user account. Included in this release is an additional option to take a system restore checkpoint before running the ADMU. +``` + +#### FEATURES: + +Added convert User profile functionality to GUI & CLI. +If secure channel is in a broken state, the ADMU can convert a profile to a local account. +Added optional field to create a system restore point before migration or conversion. +SelectedUserName parameter is verified to ensure that a username in the form of Domain\username or user account SID is valid on the system before migration. + +#### BUG FIXES: + +Fixed local admin membership bug not displaying consistently in GUI. +Fixed AzureAD informational display in GUI form. + +## 1.4.3 + +Release Date: August 3, 2020 + +#### RELEASE NOTES + +``` +Functions.ps1 renamed to Start-Migration.ps1 to allow module creation and import. +Now allows install-module JumpCloud.ADMU +``` + +#### FEATURES: + +- Builds `ModuleChangeLog.md` +- Start-Migration autogen help docs + +#### IMPROVEMENTS: + +- Kill stuck installer for test pipeline + +#### BUG FIXES: + +- Out-null file +- Error removing temp files when exe still in use +- Remove double jcagent install +- Don't call dsregcmd on windows 8.1 systems +- Display 'Fix secure channel' when domain joined but no healthy secure channel, rather than blank. + + +## 1.4.2 + +Release Date: July 28, 2020 + +#### RELEASE NOTES + +``` +JumpCloud-ADMU powershell module release pipeline. +``` + +#### FEATURES: + +- Package and release JumpCloud-ADMU to PSGallery. + +#### IMPROVEMENTS: + +- Azure pipeline and release tasks for automated builds and module creation and deployment. + +## 1.4.1 + +Release Date: July 2, 2020 + +#### RELEASE NOTES + +``` +Fix CLI bug when installing JCAgent, improve compatability with foreign language windows versions. +``` + +#### IMPROVEMENTS: + +- Improve administrator group query changed to use SID to work with foreign language windows versions. +- Test syntax updated for Pester V5 + +#### BUG FIXES: + +- Add missing condition when $InstallJCAgent -eq $true to make sure JumpCloud Connect Key is provided + +## 1.4.0 + +Release Date: May 12, 2020 + +#### RELEASE NOTES + +``` +Add local and domain username checks to avoid duplicate or failed migration. +``` + +#### IMPROVEMENTS: + +- GUI check local username doesn't exist on system to avoid duplicate user errors +- CLI parameter checks local username doesn't exist on system to avoid duplicate user errors +- CLI improved parameter validation on DomainUserName +- CLI $JumpCloudConnectKey check if $installagent $true +- Add date line to log when tool run + +#### BUG FIXES: + +- Account for state if user exists on system but not ever logged in + +## 1.3.1 + +Release Date: April 30, 2020 + +#### RELEASE NOTES + +``` +Improve JCAgent install order and connect key verification +``` + +#### IMPROVEMENTS: + +- If agent install selected, will now try install steps first and error out if fails vs converting account and then running agent installer. +- Added repository outline readme +- Added JCAgent installer connect key check and error on failed install +- Can run account conversion without installing agent or requiring a connect key input value + +#### BUG FIXES: + +- Clear old install directory that is generated when failed install so doesn't reuse bad connect key + +## 1.3.0 + +Release Date: April 27, 2020 + +#### RELEASE NOTES + +``` +Allow Administrator to customize USMT process with custom.xml file and modify in ADMU GUI. +``` + +#### FEATURES: + +- Added ability to use and load custom.xml for use in scanstate & loadstate steps. +- XML validation in GUI +- CLI Start-migration -Customxml $true will use C:\Windows\Temp\custom.xml in migration script. + +## 1.2.16 + +Release Date: April 14, 2020 + +#### RELEASE NOTES + +``` +Improve JumpCloud ADMU to work in remote non domain joined scenarios. +``` + +#### IMPROVEMENTS: + +- ADMU launches when not domain joined or broken secure channel +- Shows AzureAD accounts in GUI with AzureAD information +- Now allows migration of non domain joined, AzureAD bound scenarios +- Now allows migration of domain joined AND AzureAD bound scenarios +- Now allows migration of broken secure channel scenarios +- GUI now shows orphaned profile accounts as 'UNKNOWN ACCOUNT' +- Local Administrator check added on launch +- Leave domain option for AzureAD profile will disconnect AzureAD + +## 1.2.15 + +#### RELEASE DATE +March 16, 2020 + +#### RELEASE NOTES + +- Migration language fixes +- Improve pipeline and release steps +- Move images into wiki + +## 1.2.11 + +#### RELEASE DATE + +February 3, 2020 + +#### RELEASE NOTES + +- Fix download link in readme +- Regex for pipeline build number checks + +## 1.2.10 + +#### RELEASE DATE + +February 2, 2020 + +#### RELEASE NOTES + +- Fix build status badge +- ps2exe module install check +- Revert latest agent installer + +## 1.2.9 + +#### RELEASE DATE + +January 31, 2020 + +#### RELEASE NOTES + +- Readme changes +- Add aditional tests + +## 1.2.8 + +#### RELEASE DATE + +January 31, 2020 + +#### RELEASE NOTES + +- Added Azure pipeline exe builds & signing +- Block local profile migrations in GUI +- exe and XAML form version checks + +## 1.2.7 + +#### RELEASE DATE + +January 3, 2020 + +#### RELEASE NOTES + +- Test-ComputerSecureChannel check for GUI and CLI +- Readme Computer Account Secure Channel explanation +- Fix $true/$false values for parameter logic + +## 1.2.6 + +#### RELEASE DATE + +December 31, 2019 + +#### RELEASE NOTES + +- Fix $AzureADProfile string & boolean error +- PSScriptAnalyzer fixes +- Azure Pipelines & testsetup script for local build server +- Changes for seperating repo from support +- Add in additional exe, gpo tests +- Fix flaky 'Add-LocalUser Function' test by swapping 'get-localgroupmember' with 'net localgroup users' + +## 1.2.5 + +#### RELEASE DATE + +December 2, 2019 + +#### RELEASE NOTES + +- ConvertSID Function updated to work on windows 7 and powershell 2.0 + +## 1.2.4 + +#### RELEASE DATE + +November 26, 2019 + +#### RELEASE NOTES + +- Add $AzureADProfile Parameter to allow conversion via migration.ps1 script + +## 1.2.3 + +#### RELEASE DATE + +November 19, 2019 + +#### RELEASE NOTES + +- Force reboot without delay or keypress to work with CLI deployments +- Update Boolean options for EULA, Agent, LeaveDomain & ForceReboot + +## 1.2.2 + +#### RELEASE DATE + +October 29, 2019 + +#### RELEASE NOTES + +- Fix Win7/Powershell 2.0 SID conversion query used in local admin check in GUI + +## 1.2.1 + +#### RELEASE DATE + +October 14, 2019 + +#### RELEASE NOTES + +- Improve further and reduce migapp.xml & miguser.xml entrys. This will reduce overall file count and scanning times. + +- Aditional Pester tests and azure pipeline CI for improved automated testing. + +## 1.2.0 + +#### RELEASE DATE + +September 27, 2019 + +#### RELEASE NOTES + +- Improve and reduce migapp.xml & miguser.xml entrys. This will reduce overall file count and scanning times. + +- Add UI loading feedback using write-progress. + +- Add localadmin column to UI for profiles. + +- Add profile size column to UI for profiles. Also add system c:\ available space to UI. + +- Introduce Pester tests and azure pipeline CI for improved automated testing. + + +## 1.1.0 + +#### RELEASE DATE + +September 6, 2019 + +#### RELEASE NOTES + +- Fix netbios name to use better function and account for cases where netbios name is different than domain name. + +- Change ADK install path to use default. + +- Improve install and running of USMT on x86 and x64 systems. + +- Introduce custom config.xml to remove APAPI prompt. + +- Introduce custom migapp.xml and miguser.xml to add more applications and downloads folder migration. diff --git a/ReadMe.md b/ReadMe.md index 6914a509..25db2791 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -1,616 +1,15 @@ -[![Build status](https://dev.azure.com/JumpCloudPowershell/JumpCloud%20ADMU/_apis/build/status/JumpCloud%20ADMU-CI)](https://dev.azure.com/JumpCloudPowershell/JumpCloud%20ADMU/_build/latest?definitionId=13) +# JumpCloud Active Directory Migration Utility -# Providing Feedback +![admu-landging-image](https://github.com/TheJumpCloud/jumpcloud-ADMU/wiki/images/ADMU-landing.png) -The ADMU is currently in an Early Access (EA) period. -Have feedback to share? Email support@jumpcloud.com to connect with a member of the JumpCloud success team. +The JumpCloud Active Directory Migration Utility (ADMU) is designed to migrate Active Directory or Azure Active Directory accounts to local account for subsequent JumpCloud takeover and management. Active Directory accounts on a system can not be directly taken over by the JumpCloud Agent. Those accounts must first be converted to a local account before the JumpCloud agent can take-over and manage that account on a given system. The ADMU aims to help admins automate the otherwise tedious process of account migration. -The current ADMU Change Log can be found [Here](https://github.com/TheJumpCloud/support/blob/master/ADMU/CHANGELOG.md). +### Releases -![ADMU Workflow Diagram](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/ADMU_workflow.png) +Check out the [Releases](https://github.com/TheJumpCloud/jumpcloud-ADMU/releases) page for the GUI and PowerShell tool downloads. -**Table Of Contents** +Continue to [Getting Started](https://github.com/TheJumpCloud/jumpcloud-ADMU/wiki/Getting-Started) and the [Wiki](https://github.com/TheJumpCloud/jumpcloud-ADMU/wiki) for further information. -- [Providing Feedback](#providing-feedback) -- [About the JumpCloud AD Migration Utility](#about-the-jumpcloud-ad-migration-utility) - - [Supported Operating System Versions](#supported-operating-system-versions) - - [Requirements](#requirements) - - [EULA & Legal Explanation](#eula--legal-explanation) - - [Expected Performance](#expected-performance) -- [Known Issues](#known-issues) - - [Limitations of User Account Conversion](#limitations-of-user-account-conversion) -- [ADMU Deployment Options](#admu-deployment-options) - - [Download Links](#download-links) - - [ADMU GUI](#admu-gui) - - [Using the ADMU GUI](#using-the-admu-gui) - - [ADMU Powershell Script](#admu-powershell-script) - - [Using the ADMU Powershell Script](#using-the-admu-powershell-script) - - [ADMU exe](#admu-exe) - - [Using the ADMU exe](#using-the-admu-exe) - - [Advanced Deployment Scenarios](#advanced-deployment-scenarios) -- [Error Logging & Troubleshooting Errors](#error-logging--troubleshooting-errors) - - [Log Levels](#log-levels) - - [Troubleshooting errors](#troubleshooting-errors) -- [Usage Notes and Examples](#usage-notes-and-examples) - - [ADMU Steps - What is the script doing?](#admu-steps---what-is-the-script-doing) - - [ADK & USMT INSTALLER](#adk--usmt-installer) -- [Definitions](#definitions) - - [Windows ADK - Windows Assessment and Deployment Kit](#windows-adk---windows-assessment-and-deployment-kit) - - [USMT - User State Migration Tool](#usmt---user-state-migration-tool) - - [ADMU - Active Directory Migration Utility](#admu---active-directory-migration-utility) - - [What Is In A Windows Profile](#what-is-in-a-windows-profile) - - [Windows Profile Types](#windows-profile-types) - - [Local user profile](#local-user-profile) - - [Roaming user profile](#roaming-user-profile) - - [Microsoft Account based profile](#microsoft-account-based-profile) - - [Azure AD Profile Scenarios](#azure-ad-profile-scenarios) - - [Azure AD Join](#azure-ad-join) - - [Azure AD Registration](#azure-ad-registration) - - [Hybrid Azure AD Join](#hybrid-azure-ad-join) -- [Future Development](#future-development) +### Have questions? feature request? issues? -# About the JumpCloud AD Migration Utility - -## Supported Operating System Versions - -- Windows 7 ships with .net 3.5.1 by default -- Windows 8.1 ships with .net 4.5 and .net 3.5 not enabled by default -- Windows 10 ships with .net 4.7 and .net 3.5 not enabled by default - - Currently both the GUI and EXE implementations require a specific .net version to load or run with no user interaction. - -To account for this we currently have 2 versions of `jcadmu.exe` & `gui_jcadmu.exe`. The Windows 7 folder builds are based on `.net 3.5` and Windows 8-10 on `.net 4`. - -[ADMU EXE Directory Link](https://github.com/TheJumpCloud/support/tree/master/ADMU/exe) - -If for example the .net4+ version is run on win7 system the user would see the following. - -![image46](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_46.png) - -## Requirements - The ADMU tool requires the following to work: - - * gui_jcadmu requires the system to be currently Domain bound (The system does NOT have to be actively connected to the Domain Controller). - * A domain based profile must exist on the system to be converted to a local profile (conversion of local profile or azure profile to local profile will not currently work). - -## EULA & Legal Explanation - - The ADMU tool utilizes multiple Microsoft utilities and installers depending on the deployment scenario and system state. In order to provide a silent/zero touch option for conversion the $acceptEULA value can be used. If this is not provided the user will have to interactively accept the Microsoft EULA relating to the 'Microsoft Windows ADK'. All microsoft software/tooling is sourced and downloaded from microsoft and used in its complete form with no modification to they code. By using the acceptEULA = $true flag, the ADMU tool will also install .net framework if required & C++ runtimes ifrequired for the JC system agent install. - -![image24](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_24.png) - -[Microsoft EULA PDF Link](https://github.com/TheJumpCloud/support/tree/master/ADMU/Microsoft%20Windows%20ADK%20EULA.pdf) - -[Microsoft EULA RTF Link](https://github.com/TheJumpCloud/support/tree/master/ADMU/Microsoft%20Windows%20ADK%20EULA.rtf) -## Expected Performance - - **Approximate timings:** - - Timings are relative to the both the size and number of files present in the windows profile and the speed of the system and hardware. - - Some aproximations from VM i5-7260 2.2GHz, 512GB RAM - - :5 start → scanstate (USMT on win10) - :40 start → scanstate (NO USMT on system) - - 2:40 start → loadstate (USMT installed on win10) - - 1:00 loadstate → install agent (win10 & 7 missing prereq c++) - - **Total Time Estimate: Between 2:30 → 5:00** - - -# Known Issues - -## Limitations of User Account Conversion - - There are limitations to consider when using the USMT utility for user account conversion. Because of this it is recommended to follow a one, some, many approach for migration to understand what and how the tool can and can not do in your specific environment. This is where further investigation needs to be done on streamlining and improving/documenting common scenarios and workarounds. - - [Follow this link to see what gets migrated using the default settings of the USMT.](https://docs.microsoft.com/en-us/windows/deployment/usmt/usmt-what-does-usmt-migrate#bkmk-3) - - - It would be possible to utilize the tool on a testing machine, convert a local account, keep the system bound to the domain and run both accounts in parallel. Investigate and be sure the newly converted ‘local account’ runs all applications and has all files as expected. Then switch over to that account and unbind from the domain. Providing this phased approach could help reduce friction and uncertainty in the process. - - Windows start menu layout will be lost & not migrated. - - Windows default apps, on first profile load the `default application` associations will be lost. These will need to be reconfigured in the `settings` application. - -![image42](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_42.png) - - Applications that are installed and ran from the appdata directory may not migrate fully. E.g. Onedrive & Microsoft Teams. This may result in the need to resync, reinstall or update shortcuts for the new profile. - - After converting the account, outlooks .ost offline cache file must be recreated and the account re-logged into. However the office activation and association should still be present but require a reauth. - -[https://blogs.technet.microsoft.com/askds/2010/02/11/usmt-ost-and-pst/](https://blogs.technet.microsoft.com/askds/2010/02/11/usmt-ost-and-pst/) - -![image43](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_43.png) - - Outlook .ost file - -# ADMU Deployment Options - -Regardless of how you deploy the ADMU the utility will leave the selected domain account that is being migrated **untouched and fully intact**. -The ADMU leverages the USMT and settings to migrate user data from a domain account to a net new local account. -[Follow this link to see what gets migrated using the default settings of the USMT.](https://docs.microsoft.com/en-us/windows/deployment/usmt/usmt-what-does-usmt-migrate#bkmk-3) - -## Download Links -GUI - gui_jcadmu.exe -* [GUI - Windows 7 / .net 3 ](https://github.com/TheJumpCloud/support/raw/master/ADMU/exe/Windows%207/gui_jcadmu_win7.exe) -* [GUI - Windows 8.1-10 / .net 4 ](https://github.com/TheJumpCloud/support/raw/master/ADMU/exe/Windows%208-10/gui_jcadmu_win10.exe) - -EXE - jcadmu.exe -* [JCADMU.exe - Windows 7 / .net 3 ](https://github.com/TheJumpCloud/support/raw/master/ADMU/exe/Windows%207/jcadmu_win7.exe) -* [JCADMU.exe - Windows 8.1-10 / .net 4 ](https://github.com/TheJumpCloud/support/raw/master/ADMU/exe/Windows%208-10/jcadmu_win10.exe) - -Powershell - Migration.ps1 & Functions.ps1 -* [Powershell](https://github.com/TheJumpCloud/support/tree/master/ADMU/powershell) - -## ADMU GUI - This is a Powershell based GUI executable that utilizes WPF to collect input parameters to pass to the ADMU powershell code. - - If the GUI is ran and the system is not domain joined the utility will not let the user continue with the process. The only option is to quit the application. - -![image7](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_7.png) - -### Using the ADMU GUI - -To use the GUI run the relevant .exe file for your system as administrator from the Download Links above. It is also required to unblock the Security setting stating `This file came from another computer and might be blocked to help protect this computer`. It may also be flagged by antivirus software and need to be excluded. This will be addressed by code signing the file in a future release and this step no longer be required. - -![image48](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_48.png) - -To resolve this right click on the .exe that you wish to run and select "Properties". - - -![image47](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_47.png) - -On the security tab check the box for "Unblock" click "Ok" and you will be able to open the .exe - -## ADMU Powershell Script - - This script can be passed the required parameters and utilized in larger or silent deployment scenarios as it is all CLI/PS based. - -### Using the ADMU Powershell Script - - The powershell script Migration.ps1 requires Functions.ps1 to be present in the same directory as it relies on importing functions from the Functions.ps1 file to work. - -![image8](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_8.png) - - -![image9](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_9.png) - - -```powershell -.\Migration.ps1 -DomainUserName 'tcruise' -JumpCloudUserName 'tom.cruise' -TempPassword 'Temp123!' -JumpCloudConnectKey '4e7699c4c1c1e3126fb627240723cb3g292ebc75' -AcceptEULA $true -InstallJCAgent $true -LeaveDomain $true -ForceReboot $true -``` - - - If the paramaters -AcceptEULA -InstallJCAgent -LeaveDomain or -ForceReboot is not added to the command it will default to $false. - - - The Powershell script has validation on the main parameters and requires them to not to be empty as well as the -jumpcloudconnectkey must be 40chars or it will not move forward. - -![image10](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_10.png) - - - Currently if you pass in a domain username that doesn’t exist it will continue and error at the 'user group addition' step in the script. Earlier Validation of this user accounts existence both locally and on the domain will be added into a future version of the tool to better gate and only allow conversions of possible accounts. This is controlled by the GUI implementation and its use of the selection list. - -![image11](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_11.png) - -![image12](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_12.png) - -## ADMU exe - -The Powershell code has also been packaged as an exe for various deployment scenarios. - -The .exe verison of the ADMU is really just a wrapper and runs the same powershell code discussed above. - -### Using the ADMU exe - - The exe can be run interactively and the parameters entered or via the command line using the -arguments option as seen below. If entered interactivly it will default -accepteula -installjcagent -leavedomain -forcereboot to $false. - -```powershell -c:\jcadmu.exe -arguments -domainusername 'bob.lazar' -jumpcloudusername 'blazar' -temppassword 'Temp123!' -jumpcloudconnectkey 'CONNECTKEY' -accepteula $true -installjcagent $true -leavedomain $false -forcereboot $false -``` -![image44](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_44.png) - -![image45](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_45.png) - -## Advanced Deployment Scenarios - - The ADMU has been developed with large scale deployments in mind. As the tool stands today we are looking to gather customer input on the various environments and use cases, from this we can tweak and improve to the tool to solve a range of scenarios and stream line the account conversion process. - - Powershell Remoting Scenario: - - It is possible to utilize Powershell Remoting to query, report & execute the ADMU tool on multiple systems from a domain controller or member server. - - Report local accounts example -```powershell -$systems = @('10ent17091', '10ent18031', '10ent18091', '10pro17091', '10pro18031', '10pro18091', '81pro', '7pro1') - -Invoke-Command -ComputerName $systems { -Get-WmiObject -Class:('Win32_UserProfile') -Property * | Where-Object {$_.Special -eq $false, $_.RoamingConfigured -eq $false} | ` -Select-Object Loaded, @{Name = "LastLogin"; EXPRESSION = {$_.ConvertToDateTime($_.lastusetime)}}, @{Name = "UserName"; EXPRESSION = {(New-Object System.Security.Principal.SecurityIdentifier($_.SID)).Translate([System.Security.Principal.NTAccount]).Value}; } |FT -} -``` - - Run local file with params example -```powershell -$remotesystem = "10ent17091" -Invoke-Command -ComputerName $remotesystem { -c:\ADMU\powershell\Migration.ps1 -DomainUserName 'tom.hanks' -JumpCloudUserName 'thanks' -TempPassword 'Temp123!' -JumpCloudConnectKey 'CONNECTKEY' -AcceptEULA $true -InstallJCAgent $true -LeaveDomain $true -ForceReboot $true -} -``` - - Possible future deployment scenarios: - * ADMU file deployment script & commands - * Logon script via GPO - * Meraki deployment - * PDQ deployment - * Intune deployment - * MTP & MSP deployment - - -# Error Logging & Troubleshooting Errors - - The ADMU tool creates a log file in: -c:\windows\temp\jcadmu.log - -## Log Levels - - * Information - Tells what is going on -``` -2019-07-23 09:01:38 INFO: Download of Windows ADK Setup file completed successfully -``` - * Warning - A non script terminating error -``` -2019-07-23 09:03:52 WARNING: Removal Of Temp Files & Folders Failed -``` - - * Error - A script terminating error -``` -2019-07-23 08:56:38 ERROR: System is NOT joined to a domain. -``` - -## Troubleshooting errors - - The JCADMU.log file can help troubleshoot possible issues with the tool and why it didn't complete. Below are some examples - -``` -ERROR: System is NOT joined to a domain. -``` -The system is not bound to a domain, currently the tool requires this to convert domain accounts--local accounts. - -``` -ERROR: Microsoft Windows ADK - User State Migration Tool not found in c:\adk. Make sure it is installed correctly and in the required location. -``` -The Microsoft Windows ADK must be installed in c:\adk. If it is previously installed in another directory the script will fail. In the future this will be changed to account for the default installer path in 'C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit'. To resolve this you would have to uninstall the ADK and either reinstall or let the script install in c:\adk. - -``` -ERROR: Failed To Download Windows ADK Setup -``` - If the download step fails to download the file to the directory the script will fail. This could be due to internet connectivity or other connection issues. - -``` -ERROR: Failed to complete scanstate tool -``` - the log will show the 'scanstate' command that is being run on the system, if it fails to complete the script will error out. The preceeding INFO log entry can help with troubleshooting and verifying if the command is correct. It is also possible the disk does not have sufficient space to complete the scanstate command. -``` -INFO: Starting scanstate tool on user jcadb2\bob.lazar -``` -``` -INFO: Scanstate Command: .\scanstate.exe c:\Windows\Temp\JCADMU\store /nocompress /i:miguser.xml /i:migapp.xml /l:c:\Windows\Temp\JCADMU\store\scan.log /progress:c:\Windows\Temp\JCADMU\store\scan_progress.log /o /ue:*\* /ui: $netbiosname /c -``` -``` -ERROR: Failed to complete loadstate tool -``` - This is similar to the scanstate error but for the loadstate tool, if it fails to complete the script will error out. This could be due to issues with the scanstate step and a corrupted store state in c:\Windows\Temp\JCADMU\store\ - -``` -ERROR: Failed To add new user ' + $JumpCloudUserName + ' to Users group -``` - If the script fails to add the newly created user to the 'users' group on the system it will error out. This could be due to the fact the account doesn't exist or a duplicate or incorrect account name was used etc. - -``` -ERROR: Jumpcloud agent installation failed -``` - The Jumpcloud agent could error due to the agents prerequisites failing to install (C++ runtimes) or due to the installer being passed an incorrect connect key. If either of these steps fail it will error out. - -``` -ERROR: Unable to leave domain, Jumpcloud agent will not start until resolved' -``` - The final step is for the system to leave the domain and remove the active directory bind of the system. This utilizes a WMI call to leave the domain from the client side. If this fails it will error out. If the domain bind still exists the workstation will not be able to start the JumpCloud agent. - -``` -WARNING: Removal Of Temp Files & Folders Failed -``` - The script attempts at various stages to clear and recursivly delete files to leave the system in a clean state. If any of the files in use are locked, this step will output a warning. This would indicate the files may still be on the system and should be manually cleared if required. - -# Usage Notes and Examples - - Domain joined system 10PRO18091 on domain JCADB2.local with Local Domain Account named JCADB2\bob.lazar and a local account named 10PRO18091\Administrator. - - - Example Migration: - * Convert JCADB2\bob.lazar to 10PRO18091\blazar - * Unjoin System from JCADB2.local domain - * Install JumpCloud agent onto system - -![image15](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_15.png) - -![image16](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_16.png) - - ADMU GUI utility is launched - -![image17](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_17.png) - - Both local & Domain user accounts on the system are listed in the listbox at the top of the window, showing the username, the last time it was logged into, if the profile is currently loaded and if domain roaming is configured. System information is also listed on the top right listing the computer name, domain name & if USMT is currenlty present on the system. - - ‘USMT status’ this is true if microsoft ADMT & USMT are found on the system in the required location. If this is false, the required tools and prerequisites will be downloaded and installed in the next steps. - - The 'Jumpcloud Connect Key' is specific to your organization and can be found in the systems, new system, windows aside [here](https://console.jumpcloud.com/#/systems/new). - -![image18](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_18.png) - - The ‘Accept EULA’ checkbox allows true or false to be selected. More Info will link to more specifics on the EULA in this document. - The 'Install JCAgent' checkbox will install the JumpCloud system agent and its prerequisites using the 'JumpCloud Connect Key' to associate with the coresponding organization. - The 'Leave Domain' checkbox will force the system to unbind the from the domain, this is required for the JCAgent service to start. - The 'Force Reboot' checkbox will force the system to reboot with a countdown after the 'leave domain' step, a reboot is required for the domain bind to be removed and jcagent to start. - - The 'Local Account Username' is the desired local profile name that should match with the JumpCloud username. This will allow JC to takeover this account and sync the password when bound. - The 'Local Account Password' is the password used for the newly created account. Once JC has take over the new account the password would stay in sync with the JC user that is bound and matches. - -![image19](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_19.png) - - Once a profile is selected and text boxes correctly filled out, the ‘Migrate Profile’ button will become active and can be clicked and the JCADMU.ps1 script will be passed the parameters and ran. - - -## ADMU Steps - What is the script doing? - - * Checks if USMT is installed on the system and present in C:\adk\Assessment and Deployment Kit\User State Migration Tool\ - * If not present ‘windows ADK’ installer is downloaded. The ‘Accept EULA’ value is checked. - * True, the USMT will be installed silently with no user interaction required - * False, the USMT will be installed and require user interaction - - - -### ADK & USMT INSTALLER - - - -![image20](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_20.png) - - If the system already has ADK/USMT installed on the system but is not located in c:\adk the script will error and return: - -```powershell -LOG: 'Microsoft Windows ADK - User State Migration Tool not found in c:\adk. Make sure it is installed correctly and in the required location.' -``` - -This will need to be corrected before the tool can move forward, so ADK/USMT should be uninstalled and reinstalled in the required location. - - On win7 base systems .net framework is required for the ADK/USMT installer to work. This will be installed in the background if not present. - -![image21](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_21.png) - -If ‘Accept EULA’ parameter is equal to $false or not present the end user will see: - -```powershell -LOG: 'Installing Windows ADK at c:\adk\ please complete GUI prompts & accept EULA within 5mins or it will exit.' -``` - -![image22](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_22.png) - -![image23](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_23.png) - -![image24](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_24.png) - -![image25](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_25.png) - -![image26](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_26.png) - -![image27](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_27.png) - - Once this is completed the script will continue to the next steps and output to the log: - -```powershell -LOG: 'Microsoft Windows ADK - User State Migration Tool ready to be used.' -``` - - If the end user does not complete the above steps in 5mins the script will timeout and exit and have to be run again from the beginning. - - If ‘Accept EULA’ is equal to $true the ADK/USMT will be installed silently to a default location and simply show in the log it was installed or error accordingly. - -```powershell -Log: 'Installing Windows ADK at c:\adk\ silently. By using "$AcceptEULA = "true" you are accepting the "Microsoft Windows ADK EULA". This process could take up to 3mins if .net is required to be installed, it will timeout if it takes longer than 5mins.' -``` - - If installed on the system it would show: - -![image29](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_29.png) - - Control Panel Add remove programs Entry - -![image30](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_30.png) - - C:\adk installed folders - - Next the ADMU will run the ‘Scanstate’ command from the ‘User State Migration Tool using the passed in parameters. - -```powershell -Log: 'Starting scanstate tool on user '$netbiosname + '\' + $DomainUserName' -``` - -```powershell -Log: 'Scanstate Command: .\scanstate.exe c:\Windows\Temp\JCADMU\store /nocompress /i:miguser.xml /i:migapp.xml /l:c:\Windows\Temp\JCADMU\store\scan.log /progress:c:\Windows\Temp\JCADMU\store\scan_progress.log /o /ue:*\* /ui:' $netbiosname /c' -``` - - This step is capturing the current state of the profile and making a copy in c:\windows\temp\JCADMU\ - - - It is possible that if the profile is very large in size and the available disk space is not enough, the capture could fail. If the ADMU succeeds the captured profile is eventually deleted and space recovered. - - -Although this adds ‘duplication’ time and space it also provides the ability if there is an issue or error the ability to revert and return the system to the original state. - -![image31](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_31.png) - -![image32](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_32.png) - - UPDATE TO C:\WINDOWS\TEMP\JCADMU\ - -```powershell -LOG: 'Scanstate tool completed on user' $netbiosname + '\' + $DomainUserName -``` - -Next the ‘Loadstate’ command is run against the previously captured profile from above. - -```powershell -LOG: 'Starting loadstate tool on user ' $netbiosname + '\' + $DomainUserName + ' converting to ' + $localcomputername + '\' + $JumpCloudUserName) -``` - -```POWERSHELL -**LOG:** **'Loadstate Command:.\loadstate.exe c:\Windows\Temp\JCADMT\store /i:miguser.xml /i:migapp.xml /nocompress /l:c:\Windows\Temp\JCADMT\store\load.log /progress:c:\Windows\Temp\JCADMT\store\load_progress.log /ue:*\* /ui:' + $netbiosname + '\' + $DomainUserName + '/lac:$TEMPPASSWORD /lae /c /mu:' + $netbiosname + '`\' + $DomainUserName + '`:' + $localcomputername + '\' + $JumpCloudUserName) -``` - -![image33](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_33.png) - - Once the conversion is completed the newly converted/created user is added to the computers ‘User group’. This allows the new account to show up on the logon screen and be used. - -Depending on the passed options/paramaters the script will take the next required action. - -If the JumpCloud agent is selected to install. The system is checked to make sure it is not previously installed. The system is also checked for the required ‘Microsoft Visual C++ Redistributables’. If they are not present they are downloaded and installed silently. - - They agent is then installed using the passed in Connect Key. If this key was incorrect the installer would fail and script stopped. They system must also have an internet connection to register the system on JumpCloud during this step. - -![image34](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_34.png) - - Currently by design the JumpCloud agent service will not start if the system is bound to a domain and the ‘network category’ is 'DomainAuthenticated'. - -![image35](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_35.png) - - If the admin chooses to leave the domain or force reboot the system will then do so. If the agent is able to checkin (Not bound to domain) the system will show up in the JC console. - -![image36](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_36.png) - - Once the system checks in, the coresponding Jumpcloud user can be bound to the system. If the username matches the account will be ‘taken over’ and the password will update and sync with jumpcloud. - -![image37](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_37.png) - -![image38](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_38.png) - - Now the user can login with the same password as JumpCloud once in sync. - -![image39](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_39.png) - -![image40](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_40.png) - - If the above steps complete successfully, the system will now be bound to JumpCloud and no longer bound to the active directory domain. However the system still has a local copy of the original cached domain profile. This can be seen as ‘Account Unknown’ in the user profiles screen, and the corresponding folder in ```C:\Users\.``` This is useful incase the administrator wants to reverse or rejoin the system and access the previous domain account. For example maybe the conversion process broke a business critical application and they need a way for the user to quickly get back to the previous state. - - In that case the administrator can just rejoin the system to the domain (the Jumpcloud agent will no longer function due to the network configuration changing back to DomainAuthenticated), but the profile will return to how it was. - -![image41](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_41.png) - -# Definitions - -## Windows ADK - Windows Assessment and Deployment Kit - - Windows Assessment and Deployment Kit (ADK) for Windows provides new and improved deployment tools for automating large-scale deployments of Windows. - -## USMT - User State Migration Tool - - [Microsoft User State Migration Tool](https://docs.microsoft.com/en-us/windows/deployment/usmt/usmt-overview) is a bundled utility in the Windows ADK. - - -## ADMU - Active Directory Migration Utility - - Name for the JumpCloud tool that utilizes USMT to convert domain bound systems and accounts to JumpCloud. - - -## What Is In A Windows Profile - -* A registry hive. The registry hive is the file NTuser.dat. The hive is loaded by the system at user logon, and it is mapped to the HKEY_CURRENT_USER registry key. The user's registry hive maintains the user's registry-based preferences and configuration. - - * A set of profile folders stored in the file system. User-profile files are stored in the Profiles directory, on a folder per-user basis. The user-profile folder is a container for applications and other system components to populate with sub-folders, and per-user data such as documents and configuration files. Windows Explorer uses the user-profile folders extensively for such items as the user's Desktop, Start menu and Documents folder. - - * App data folder contains data and settings related to applications. Each windows user/profile has its own broken down into roaming and local. If a system is domain joined certain settings can roam across the domain vs local will only be specific to that user on that system. - -## Windows Profile Types - -Refernce: [Microsoft Windows User Profiles](https://docs.microsoft.com/en-us/windows/win32/shell/about-user-profiles) - -### Local user profile - - * Created upon first logon - * Stored on local hard disk - * Changes to profile are stored on computer and user specific - -### Roaming user profile - - * Downloaded upon first logon & requires connection to server - * Stored and redirects to file share - * Syncs changes to file share when accessible - * Merged with local profile to allow offline ‘cached version’ - * Dissociated/unusable when system is unbound from domain - - -### Microsoft Account based profile - - * Tied to online ‘Live ID’ or ‘Microsoft Account’ - * Syncs account settings via cloud - * Can utilize onedrive to sync desktop, network profiles, passwords, wifi etc. - * Tightly coupled with online identity and services. - - -```diff -- Microsoft accounts are not supported with JumpCloud takeover. -``` -### Azure AD Profile Scenarios - -Reference: [https://docs.microsoft.com/en-us/azure/active-directory/devices/](https://docs.microsoft.com/en-us/azure/active-directory/devices/) - -#### Azure AD Join - - Windows 10 systems can be ‘Azure AD Joined’ to an ‘Azure AD’ instance and shows up under ‘Devices’. Based on the ‘Azure AD’ settings, Users and Admins can associate a system to an ‘Azure AD’ identity allowing login to the system with ‘Azure AD’ credentials. This creates a cached local account that is associated to this account and named ‘AzureAD\Username’. - - This type of account is not supported by JumpCloud takeover when binding users to a system and would create a new ‘local profile’ in this example if JumpCloud username was ‘BradStevens’ it would create ‘10PRO1809-1\BradStevens’ and not sync/link with the ‘AzureAD\BradStevens’ profile. - - The ADMU Migration script can convert this account to a ‘local profile’. - - This can be achieved using the `$AzureADProfile=$true` parameter. - - ```powershell -.\Migration.ps1 -DomainUserName 'tcruise' -JumpCloudUserName 'tom.cruise' -TempPassword 'Temp123!' -JumpCloudConnectKey '4e7699c4c1c1e3126fb627240723cb3g292ebc75' -AcceptEULA $true -InstallJCAgent $true -AzureADProfile $true -``` - - -![image0](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_0.png) - - -![image1](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_1.png) - -#### Azure AD Registration - - A system can also be ‘registered’ to ‘Azure AD’, this is primarily for BYOD devices in which complete control of the system is not required or present. This can be done in windows 10 under Settings, Accounts, Access work or school, Connect. Once signed in the system would be registered, this registration is independent of the profile and simply associated to the underlying system profile. This means that as long as the parent profile is managed by JumpCloud it can co-exist vs the ‘Azure AD Join’ scenario above can not and requires account conversion. - -![image2](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_2.png) - -![image3](https://github.com/TheJumpCloud/support/blob/master/ADMU/images/img_3.png) - -#### Hybrid Azure AD Join - - It is also possible to ‘Hybrid Azure AD Join’ a system. This is when a system is both domain bound and azure ad joined to get the best of both scenarios. It also allows non windows 10 systems to be managed within ‘Azure Ad’ however it is more limited than the other windows 10 options. It does not impact or create any local profiles and JumpCloud can run alongside this scenario. In this scenario be advised that end user education may be required to ensure users follow a password reset workflow that updates both Azure AD and JumpCloud. - -```diff -- Hybrid Azure AD Join is not supported with JumpCloud takeover. -``` - -# Future Development - - * Sign .exe - * Combine and improve .exe to single file - * Domain validation - * Ability to convert multiple accounts - * Custom USMT xml templates - * Show local, domain & azure accounts - * Show if account is in local admin group - * Ability to change & edit username - * etc. +Please use the GitHub issues tab, email [support@jumpcloud.com](support@jumpcloud.com) or the [feedback form](https://github.com/TheJumpCloud/jumpcloud-ADMU/wiki/feedback-form). diff --git a/azure-pipelines.yml b/azure-pipelines.yml deleted file mode 100644 index 5230c108..00000000 --- a/azure-pipelines.yml +++ /dev/null @@ -1,22 +0,0 @@ -pool: - name: ADMU - demands: cmd - -steps: -- task: PowerShell@2 - displayName: 'TestSetup Script' - inputs: - targetType: filePath - filePath: ./powershell/Tests/TestSetup.ps1 - arguments: '-TestOrgConnectKey:(''$(secretXConnectKey.Pester)'')' - timeoutInMinutes: 60 - env: - system.debug: true - -- task: PowerShell@2 - displayName: 'InvokePester Script' - inputs: - targetType: filePath - filePath: ./powershell/InvokePester.ps1 - errorActionPreference: continue - condition: succeededOrFailed() \ No newline at end of file diff --git a/exe/Windows 7/gui_jcadmu_win7.exe b/exe/Windows 7/gui_jcadmu_win7.exe deleted file mode 100644 index 99d54bb7..00000000 Binary files a/exe/Windows 7/gui_jcadmu_win7.exe and /dev/null differ diff --git a/exe/Windows 7/jcadmu_win7.exe b/exe/Windows 7/jcadmu_win7.exe deleted file mode 100644 index dcc9900c..00000000 Binary files a/exe/Windows 7/jcadmu_win7.exe and /dev/null differ diff --git a/exe/Windows 8-10/gui_jcadmu_win10.exe b/exe/Windows 8-10/gui_jcadmu_win10.exe deleted file mode 100644 index 2b9b99e0..00000000 Binary files a/exe/Windows 8-10/gui_jcadmu_win10.exe and /dev/null differ diff --git a/exe/Windows 8-10/jcadmu_win10.exe b/exe/Windows 8-10/jcadmu_win10.exe deleted file mode 100644 index 4c0e61ca..00000000 Binary files a/exe/Windows 8-10/jcadmu_win10.exe and /dev/null differ diff --git a/gpo/manifest.xml b/gpo/manifest.xml deleted file mode 100644 index 5210156b..00000000 --- a/gpo/manifest.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/gpo/{A5D8D976-ECA9-489E-92C7-C05CDE6A434F}/Backup.xml b/gpo/{A5D8D976-ECA9-489E-92C7-C05CDE6A434F}/Backup.xml deleted file mode 100644 index 9e53f757..00000000 --- a/gpo/{A5D8D976-ECA9-489E-92C7-C05CDE6A434F}/Backup.xml +++ /dev/null @@ -1,18 +0,0 @@ - - 01 00 04 9c 00 00 00 00 00 00 00 00 00 00 00 00 14 00 00 00 04 00 10 01 09 00 00 00 05 02 28 00 00 01 00 00 01 00 00 00 8f fd ac ed b3 ff d1 11 b4 1d 00 a0 c9 68 f9 39 01 01 00 00 00 00 00 05 0b 00 00 00 00 00 24 00 ff 00 0f 00 01 05 00 00 00 00 00 05 15 00 00 00 8b 28 56 8e 20 a4 2d 89 a0 19 9a 92 00 02 00 00 00 02 24 00 14 00 02 00 01 05 00 00 00 00 00 05 15 00 00 00 8b 28 56 8e 20 a4 2d 89 a0 19 9a 92 84 04 00 00 00 02 24 00 ff 00 0f 00 01 05 00 00 00 00 00 05 15 00 00 00 8b 28 56 8e 20 a4 2d 89 a0 19 9a 92 00 02 00 00 00 02 24 00 ff 00 0f 00 01 05 00 00 00 00 00 05 15 00 00 00 8b 28 56 8e 20 a4 2d 89 a0 19 9a 92 07 02 00 00 00 02 14 00 94 00 02 00 01 01 00 00 00 00 00 05 09 00 00 00 00 02 14 00 94 00 02 00 01 01 00 00 00 00 00 05 0b 00 00 00 00 02 14 00 ff 00 0f 00 01 01 00 00 00 00 00 05 12 00 00 00 00 0a 14 00 ff 00 0f 00 01 01 00 00 00 00 00 03 00 00 00 00 - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/gpo/{A5D8D976-ECA9-489E-92C7-C05CDE6A434F}/DomainSysvol/GPO/GPO.cmt b/gpo/{A5D8D976-ECA9-489E-92C7-C05CDE6A434F}/DomainSysvol/GPO/GPO.cmt deleted file mode 100644 index 487c30a6..00000000 Binary files a/gpo/{A5D8D976-ECA9-489E-92C7-C05CDE6A434F}/DomainSysvol/GPO/GPO.cmt and /dev/null differ diff --git a/gpo/{A5D8D976-ECA9-489E-92C7-C05CDE6A434F}/DomainSysvol/GPO/Machine/Microsoft/Windows NT/SecEdit/GptTmpl.inf b/gpo/{A5D8D976-ECA9-489E-92C7-C05CDE6A434F}/DomainSysvol/GPO/Machine/Microsoft/Windows NT/SecEdit/GptTmpl.inf deleted file mode 100644 index 91061e3d..00000000 Binary files a/gpo/{A5D8D976-ECA9-489E-92C7-C05CDE6A434F}/DomainSysvol/GPO/Machine/Microsoft/Windows NT/SecEdit/GptTmpl.inf and /dev/null differ diff --git a/gpo/{A5D8D976-ECA9-489E-92C7-C05CDE6A434F}/DomainSysvol/GPO/Machine/Preferences/Files/Files.xml b/gpo/{A5D8D976-ECA9-489E-92C7-C05CDE6A434F}/DomainSysvol/GPO/Machine/Preferences/Files/Files.xml deleted file mode 100644 index baa39cc1..00000000 --- a/gpo/{A5D8D976-ECA9-489E-92C7-C05CDE6A434F}/DomainSysvol/GPO/Machine/Preferences/Files/Files.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/gpo/{A5D8D976-ECA9-489E-92C7-C05CDE6A434F}/DomainSysvol/GPO/Machine/Preferences/Services/Services.xml b/gpo/{A5D8D976-ECA9-489E-92C7-C05CDE6A434F}/DomainSysvol/GPO/Machine/Preferences/Services/Services.xml deleted file mode 100644 index 2d5976bc..00000000 --- a/gpo/{A5D8D976-ECA9-489E-92C7-C05CDE6A434F}/DomainSysvol/GPO/Machine/Preferences/Services/Services.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/gpo/{A5D8D976-ECA9-489E-92C7-C05CDE6A434F}/DomainSysvol/GPO/Machine/comment.cmtx b/gpo/{A5D8D976-ECA9-489E-92C7-C05CDE6A434F}/DomainSysvol/GPO/Machine/comment.cmtx deleted file mode 100644 index d962772c..00000000 --- a/gpo/{A5D8D976-ECA9-489E-92C7-C05CDE6A434F}/DomainSysvol/GPO/Machine/comment.cmtx +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/gpo/{A5D8D976-ECA9-489E-92C7-C05CDE6A434F}/DomainSysvol/GPO/Machine/registry.pol b/gpo/{A5D8D976-ECA9-489E-92C7-C05CDE6A434F}/DomainSysvol/GPO/Machine/registry.pol deleted file mode 100644 index 19a3b14f..00000000 Binary files a/gpo/{A5D8D976-ECA9-489E-92C7-C05CDE6A434F}/DomainSysvol/GPO/Machine/registry.pol and /dev/null differ diff --git a/gpo/{A5D8D976-ECA9-489E-92C7-C05CDE6A434F}/bkupInfo.xml b/gpo/{A5D8D976-ECA9-489E-92C7-C05CDE6A434F}/bkupInfo.xml deleted file mode 100644 index 44a363ca..00000000 --- a/gpo/{A5D8D976-ECA9-489E-92C7-C05CDE6A434F}/bkupInfo.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/gpo/{A5D8D976-ECA9-489E-92C7-C05CDE6A434F}/gpreport.xml b/gpo/{A5D8D976-ECA9-489E-92C7-C05CDE6A434F}/gpreport.xml deleted file mode 100644 index 7540e6f2..00000000 Binary files a/gpo/{A5D8D976-ECA9-489E-92C7-C05CDE6A434F}/gpreport.xml and /dev/null differ diff --git a/images/ADMU_workflow.png b/images/ADMU_workflow.png deleted file mode 100644 index 460650de..00000000 Binary files a/images/ADMU_workflow.png and /dev/null differ diff --git a/images/img_0.png b/images/img_0.png deleted file mode 100644 index aa9e3456..00000000 Binary files a/images/img_0.png and /dev/null differ diff --git a/images/img_1.png b/images/img_1.png deleted file mode 100644 index 143e28f4..00000000 Binary files a/images/img_1.png and /dev/null differ diff --git a/images/img_10.png b/images/img_10.png deleted file mode 100644 index b82a0716..00000000 Binary files a/images/img_10.png and /dev/null differ diff --git a/images/img_11.png b/images/img_11.png deleted file mode 100644 index 42309d0b..00000000 Binary files a/images/img_11.png and /dev/null differ diff --git a/images/img_12.png b/images/img_12.png deleted file mode 100644 index d0f78576..00000000 Binary files a/images/img_12.png and /dev/null differ diff --git a/images/img_13.png b/images/img_13.png deleted file mode 100644 index e19b5249..00000000 Binary files a/images/img_13.png and /dev/null differ diff --git a/images/img_15.png b/images/img_15.png deleted file mode 100644 index 6d32c831..00000000 Binary files a/images/img_15.png and /dev/null differ diff --git a/images/img_16.png b/images/img_16.png deleted file mode 100644 index 5965488c..00000000 Binary files a/images/img_16.png and /dev/null differ diff --git a/images/img_17.png b/images/img_17.png deleted file mode 100644 index 33627141..00000000 Binary files a/images/img_17.png and /dev/null differ diff --git a/images/img_18.png b/images/img_18.png deleted file mode 100644 index c3843f70..00000000 Binary files a/images/img_18.png and /dev/null differ diff --git a/images/img_19.png b/images/img_19.png deleted file mode 100644 index 8fd594c2..00000000 Binary files a/images/img_19.png and /dev/null differ diff --git a/images/img_2.png b/images/img_2.png deleted file mode 100644 index a377f454..00000000 Binary files a/images/img_2.png and /dev/null differ diff --git a/images/img_20.png b/images/img_20.png deleted file mode 100644 index dd0fda19..00000000 Binary files a/images/img_20.png and /dev/null differ diff --git a/images/img_21.png b/images/img_21.png deleted file mode 100644 index 6f9c4991..00000000 Binary files a/images/img_21.png and /dev/null differ diff --git a/images/img_22.png b/images/img_22.png deleted file mode 100644 index eb5f834c..00000000 Binary files a/images/img_22.png and /dev/null differ diff --git a/images/img_23.png b/images/img_23.png deleted file mode 100644 index 213abcc2..00000000 Binary files a/images/img_23.png and /dev/null differ diff --git a/images/img_24.png b/images/img_24.png deleted file mode 100644 index 21df9fc0..00000000 Binary files a/images/img_24.png and /dev/null differ diff --git a/images/img_25.png b/images/img_25.png deleted file mode 100644 index 529bbf54..00000000 Binary files a/images/img_25.png and /dev/null differ diff --git a/images/img_26.png b/images/img_26.png deleted file mode 100644 index ed70c89a..00000000 Binary files a/images/img_26.png and /dev/null differ diff --git a/images/img_27.png b/images/img_27.png deleted file mode 100644 index 0ba79ca6..00000000 Binary files a/images/img_27.png and /dev/null differ diff --git a/images/img_29.png b/images/img_29.png deleted file mode 100644 index fbd93f7a..00000000 Binary files a/images/img_29.png and /dev/null differ diff --git a/images/img_3.png b/images/img_3.png deleted file mode 100644 index 0e625c08..00000000 Binary files a/images/img_3.png and /dev/null differ diff --git a/images/img_30.png b/images/img_30.png deleted file mode 100644 index 06999091..00000000 Binary files a/images/img_30.png and /dev/null differ diff --git a/images/img_31.png b/images/img_31.png deleted file mode 100644 index 460f58f3..00000000 Binary files a/images/img_31.png and /dev/null differ diff --git a/images/img_32.png b/images/img_32.png deleted file mode 100644 index 5560fcaa..00000000 Binary files a/images/img_32.png and /dev/null differ diff --git a/images/img_33.png b/images/img_33.png deleted file mode 100644 index 5a5cc756..00000000 Binary files a/images/img_33.png and /dev/null differ diff --git a/images/img_34.png b/images/img_34.png deleted file mode 100644 index 4ed05024..00000000 Binary files a/images/img_34.png and /dev/null differ diff --git a/images/img_35.png b/images/img_35.png deleted file mode 100644 index 830d6558..00000000 Binary files a/images/img_35.png and /dev/null differ diff --git a/images/img_36.png b/images/img_36.png deleted file mode 100644 index 6dcb1412..00000000 Binary files a/images/img_36.png and /dev/null differ diff --git a/images/img_37.png b/images/img_37.png deleted file mode 100644 index 166241db..00000000 Binary files a/images/img_37.png and /dev/null differ diff --git a/images/img_38.png b/images/img_38.png deleted file mode 100644 index 3a70a63d..00000000 Binary files a/images/img_38.png and /dev/null differ diff --git a/images/img_39.png b/images/img_39.png deleted file mode 100644 index 177e635f..00000000 Binary files a/images/img_39.png and /dev/null differ diff --git a/images/img_40.png b/images/img_40.png deleted file mode 100644 index 76d020fe..00000000 Binary files a/images/img_40.png and /dev/null differ diff --git a/images/img_41.png b/images/img_41.png deleted file mode 100644 index 828a0c76..00000000 Binary files a/images/img_41.png and /dev/null differ diff --git a/images/img_42.png b/images/img_42.png deleted file mode 100644 index 5e1da8c4..00000000 Binary files a/images/img_42.png and /dev/null differ diff --git a/images/img_43.png b/images/img_43.png deleted file mode 100644 index e1a6c7da..00000000 Binary files a/images/img_43.png and /dev/null differ diff --git a/images/img_44.png b/images/img_44.png deleted file mode 100644 index bf7246b3..00000000 Binary files a/images/img_44.png and /dev/null differ diff --git a/images/img_45.png b/images/img_45.png deleted file mode 100644 index 8b9d624b..00000000 Binary files a/images/img_45.png and /dev/null differ diff --git a/images/img_46.png b/images/img_46.png deleted file mode 100644 index b144a045..00000000 Binary files a/images/img_46.png and /dev/null differ diff --git a/images/img_47.png b/images/img_47.png deleted file mode 100644 index e12c6fbf..00000000 Binary files a/images/img_47.png and /dev/null differ diff --git a/images/img_48.png b/images/img_48.png deleted file mode 100644 index 5955944f..00000000 Binary files a/images/img_48.png and /dev/null differ diff --git a/images/img_7.png b/images/img_7.png deleted file mode 100644 index 7b9ceb0f..00000000 Binary files a/images/img_7.png and /dev/null differ diff --git a/images/img_8.png b/images/img_8.png deleted file mode 100644 index e40a6811..00000000 Binary files a/images/img_8.png and /dev/null differ diff --git a/images/img_9.png b/images/img_9.png deleted file mode 100644 index edd863d8..00000000 Binary files a/images/img_9.png and /dev/null differ diff --git a/jumpcloud-ADMU-Advanced-Deployment/InvokeFromAgent/Invoke ADMU.ps1 b/jumpcloud-ADMU-Advanced-Deployment/InvokeFromAgent/Invoke ADMU.ps1 new file mode 100644 index 00000000..8f0e03f0 --- /dev/null +++ b/jumpcloud-ADMU-Advanced-Deployment/InvokeFromAgent/Invoke ADMU.ps1 @@ -0,0 +1,29 @@ +# Variables +# If system is domain bound, $SelectedUsername can be "Domain\userToConvert" +# Else, enter the SID of the user to Convert +$SelectedUsername = "" +# Enter the username of the JumpCloud User +$JumpCloudUserName = "" +$TempPassword = "Temp123!Temp123!" +$AcceptEULA = [System.Convert]::ToBoolean('true') +$LeaveDomain = [System.Convert]::ToBoolean('true') +$ConvertProfile = [System.Convert]::ToBoolean('true') +$AzureADProfile = [System.Convert]::ToBoolean('false') + +# Query User Sessions +$quserResult = quser +$quserRegex = $quserResult | ForEach-Object -Process { $_ -replace '\s{2,}', ',' } +$quserObject = $quserRegex | ConvertFrom-Csv + +# If the username of logged in user matches the profile path of the user we want +# to migrate, log them off. +If ($quserObject.username) +{ + # TODO: Logout if match + logoff.exe $quserObject.ID +} +# Kick off the ADMU with the SID from the selected user. +Start-Migration -JumpCloudUserName $JumpCloudUserName -SelectedUserName $SelectedUsername -TempPassword $TempPassword -AcceptEULA $AcceptEULA -LeaveDomain $LeaveDomain -ConvertProfile $ConvertProfile -AzureADProfile $AzureADProfile + +# Restart Comptuer to update UI at login screen +Restart-Computer -Force \ No newline at end of file diff --git a/jumpcloud-ADMU-Advanced-Deployment/InvokeFromAgent/collect-discovery-gist.ps1 b/jumpcloud-ADMU-Advanced-Deployment/InvokeFromAgent/collect-discovery-gist.ps1 new file mode 100644 index 00000000..048a0197 --- /dev/null +++ b/jumpcloud-ADMU-Advanced-Deployment/InvokeFromAgent/collect-discovery-gist.ps1 @@ -0,0 +1,43 @@ +$GHUsername = 'yourGhUsername' +$GHToken = 'yourGhToken' +$CSVFolder = 'C:\Windows\Temp\'; +$CSVResult = 'C:\Windows\Temp\ADMUResult.csv'; +$password = ConvertTo-SecureString "$GHToken" -AsPlainText -Force +$Cred = New-Object System.Management.Automation.PSCredential ($GHUsername, $password) + +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +Install-PackageProvider -Name NuGet -Force +# Install Module PowerShellForGitHub +Install-Module PowerShellForGitHub -Force + +# Set Authentication +Set-GitHubAuthentication -Credential $cred + +# Get GH Gists +$AllGists = Get-GitHubGist -Username $GHUsername +foreach ($IndividualGist in $AllGists) +{ + if ($IndividualGist.description -match "ADMU Discovery:") + { + Write-Host "Downloading Gist $($IndividualGist.GistId)" + Get-GitHubGist -Gist $IndividualGist.gistid -Path "C:\Windows\Temp\" -Force + } +} +# All ADMU discovery gists should be in Windows\Temp Write out to ADMUResult.csv +$CSVFiles = Get-ChildItem -path $CSVFolder | Where-Object { $_.BaseName -match "ADMU_Discovery_" } +$CSVFiles | ForEach-Object { [System.IO.File]::AppendAllText + ($CSVResult, [System.IO.File]::ReadAllText($_.FullName)) +} +$getFirstLine = $true +$CSVFiles | ForEach-Object { + $filePath = $_.PSPath + + $lines = $lines = Get-Content $filePath + $linesToWrite = switch ($getFirstLine) + { + $true { $lines } + $false { $lines | Select -Skip 1 } + } + $getFirstLine = $false + Add-Content $CSVResult $linesToWrite +} \ No newline at end of file diff --git a/jumpcloud-ADMU-Advanced-Deployment/InvokeFromAgent/discovery.ps1 b/jumpcloud-ADMU-Advanced-Deployment/InvokeFromAgent/discovery.ps1 new file mode 100644 index 00000000..8f1892fd --- /dev/null +++ b/jumpcloud-ADMU-Advanced-Deployment/InvokeFromAgent/discovery.ps1 @@ -0,0 +1,25 @@ +# Query Accounts based on Registry +$registyProfiles = Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" +$profileList = @() +foreach ($profile in $registyProfiles) +{ + $profileList += Get-ItemProperty -Path $profile.PSPath | Select-Object PSChildName, ProfileImagePath +} + +$users = @() +foreach ($listItem in $profileList) +{ + $sidPattern = "^S-\d-\d+-(\d+-){1,14}\d+$" + $isValidFormat = [regex]::IsMatch($($listItem.PSChildName), $sidPattern); + # Get Valid SIDs + if ($isValidFormat) + { + # Populate Users List + $users += [PSCustomObject]@{ + Name = $listItem.PSChildName + LocalPath = $listItem.ProfileImagePath + SID = $listItem.PSChildName + } + } +} +$users | ConvertTo-Csv \ No newline at end of file diff --git a/jumpcloud-ADMU-Advanced-Deployment/InvokeFromAgent/invoke-discovery-gist.ps1 b/jumpcloud-ADMU-Advanced-Deployment/InvokeFromAgent/invoke-discovery-gist.ps1 new file mode 100644 index 00000000..f6cf8896 --- /dev/null +++ b/jumpcloud-ADMU-Advanced-Deployment/InvokeFromAgent/invoke-discovery-gist.ps1 @@ -0,0 +1,59 @@ +# Github vars +$GHUsername = 'yourGhUsername' +$GHToken = 'yourGhToken' +$Hostname = $env:COMPUTERNAME +$Date = get-date -f yyyy_MM_dd_ss +$GHGistName = "ADMU_Discovery_$($Hostname)_$($Date).csv" +# $GHGistName = 'ADMU_Discovery.csv' +$GHGistDescription = "ADMU Discovery: $Hostname $Date" +$password = ConvertTo-SecureString "$GHToken" -AsPlainText -Force +$Cred = New-Object System.Management.Automation.PSCredential ($GHUsername, $password) + +# Vars +$CsvPath = "C:\Windows\Temp\$($GHGistName)" +New-Item -ItemType file -path $CsvPath -force | Out-Null +("" | Select-Object "ComputerName", "SelectedUserName", "LocalPath", "RoamingConfigured", "Loaded", "LocalProfileSize", "JumpCloudUserName", "TempPassword", "AcceptEULA", "LeaveDomain", "ForceReboot", "AzureADProfile", "InstallJCAgent", "JumpCloudConnectKey", "Customxml", "ConvertProfile", "MigrationSuccess", "DomainName" | ConvertTo-Csv -NoType -Delimiter ",")[0] | Out-File $CsvPath + +$info = Get-ComputerInfo +$Win32UserProfiles = Get-WmiObject -Class:('Win32_UserProfile') -Property * | Where-Object { $_.Special -eq $false } +$Win32UserProfiles | Add-Member -MemberType NoteProperty -Name ComputerName -Value "$($info.csname)" +$Win32UserProfiles | Add-Member -MemberType NoteProperty -Name LocalProfileSize -Value $null +$Win32UserProfiles | Add-Member -MemberType NoteProperty -Name JumpCloudUserName -Value $null +$Win32UserProfiles | Add-Member -MemberType NoteProperty -Name SelectedUserName -Value $null +$Win32UserProfiles | Add-Member -MemberType NoteProperty -Name TempPassword -Value 'Temp123!' +$Win32UserProfiles | Add-Member -MemberType NoteProperty -Name AcceptEULA -Value 'true' +$Win32UserProfiles | Add-Member -MemberType NoteProperty -Name LeaveDomain -Value 'false' +$Win32UserProfiles | Add-Member -MemberType NoteProperty -Name ForceReboot -Value 'false' +$Win32UserProfiles | Add-Member -MemberType NoteProperty -Name AzureADProfile -Value 'false' +$Win32UserProfiles | Add-Member -MemberType NoteProperty -Name InstallJCAgent -Value 'false' +$Win32UserProfiles | Add-Member -MemberType NoteProperty -Name JumpCloudConnectKey -Value '1111111111111111111111111111111111111111' +$Win32UserProfiles | Add-Member -MemberType NoteProperty -Name Customxml -Value 'false' +$Win32UserProfiles | Add-Member -MemberType NoteProperty -Name ConvertProfile -Value 'true' +$Win32UserProfiles | Add-Member -MemberType NoteProperty -Name CreateRestore -Value 'false' +$Win32UserProfiles | Add-Member -MemberType NoteProperty -Name MigrationSuccess -Value $null +$Win32UserProfiles | Add-Member -MemberType NoteProperty -Name DomainName -Value "$($info.csdomain)" + + +# Set Profiles Variable with data collected above +$profiles = $Win32UserProfiles | Select-Object ComputerName, SID, LocalPath , RoamingConfigured, Loaded, LocalProfileSize, JumpCloudUserName, TempPassword, AcceptEULA, LeaveDomain, ForceReboot, AzureADProfile, InstallJCAgent, JumpCloudConnectKey, Customxml, ConvertProfile, MigrationSuccess, DomainName + +# Export CSV skip header: +$data = $profiles | ConvertTo-Csv -NoTypeInformation | Select-Object -Skip 1 +$data | Out-File -FilePath $CsvPath -Append + +# Execution policy required to run scripts: +Set-ExecutionPolicy -ExecutionPolicy Bypass -Force +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +Install-PackageProvider -Name NuGet -Force +# Install Module PowerShellForGitHub +Install-Module PowerShellForGitHub -Force +Set-GitHubAuthentication -Credential $cred + +# Check for gist +$gist = Get-GitHubGist -UserName $GHUsername | Where-Object { $_.description -eq $GHGistDescription} +if (!($gist)) +{ + # upload gist for this host + Write-Host "Uploading new file" + New-GitHubGist -File $CsvPath -Description $GHGistDescription +} diff --git a/jumpcloud-ADMU-Advanced-Deployment/InvokeFromAgent/invoke-migration-gist.ps1 b/jumpcloud-ADMU-Advanced-Deployment/InvokeFromAgent/invoke-migration-gist.ps1 new file mode 100644 index 00000000..e4395afc --- /dev/null +++ b/jumpcloud-ADMU-Advanced-Deployment/InvokeFromAgent/invoke-migration-gist.ps1 @@ -0,0 +1,158 @@ +# These Variables must match your environment +$JcApiKey = 'yourJCAPIKey' +$GHUsername = 'yourGhUsername' +$GHToken = 'yourGhToken' +$GHGistDescription = 'ADMU_RESULT' + +# These variables are built automatically +$Hostname = $env:COMPUTERNAME +$DiscoveryCSV = 'C:\Windows\Temp\ADMUDiscovery.csv'; +$password = ConvertTo-SecureString "$GHToken" -AsPlainText -Force +$Cred = New-Object System.Management.Automation.PSCredential ($GHUsername, $password) + +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +Install-PackageProvider -Name NuGet -Force +# Install Module PowerShellForGitHub +Install-Module PowerShellForGitHub -Force + +Set-GitHubAuthentication -Credential $cred + +$gist = Get-GitHubGist -UserName $GHUsername | Where-Object { $_.description -eq $GHGistDescription } +Get-GitHubGist -Gist $gist.gistid -Path 'C:\Windows\Temp\'-Force +# Import the CSV +$ImportedCSV = Import-Csv -Path $DiscoveryCSV +# If Duplicates are found exit +$counts = $ImportedCSV | Group-Object ComputerName +foreach ($i in $counts) +{ + if ($i.count -gt 1) + { + write-error "Duplicate system found $($i.Name)" + } +} + +# Find user to be migrated +foreach ($row in $ImportedCSV) { + if ($row.Computername -eq $Hostname) { + # If system is domain bound, $SelectedUsername can be "Domain\userToConvert" + # Else, enter the SID of the user to Convert + # Get the username of the JumpCloud User from CSV + $SelectedUsername = $row.SelectedUserName + $JumpCloudUserName = $row.JumpCloudUserName + $TempPassword = $row.TempPassword + $JumpCloudConnectKey = $row.JumpCloudConnectKey + $AcceptEULA = [System.Convert]::ToBoolean($($row.AcceptEULA)) + $LeaveDomain = [System.Convert]::ToBoolean($($row.LeaveDomain)) + $ConvertProfile = [System.Convert]::ToBoolean($($row.ConvertProfile)) + $AzureADProfile = [System.Convert]::ToBoolean($($row.AzureADProfile)) + $InstallJCAgent = [System.Convert]::ToBoolean($($row.InstallJCAgent)) + } +} + +# Validate parameters are not empty: +If ( -Not ($SelectedUsername)::IsNullOrEmpty){ + Write-Host "Could not migrate user, entry not found in CSV for Selected Username" + exit +} +If ( -Not ($JumpCloudUserName)::IsNullOrEmpty) +{ + Write-Host "Could not migrate user, entry not found in CSV for JumpCloud Username" + exit +} +If ( -Not ($TempPassword)::IsNullOrEmpty) +{ + Write-Host "Could not migrate user, entry not found in CSV for TempPassword" + exit +} +Write-Host "Converting ADMU with the following options:" +Write-Host "SelectedUsername = $SelectedUsername" +Write-Host "JumpCloudUserName = $JumpCloudUserName" +Write-Host "TempPassword = $TempPassword" +Write-Host "AcceptEULA = $AcceptEULA" +Write-Host "LeaveDomain = $LeaveDomain" +Write-Host "ConvertProfile = $ConvertProfile" +Write-Host "AzureADProfile = $AzureADProfile" +Write-Host "InstallJCAgent = $InstallJCAgent" + + +# Install the ADMU +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +# Install-PackageProvider -Name NuGet -Force +Install-Module JumpCloud.ADMU -Force + +# Query User Sessions +$quserResult = quser +$quserRegex = $quserResult | ForEach-Object -Process { $_ -replace '\s{2,}', ',' } +$quserObject = $quserRegex | ConvertFrom-Csv + +# If the username of logged in user matches the profile path of the user we want +# to migrate, log them off. +If ($quserObject.username) +{ + # TODO: Logout if match + logoff.exe $quserObject.ID +} +# Kick off the ADMU with the SID from the selected user. +Set-ExecutionPolicy -ExecutionPolicy Bypass -Force +Start-Migration -JumpCloudUserName $JumpCloudUserName -SelectedUserName $SelectedUsername -TempPassword $TempPassword -AcceptEULA $AcceptEULA -LeaveDomain $LeaveDomain -ConvertProfile $ConvertProfile -AzureADProfile $AzureADProfile -JumpCloudConnectKey $JumpCloudConnectKey -InstallJCAgent $InstallJCAgent + +# Step 2 - Bind User Steps +# Get the JumpCloud SystemKey +$config = get-content 'C:\Program Files\JumpCloud\Plugins\Contrib\jcagent.conf' +$regex = 'systemKey\":\"(\w+)\"' +$systemKey = [regex]::Match($config, $regex).Groups[1].Value +if ($systemKey){ + $Headers = @{ + 'Accept' = 'application/json'; + 'Content-Type' = 'application/json'; + 'x-api-key' = $JcApiKey; + } + $Form = @{ + 'filter' = "username:eq:$($JumpcloudUserName)" + } + Try{ + Write-Host "Getting information from SystemID: $systemKey" + [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 + $Response = Invoke-WebRequest -Method 'Get' -Uri "https://console.jumpcloud.com/api/systemusers" -Headers $Headers -Body $Form -UseBasicParsing + $StatusCode = $Response.StatusCode + } + catch + { + $StatusCode = $_.Exception.Response.StatusCode.value__ + } + # Get Results, convert from Json + $Results = $Response.Content | ConvertFrom-JSON + $JcUserId = $Results.results.id + # Bind Step + if ($JcUserId){ + $Headers = @{ + 'Accept' = 'application/json'; + 'x-api-key' = $JcApiKey + } + $Form = @{ + 'op' = 'add'; + 'type' = 'system'; + 'id' = "$systemKey" + } | ConvertTo-Json + Try + { + Write-Host "Binding $JumpcloudUserName with userId: $JcUserId to SystemID: $systemKey" + [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 + $Response = Invoke-WebRequest -Method 'Post' -Uri "https://console.jumpcloud.com/api/v2/users/$JcUserId/associations" -Headers $Headers -Body $Form -ContentType 'application/json' -UseBasicParsing + $StatusCode = $Response.StatusCode + } + catch + { + $StatusCode = $_.Exception.Response.StatusCode.value__ + } + } + else { + Write-Host "Could not bind user/ JumpCloudUsername did not exist in JC Directory" + } +} +else{ + Write-Host "Could not find systemKey, aborting bind step" +} + +# Restart Computer to update UI at login screen +Restart-Computer -Force \ No newline at end of file diff --git a/jumpcloud-ADMU-Advanced-Deployment/InvokeFromAgent/systemInsightsDiscovery.ps1 b/jumpcloud-ADMU-Advanced-Deployment/InvokeFromAgent/systemInsightsDiscovery.ps1 new file mode 100644 index 00000000..54837586 --- /dev/null +++ b/jumpcloud-ADMU-Advanced-Deployment/InvokeFromAgent/systemInsightsDiscovery.ps1 @@ -0,0 +1,15 @@ +# This script is intended to be run from the Powershell Module on a local system +# If the JumpCloud agent is installed on AD Bound systems, all domain accounts +# can be queried for every system. + +# Get Windows systems +$systems = Get-JCSystem -os "Windows" +# Define SID Pattern for users +$sidPattern = "^S-\d-\d+-(\d+-){1,14}\d+$" +# Get Users on systems +$all = @() +foreach ($system in $systems) { + $all += Get-JCSystemInsights -Table User -SystemId $($system._id) | Where-Object { ($_.Directory -ne "") -AND ([regex]::IsMatch($($_.Uuid), $sidPattern)) -And ($_.Type -eq "roaming") } +} +$all | ConvertTo-Csv | Out-File "~/ADMU_EXPORT.CSV" +# Export CSV \ No newline at end of file diff --git a/jumpcloud-ADMU-Advanced-Deployment/InvokeFromJCAgent/1_ADMU_Discovery.ps1 b/jumpcloud-ADMU-Advanced-Deployment/InvokeFromJCAgent/1_ADMU_Discovery.ps1 new file mode 100644 index 00000000..b1d8c5d3 --- /dev/null +++ b/jumpcloud-ADMU-Advanced-Deployment/InvokeFromJCAgent/1_ADMU_Discovery.ps1 @@ -0,0 +1,55 @@ +# Github vars +$GHUsername = '' +$GHToken = '' # https://github.com/settings/tokens needs token to write/create repo +$GHRepoName = 'Jumpcloud-ADMU-Discovery' +$password = ConvertTo-SecureString "$GHToken" -AsPlainText -Force +$Cred = New-Object System.Management.Automation.PSCredential ($GHUsername, $password) + +$windowstemp = [System.Environment]::GetEnvironmentVariable('TEMP','Machine') +$newjsonoutputdir = $windowstemp + '\' + $env:COMPUTERNAME + '.json' +$workingdir = $windowstemp + '\jumpcloud-discovery' +$discoverycsvlocation = $workingdir + '\jcdiscovery.csv' + +if ($null -eq (Get-InstalledModule -Name "PowerShellForGitHub" -ErrorAction SilentlyContinue)) { + Install-Module PowerShellForGitHub -Force +} + +# Auth to github +Set-GitHubAuthentication -Credential $cred + +function Convert-Sid { + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)] + $Sid + ) + process { + try { + (New-Object System.Security.Principal.SecurityIdentifier($Sid)).Translate( [System.Security.Principal.NTAccount]).Value + } + catch { + return $Sid + } + } +} + +# Find local machine SID +$MachineSID = ($sidquery = (Get-WmiObject -Query "SELECT SID FROM Win32_UserAccount WHERE LocalAccount = 'True'" | Select-Object -First 1 -ExpandProperty SID) -split "-")[0..($sidquery.Length-2)]-join"-" +$DomainAccounts = Get-WmiObject -ClassName Win32_UserProfile | Select-Object SID,LocalPath,special | Where-Object {($_.SID -notmatch $MachineSID) -and ($_.special -eq $false)} + +# Add additional fields +$DomainAccounts | Add-Member -MemberType NoteProperty -Name LocalComputerName -Value $env:COMPUTERNAME +$DomainAccounts | Add-Member -MemberType NoteProperty -Name LocalUsername -Value $null +$DomainAccounts | Add-Member -MemberType NoteProperty -Name JumpCloudUserName -Value '' + +foreach ($account in $DomainAccounts) { + $account.LocalUsername = Convert-Sid -Sid $account.SID +} + +# Output local CSV +$DomainAccounts | Select-Object SID, LocalPath, LocalComputerName, LocalUsername, JumpCloudUserName | ConvertTo-Json -Compress | out-file $newjsonoutputdir -Encoding unicode + +# Upload latest csv to repo +$DomainLocalAccountsCSV = (get-content -Path $newjsonoutputdir -Encoding unicode) +Set-GitHubContent -OwnerName $GHUsername -RepositoryName $GHRepoName -BranchName 'main' -Path ($env:COMPUTERNAME + '.json') -CommitMessage $env:COMPUTERNAME -Content $DomainLocalAccountsCSV \ No newline at end of file diff --git a/jumpcloud-ADMU-Advanced-Deployment/InvokeFromJCAgent/2_ADMU_Collate.ps1 b/jumpcloud-ADMU-Advanced-Deployment/InvokeFromJCAgent/2_ADMU_Collate.ps1 new file mode 100644 index 00000000..5ca5df30 --- /dev/null +++ b/jumpcloud-ADMU-Advanced-Deployment/InvokeFromJCAgent/2_ADMU_Collate.ps1 @@ -0,0 +1,52 @@ +# Github vars +$GHUsername = '' +$GHToken = '' # https://github.com/settings/tokens needs token to write/create repo +$GHRepoName = 'Jumpcloud-ADMU-Discovery' +$password = ConvertTo-SecureString "$GHToken" -AsPlainText -Force +$Cred = New-Object System.Management.Automation.PSCredential ($GHUsername, $password) + +# If system is Mac, save to home directory +If ($IsMacOS){ + $tempDir = '~/' + $newjsonoutputdir = $tempDir + '/' + $env:COMPUTERNAME + '.json' + $workingdir = $tempDir + '\jumpcloud-discovery' + $discoverycsvlocation = $workingdir + '\jcdiscovery.csv' +} +elseif ($IsWindows){ + # If system is Windows and running Powershell 7.x.xxx, save to %TEMP%\Jumpcloud-discovery + $windowstemp = [System.Environment]::GetEnvironmentVariable('TEMP','Machine') + $newjsonoutputdir = $windowstemp + '\' + $env:COMPUTERNAME + '.json' + $workingdir = $windowstemp + '\jumpcloud-discovery' + $discoverycsvlocation = $workingdir + '\jcdiscovery.csv' +} +else { + # Assume PowerShell 5.1.xxx + $windowstemp = [System.Environment]::GetEnvironmentVariable('TEMP','Machine') + $newjsonoutputdir = $windowstemp + '\' + $env:COMPUTERNAME + '.json' + $workingdir = $windowstemp + '\jumpcloud-discovery' + $discoverycsvlocation = $workingdir + '\jcdiscovery.csv' +} + +if ($null -eq (Get-InstalledModule -Name "PowerShellForGitHub" -ErrorAction SilentlyContinue)) { + Install-Module PowerShellForGitHub -Force +} + +# Auth to github +Set-GitHubAuthentication -Credential $cred + +# Download all json files and collate +$GHJsonFiles = (Get-GitHubContent -OwnerName $GHUsername -RepositoryName $GHRepoName -BranchName 'main' -ErrorAction SilentlyContinue -WarningAction SilentlyContinue).Entries | Where-Object {$_.name -match '.json'} | Select-Object name,download_url +foreach ($file in $GHJsonFiles) { + New-Item -ItemType Directory -Force -Path $workingdir | Out-Null + $dlname = ($workingdir + '\' + $file.name) + [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 + Invoke-WebRequest -Uri $file.download_url -OutFile $dlname +} + +# Collate into single csv file +$combinedjson = @() +$jsonfiles = Get-ChildItem -Filter *.json -Path $workingdir +Foreach($File in $jsonfiles) { + $combinedjson += Get-Content -Raw $File.FullName -Encoding unicode | ConvertFrom-Json +} +$combinedjson | ConvertTo-Csv -NoTypeInformation | Out-File $discoverycsvlocation diff --git a/jumpcloud-ADMU-Advanced-Deployment/InvokeFromJCAgent/3_ADMU_Invoke.ps1 b/jumpcloud-ADMU-Advanced-Deployment/InvokeFromJCAgent/3_ADMU_Invoke.ps1 new file mode 100644 index 00000000..068c041e --- /dev/null +++ b/jumpcloud-ADMU-Advanced-Deployment/InvokeFromJCAgent/3_ADMU_Invoke.ps1 @@ -0,0 +1,76 @@ +# Github vars +$GHUsername = '' +$GHToken = '' # https://github.com/settings/tokens needs token to write/create repo +$GHRepoName = 'Jumpcloud-ADMU-Discovery' +$password = ConvertTo-SecureString "$GHToken" -AsPlainText -Force +$Cred = New-Object System.Management.Automation.PSCredential ($GHUsername, $password) + +$windowstemp = [System.Environment]::GetEnvironmentVariable('TEMP','Machine') +$workingdir = $windowstemp +$discoverycsvlocation = $workingdir + '\jcdiscovery.csv' + +# ADMU vars +$TempPassword = 'Temp123!Temp123!' +$LeaveDomain = $true +$ForceReboot = $false +$UpdateHomePath = $false +$AutobindJCUser = $false +$JumpCloudAPIKey = 'yourJCAPIKey' + +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +Install-PackageProvider -Name NuGet -Force +# Install Module PowerShellForGitHub +if ($null -eq (Get-InstalledModule -Name "PowerShellForGitHub" -ErrorAction SilentlyContinue)) { + Install-Module PowerShellForGitHub -Force +} + +# Auth to github +Set-GitHubAuthentication -Credential $cred + +# Download jcdiscovery.csv from GH +$jcdiscoverycsv = (Get-GitHubContent -OwnerName $GHUsername -RepositoryName $GHRepoName -BranchName 'main' -ErrorAction SilentlyContinue -WarningAction SilentlyContinue).Entries | Where-Object {$_.name -match 'jcdiscovery.csv'} | Select-Object name,download_url + New-Item -ItemType Directory -Force -Path $workingdir | Out-Null + $dlname = ($workingdir + '\jcdiscovery.csv') + [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 + Invoke-WebRequest -Uri $jcdiscoverycsv.download_url -OutFile $dlname + +# Import the CSV & check for one row per system +$ImportedCSV = Import-Csv -Path $discoverycsvlocation +$counts = $ImportedCSV | Group-Object LocalComputerName +foreach ($i in $counts) +{ + if ($i.count -gt 1) + { + write-error "Duplicate system found $($i.Name)" + exit 1 + } +} + +# Find user to be migrated +foreach ($row in $ImportedCSV) { + if ($row.LocalComputerName -eq ($env:COMPUTERNAME)) { + $SelectedUsername = $row.SID + $JumpCloudUserName = $row.JumpCloudUserName + } +} + +# Validate parameter are not empty: +If ([string]::IsNullOrEmpty($JumpCloudUserName)) +{ + Write-Error "Could not migrate user, entry not found in CSV for JumpCloud Username" + exit 1 +} + +# Install the latest ADMU from PSGallery +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +Install-Module JumpCloud.ADMU -Force + +# Query User Sessions & logoff +$quserResult = quser +$quserRegex = $quserResult | ForEach-Object -Process { $_ -replace '\s{2,}', ',' } +$quserObject = $quserRegex | ConvertFrom-Csv +If ($quserObject.username){logoff.exe $quserObject.ID} + +# Run ADMU +Set-ExecutionPolicy -ExecutionPolicy Bypass -Force +Start-Migration -JumpCloudUserName $JumpCloudUserName -SelectedUserName $SelectedUsername -TempPassword $TempPassword -LeaveDomain $LeaveDomain -ForceReboot $ForceReboot -UpdateHomePath $UpdateHomePath -AutobindJCUser $AutobindJCUser -JumpCloudAPIKey $JumpCloudAPIKey \ No newline at end of file diff --git a/jumpcloud-ADMU-Advanced-Deployment/ReadMe.md b/jumpcloud-ADMU-Advanced-Deployment/ReadMe.md new file mode 100644 index 00000000..14e39324 --- /dev/null +++ b/jumpcloud-ADMU-Advanced-Deployment/ReadMe.md @@ -0,0 +1,8 @@ +# jumpcloud-ADMU Advanced Deployment: + +Files: +- invoke-admu-discovery.ps1 +- invoke-admu-migration.ps1 + +Explanation: +See https://github.com/TheJumpCloud/jumpcloud-ADMU/wiki/advanced-deployment-scenarios \ No newline at end of file diff --git a/jumpcloud-ADMU-Advanced-Deployment/invoke-admu-discovery.ps1 b/jumpcloud-ADMU-Advanced-Deployment/invoke-admu-discovery.ps1 new file mode 100644 index 00000000..4871655e --- /dev/null +++ b/jumpcloud-ADMU-Advanced-Deployment/invoke-admu-discovery.ps1 @@ -0,0 +1,270 @@ +# #local AD Group Testing +# $ADgroup = "Group1" +# $group = Get-ADGroup -Identity $ADgroup -Properties member +# $members = @() +# $members = $group.member +# $Computers = @() +# foreach ($member in $members) { +# $member = $member.Substring(0, $member.IndexOf(',')) +# $member = $member.Replace('CN=','') +# $Computers += $member +# } + +#create admu_discovery.csv +$CSV = "C:\Windows\Temp\admu_discovery.csv" +New-Item -ItemType file -path $CSV -force | Out-Null +("" | Select-Object "ComputerName", "SelectedUserName", "LocalPath", "RoamingConfigured", "Loaded", "LocalProfileSize", "JumpCloudUserName", "TempPassword", "AcceptEULA", "LeaveDomain", "ForceReboot", "AzureADProfile", "InstallJCAgent", "JumpCloudConnectKey", "Customxml", "ConvertProfile", "MigrationSuccess", "DomainName" | ConvertTo-Csv -NoType -Delimiter ",")[0] | Out-File $CSV + +#load $computers list +#Change this AD query to return the computers required below is an example +#Check for computers logged into AD in the last 30days, search whole AD org, exclude if in a specific OU +$Time = (Get-Date).AddDays(-30) +$ComputerList = GET-ADComputer -filter {lastlogon -gt $Time} -searchbase 'DC=sajumpcloud,DC=com' -resultPageSize 2000 -ResultSetSize $null | Where-Object { ($_.distinguishedName -notlike "*OU=Cleanup,*") } +$Computers = @() +ForEach ($member in $ComputerList) { + $name = $($member.DistinguishedName).Substring(0, $($member.DistinguishedName).IndexOf(',')) + $name = $name.Replace('CN=', '') + $Computers += $name +} + +#check network connectivity to computers +$ConnectionTest = $Computers | ForEach-Object { Test-Connection -ComputerName $_ -Count 1 -AsJob } | Get-Job | Receive-Job -Wait | Select-Object @{Name='ComputerName';Expression={$_.Address}},@{Name='Reachable';Expression={if ($_.StatusCode -eq 0) { $true } else { $false }}} +$OnlineComputers = $ConnectionTest | ? { $_.Reachable -eq $True } +$OfflineComputers = $ConnectionTest | Where-Object { $_.Reachable -eq $False } + +#scriptblock to run on computers +$ScriptBlock ={ + #Get Computer Info + $info = Get-ComputerInfo + $Win32UserProfiles = Get-WmiObject -Class:('Win32_UserProfile') -Property * | Where-Object { $_.Special -eq $false } + $Win32UserProfiles | Add-Member -MemberType NoteProperty -Name ComputerName -Value "$($info.csname)" + $Win32UserProfiles | Add-Member -MemberType NoteProperty -Name LocalProfileSize -Value $null + $Win32UserProfiles | Add-Member -MemberType NoteProperty -Name JumpCloudUserName -Value $null + $Win32UserProfiles | Add-Member -MemberType NoteProperty -Name SelectedUserName -Value $null + $Win32UserProfiles | Add-Member -MemberType NoteProperty -Name TempPassword -Value 'Temp123!' + $Win32UserProfiles | Add-Member -MemberType NoteProperty -Name LeaveDomain -Value 'false' + $Win32UserProfiles | Add-Member -MemberType NoteProperty -Name ForceReboot -Value 'false' + $Win32UserProfiles | Add-Member -MemberType NoteProperty -Name AzureADProfile -Value 'false' + $Win32UserProfiles | Add-Member -MemberType NoteProperty -Name InstallJCAgent -Value 'false' + $Win32UserProfiles | Add-Member -MemberType NoteProperty -Name JumpCloudConnectKey -Value '1111111111111111111111111111111111111111' + $Win32UserProfiles | Add-Member -MemberType NoteProperty -Name ConvertProfile -Value 'true' + $Win32UserProfiles | Add-Member -MemberType NoteProperty -Name MigrationSuccess -Value $null + $Win32UserProfiles | Add-Member -MemberType NoteProperty -Name DomainName -Value "$($info.csdomain)" + + # #Uncomment to check profile sizes (this will add addtional time) + # #calculate estimated profile size + # $LocalUserProfiles = $Win32UserProfiles | Select-Object LocalPath + # $LocalUserProfilesTrim = ForEach ($LocalPath in $LocalUserProfiles) { $LocalPath.LocalPath.substring(9) } + # $i = 0 + # foreach ($userprofile in $LocalUserProfilesTrim) { + # $largeprofile = Get-ChildItem C:\Users\$userprofile -Recurse -Force -ErrorAction SilentlyContinue | Measure-Object -Sum length | Select-Object -ExpandProperty Sum + # $largeprofile = [math]::Round($largeprofile / 1MB, 0) + # $win32UserProfiles[$i].LocalProfileSize = $largeprofile + # $win32UserProfiles[$i].ComputerName = $env:computername + # $i++ + # } + + #return csv excluding headers & local accounts + $profiles = $Win32UserProfiles | Select-Object ComputerName, @{Name = "SelectedUserName"; EXPRESSION = { (New-Object System.Security.Principal.SecurityIdentifier($_.SID)).Translate([System.Security.Principal.NTAccount]).Value }; }, LocalPath , RoamingConfigured, Loaded, LocalProfileSize, @{Name = "JumpCloudUserName"; EXPRESSION = { ((New-Object System.Security.Principal.SecurityIdentifier($_.SID)).Translate([System.Security.Principal.NTAccount]).Value).Split('\')[1] }; }, TempPassword, AcceptEULA, LeaveDomain, ForceReboot, AzureADProfile, InstallJCAgent, JumpCloudConnectKey, Customxml, ConvertProfile, MigrationSuccess, DomainName + return ($profiles | ConvertTo-Csv -NoTypeInformation | Select-Object -Skip 1) + } + + +foreach ( $i in $OnlineComputers ) { + $Command = Invoke-Command -ComputerName:($i.ComputerName) -ScriptBlock:($ScriptBlock) -AsJob -JobName 'ADMU-DISCOVERY' +} + +#Load all admu-discovery jobs +$admujobs = (get-job) | where-object { $_.Name -eq 'ADMU-DISCOVERY' } + +#Monitor jobs script based on gngrNinja script found here: +#https://www.gngrninja.com/script-ninja/2016/5/29/powershell-getting-started-part-10-jobs#collect +#Vars +$outputFolder = 'C:\Windows\Temp\output' +$jobs = $true +$loopwait = 10 + +#If the folder doesn't exist, create it +If (!(Test-Path $outputFolder)) { + New-Item -Path $outputFolder -ItemType Directory +} + +#While $jobs = $true... +While ($jobs) { #Begin $jobs While Loop + + #Get all ADMU-DISCOVERY jobs + $admujobs = (get-job) | where-object { $_.Name -eq 'ADMU-DISCOVERY' } + + #Use a ForEach loop to iterate through the jobs + foreach ($jobObject in $admujobs) { #Begin $ourJobs ForEach loop + + #Null out variables used in this loop cycle + $jobResults = $null + $errorMessage = $null + $jobFile = $null + $jobCommand = $null + + #Store the command used in the job to display later + $jobCommand = $jobObject.Command + + #Use the Switch statement to take different actions based on the job's state value + Switch ($jobObject.State) { #Begin Job State Switch + + #If the job state is running, display the job info + {$_ -eq 'Running'} { + #Write-Host "Job: [$($jobObject.Name)] is still running on " $jobObject.Location + } + + #If the job is completed, create the job file, say it's been completed, and then perform an error check + #Then display different information if an error is found, versus successful completion + #Use a here-string to create the file contents, then add the contents to the file + #Finally use Remove-Job to remove the job + {$_ -eq 'Completed'} { + + #Create file + $jobFile = New-Item -Path $outputFolder -Name ("$($jobObject.Name)_$($jobObject.Location)_{0:MMddyy_HHmm}.txt" -f (Get-Date)) -ItemType File + + Write-Host "Job [$($jobObject.Name)] has completed on " $jobObject.location + + #Begin completed but with error checking... + if ($jobObject.ChildJobs[0].Error) { + + #Store error message in $errorMessage + $errorMessage = $jobObject.ChildJobs[0].Error | Out-String + + Write-Host "Job completed with an error!"`n + #Write-Host "$errorMessage"`n -ForegroundColor Red -BackgroundColor DarkBlue + + #Here-string that contains file contents + $fileContents = @" +Job Name: $($jobObject.Name) + +Job State: $($jobObject.State) + +Command: + +$jobCommand + +Error: + +$errorMessage +"@ + + #Add the content to the file + Add-Content -Path $jobFile -Value $fileContents + + } else { + + #Get job result and store in $jobResults + $jobResults = Receive-Job $jobObject.Name + + Write-Host "Job completed without errors!"`n + #Write-Host ($jobResults | Out-String)`n + + #Here-string that contains file contents + $fileContents = @" +Job Name: $($jobObject.Name) + +Job State: $($jobObject.State) + +Command: + +$jobCommand + +Output: + +$($jobResults | Out-String) +"@ + + #Add content to file + Add-Content -Path $jobFile -Value $fileContents + + #Append result to discovery CSV + $jobResults | Out-File -FilePath $CSV -Append + } + + #Remove the job + Remove-Job -id $jobObject.id + } + + #If the job state is failed, state that it is failed and then create the file + #Add the error message to the file contents via a here-string + #Then use Remove-Job to remove the job + {$_ -eq 'Failed'} { + + #Create the file + $jobFile = New-Item -Path $outputFolder -Name ("$($jobObject.Name)_$($jobObject.Location)_{0:MMddyy_HHmm}.txt" -f (Get-Date)) -ItemType File + #Store the failure reason in $failReason + $failReason = $jobObject.ChildJobs[0].JobStateInfo.Reason.Message + + Write-Host "Job: [$($jobObject.Name)] has failed on " $jobobject.Location`n + #Write-Host "$failReason"`n -ForegroundColor Red -BackgroundColor DarkBlue + + #Here-string that contains file contents + $fileContents = @" +Job Name: $($jobObject.Name) + +Job State: $($jobObject.State) + +Command: + +$jobCommand + +Error: + +$failReason +"@ + #Add content to file + Add-Content -Path $jobFile -Value $fileContents + + #Remove the job + Remove-Job -id $jobObject.Id + } + + + } #End Job State Switch + + } #End $ourJobs ForEach loop + + #Clear the $ourJobs variable + $ourJobs = $null + + #Get the new list of ADMU-DISCOVERY jobs as it may have changed + $ourJobs = (get-job) | where-object { $_.Name -eq 'ADMU-DISCOVERY' } + + #If jobs exists, keep the loop running by setting $jobs to $true, else set it to $false + if ($ourJobs) {$jobs = $true} else {$jobs = $false} + + #Wait 10 seconds to check for jobs again + Start-Sleep -Seconds $loopwait + +} #End $jobs While Loop + +#check running jobs state + +#append completed jobs to csv +#$admucompletedjobs = $admujobs | Where-Object { $_.State -eq 'Completed' } +#$csvcompletedcomputers = "C:\Windows\Temp\admu_discovery_completed_computers.csv" +#foreach ($i in $admucompletedjobs) { +# $i | Receive-Job -Keep | Out-File -FilePath $CSV -Append +# $i.Location | Out-File -FilePath $csvcompletedcomputers -Append +# $i | Remove-Job +#} + +#append failed jobs to csv +#$csvfailederrors = "C:\Windows\Temp\admu_discovery_failed_errors.csv" +#$csvfailedcomputers = "C:\Windows\Temp\admu_discovery_failed_computers.csv" +#$admufailedjobs = $admujobs | Where-Object { $_.State -eq 'Failed' } +#foreach ($i in $admufailedjobs) { +# $i.Location | Out-File -FilePath $csvfailederrors -Append +# $i.ChildJobs[0].JobStateInfo.Reason.Message | Out-File -FilePath $csvfailederrors -Append +# $i.Location | Out-File -FilePath $csvfailedcomputers -Append +# $i | Remove-Job +#} + +# #cleanup +# $confirmation = Read-Host "Do you want to remove all completed psjobs and sessions: (y/n)" +# if ($confirmation -eq 'y') { +# Get-Job | Remove-Job +# Get-PSSession | Remove-PSSession +# } diff --git a/jumpcloud-ADMU-Advanced-Deployment/invoke-admu-migration.ps1 b/jumpcloud-ADMU-Advanced-Deployment/invoke-admu-migration.ps1 new file mode 100644 index 00000000..8e3320ce --- /dev/null +++ b/jumpcloud-ADMU-Advanced-Deployment/invoke-admu-migration.ps1 @@ -0,0 +1,129 @@ +# JumpCloud API Key +$JcApiKey = '' + +#check csv for duplicate rows per system +$CSV = "C:\Windows\Temp\admu_discovery.csv" +$Rows = Import-CSV -Path $CSV +$counts = $Rows | Group-Object ComputerName +foreach ($i in $counts) +{ + if ($i.count -gt 1) + { + write-error "Duplicate system found $($i.Name)" + } +} + +#load target computers from csv +$Computers = @() +$Rows | foreach-object { $computers += ($_.ComputerName) } + +#check network connectivity to computers +$ConnectionTest = $Computers | ForEach-Object { + Test-NetConnection -ComputerName:($_) -WarningAction:('SilentlyContinue') +} + +$OnlineComputers = $ConnectionTest | Where-Object { $_.PingSucceeded } +$OfflineComputers = $ConnectionTest | Where-Object { -not $_.PingSucceeded } + +foreach ( $i in $OnlineComputers ) +{ + # Select row where the computer name matches report csv + $System = $Rows | Where-Object ComputerName -eq $i.ComputerName + + # Step 1 - Convert the Profile + $ADMUConvertSession = New-PSSession -ComputerName $System.ComputerName + Invoke-Command -asJob -Session $ADMUConvertSession -JobName 'ADMU-Job' -ScriptBlock { + Param ($SelectedUserName, $JumpCloudUserName, $TempPassword, $JumpCloudConnectKey, $InstallJCAgent, $LeaveDomain, $ForceReboot, $AzureADProfile, $ConvertProfile, $JcApiKey) + # Logoff all users on the system + $quserResult = quser + $quserRegex = $quserResult | ForEach-Object -Process { $_ -replace '\s{2,}', ',' } + $quserObject = $quserRegex | ConvertFrom-Csv + ForEach ($session In $quserObject) + { + logoff.exe $session.ID + } + # Install the ADMU + [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 + Install-PackageProvider -Name NuGet -Force + Install-Module JumpCloud.ADMU -Force + # Convert Strings to Bools + $LeaveDomain = ([System.Convert]::ToBoolean($LeaveDomain)) + $ForceReboot = ([System.Convert]::ToBoolean($ForceReboot)) + $AzureADProfile = ([System.Convert]::ToBoolean($AzureADProfile)) + $InstallJCAgent = ([System.Convert]::ToBoolean($InstallJCAgent)) + $ConvertProfile = ([System.Convert]::ToBoolean($ConvertProfile)) + + # Start Migration + Set-ExecutionPolicy -ExecutionPolicy Bypass + # TODO: Deselect or don't pass in forceReboot + Start-Migration -SelectedUserName $SelectedUserName -JumpCloudUserName $JumpCloudUserName -TempPassword $TempPassword -JumpCloudConnectKey $JumpCloudConnectKey -InstallJCAgent $InstallJCAgent -LeaveDomain $LeaveDomain -ForceReboot $ForceReboot -AZureADProfile $AzureADProfile -ConvertProfile $ConvertProfile + + # Step 2 - Bind User Steps + # Get the JumpCloud SystemKey + $config = get-content 'C:\Program Files\JumpCloud\Plugins\Contrib\jcagent.conf' + $regex = 'systemKey\":\"(\w+)\"' + $systemKey = [regex]::Match($config, $regex).Groups[1].Value + if ($systemKey){ + $Headers = @{ + 'Accept' = 'application/json'; + 'Content-Type' = 'application/json'; + 'x-api-key' = $JcApiKey; + } + $Form = @{ + 'filter' = "username:eq:$($JumpcloudUserName)" + } + Try{ + Write-Host "Getting information from SystemID: $systemKey" + [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 + $Response = Invoke-WebRequest -Method 'Get' -Uri "https://console.jumpcloud.com/api/systemusers" -Headers $Headers -Body $Form -UseBasicParsing + $StatusCode = $Response.StatusCode + } + catch + { + $StatusCode = $_.Exception.Response.StatusCode.value__ + } + # Get Results, convert from Json + $Results = $Response.Content | ConvertFrom-JSON + $JcUserId = $Results.results.id + # Bind Step + if ($JcUserId){ + $Headers = @{ + 'Accept' = 'application/json'; + 'x-api-key' = $JcApiKey + } + $Form = @{ + 'op' = 'add'; + 'type' = 'system'; + 'id' = "$systemKey" + } | ConvertTo-Json + Try + { + Write-Host "Binding $JumpcloudUserName with userId: $JcUserId to SystemID: $systemKey" + [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 + $Response = Invoke-WebRequest -Method 'Post' -Uri "https://console.jumpcloud.com/api/v2/users/$JcUserId/associations" -Headers $Headers -Body $Form -ContentType 'application/json' -UseBasicParsing + $StatusCode = $Response.StatusCode + } + catch + { + $StatusCode = $_.Exception.Response.StatusCode.value__ + } + } + else { + Write-Host "Cound not bind user/ JumpCloudUsername did not exist in JC Directory" + } + } + else{ + Write-Host "Could not find systemKey, aborting bind step" + } + # Force Reboot + Write-Host "Rebooting as Job" + Restart-Computer -Force -asJob + } -ArgumentList ($System.SelectedUserName, $System.JumpCloudUserName, $System.TempPassword, $System.JumpCloudConnectKey, $System.InstallJCAgent, $System.LeaveDomain, $System.ForceReboot, $System.AzureADProfile, $System.ConvertProfile, $JcApiKey) +} + +$confirmation = Read-Host "Do you want to remove all completed psjobs and sessions: (y/n)" +if ($confirmation -eq 'y') +{ + Get-Job | Remove-Job + Get-PSSession | Remove-PSSession +} \ No newline at end of file diff --git a/jumpcloud-ADMU/.DS_Store b/jumpcloud-ADMU/.DS_Store new file mode 100644 index 00000000..074dd6e9 Binary files /dev/null and b/jumpcloud-ADMU/.DS_Store differ diff --git a/jumpcloud-ADMU/Docs/Start-Migration.md b/jumpcloud-ADMU/Docs/Start-Migration.md new file mode 100644 index 00000000..ccbb6f33 --- /dev/null +++ b/jumpcloud-ADMU/Docs/Start-Migration.md @@ -0,0 +1,227 @@ +--- +external help file: JumpCloud.ADMU-help.xml +Module Name: JumpCloud.ADMU +online version: https://github.com/TheJumpCloud/jumpcloud-ADMU/wiki/Start-Migration +schema: 2.0.0 +--- + +# Start-Migration + +## SYNOPSIS +Starts the JumpCloud Active Directory Migration process. + +## SYNTAX + +### cmd +``` +Start-Migration -JumpCloudUserName -SelectedUserName -TempPassword + [-LeaveDomain ] [-ForceReboot ] [-UpdateHomePath ] [-InstallJCAgent ] + [-AutobindJCUser ] [-JumpCloudConnectKey ] [-JumpCloudAPIKey ] [] +``` + +### form +``` +Start-Migration [-inputObject ] [] +``` + +## DESCRIPTION +The Start-Migration function allows the starting of the JumpCloud Active Directory Migration Process. This utility can be used to convert domain bound user accounts into locally managed accounts ready to be taken over by JumpCloud. There are various options to run the utility depending on the administrators requirements. + +## EXAMPLES + +### Example 1 +```powershell +PS C:\> Start-Migration -SelectedUserName 'DOMAIN\bobfay' -JumpCloudUserName 'bob.fay' -TempPassword 'Temp123!Temp123!' -LeaveDomain $true -ForceReboot $true -InstallJCAgent $true -JumpCloudConnectKey 'ConnectKEY' -AutobindJCUser $true -JumpCloudAPIKey 'APIKEY' +``` + +This example would run the `Start-Migration` function on a domain user `DOMAIN\bobfay` and create a new local user account `COMPUTERNAME\bob.fay`. Using a temporary password `Temp123!Temp123!`. The JumpCloud Agent would be installed. After migration the JumpCloud user `bob.fay` would be bound to the system. Finally, the system would leave the bound domain and reboot. + +### Example 2 +```powershell +PS C:\> Start-Migration -SelectedUserName 'DOMAIN\bobfay' -JumpCloudUserName 'bob.fay' -TempPassword 'Temp123!Temp123!' $false -ForceReboot $false -InstallJCAgent $false +``` + +This example would run the `Start-Migration` function on a domain user `DOMAIN\jsmith` and create a new local user account `COMPUTERNAME\john.smith`. Using a temporary password `Temp123!Temp123!`, the system would remain bound to the current domain and not reboot. The JumpCloud Agent would not be installed. This would allow the administrator to run the converted account in parallel for testing. + +## PARAMETERS + +### -ForceReboot +A boolean $true/$false value to force the system to reboot at the end of the migration process. A reboot is required when unbinding from a domain. + +```yaml +Type: System.Boolean +Parameter Sets: cmd +Aliases: + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -InstallJCAgent +A boolean $true/$false value to install the JumpCloud agent on the system. If this value is $true you will be required to also pass a `JumpCloudConnectKey` value. If the system remains on the domain, the JumpCloud agent will be installed but not connected until it leaves the domain. + +```yaml +Type: System.Boolean +Parameter Sets: cmd +Aliases: + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -JumpCloudConnectKey +A string value that is required if `-InstallJCAgent` is $true. This connect key can be found in the JumpCloud console under add systems. It must be 24 chars and is different than an JumpCloud API key. + +```yaml +Type: System.String +Parameter Sets: cmd +Aliases: + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -JumpCloudUserName +A string value that will be used for the new converted local account that can be bound to JumpCloud. This value must be unique on the system, if it is not unique an error will stop the migration. This value should match the JumpCloud Username value to allow takeover when a User is bound to a system within the JumpCloud console. + +```yaml +Type: System.String +Parameter Sets: cmd +Aliases: + +Required: True +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -LeaveDomain +A boolean $true/$false value to force the system to leave currently bound domain, this is required for the JumpCloud Agent to operate. It can also be reversed by simply rejoining the system back to the domain. This will also work for AzureAD and will disconnect the AzureAD bind. + +```yaml +Type: System.Boolean +Parameter Sets: cmd +Aliases: + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -TempPassword +A string value that is used to set the new local accounts password. When duplicating the user account a password must be set when created and this value is passed. Once the system is online in JumpCloud the password will be overwritten and synced with JumpCloud if the user is taken over. + +```yaml +Type: System.String +Parameter Sets: cmd +Aliases: + +Required: True +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -inputObject +An PSObject can be passed to the function with the required values for the migration process. This is used when the GUI version of the tool is used and inputs to the XAML form are passed to this function. + +```yaml +Type: System.Object +Parameter Sets: form +Aliases: + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -SelectedUserName +A string value for the DomainUserName that is used in the migration script. This value is verified to make sure the account exists on the system. If the Domain Account does not exist, the script will error and not continue. Either pass a username using the "Domain\username" syntax or a domain user SID. + +```yaml +Type: System.String +Parameter Sets: cmd +Aliases: + +Required: True +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -AutobindJCUser +This parameter will bind the username specified in the `JumpCloudUserName` field to the current system after Migration. + +```yaml +Type: System.Boolean +Parameter Sets: cmd +Aliases: + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -UpdateHomePath +If set to $true, the ADMU will attempt to rename the selected username's homepath to the jumpcloud username. Note, this could break any applications that rely on a hard coded homepath. By default this is not set and will not rename the homepath. + +```yaml +Type: System.Boolean +Parameter Sets: cmd +Aliases: + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -JumpCloudAPIKey +The Read/Write API key of a JumpCloud Administrator. This parameter is required if the AutoBind JC User parameter is specified. + +```yaml +Type: System.String +Parameter Sets: cmd +Aliases: + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### CommonParameters +This cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see [about_CommonParameters](http://go.microsoft.com/fwlink/?LinkID=113216). + +## INPUTS + +### None +## OUTPUTS + +### System.Object +## NOTES + +## RELATED LINKS + +[https://github.com/TheJumpCloud/jumpcloud-ADMU/wiki/Start-Migration](https://github.com/TheJumpCloud/jumpcloud-ADMU/wiki/Start-Migration) + diff --git a/jumpcloud-ADMU/Exe/gui_jcadmu.exe b/jumpcloud-ADMU/Exe/gui_jcadmu.exe new file mode 100644 index 00000000..646ab0b7 Binary files /dev/null and b/jumpcloud-ADMU/Exe/gui_jcadmu.exe differ diff --git a/jumpcloud-ADMU/Exe/uwp_jcadmu.exe b/jumpcloud-ADMU/Exe/uwp_jcadmu.exe new file mode 100644 index 00000000..a60979bd Binary files /dev/null and b/jumpcloud-ADMU/Exe/uwp_jcadmu.exe differ diff --git a/jumpcloud-ADMU/JumpCloud.ADMU.nuspec b/jumpcloud-ADMU/JumpCloud.ADMU.nuspec new file mode 100644 index 00000000..2cf24910 --- /dev/null +++ b/jumpcloud-ADMU/JumpCloud.ADMU.nuspec @@ -0,0 +1,16 @@ + + + + JumpCloud.ADMU + 2.0.0.1551 + Powershell Module to run JumpCloud Active Directory Migration Utility. + JumpCloud Solutions Architect Team + JumpCloud + + + false + (c) JumpCloud. All rights reserved. + + + + \ No newline at end of file diff --git a/jumpcloud-ADMU/JumpCloud.ADMU.psd1 b/jumpcloud-ADMU/JumpCloud.ADMU.psd1 new file mode 100644 index 00000000..1e04d749 Binary files /dev/null and b/jumpcloud-ADMU/JumpCloud.ADMU.psd1 differ diff --git a/jumpcloud-ADMU/JumpCloud.ADMU.psm1 b/jumpcloud-ADMU/JumpCloud.ADMU.psm1 new file mode 100644 index 00000000..fce4dcbf --- /dev/null +++ b/jumpcloud-ADMU/JumpCloud.ADMU.psm1 @@ -0,0 +1,5 @@ +$Public = @(Get-ChildItem -Path "$PSScriptRoot\Powershell\Start-Migration.ps1") + +. "$PSScriptRoot\Powershell\Start-Migration.ps1" + +Export-ModuleMember -Function $Public.BaseName diff --git a/jumpcloud-ADMU/Powershell/Form.ps1 b/jumpcloud-ADMU/Powershell/Form.ps1 new file mode 100644 index 00000000..6d05e32b --- /dev/null +++ b/jumpcloud-ADMU/Powershell/Form.ps1 @@ -0,0 +1,650 @@ +Write-ToLog 'Loading Jumpcloud ADMU. Please Wait.. Loading ADMU GUI..' +# Base64 Encoded Strings of our Images +$JCLogoBase64 = "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" +$ErrorBase64 = "iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAFiSURBVHgBpVPNSsNAEJ4ZzwWv/lKfoPUN2oOl3lYKelAoPpkIelBQ4smih8YnMI8QqlQbL0JbT2bH2di0MXFD2n6w7OzMzscwMx/CP3hpqhoBtcWsySlHTmYPEL1Q67vtB8dJ52Dy8dZUZQY8k1ODfPgEur7WcfwM0eueqiJRVzyrUAQMn6x1ffPR8aZEphLN9JwmKR0fQunkKLKHF1cwvLzOkBHqXVMZmbeGOSpJQnJMK4xJvUZLQdzQBWD6GQ2HSCvbpzAIZvbgw0pGsNImZKxAAYTjcU6UZV0Qqrbw9/usCs4lgjLlRcMgQTTKJQJD5EMB6NGXPShbTwz8ZIuHg0SzE43PQKSDE111YRkwqWiz+82Drk1f6/c30d3fb9lo/I3O7U7UbAQ+NesOc1ciEhHx/nJMsKxop+M3DiNAKDBFGZBr/sYkfypKotdQiggVMlRkIvHC+nJcDfp8q+O46Zwfa3qRu77hWMMAAAAASUVORK5CYII=" +$ActiveBase64 = "iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAGKSURBVHgBlZRPTsJQEMbfTBvccgTcKYFQlxJM2hvUEygnID2CJ6jKAZQTgCcoorK1Cf5hZ4/A1oQ3Y98j1FKLbWfTvnn9fp3ON68gcqL15NtsGhfIbLOAxibLITOECPJh0fUmWQ2kF0eB3zBreCcAbPFPsBCR/JbO0vGiP6Bm4FtYM4I4UxflYgVC9rfVwW8lxmsFSAIjks5HzwtRrYyDSpWko46Avq6oPRu6bPK4jIoFR0x0HotVH61kQ0oHCcktC5FA+jOIqb+zpxwGwE6eKA+yPPUi1U9AY5wR2CiArXQOiEfv3cGhuuZBVD9jhxo7mniN2WqkoGt1XfQGl4L5qgiSwNrz2y/e3Uws3SaKIMwcIgl+zOTriEbQfPatMhAdqI8O3edsadjxfOgWQlRFxBM92a2Xm6DofO2FxGYoc3Sz1xjPBYuVqBrMK2WGutUg5QqxdCrBNpC+0iYgFcqlNcqT7DDugUzj6XY+U/8lyHuuPfNdMtEFFp3tmYL4BQQwhbUcvZ1506zmB49h1CYDMPPcAAAAAElFTkSuQmCC" +$BlueBase64 = "iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAElSURBVHgBbVE7TsNAEH2z+dQ+wnKCmIY6nICCIEIXdymIYk4AnCBBEETpVBQWSjgBpEM0+Ag+ghGiQIl3GH/BcUaa1erNe292ZglFuAsLGzMGmwGItCCRZACGh1lvXtAoPYcLjYZ5AbEuDZg8wHRTMfEUtycXCax2kolCzI4dud3kYhcjf5J1GD1NwOyiHq+StqT1B/GhEnK3yjNzGLOPzdqpkhM+bJW7FBGBFMPEEZpNXW+qOgrZNoqwxEXj4SwUu0GNT/yZCIKttl5e7WyZJbUPEfB1BWx9PaebA63wfwbmEPF61cC7H+KgtyeEbBbT/oHisdz61ecYB/f9NyqBc/9K0EvUQ54VO7g7Xaa6Smn4qNFsHclH2cmAst4A7e8lpk45yy8GxWbP/ZW8WwAAAABJRU5ErkJggg==" + +Add-Type -AssemblyName PresentationFramework, PresentationCore, WindowsBase, System.Windows.Forms, System.Drawing + +function DecodeBase64Image +{ + param ( + [Parameter(Mandatory = $true)] + [String]$ImageBase64 + ) + # Parameter help description + $ObjBitmapImage = New-Object System.Windows.Media.Imaging.BitmapImage #Provides a specialized BitmapSource that is optimized for loading images using Extensible Application Markup Language (XAML). + $ObjBitmapImage.BeginInit() #Signals the start of the BitmapImage initialization. + $ObjBitmapImage.StreamSource = [System.IO.MemoryStream][System.Convert]::FromBase64String($ImageBase64) #Creates a stream whose backing store is memory. + $ObjBitmapImage.EndInit() #Signals the end of the BitmapImage initialization. + $ObjBitmapImage.Freeze() #Makes the current object unmodifiable and sets its IsFrozen property to true. + $ObjBitmapImage +} +# Set source here. Take note in the XAML as to where the variable name was taken. + +#============================================================================================== +# XAML Code - Imported from Visual Studio WPF Application +#============================================================================================== +[void][System.Reflection.Assembly]::LoadWithPartialName('PresentationFramework') +[xml]$XAML = @' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - -'@ - - # Read XAML - $reader = (New-Object System.Xml.XmlNodeReader $xaml) - Try - { - $Form = [Windows.Markup.XamlReader]::Load($reader) - } - Catch - { - Write-Error "Unable to load Windows.Markup.XamlReader. Some possible causes for this problem include: .NET Framework is missing PowerShell must be launched with PowerShell -sta, invalid XAML code was encountered."; - Exit; - } - #=========================================================================== - # Store Form Objects In PowerShell - #=========================================================================== - $xaml.SelectNodes("//*[@Name]") | ForEach-Object {Set-Variable -Name ($_.Name) -Value $Form.FindName($_.Name)} - - # Check PartOfDomain & Disable Controls - $WmiComputerSystem = Get-WmiObject -Class:('Win32_ComputerSystem') - If ($WmiComputerSystem.PartOfDomain) - { - # Define misc static variables - $DomainName = $WmiComputerSystem.Domain - $FormResults = [PSCustomObject]@{} - - Write-Progress -Activity 'Loading Jumpcloud ADMU. Please Wait..' -Status 'Getting Installed Applications..' -PercentComplete 25 - - $InstalledProducts = (Get-WmiObject -Class:('Win32_Product') | Select-Object Name) - $Disk = Get-WmiObject -Class Win32_logicaldisk -Filter "DeviceID = 'C:'" - $freespace = $Disk.FreeSpace - $freespace = [math]::Round($freespace/1MB,0) - - Write-Progress -Activity 'Loading Jumpcloud ADMU. Please Wait..' -Status 'Verifying Local Accounts & Group Membership..' -PercentComplete 50 - - # Get list of profiles from computer into listview - $win32UserProfiles = Get-WmiObject -Class:('Win32_UserProfile') -Property * | Where-Object {$_.Special -eq $false} - $win32UserProfiles | add-member -membertype NoteProperty -name IsLocalAdmin -value $null - $win32UserProfiles | add-member -membertype NoteProperty -name LocalProfileSize -value $null - - $users = $win32UserProfiles | Select-Object -ExpandProperty "SID" | ConvertSID - $userstrim = $users -creplace '^[^\\]*\\', '' - - $members = net localgroup administrators | - where {$_ -AND $_ -notmatch "command completed successfully"} | - select -Skip 4 - - $i = 0 - ForEach ($user in $userstrim) { - If ($members -contains $user) { - $win32UserProfiles[$i].IsLocalAdmin = $true - $i++ - } Else { - $win32UserProfiles[$i].IsLocalAdmin = $false - $i++ - }} - - Write-Progress -Activity 'Loading Jumpcloud ADMU. Please Wait..' -Status 'Getting C:\ & Local Profile Data..' -PercentComplete 75 - - #local profile file size check - $LocalUserProfiles = $win32UserProfiles | Select-Object LocalPath - $LocalUserProfilesTrim = ForEach ($LocalPath in $LocalUserProfiles){$LocalPath.LocalPath.substring(9)} - - $i = 0 - $profiles2 = Get-ChildItem C:\Users | ?{Test-path C:\Users\$_\NTUSER.DAT} | Select -ExpandProperty Name - foreach($userprofile in $LocalUserProfilesTrim) - { - $largeprofile = Get-ChildItem C:\Users\$userprofile -Recurse -Force -ErrorAction SilentlyContinue | Measure-Object -Sum length | Select -ExpandProperty Sum - $largeprofile = [math]::Round($largeprofile/1MB,0) - $largeprofile = $largeprofile - $win32UserProfiles[$i].LocalProfileSize = $largeprofile - $i++ - } - - Write-Progress -Activity 'Loading Jumpcloud ADMU. Please Wait..' -Status 'Building Profile Group Box Query..' -PercentComplete 95 - - $Profiles = $win32UserProfiles | Select-Object SID, RoamingConfigured, Loaded, IsLocalAdmin, LocalPath, LocalProfileSize, @{Name = "LastLogin"; EXPRESSION = {$_.ConvertToDateTime($_.lastusetime)}}, @{Name = "UserName"; EXPRESSION = {ConvertSID($_.SID)}} - - Write-Progress -Activity 'Loading Jumpcloud ADMU. Please Wait..' -Status 'Done!' -Completed - } - Else - { - #Disable UI Elements - $DomainName = "Not Domain Joined" - $bDeleteProfile.Content = "No Domain" - $bDeleteProfile.IsEnabled = $false - $tbJumpCloudConnectKey.IsEnabled = $false - $tbJumpCloudUserName.IsEnabled = $false - $tbTempPassword.IsEnabled = $false - $lvProfileList.IsEnabled = $false - $cb_accepteula.IsEnabled = $false - $cb_installjcagent.IsEnabled = $false - $cb_leavedomain.IsEnabled = $false - $cb_forcereboot.IsEnabled = $false - $lbDomainName.FontWeight = "Bold" - $lbDomainName.Foreground = "Red" - } - - #load UI Labels - $lbDomainName.Content = $DomainName - $lbComputerName.Content = $WmiComputerSystem.Name - $lbUSMTStatus.Content = (($InstalledProducts -match 'User State Migration Tool').Count -eq 1) - $lbcfreespace.Content = $freespace - Function Test-Button([object]$tbJumpCloudUserName, [object]$tbJumpCloudConnectKey, [object]$tbTempPassword, [object]$lvProfileList) - { - Write-Debug ('---------------------------------------------------------') - Write-Debug ('Valid UserName: ' + $tbJumpCloudUserName) - Write-Debug ('Valid ConnectKey: ' + $tbJumpCloudConnectKey) - Write-Debug ('Valid Password: ' + $tbTempPassword) - Write-Debug ('Has UserName not been selected: ' + [System.String]::IsNullOrEmpty($lvProfileList.SelectedItem.UserName)) - If(![System.String]::IsNullOrEmpty($lvProfileList.SelectedItem.UserName)) - { - If(!(Test-IsNotEmpty $tbJumpCloudUserName.Text) -and (Test-HasNoSpaces $tbJumpCloudUserName.Text) ` - -and (Test-Is40chars $tbJumpCloudConnectKey.Text) -and (Test-HasNoSpaces $tbJumpCloudConnectKey.Text) ` - -and !(Test-IsNotEmpty $tbTempPassword.Text) -and (Test-HasNoSpaces $tbTempPassword.Text)) - { - $script:bDeleteProfile.Content = "Migrate Profile" - $script:bDeleteProfile.IsEnabled = $true - Return $true - } - Else - { - $script:bDeleteProfile.Content = "Correct Errors" - $script:bDeleteProfile.IsEnabled = $false - Return $false - } - } - Else - { - $script:bDeleteProfile.Content = "Select Profile" - $script:bDeleteProfile.IsEnabled = $false - Return $false - } - } - - ## Form changes & interactions - - # EULA checkbox - $script:AcceptEULA = $true - $cb_accepteula.Add_Checked({$script:AcceptEULA = $true}) - $cb_accepteula.Add_Unchecked({$script:AcceptEULA = $false}) - - # Install JCAgent checkbox - $script:InstallJCAgent = $true - $cb_installjcagent.Add_Checked({$script:InstallJCAgent = $true}) - $cb_installjcagent.Add_Unchecked({$script:InstallJCAgent = $false}) - - # Leave Domain checkbox - $script:LeaveDomain = $false - $cb_leavedomain.Add_Checked({$script:LeaveDomain = $true}) - $cb_leavedomain.Add_Unchecked({$script:LeaveDomain = $false}) - - # Force Reboot checkbox - $script:ForceReboot = $false - $cb_forcereboot.Add_Checked({$script:ForceReboot = $true}) - $cb_forcereboot.Add_Unchecked({$script:ForceReboot = $false}) - - $tbJumpCloudUserName.add_TextChanged( { - Test-Button -tbJumpCloudUserName:($tbJumpCloudUserName) -tbJumpCloudConnectKey:($tbJumpCloudConnectKey) -tbTempPassword:($tbTempPassword) -lvProfileList:($lvProfileList) - If ((!(Test-IsNotEmpty $tbJumpCloudUserName.Text) -and (Test-HasNoSpaces $tbJumpCloudUserName.Text)) -eq $false) - { - $tbJumpCloudUserName.Background = "#FFC6CBCF" - $tbJumpCloudUserName.Tooltip = "JumpCloud User Name Can't Be Empty Or Contain Spaces" - } - Else - { - $tbJumpCloudUserName.Background = "white" - $tbJumpCloudUserName.Tooltip = $null - $tbJumpCloudUserName.FontWeight = "Normal" - } - }) - - $tbJumpCloudUserName.add_GotFocus( { - $tbJumpCloudUserName.Text = "" - }) - - $tbJumpCloudConnectKey.add_TextChanged( { - Test-Button -tbJumpCloudUserName:($tbJumpCloudUserName) -tbJumpCloudConnectKey:($tbJumpCloudConnectKey) -tbTempPassword:($tbTempPassword) -lvProfileList:($lvProfileList) - If (((Test-Is40chars $tbJumpCloudConnectKey.Text) -and (Test-HasNoSpaces $tbJumpCloudConnectKey.Text)) -eq $false) - { - $tbJumpCloudConnectKey.Background = "#FFC6CBCF" - $tbJumpCloudConnectKey.Tooltip = "Connect Key Must be 40chars & Not Contain Spaces" - } - Else - { - $tbJumpCloudConnectKey.Background = "white" - $tbJumpCloudConnectKey.Tooltip = $null - $tbJumpCloudConnectKey.FontWeight = "Normal" - } - }) - - $tbJumpCloudConnectKey.add_GotFocus( { - $tbJumpCloudConnectKey.Text = "" - }) - - $tbTempPassword.add_TextChanged( { - Test-Button -tbJumpCloudUserName:($tbJumpCloudUserName) -tbJumpCloudConnectKey:($tbJumpCloudConnectKey) -tbTempPassword:($tbTempPassword) -lvProfileList:($lvProfileList) - If ((!(Test-IsNotEmpty $tbTempPassword.Text) -and (Test-HasNoSpaces $tbTempPassword.Text)) -eq $false) - { - $tbTempPassword.Background = "#FFC6CBCF" - $tbTempPassword.Tooltip = "Connect Key Must Be 40chars & No spaces" - } - Else - { - $tbTempPassword.Background = "white" - $tbTempPassword.Tooltip = $null - $tbTempPassword.FontWeight = "Normal" - } - }) - - # Change button when profile selected - $lvProfileList.Add_SelectionChanged( { - $script:SelectedUserName = ($lvProfileList.SelectedItem.username) - Test-Button -tbJumpCloudUserName:($tbJumpCloudUserName) -tbJumpCloudConnectKey:($tbJumpCloudConnectKey) -tbTempPassword:($tbTempPassword) -lvProfileList:($lvProfileList) - }) - # AcceptEULA moreinfo link - Mouse button event - $lbMoreInfo.Add_PreviewMouseDown( {[System.Diagnostics.Process]::start('https://github.com/TheJumpCloud/support/tree/BS-ADMU-version_1.0.0/ADMU#EULA--Legal-Explanation')}) - - $bDeleteProfile.Add_Click( { - # Build FormResults object - Add-Member -InputObject:($FormResults) -MemberType:('NoteProperty') -Name:('AcceptEula') -Value:($AcceptEula) - Add-Member -InputObject:($FormResults) -MemberType:('NoteProperty') -Name:('InstallJCAgent') -Value:($InstallJCAgent) - Add-Member -InputObject:($FormResults) -MemberType:('NoteProperty') -Name:('LeaveDomain') -Value:($LeaveDomain) - Add-Member -InputObject:($FormResults) -MemberType:('NoteProperty') -Name:('ForceReboot') -Value:($ForceReboot) - Add-Member -InputObject:($FormResults) -MemberType:('NoteProperty') -Name:('DomainUserName') -Value:($SelectedUserName.Substring($SelectedUserName.IndexOf('\') + 1)) - Add-Member -InputObject:($FormResults) -MemberType:('NoteProperty') -Name:('JumpCloudUserName') -Value:($tbJumpCloudUserName.Text) - Add-Member -InputObject:($FormResults) -MemberType:('NoteProperty') -Name:('TempPassword') -Value:($tbTempPassword.Text) - Add-Member -InputObject:($FormResults) -MemberType:('NoteProperty') -Name:('JumpCloudConnectKey') -Value:($tbJumpCloudConnectKey.Text) - # Close form - $Form.Close() - }) - - # Put the list of profiles in the profile box - $Profiles | ForEach-Object {$lvProfileList.Items.Add($_) | Out-Null} - #=========================================================================== - # Shows the form - #=========================================================================== - $Form.Showdialog() | Out-Null - If ($bDeleteProfile.IsEnabled -eq $true) - { - Return $FormResults - } diff --git a/powershell/Functions.ps1 b/powershell/Functions.ps1 deleted file mode 100644 index ef161647..00000000 --- a/powershell/Functions.ps1 +++ /dev/null @@ -1,5205 +0,0 @@ -#region Functions -#Verify Domain Account Function -Function VerifyAccount -{ - Param ( - [Parameter(Mandatory = $true)][System.String]$userName, [System.String]$domain = $null - ) - $idrefUser = $null - $strUsername = $userName - If ($domain) - { - $strUsername += [String]("@" + $domain) - } - Try - { - $idrefUser = ([System.Security.Principal.NTAccount]($strUsername)).Translate([System.Security.Principal.SecurityIdentifier]) - } - Catch [System.Security.Principal.IdentityNotMappedException] - { - $idrefUser = $null - } - If ($idrefUser) - { - Return $true - } - Else - { - Return $false - } -} -#Logging function -<# - .Synopsis - Write-Log writes a message to a specified log file with the current time stamp. - .DESCRIPTION - The Write-Log function is designed to add logging capability to other scripts. - In addition to writing output and/or verbose you can write to a log file for - later debugging. - .NOTES - Created by: Jason Wasser @wasserja - Modified: 11/24/2015 09:30:19 AM - .PARAMETER Message - Message is the content that you wish to add to the log file. - .PARAMETER Path - The path to the log file to which you would like to write. By default the function will - create the path and file if it does not exist. - .PARAMETER Level - Specify the criticality of the log information being written to the log (i.e. Error, Warning, Informational) - .EXAMPLE - Write-Log -Message 'Log message' - Writes the message to c:\Logs\PowerShellLog.log. - .EXAMPLE - Write-Log -Message 'Restarting Server.' -Path c:\Logs\Scriptoutput.log - Writes the content to the specified log file and creates the path and file specified. - .EXAMPLE - Write-Log -Message 'Folder does not exist.' -Path c:\Logs\Script.log -Level Error - Writes the message to the specified log file as an error message, and writes the message to the error pipeline. - .LINK - https://gallery.technet.microsoft.com/scriptcenter/Write-Log-PowerShell-999c32d0 - #> -Function Write-Log -{ - [CmdletBinding()] - Param - ( - [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)][ValidateNotNullOrEmpty()][Alias("LogContent")][string]$Message - , [Parameter(Mandatory = $false)][Alias('LogPath')][string]$Path = 'C:\Windows\Temp\jcAdmu.log' - , [Parameter(Mandatory = $false)][ValidateSet("Error", "Warn", "Info")][string]$Level = "Info" - ) - Begin - { - # Set VerbosePreference to Continue so that verbose messages are displayed. - $VerbosePreference = 'Continue' - } - Process - { - # If attempting to write to a log file in a folder/path that doesn't exist create the file including the path. - If (!(Test-Path $Path)) - { - Write-Verbose "Creating $Path." - $NewLogFile = New-Item $Path -Force -ItemType File - } - Else - { - # Nothing to see here yet. - } - # Format Date for our Log File - $FormattedDate = Get-Date -Format "yyyy-MM-dd HH:mm:ss" - # Write message to error, warning, or verbose pipeline and specify $LevelText - Switch ($Level) - { - 'Error' - { - Write-Error $Message - $LevelText = 'ERROR:' - } - 'Warn' - { - Write-Warning $Message - $LevelText = 'WARNING:' - } - 'Info' - { - Write-Verbose $Message - $LevelText = 'INFO:' - } - } - # Write log entry to $Path - "$FormattedDate $LevelText $Message" | Out-File -FilePath $Path -Append - } - End - { - } -} -Function Remove-ItemIfExist -{ - [CmdletBinding(SupportsShouldProcess = $true)] - Param( - [Parameter(Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)][String[]]$Path - , [Switch]$Recurse - ) - Process - { - Try - { - If (Test-Path -Path:($Path)) - { - Remove-Item -Path:($Path) -Recurse:($Recurse) - } - } - Catch - { - Write-Log -Message ('Removal Of Temp Files & Folders Failed') -Level Warn - } - } -} -#Download $Link to $Path -Function DownloadLink($Link, $Path) -{ - - $WebClient = New-Object -TypeName:('System.Net.WebClient') - $Global:IsDownloaded = $false - $SplatArgs = @{ InputObject = $WebClient - EventName = 'DownloadFileCompleted' - Action = {$Global:IsDownloaded = $true; } - } - $DownloadCompletedEventSubscriber = Register-ObjectEvent @SplatArgs - $WebClient.DownloadFileAsync("$Link", "$Path") - While (-not $Global:IsDownloaded) - { - Start-Sleep -Seconds 3 - } # While - $DownloadCompletedEventSubscriber.Dispose() - $WebClient.Dispose() - -} -# Add localuser to group -Function Add-LocalUser -{ - Param( - [String[]]$computer - , [String[]]$group - , [String[]]$localusername - ) - ([ADSI]"WinNT://$computer/$group,group").psbase.Invoke("Add", ([ADSI]"WinNT://$computer/$localusername").path) -} -#Check if program is on system -function Check_Program_Installed($programName) { - $installed = $null - $installed = (Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object {$_.DisplayName -match $programName}) - $installed32 = (Get-ItemProperty HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object {$_.DisplayName -match $programName}) - if (($null -ne $installed) -or ($null -ne $installed32)) { - return $true - } - else { - return $false - } - } -#Check reg for program uninstallstring and silently uninstall - -function Uninstall_Program($programName) { - $Ver = Get-ChildItem -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall, HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall | - Get-ItemProperty | - Where-Object {$_.DisplayName -match $programName } | - Select-Object -Property DisplayName, UninstallString - - ForEach ($ver in $Ver) { - If ($ver.UninstallString -and $ver.DisplayName -match 'Jumpcloud') { - $uninst = $ver.UninstallString - & cmd /C $uninst /Silent | Out-Null - } If ($ver.UninstallString -and $ver.DisplayName -match 'FileZilla Client 3.46.0') { - $uninst = $ver.UninstallString - & cmd /c $uninst /S| Out-Null - } else{ - $uninst = $ver.UninstallString - & cmd /c $uninst /q /norestart | Out-Null - } - } - } - - -#Start process and wait then close after 5mins -Function Start-NewProcess([string]$pfile, [string]$arguments, [int32]$Timeout = 300000) -{ - $p = New-Object System.Diagnostics.Process; - $p.StartInfo.FileName = $pfile; - $p.StartInfo.Arguments = $arguments - [void]$p.Start(); - If (! $p.WaitForExit($Timeout)) - { - Write-Log -Message "Windows ADK Setup did not complete after 5mins"; - Get-Process | Where-Object {$_.Name -like "adksetup*"} | Stop-Process - } -} -# Validation -Function Test-IsNotEmpty ([System.String] $field) -{ - If (([System.String]::IsNullOrEmpty($field))) - { - Return $true - } - Else - { - Return $false - } -} -Function Test-Is40chars ([System.String] $field) -{ - If ($field.Length -eq 40) - { - Return $true - } - Else - { - Return $false - } -} -Function Test-HasNoSpace ([System.String] $field) -{ - If ($field -like "* *") - { - Return $false - } - Else - { - Return $true - } -} - -Function DownloadAndInstallAgent( - [System.String]$msvc2013x64Link - , [System.String]$msvc2013Path - , [System.String]$msvc2013x64File - , [System.String]$msvc2013x64Install - , [System.String]$msvc2013x86Link - , [System.String]$msvc2013x86File - , [System.String]$msvc2013x86Install -) -{ - If (!(Check_Program_Installed("Microsoft Visual C\+\+ 2013 x64"))) - { - Write-Log -Message:('Downloading & Installing JCAgent prereq Visual C++ 2013 x64') - (New-Object System.Net.WebClient).DownloadFile("${msvc2013x64Link}", ($jcAdmuTempPath + $msvc2013x64File)) - Invoke-Expression -Command:($msvc2013x64Install) - Write-Log -Message:('JCAgent prereq installed') - } - If (!(Check_Program_Installed("Microsoft Visual C\+\+ 2013 x86"))) - { - Write-Log -Message:('Downloading & Installing JCAgent prereq Visual C++ 2013 x86') - (New-Object System.Net.WebClient).DownloadFile("${msvc2013x86Link}", ($jcAdmuTempPath + $msvc2013x86File)) - Invoke-Expression -Command:($msvc2013x86Install) - Write-Log -Message:('JCAgent prereq installed') - } - If (!(AgentIsOnFileSystem)) - { - Start-Sleep -s 20 - Write-Log -Message:('Downloading JCAgent Installer') - #Download Installer - DownloadAgentInstaller - Write-Log -Message:('JumpCloud Agent Download Complete') - Write-Log -Message:('Running JCAgent Installer') - #Run Installer - InstallAgent - Write-Log -Message:('JumpCloud Agent Installer Completed') - } - If (Check_Program_Installed("Microsoft Visual C\+\+ 2013 x64") -and Check_Program_Installed("Microsoft Visual C\+\+ 2013 x86") -and AgentIsOnFileSystem) - { - Return $true - } - Else - { - Return $false - } -} - -Add-Type -MemberDefinition @" -[DllImport("netapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] -public static extern uint NetApiBufferFree(IntPtr Buffer); -[DllImport("netapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] -public static extern int NetGetJoinInformation( - string server, - out IntPtr NameBuffer, - out int BufferType); -"@ -Namespace Win32Api -Name NetApi32 - -function GetNetBiosName { - $pNameBuffer = [IntPtr]::Zero - $joinStatus = 0 - $apiResult = [Win32Api.NetApi32]::NetGetJoinInformation( - $null, # lpServer - [Ref] $pNameBuffer, # lpNameBuffer - [Ref] $joinStatus # BufferType - ) - if ( $apiResult -eq 0 ) { - [Runtime.InteropServices.Marshal]::PtrToStringAuto($pNameBuffer) - [Void] [Win32Api.NetApi32]::NetApiBufferFree($pNameBuffer) - } -} - -function ConvertSID { - [CmdletBinding()] - param - ( - [Parameter(Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)] - $Sid - ) - process - { - (New-Object System.Security.Principal.SecurityIdentifier($Sid)).Translate( [System.Security.Principal.NTAccount]).Value - } -} - -#endregion Functions - -#region Agent Install Helper Functions -Function AgentIsOnFileSystem() -{ - Test-Path -Path:(${AGENT_PATH} + '/' + ${AGENT_BINARY_NAME}) -} -Function InstallAgent() -{ - $params = ("${AGENT_INSTALLER_PATH}", "-k ${JumpCloudConnectKey}", "/VERYSILENT", "/NORESTART", "/SUPRESSMSGBOXES", "/NOCLOSEAPPLICATIONS", "/NORESTARTAPPLICATIONS", "/LOG=$env:TEMP\jcUpdate.log") - Invoke-Expression "$params" -} -Function DownloadAgentInstaller() -{ - (New-Object System.Net.WebClient).DownloadFile("${AGENT_INSTALLER_URL}", "${AGENT_INSTALLER_PATH}") -} -Function ForceRebootComputerWithDelay -{ - Param( - [int]$TimeOut = 10 - ) - $continue = $true - - while ($continue) - { - If ([console]::KeyAvailable) - { - Write-Output "Restart Canceled by key press" - Exit; - } - Else - { - Write-Output "Press any key to cancel... restarting in $TimeOut" -NoNewLine - Start-Sleep -Seconds 1 - $TimeOut = $TimeOut - 1 - Clear-Host - If ($TimeOut -eq 0) - { - $continue = $false - $Restart = $true - } - } - } - If ($Restart -eq $True) - { - Write-Output "Restarting Computer..." - Restart-Computer -ComputerName $env:COMPUTERNAME -Force - } -} -#endregion Agent Install Helper Functions - - -#region config xml -$usmtconfig = [xml] @" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -"@ -#endregion config xml - -#region migapp xml -$usmtmigapp = [xml] @" - - - MigSys.dll - <_locDefinition> - <_locDefault _loc="locNone" /> - <_locTag _loc="locData">displayName - - - - - - MigXmlHelper.IsNative64Bit() - - - HKLM\SOFTWARE\Wow6432Node - - - %ProgramFiles(x86)% - - - %CommonProgramFiles(x86)% - - - - - MigXmlHelper.IsNative64Bit() - - - HKLM\Software - - - %ProgramFiles% - - - %CommonProgramFiles% - - - - - - MigXmlHelper.IsNative64Bit() - - - %CSIDL_VIRTUALSTORE_PROGRAMFILES(X86)% - - - %CSIDL_VIRTUALSTORE_COMMONPROGRAMFILES(X86)% - - - - - MigXmlHelper.IsNative64Bit() - - - %CSIDL_VIRTUALSTORE_PROGRAMFILES% - - - %CSIDL_VIRTUALSTORE_COMMONPROGRAMFILES% - - - - - - MigXmlHelper.DoesObjectExist("Registry","HKCU\Software\Microsoft\Windows Live Mail [First Signin Done]") - - - %WLMailStoreRoot% - - - HKCU\Software\Microsoft\Windows Live Mail - - - - - MigXmlHelper.DoesObjectExist("Registry","HKCU\Software\Microsoft\Windows Live Mail [First Signin Done]") - - - %CSIDL_MYDOCUMENTS%\Migrated Mail - - - HKCU\Software\Microsoft\Windows Live Mail\Migrated Keys - - - - - - MigXmlHelper.DoesObjectExist("Registry","HKCU\Software\Adobe\Photoshop\8.0") - - - MigXmlHelper.DoesFileVersionMatch("%PhotoshopSuite8Path%\Photoshop.exe","FileVersion","8.*") - - - - - MigXmlHelper.DoesObjectExist("File","%CSIDL_APPDATA%\Adobe\ImageReady\CS\Settings\Adobe ImageReady CS Prefs") - - - MigXmlHelper.DoesFileVersionMatch("%PhotoshopSuite8Path%\ImageReady.exe","FileVersion","8.*") - MigXmlHelper.DoesFileVersionMatch("%PhotoshopSuite8Path%\ImageReady.exe","FileVersion","* 8.*") - - - - - - - - - - - - - - - - - - - - - - - - - - - %OFFICEINSTALLPATH%\FrontPg.exe - - - - - - MigXmlHelper.DoesObjectExist("Registry","%HklmWowSoftware%\Microsoft\Office\%OFFICEVERSION%\Word\InstallRoot [Path]") - - - - - MigXmlHelper.DoesObjectExist("Registry","%HklmWowSoftware%\Microsoft\Office\%OFFICEVERSION%\Access\InstallRoot [Path]") - - - - - MigXmlHelper.DoesObjectExist("Registry","%HklmWowSoftware%\Microsoft\Office\%OFFICEVERSION%\Excel\InstallRoot [Path]") - - - - - MigXmlHelper.DoesObjectExist("Registry","%HklmWowSoftware%\Microsoft\Office\%OFFICEVERSION%\PowerPoint\InstallRoot [Path]") - - - - - MigXmlHelper.DoesObjectExist("Registry","%HklmWowSoftware%\Microsoft\Office\%OFFICEVERSION%\Outlook\InstallRoot [Path]") - - - - - MigXmlHelper.DoesObjectExist("Registry","%HklmWowSoftware%\Microsoft\Office\%OFFICEVERSION%\Publisher\InstallRoot [Path]") - - - - - MigXmlHelper.DoesObjectExist("Registry","%HklmWowSoftware%\Microsoft\Office\%OFFICEVERSION%\FrontPage\InstallRoot [Path]") - - - - - MigXmlHelper.DoesObjectExist("Registry","%HklmWowSoftware%\Microsoft\Office\%OFFICEVERSION%\Visio [CurrentlyRegisteredVersion]") - - - - - MigXmlHelper.DoesObjectExist("Registry","%HklmWowSoftware%\Microsoft\Office\%OFFICEVERSION%\Visio\InstallRoot [Path]") - - - - - MigXmlHelper.DoesObjectExist("Registry","%HklmWowSoftware%\Microsoft\Office\%OFFICEVERSION%\Visio\InstallRoot [Path]") - - - - - MigXmlHelper.DoesObjectExist("Registry","%HklmWowSoftware%\Microsoft\Office\%OFFICEVERSION%\Visio\InstallRoot [Path]") - - - - - MigXmlHelper.DoesObjectExist("Registry","%HklmWowSoftware%\Microsoft\Office\%OFFICEVERSION%\MS Project") - - - - - MigXmlHelper.DoesObjectExist("Registry","%HklmWowSoftware%\Microsoft\Office\%OFFICEVERSION%\Project\InstallRoot [Path]") - - - - - MigXmlHelper.DoesObjectExist("Registry","%HklmWowSoftware%\Microsoft\Office\%OFFICEVERSION%\Project\InstallRoot [Path]") - - - - - MigXmlHelper.DoesObjectExist("Registry","%HklmWowSoftware%\Microsoft\Office\%OFFICEVERSION%\Project\InstallRoot [Path]") - - - - - MigXmlHelper.DoesObjectExist("Registry","%HklmWowSoftware%\Microsoft\Office\%OFFICEVERSION%\Project\InstallRoot [Path]") - - - - - MigXmlHelper.DoesObjectExist("Registry","%HklmWowSoftware%\Microsoft\Office\%OFFICEVERSION%\Project\InstallRoot [Path]") - - - - - MigXmlHelper.DoesObjectExist("Registry","%HklmWowSoftware%\Microsoft\Office\%OFFICEVERSION%\OneNote\InstallRoot [Path]") - - - - - MigXmlHelper.DoesObjectExist("Registry","%HklmWowSoftware%\Microsoft\Office\%OFFICEVERSION%\InfoPath\InstallRoot [Path]") - - - - - MigXmlHelper.DoesObjectExist("Registry","%HklmWowSoftware%\Microsoft\Office\%OFFICEVERSION%\SharePoint Designer\InstallRoot [Path]") - - - - - MigXmlHelper.DoesObjectExist("Registry","HklmWowSoftware%\Microsoft\Office\%OFFICEVERSION%\Lync\InstallRoot [Path]") - - - - - MigXmlHelper.DoesObjectExist("Registry","HklmWowSoftware%\Microsoft\Office\%OFFICEVERSION%\Lync\InstallRoot [Path]") - - - - - MigXmlHelper.DoesObjectExist("Registry","HklmWowSoftware%\Microsoft\Office\%OFFICEVERSION%\Lync\InstallRoot [Path]") - - - - - - MigXmlHelper.DoesObjectExist("Registry","HKLM\Software\Microsoft\Office\%OFFICEVERSION%\Word\InstallRoot [Path]") - - - - - MigXmlHelper.DoesObjectExist("Registry","HKLM\SOFTWARE\Wow6432Node\Microsoft\Office\%OFFICEVERSION%\Word\InstallRoot [Path]") - - - - - MigXmlHelper.DoesObjectExist("Registry","HKLM\Software\Microsoft\Office\%OFFICEVERSION%\Access\InstallRoot [Path]") - - - - - MigXmlHelper.DoesObjectExist("Registry","HKLM\Software\Microsoft\Office\%OFFICEVERSION%\Excel\InstallRoot [Path]") - - - - - MigXmlHelper.DoesObjectExist("Registry","HKLM\Software\Microsoft\Office\%OFFICEVERSION%\PowerPoint\InstallRoot [Path]") - - - - - MigXmlHelper.DoesObjectExist("Registry","HKLM\Software\Microsoft\Office\%OFFICEVERSION%\Outlook\InstallRoot [Path]") - - - - - MigXmlHelper.DoesObjectExist("Registry","HKLM\Software\Microsoft\Office\%OFFICEVERSION%\Publisher\InstallRoot [Path]") - - - - - MigXmlHelper.DoesObjectExist("Registry","HKLM\Software\Microsoft\Office\%OFFICEVERSION%\Visio [CurrentlyRegisteredVersion]") - - - - - MigXmlHelper.DoesObjectExist("Registry","HKLM\Software\Microsoft\Office\%OFFICEVERSION%\Visio\InstallRoot [Path]") - - - - - MigXmlHelper.DoesObjectExist("Registry","HKLM\Software\Microsoft\Office\%OFFICEVERSION%\Visio\InstallRoot [Path]") - - - - - MigXmlHelper.DoesObjectExist("Registry","HKLM\Software\Microsoft\Office\%OFFICEVERSION%\Visio\InstallRoot [Path]") - - - - - MigXmlHelper.DoesObjectExist("Registry","HKLM\Software\Microsoft\Office\%OFFICEVERSION%\Project\InstallRoot [Path]") - - - - - MigXmlHelper.DoesObjectExist("Registry","HKLM\Software\Microsoft\Office\%OFFICEVERSION%\Project\InstallRoot [Path]") - - - - - MigXmlHelper.DoesObjectExist("Registry","HKLM\Software\Microsoft\Office\%OFFICEVERSION%\Project\InstallRoot [Path]") - - - - - MigXmlHelper.DoesObjectExist("Registry","HKLM\Software\Microsoft\Office\%OFFICEVERSION%\Project\InstallRoot [Path]") - - - - - MigXmlHelper.DoesObjectExist("Registry","HKLM\Software\Microsoft\Office\%OFFICEVERSION%\OneNote\InstallRoot [Path]") - - - - - MigXmlHelper.DoesObjectExist("Registry","HKLM\Software\Microsoft\Office\%OFFICEVERSION%\InfoPath\InstallRoot [Path]") - - - - - MigXmlHelper.DoesObjectExist("Registry","HKLM\Software\Microsoft\Office\%OFFICEVERSION%\SharePoint Designer\InstallRoot [Path]") - - - - - MigXmlHelper.DoesObjectExist("Registry","HKLM\Software\Microsoft\Office\%OFFICEVERSION%\Lync\InstallRoot [Path]") - - - - - MigXmlHelper.DoesObjectExist("Registry","HKLM\Software\Microsoft\Office\%OFFICEVERSION%\Lync\InstallRoot [Path]") - - - - - MigXmlHelper.DoesObjectExist("Registry","HKLM\Software\Microsoft\Office\%OFFICEVERSION%\Lync\InstallRoot [Path]") - - - - - - MigXmlHelper.DoesObjectExist("Registry","HKCU\Software\Microsoft\Office\Common\Smart Tag\Recognizers\{4FFB3E8B-AE75-48F2-BF13-D0D7E93FA8F9}") - - - - - MigXmlHelper.DoesObjectExist("Registry","HKCU\Software\Microsoft\Office\Common\Smart Tag\Recognizers\{64AB6C69-B40E-40AF-9B7F-F5687B48E2B6}") - - - - - MigXmlHelper.DoesObjectExist("Registry","HKCU\Software\Microsoft\Office\Common\Smart Tag\Recognizers\{64AB6C69-B40E-40AF-9B7F-F5687B48E2B6}") - - - - - MigXmlHelper.DoesObjectExist("Registry","HKCU\Software\Microsoft\Office\Common\Smart Tag\Recognizers\{64AB6C69-B40E-40AF-9B7F-F5687B48E2B6}") - - - - - MigXmlHelper.DoesObjectExist("Registry","HKCU\Software\Microsoft\Office\Common\Smart Tag\Recognizers\{64AB6C69-B40E-40AF-9B7F-F5687B48E2B6}") - - - - - MigXmlHelper.DoesObjectExist("Registry","HKCU\Software\Microsoft\Office\Common\Smart Tag\Recognizers\{64AB6C69-B40E-40AF-9B7F-F5687B48E2B6}") - - - - - MigXmlHelper.DoesObjectExist("Registry","HKCU\Software\Microsoft\Office\Common\Smart Tag\Recognizers\{64AB6C69-B40E-40AF-9B7F-F5687B48E2B6}") - - - - - MigXmlHelper.DoesObjectExist("Registry","HKCU\Software\Microsoft\Office\Common\Smart Tag\Recognizers\{87EF1CFE-51CA-4E6B-8C76-E576AA926888}") - - - - - - MigXmlHelper.DoesObjectExist("Registry","HKCU\Software\Microsoft\Windows Live Mail") - MigXmlHelper.DoesFileVersionMatch("%WLMailInstPath%\wlmail.exe","ProductVersion","12.*") - - - - - MigXmlHelper.DoesObjectExist("Registry","HKCU\Software\Microsoft\Windows Live Mail") - MigXmlHelper.DoesFileVersionMatch("%WLMailInstPath%\wlmail.exe","ProductVersion","14.*") - - - - - MigXmlHelper.DoesObjectExist("Registry","HKCU\Software\Microsoft\Windows Live Mail") - MigXmlHelper.DoesFileVersionMatch("%WLMailInstPath%\wlmail.exe","ProductVersion","15.*") - - - - - MigXmlHelper.DoesObjectExist("Registry","HKCU\Software\Microsoft\MSNMessenger") - - MigXmlHelper.DoesFileVersionMatch("%WLMessengerInstPath%\msnmsgr.exe","ProductVersion","8.5.*") - MigXmlHelper.DoesFileVersionMatch("%WLMessengerInstPath%\msnmsgr.exe","ProductVersion","14.*") - MigXmlHelper.DoesFileVersionMatch("%WLMessengerInstPath%\msnmsgr.exe","ProductVersion","15.*") - - - - - - MigXmlHelper.DoesObjectExist("Registry","HKCU\Software\Microsoft\Windows Live\Photo Gallery") - - MigXmlHelper.DoesFileVersionMatch("%WLPhotoGalleryInstPath%\WLXPhotoGallery.exe","ProductVersion","12.*") - MigXmlHelper.DoesFileVersionMatch("%WLPhotoGalleryInstPath%\WLXPhotoGallery.exe","ProductVersion","14.*") - MigXmlHelper.DoesFileVersionMatch("%WLPhotoGalleryInstPath%\WLXPhotoGallery.exe","ProductVersion","15.*") - - - - - - MigXmlHelper.DoesObjectExist("Registry","HKCU\Software\Microsoft\Windows Live\Writer") - - MigXmlHelper.DoesFileVersionMatch("%WLWriterInstPath%\WindowsLiveWriter.exe","ProductVersion","12.*") - MigXmlHelper.DoesFileVersionMatch("%WLWriterInstPath%\WindowsLiveWriter.exe","ProductVersion","14.*") - MigXmlHelper.DoesFileVersionMatch("%WLWriterInstPath%\WindowsLiveWriter.exe","ProductVersion","15.*") - - - - - - - - %HklmWowSoftware%\Microsoft\Office\12.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - %HklmWowSoftware%\Microsoft\Office\12.0\Common\Migration\%OFFICEPROGRAM% [Lang] - HKLM\Software\Microsoft\Office\11.0\Common\LanguageResources [SKULanguage] - - - - - %HklmWowSoftware%\Microsoft\Office\12.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - DWORD - 0B000000 - - - %HklmWowSoftware%\Microsoft\Office\12.0\Common\Migration\%OFFICEPROGRAM% [Lang] - DWORD - 00000000 - - - - - %HklmWowSoftware%\Microsoft\Office\12.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - %HklmWowSoftware%\Microsoft\Office\12.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - %HklmWowSoftware%\Microsoft\Office\12.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - - - - %HklmWowSoftware%\Microsoft\Office\14.0\Common\Migration\%OFFICEPROGRAM% [Lang] - %HklmWowSoftware%\Microsoft\Office\14.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - HKLM\Software\Microsoft\Office\11.0\Common\LanguageResources [SKULanguage] - - - - - %HklmWowSoftware%\Microsoft\Office\14.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - DWORD - 0B000000 - - - %HklmWowSoftware%\Microsoft\Office\14.0\Common\Migration\%OFFICEPROGRAM% [Lang] - DWORD - 00000000 - - - - - %HklmWowSoftware%\Microsoft\Office\14.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - %HklmWowSoftware%\Microsoft\Office\14.0\Common\Migration\%OFFICEPROGRAM% [Lang] - %HklmWowSoftware%\Microsoft\Office\14.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - - - - - - - - HKLM\Software\Microsoft\Office\14.0\Common\Migration\%OFFICEPROGRAM% [Lang] - HKLM\Software\Microsoft\Office\14.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - HKLM\Software\Microsoft\Office\11.0\Common\LanguageResources [SKULanguage] - - - - - HKLM\Software\Microsoft\Office\14.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - DWORD - 0B000000 - - - HKLM\Software\Microsoft\Office\14.0\Common\Migration\%OFFICEPROGRAM% [Lang] - DWORD - 00000000 - - - - - HKLM\Software\Microsoft\Office\14.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - - - - %HklmWowSoftware%\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [Lang] - %HklmWowSoftware%\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - HKLM\Software\Microsoft\Office\11.0\Common\LanguageResources [SKULanguage] - - - - - %HklmWowSoftware%\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - DWORD - 0B000000 - - - %HklmWowSoftware%\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [Lang] - DWORD - 00000000 - - - - - %HklmWowSoftware%\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - %HklmWowSoftware%\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [Lang] - %HklmWowSoftware%\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - - - - - - - - HKLM\Software\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [Lang] - HKLM\Software\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - HKLM\Software\Microsoft\Office\11.0\Common\LanguageResources [SKULanguage] - - - - - HKLM\Software\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - DWORD - 0B000000 - - - HKLM\Software\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [Lang] - DWORD - 00000000 - - - - - HKLM\Software\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - - - - %HklmWowSoftware%\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [Lang] - %HklmWowSoftware%\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - HKLM\Software\Microsoft\Office\11.0\Common\LanguageResources [SKULanguage] - - - - - %HklmWowSoftware%\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - DWORD - 0B000000 - - - %HklmWowSoftware%\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [Lang] - DWORD - 00000000 - - - - - %HklmWowSoftware%\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - %HklmWowSoftware%\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [Lang] - %HklmWowSoftware%\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - - - - - - - - HKLM\Software\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [Lang] - HKLM\Software\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - HKLM\Software\Microsoft\Office\11.0\Common\LanguageResources [SKULanguage] - - - - - HKLM\Software\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - DWORD - 0B000000 - - - HKLM\Software\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [Lang] - DWORD - 00000000 - - - - - HKLM\Software\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - - - - %HklmWowSoftware%\Microsoft\Office\14.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - %HklmWowSoftware%\Microsoft\Office\14.0\Common\Migration\%OFFICEPROGRAM% [Lang] - HKLM\Software\Microsoft\Office\12.0\Common\LanguageResources [SKULanguage] - - - - - %HklmWowSoftware%\Microsoft\Office\14.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - DWORD - 0C000000 - - - %HklmWowSoftware%\Microsoft\Office\14.0\Common\Migration\%OFFICEPROGRAM% [Lang] - DWORD - 00000000 - - - - - %HklmWowSoftware%\Microsoft\Office\14.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - %HklmWowSoftware%\Microsoft\Office\14.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - %HklmWowSoftware%\Microsoft\Office\14.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - - - - HKLM\Software\Microsoft\Office\14.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - HKLM\Software\Microsoft\Office\14.0\Common\Migration\%OFFICEPROGRAM% [Lang] - HKLM\Software\Microsoft\Office\12.0\Common\LanguageResources [SKULanguage] - - - - - HKLM\Software\Microsoft\Office\14.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - DWORD - 0C000000 - - - HKLM\Software\Microsoft\Office\14.0\Common\Migration\%OFFICEPROGRAM% [Lang] - DWORD - 00000000 - - - - - HKLM\Software\Microsoft\Office\14.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - - - - %HklmWowSoftware%\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - %HklmWowSoftware%\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [Lang] - HKLM\Software\Microsoft\Office\12.0\Common\LanguageResources [SKULanguage] - - - - - %HklmWowSoftware%\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - DWORD - 0C000000 - - - %HklmWowSoftware%\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [Lang] - DWORD - 00000000 - - - - - %HklmWowSoftware%\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - %HklmWowSoftware%\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - %HklmWowSoftware%\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - - - - HKLM\Software\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - HKLM\Software\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [Lang] - HKLM\Software\Microsoft\Office\12.0\Common\LanguageResources [SKULanguage] - - - - - HKLM\Software\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - DWORD - 0C000000 - - - HKLM\Software\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [Lang] - DWORD - 00000000 - - - - - HKLM\Software\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - - - - %HklmWowSoftware%\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - %HklmWowSoftware%\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [Lang] - HKLM\Software\Microsoft\Office\12.0\Common\LanguageResources [SKULanguage] - - - - - %HklmWowSoftware%\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - DWORD - 0C000000 - - - %HklmWowSoftware%\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [Lang] - DWORD - 00000000 - - - - - %HklmWowSoftware%\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - %HklmWowSoftware%\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - %HklmWowSoftware%\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - - - - HKLM\Software\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - HKLM\Software\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [Lang] - HKLM\Software\Microsoft\Office\12.0\Common\LanguageResources [SKULanguage] - - - - - HKLM\Software\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - DWORD - 0C000000 - - - HKLM\Software\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [Lang] - DWORD - 00000000 - - - - - HKLM\Software\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - - - - %HklmWowSoftware%\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - %HklmWowSoftware%\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [Lang] - HKLM\Software\Microsoft\Office\14.0\Common\LanguageResources [SKULanguage] - - - - - %HklmWowSoftware%\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - DWORD - 0C000000 - - - %HklmWowSoftware%\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [Lang] - DWORD - 00000000 - - - - - %HklmWowSoftware%\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - %HklmWowSoftware%\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - %HklmWowSoftware%\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - - - - HKLM\Software\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - HKLM\Software\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [Lang] - HKLM\Software\Microsoft\Office\14.0\Common\LanguageResources [SKULanguage] - - - - - HKLM\Software\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - DWORD - 0C000000 - - - HKLM\Software\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [Lang] - DWORD - 00000000 - - - - - HKLM\Software\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - - - - %HklmWowSoftware%\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - %HklmWowSoftware%\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [Lang] - HKLM\Software\Microsoft\Office\14.0\Common\LanguageResources [SKULanguage] - - - - - %HklmWowSoftware%\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - DWORD - 0C000000 - - - %HklmWowSoftware%\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [Lang] - DWORD - 00000000 - - - - - %HklmWowSoftware%\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - %HklmWowSoftware%\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - %HklmWowSoftware%\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - - - - HKLM\Software\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - HKLM\Software\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [Lang] - HKLM\Software\Microsoft\Office\14.0\Common\LanguageResources [SKULanguage] - - - - - HKLM\Software\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - DWORD - 0C000000 - - - HKLM\Software\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [Lang] - DWORD - 00000000 - - - - - HKLM\Software\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - - - - %HklmWowSoftware%\Microsoft\Office\14.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - %HklmWowSoftware%\Microsoft\Office\14.0\Common\Migration\%OFFICEPROGRAM% [Lang] - HKLM\Software\Microsoft\Office\14.0\Common\LanguageResources [SKULanguage] - - - - - %HklmWowSoftware%\Microsoft\Office\14.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - DWORD - 0E000000 - - - %HklmWowSoftware%\Microsoft\Office\14.0\Common\Migration\%OFFICEPROGRAM% [Lang] - DWORD - 00000000 - - - - - %HklmWowSoftware%\Microsoft\Office\14.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - %HklmWowSoftware%\Microsoft\Office\14.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - %HklmWowSoftware%\Microsoft\Office\14.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - - - - HKLM\Software\Microsoft\Office\14.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - HKLM\Software\Microsoft\Office\14.0\Common\Migration\%OFFICEPROGRAM% [Lang] - HKLM\Software\Microsoft\Office\14.0\Common\LanguageResources [SKULanguage] - - - - - HKLM\Software\Microsoft\Office\14.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - DWORD - 0E000000 - - - HKLM\Software\Microsoft\Office\14.0\Common\Migration\%OFFICEPROGRAM% [Lang] - DWORD - 00000000 - - - - - HKLM\Software\Microsoft\Office\14.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - - - - %HklmWowSoftware%\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - %HklmWowSoftware%\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [Lang] - HKLM\Software\Microsoft\Office\15.0\Common\LanguageResources [SKULanguage] - - - - - %HklmWowSoftware%\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - DWORD - 0E000000 - - - %HklmWowSoftware%\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [Lang] - DWORD - 00000000 - - - - - %HklmWowSoftware%\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - %HklmWowSoftware%\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - %HklmWowSoftware%\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - - - - HKLM\Software\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - HKLM\Software\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [Lang] - HKLM\Software\Microsoft\Office\15.0\Common\LanguageResources [SKULanguage] - - - - - HKLM\Software\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - DWORD - 0E000000 - - - HKLM\Software\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [Lang] - DWORD - 00000000 - - - - - HKLM\Software\Microsoft\Office\15.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - - - - %HklmWowSoftware%\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - %HklmWowSoftware%\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [Lang] - HKLM\Software\Microsoft\Office\15.0\Common\LanguageResources [SKULanguage] - - - - - %HklmWowSoftware%\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - DWORD - 0C000000 - - - %HklmWowSoftware%\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [Lang] - DWORD - 00000000 - - - - - %HklmWowSoftware%\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - %HklmWowSoftware%\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - %HklmWowSoftware%\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - - - - HKLM\Software\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - HKLM\Software\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [Lang] - HKLM\Software\Microsoft\Office\15.0\Common\LanguageResources [SKULanguage] - - - - - HKLM\Software\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - DWORD - 0C000000 - - - HKLM\Software\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [Lang] - DWORD - 00000000 - - - - - HKLM\Software\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - - - - %HklmWowSoftware%\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - %HklmWowSoftware%\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [Lang] - HKLM\Software\Microsoft\Office\16.0\Common\LanguageResources [SKULanguage] - - - - - %HklmWowSoftware%\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - DWORD - 0E000000 - - - %HklmWowSoftware%\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [Lang] - DWORD - 00000000 - - - - - %HklmWowSoftware%\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - %HklmWowSoftware%\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - %HklmWowSoftware%\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - - - - HKLM\Software\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - HKLM\Software\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [Lang] - HKLM\Software\Microsoft\Office\16.0\Common\LanguageResources [SKULanguage] - - - - - HKLM\Software\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - DWORD - 0E000000 - - - HKLM\Software\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [Lang] - DWORD - 00000000 - - - - - HKLM\Software\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - - - - %HklmWowSoftware%\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - %HklmWowSoftware%\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [Lang] - HKLM\Software\Microsoft\Office\14.0\Common\LanguageResources [SKULanguage] - - - - - %HklmWowSoftware%\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - DWORD - 0C000000 - - - %HklmWowSoftware%\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [Lang] - DWORD - 00000000 - - - - - %HklmWowSoftware%\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - %HklmWowSoftware%\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - %HklmWowSoftware%\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - - - - HKLM\Software\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - HKLM\Software\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [Lang] - HKLM\Software\Microsoft\Office\14.0\Common\LanguageResources [SKULanguage] - - - - - HKLM\Software\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - DWORD - 0C000000 - - - HKLM\Software\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [Lang] - DWORD - 00000000 - - - - - HKLM\Software\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - - - - %HklmWowSoftware%\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - %HklmWowSoftware%\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [Lang] - HKLM\Software\Microsoft\Office\15.0\Common\LanguageResources [SKULanguage] - - - - - %HklmWowSoftware%\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - DWORD - 0C000000 - - - %HklmWowSoftware%\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [Lang] - DWORD - 00000000 - - - - - %HklmWowSoftware%\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - %HklmWowSoftware%\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - %HklmWowSoftware%\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - - - - HKLM\Software\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - HKLM\Software\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [Lang] - HKLM\Software\Microsoft\Office\15.0\Common\LanguageResources [SKULanguage] - - - - - HKLM\Software\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - DWORD - 0C000000 - - - HKLM\Software\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [Lang] - DWORD - 00000000 - - - - - HKLM\Software\Microsoft\Office\16.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - - - - %HklmWowSoftware%\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - %HklmWowSoftware%\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [Lang] - HKLM\Software\Microsoft\Office\16.0\Common\LanguageResources [SKULanguage] - - - - - %HklmWowSoftware%\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - DWORD - 0C000000 - - - %HklmWowSoftware%\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [Lang] - DWORD - 00000000 - - - - - %HklmWowSoftware%\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - %HklmWowSoftware%\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - %HklmWowSoftware%\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - - - - HKLM\Software\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - HKLM\Software\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [Lang] - HKLM\Software\Microsoft\Office\16.0\Common\LanguageResources [SKULanguage] - - - - - HKLM\Software\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - DWORD - 0C000000 - - - HKLM\Software\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [Lang] - DWORD - 00000000 - - - - - HKLM\Software\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - - - - %HklmWowSoftware%\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - %HklmWowSoftware%\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [Lang] - HKLM\Software\Microsoft\Office\17.0\Common\LanguageResources [SKULanguage] - - - - - %HklmWowSoftware%\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - DWORD - 0E000000 - - - %HklmWowSoftware%\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [Lang] - DWORD - 00000000 - - - - - %HklmWowSoftware%\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - %HklmWowSoftware%\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - %HklmWowSoftware%\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - - - - HKLM\Software\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - HKLM\Software\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [Lang] - HKLM\Software\Microsoft\Office\17.0\Common\LanguageResources [SKULanguage] - - - - - HKLM\Software\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [UpgradeVersion] - DWORD - 0E000000 - - - HKLM\Software\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [Lang] - DWORD - 00000000 - - - - - HKLM\Software\Microsoft\Office\17.0\Common\Migration\%OFFICEPROGRAM% [Lang] - - - - - - - - %OUTLOOKPROFILESPATH%* [01020fff] - %OUTLOOKPROFILESPATH%* [001e0324] - %OUTLOOKPROFILESPATH%* [001e6600] - %OUTLOOKPROFILESPATH%* [001e6700] - - - %OUTLOOKPROFILESPATH%* [001e0324] - %OUTLOOKPROFILESPATH%* [001e6600] - %OUTLOOKPROFILESPATH%* [001e6700] - - - - - - - %OUTLOOKPROFILESPATH%* [001f0324] - %OUTLOOKPROFILESPATH%* [001f6600] - %OUTLOOKPROFILESPATH%* [001f6700] - - - %OUTLOOKPROFILESPATH%* [001e0324] - %OUTLOOKPROFILESPATH%* [001e6600] - %OUTLOOKPROFILESPATH%* [001e6700] - %OUTLOOKPROFILESPATH%* [001f0324] - %OUTLOOKPROFILESPATH%* [001f6600] - %OUTLOOKPROFILESPATH%* [001f6700] - - - - - - - %OUTLOOKPROFILESPATH%* [0102*] - - - - - %OUTLOOKPROFILESPATH%* [0102*] - - - - - %OUTLOOKPROFILESPATH%* [1102*] - - - - - - - Microsoft Office 2010 - - - - - 14.0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Microsoft Office Access 2010 - - - Access - - - - - - - - - HKCU\Software\Microsoft\Office\14.0\Access\Settings\* [*] - - - - - HKCU\Software\Microsoft\Office\14.0\Access\* [*] - %CSIDL_APPDATA%\Microsoft\Access\* [*] - - - - - %CSIDL_APPDATA%\Microsoft\Access\* [*] - - - - - - - %CSIDL_APPDATA%\Microsoft\Office [Access14.pip] - %CSIDL_APPDATA%\* [*.mdw] - HKCU\Software\Microsoft\Office\Access\* [*] - HKCU\Software\Microsoft\Office\14.0\Access\* [*] - HKCU\Software\Microsoft\Office\14.0\CMA\* [*] - HKCU\Software\Microsoft\Office\14.0\Common\Toolbars\Settings\ [Microsoft Access] - HKCU\Software\Microsoft\Office\14.0\Access\File MRU\* [*] - - - - - HKCU\Software\Microsoft\Office\14.0\Access\Settings [MRU1] - HKCU\Software\Microsoft\Office\14.0\Access\Settings [MRU2] - HKCU\Software\Microsoft\Office\14.0\Access\Settings [MRU3] - HKCU\Software\Microsoft\Office\14.0\Access\Settings [MRU4] - HKCU\Software\Microsoft\Office\14.0\Access\Settings [MRU5] - HKCU\Software\Microsoft\Office\14.0\Access\Settings [MRU6] - HKCU\Software\Microsoft\Office\14.0\Access\Settings [MRU7] - HKCU\Software\Microsoft\Office\14.0\Access\Settings [MRU8] - HKCU\Software\Microsoft\Office\14.0\Access\Settings [MRU9] - HKCU\Software\Microsoft\Office\14.0\Access\Settings [MRUFlags1] - HKCU\Software\Microsoft\Office\14.0\Access\Settings [MRUFlags2] - HKCU\Software\Microsoft\Office\14.0\Access\Settings [MRUFlags3] - HKCU\Software\Microsoft\Office\14.0\Access\Settings [MRUFlags4] - HKCU\Software\Microsoft\Office\14.0\Access\Settings [MRUFlags5] - HKCU\Software\Microsoft\Office\14.0\Access\Settings [MRUFlags6] - HKCU\Software\Microsoft\Office\14.0\Access\Settings [MRUFlags7] - HKCU\Software\Microsoft\Office\14.0\Access\Settings [MRUFlags8] - HKCU\Software\Microsoft\Office\14.0\Access\Settings [MRUFlags9] - - - - - HKCU\Software\Microsoft\Office\14.0\Access\Options [Default Database Directory] - - - - - - - - - - Microsoft Office Excel 2010 - - - Excel - - - - - - - - - HKCU\Software\Microsoft\Office\14.0\Excel\Error Checking\* [*] - HKCU\Software\Microsoft\Office\14.0\Excel\Internet\* [*] - HKCU\Software\Microsoft\Office\14.0\Excel\Options\* [*] - - - - - HKCU\Software\Microsoft\Office\14.0\Excel\* [*] - - - - - - - - - - Microsoft Office OneNote 2010 - - - - - - OneNote - - - - - - - - - %OneNoteCachePath%\OneNoteOfflineCache_Files\* [*] - %OneNoteCachePath% [OneNoteOfflineCache.onecache] - - - - - HKCU\Software\Microsoft\Office\14.0\OneNote\* [*] - %CSIDL_APPDATA%\Microsoft\OneNote\14.0\* [*] - %CSIDL_LOCAL_APPDATA%\Microsoft\Office [OneNote.officeUI] - - - - - HKCU\Software\Microsoft\Office\14.0\OneNote\Options\Other [EnableAudioSearch] - - - - - %CSIDL_APPDATA%\Microsoft\OneNote\14.0\* [*] - %CSIDL_LOCAL_APPDATA%\Microsoft\Office [OneNote.officeUI] - - - - - - - - - - Microsoft Office InfoPath 2010 - - - OneNote - - - - - - - - - HKCU\Software\Microsoft\Office\14.0\InfoPath\* [*] - - - - - HKCU\Software\Microsoft\Office\14.0\InfoPath\* [*] - - - - - - - - - - Microsoft SharePoint Designer 2010 - - - SharePointDesigner - - - - - - - - - HKCU\Software\Microsoft\Office\14.0\SharePoint Designer\* [*] - - - - - HKCU\Software\Microsoft\Office\14.0\SharePoint Designer\* [*] - - - - - - - - - - Microsoft Office Outlook 2010 - - - Outlook - - - HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\ - - - - - - - - - - HKCU\Software\Microsoft\Office\Outlook\* [*] - HKCU\Software\Microsoft\Office\14.0\Outlook\* [*] - HKCU\Software\Microsoft\Exchange\* [*] - HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\* [*] - %CSIDL_APPDATA%\Microsoft\Office [*.officeUI] - %CSIDL_LOCAL_APPDATA%\Microsoft\Office [*.officeUI] - %CSIDL_APPDATA%\Microsoft\Templates\* [*] - %CSIDL_APPDATA%\Microsoft\Stationery\* [*] - %CSIDL_APPDATA%\Microsoft\Outlook\* [*] - %CSIDL_APPDATA%\Microsoft\Signatures\* [*] - %CSIDL_LOCAL_APPDATA%\Microsoft\FORMS [frmcache.dat] - %CSIDL_LOCAL_APPDATA%\Microsoft\Outlook\* [*] - - - - HKCU\Software\Microsoft\Office\14.0\Outlook\Search\* [*] - - - - - - HKCU\Software\Microsoft\Office\14.0\Outlook\Journal\* [*] - - - - - - HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\* [001e023d] - HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\* [001f023d] - - - - - - - - %CSIDL_LOCAL_APPDATA%\Microsoft\Outlook\* [*.ost] - - - - - %CSIDL_APPDATA%\Microsoft\Outlook\* [*.srs] - %CSIDL_APPDATA%\Microsoft\Outlook\* [*.xml] - %CSIDL_APPDATA%\Microsoft\Outlook\* [*.dat] - %CSIDL_LOCAL_APPDATA%\Microsoft\FORMS [frmcache.dat] - - - - - %CSIDL_APPDATA%\Microsoft\Outlook [*.rwz] - - - - - - - - - - Microsoft Office PowerPoint 2010 - - - PowerPoint - - - - - - - - - HKCU\Software\Microsoft\Office\14.0\PowerPoint\Options\* [*] - HKCU\Software\Microsoft\Office\14.0\PowerPoint\Internet\* [*] - - - - - HKCU\Software\Microsoft\Office\14.0\PowerPoint\* [*] - %CSIDL_APPDATA%\Microsoft\PowerPoint\* [*] - - - - - %CSIDL_APPDATA%\Microsoft\PowerPoint\* [*] - - - - - - - - - - Microsoft Project 2010 - - - Project - - - - - - - - - HKCU\Software\Microsoft\Office\14.0\MS Project\Options\* [*] - - - - - HKCU\Software\Microsoft\Office\14.0\MS Project\* [*] - %CSIDL_APPDATA%\Microsoft\MS Project\14\* [*] - - - - - %CSIDL_APPDATA%\Microsoft\MS Project\14\* [*] - - - - - - - - - - Microsoft Office Publisher 2010 - - - Publisher - - - - - - - - - HKCU\Software\Microsoft\Office\14.0\Publisher\Preferences\* [*] - - - - - HKCU\Software\Microsoft\Office\14.0\Publisher\* [*] - %CSIDL_APPDATA%\Microsoft\Publisher\* [*] - %CSIDL_APPDATA%\Microsoft\Publisher Building Blocks\* [*] - - - - - %CSIDL_APPDATA%\Microsoft\Publisher\* [*] - %CSIDL_APPDATA%\Microsoft\Publisher Building Blocks\* [*] - - - - - - - - - - Microsoft Office SmartTags - - - - - - - Microsoft Outlook Email Recipients SmartTags - - - - - - HKCU\Software\Microsoft\Office\Common\Smart Tag\Recognizers\{4FFB3E8B-AE75-48F2-BF13-D0D7E93FA8F9} [*] - - - - - HKCU\Software\Microsoft\Office\Common\Smart Tag\Recognizers\{4FFB3E8B-AE75-48F2-BF13-D0D7E93FA8F9}\* [*] - - - - - - - - Microsoft Lists SmartTags - - - - - - HKCU\Software\Microsoft\Office\Common\Smart Tag\Recognizers\{64AB6C69-B40E-40AF-9B7F-F5687B48E2B6}\* [*] - - - - - HKCU\Software\Microsoft\Office\Common\Smart Tag\Recognizers\{64AB6C69-B40E-40AF-9B7F-F5687B48E2B6}\* [*] - - - - - - - - Microsoft Place SmartTags - - - - - - HKCU\Software\Microsoft\Office\Common\Smart Tag\Recognizers\{87EF1CFE-51CA-4E6B-8C76-E576AA926888} [*] - - - - - HKCU\Software\Microsoft\Office\Common\Smart Tag\Recognizers\{87EF1CFE-51CA-4E6B-8C76-E576AA926888}\* [*] - - - - - - - - - - Microsoft Office Visio 2010 - - - Visio - - - - - - - - - HKCU\software\Microsoft\Office\14.0\Visio\Application\* [*] - - - - - HKCU\software\Microsoft\Office\14.0\Visio\* [*] - %CSIDL_LOCAL_APPDATA%\Microsoft\Visio\* [*] - - - - - HKCU\Software\Microsoft\Office\14.0\Visio\Application [LicenseCache] - HKCU\Software\Microsoft\Office\14.0\Visio\Application [ConfigChangeID] - HKCU\Software\Microsoft\Office\14.0\Visio\Application [MyShapesPath] - HKCU\Software\Microsoft\Office\14.0\Visio\Application [DrawingsPath] - HKCU\Software\Microsoft\Office\14.0\Visio\Application [StartUpPath] - HKCU\Software\Microsoft\Office\14.0\Visio\Application [StencilPath] - HKCU\Software\Microsoft\Office\14.0\Visio\Application [TemplatePath] - HKCU\Software\Microsoft\Office\14.0\Visio\Quick Shapes\* [*] - HKCU\Software\Microsoft\Office\14.0\Visio\Security\* [*] - HKCU\Software\Microsoft\Office\14.0\Visio\Recent Templates\* [*] - - - - - %CSIDL_LOCAL_APPDATA%\Microsoft\Visio\* [*] - - - - - - - - - - Microsoft Office Word 2010 (32-bit) - - - Word - - - 14.0 - - - - - - - - HKCU\software\Microsoft\Office\14.0\Word\Data\* [*] - - - - - HKCU\Software\Microsoft\Office\14.0\Word\* [*] - %CSIDL_APPDATA%\Microsoft\Templates [Normal.dotm] - %CSIDL_APPDATA%\Microsoft\Templates [NormalEmail.dotm] - %CSIDL_APPDATA%\Microsoft\Document Building Blocks\* [*] - - - - - %CSIDL_APPDATA%\Microsoft\Templates [Normal.dotm] - %CSIDL_APPDATA%\Microsoft\Templates [NormalEmail.dotm] - %CSIDL_APPDATA%\Microsoft\Document Building Blocks\* [*] - - - - - HKCU\Software\Microsoft\Office\14.0\Word\Options [PROGRAMDIR] - HKCU\Software\Microsoft\Office\14.0\Word\Data\* [*] - - - - - - - - - Microsoft Office Word 2010 (64-bit) - - - Word - - - 14.0 - - - - - - Microsoft Office Word 2010 (64-bit) Body - - - - - HKCU\software\Microsoft\Office\11.0\Word\Data\* [*] - HKCU\software\Microsoft\Office\12.0\Word\Data\* [*] - - - - - HKCU\Software\Microsoft\Office\14.0\Word\* [*] - %CSIDL_APPDATA%\Microsoft\Templates [Normal.dotm] - %CSIDL_APPDATA%\Microsoft\Templates [NormalEmail.dotm] - %CSIDL_APPDATA%\Microsoft\Document Building Blocks\* [*] - - - - - %CSIDL_APPDATA%\Microsoft\Templates [Normal.dotm] - %CSIDL_APPDATA%\Microsoft\Templates [NormalEmail.dotm] - %CSIDL_APPDATA%\Microsoft\Document Building Blocks\* [*] - - - - - - HKCU\Software\Microsoft\Office\14.0\Word\Options [PROGRAMDIR] - HKCU\Software\Microsoft\Office\14.0\Word\Data [PROGRAMDIR] - - - - - - - - - Microsoft Office Word 2010 (64-bit) legacy settings - - - - - - HKCU\software\Microsoft\Office\14.0\Word\Data\* [*] - - - - - - HKCU\Software\Microsoft\Office\14.0\Word\Data\* [*] - - - - - HKCU\Software\Microsoft\Office\14.0\Word\Data\* [*] - - - - - - - - - - - - Microsoft Office 15 - - - - - 15.0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Microsoft Office Access 15 - - - Access - - - - - - - - - HKCU\Software\Microsoft\Office\15.0\Access\Settings\* [*] - - - - - HKCU\Software\Microsoft\Office\15.0\Access\* [*] - %CSIDL_APPDATA%\Microsoft\Access\* [*] - - - - - %CSIDL_APPDATA%\Microsoft\Access\* [*] - - - - - - - %CSIDL_APPDATA%\Microsoft\Office [Access15.pip] - %CSIDL_APPDATA%\* [*.mdw] - HKCU\Software\Microsoft\Office\Access\* [*] - HKCU\Software\Microsoft\Office\15.0\Access\* [*] - HKCU\Software\Microsoft\Office\15.0\CMA\* [*] - HKCU\Software\Microsoft\Office\15.0\Common\Toolbars\Settings\ [Microsoft Access] - HKCU\Software\Microsoft\Office\15.0\Access\File MRU\* [*] - - - - - HKCU\Software\Microsoft\Office\15.0\Access\Settings [MRU1] - HKCU\Software\Microsoft\Office\15.0\Access\Settings [MRU2] - HKCU\Software\Microsoft\Office\15.0\Access\Settings [MRU3] - HKCU\Software\Microsoft\Office\15.0\Access\Settings [MRU4] - HKCU\Software\Microsoft\Office\15.0\Access\Settings [MRU5] - HKCU\Software\Microsoft\Office\15.0\Access\Settings [MRU6] - HKCU\Software\Microsoft\Office\15.0\Access\Settings [MRU7] - HKCU\Software\Microsoft\Office\15.0\Access\Settings [MRU8] - HKCU\Software\Microsoft\Office\15.0\Access\Settings [MRU9] - HKCU\Software\Microsoft\Office\15.0\Access\Settings [MRUFlags1] - HKCU\Software\Microsoft\Office\15.0\Access\Settings [MRUFlags2] - HKCU\Software\Microsoft\Office\15.0\Access\Settings [MRUFlags3] - HKCU\Software\Microsoft\Office\15.0\Access\Settings [MRUFlags4] - HKCU\Software\Microsoft\Office\15.0\Access\Settings [MRUFlags5] - HKCU\Software\Microsoft\Office\15.0\Access\Settings [MRUFlags6] - HKCU\Software\Microsoft\Office\15.0\Access\Settings [MRUFlags7] - HKCU\Software\Microsoft\Office\15.0\Access\Settings [MRUFlags8] - HKCU\Software\Microsoft\Office\15.0\Access\Settings [MRUFlags9] - - - - - HKCU\Software\Microsoft\Office\15.0\Access\Options [Default Database Directory] - - - - - - - - - - Microsoft Office Excel 15 - - - Excel - - - - - - - - - HKCU\Software\Microsoft\Office\15.0\Excel\Error Checking\* [*] - HKCU\Software\Microsoft\Office\15.0\Excel\Internet\* [*] - HKCU\Software\Microsoft\Office\15.0\Excel\Options\* [*] - - - - - HKCU\Software\Microsoft\Office\15.0\Excel\* [*] - HKCU\Software\Microsoft\Office\Excel\* [*] - - - - - - - - - - Microsoft Office OneNote 15 - - - - - - OneNote - - - - - - - - - %OneNoteCachePath%\OneNoteOfflineCache_Files\* [*] - %OneNoteCachePath% [OneNoteOfflineCache.onecache] - - - - - HKCU\Software\Microsoft\Office\15.0\OneNote\* [*] - %CSIDL_APPDATA%\Microsoft\OneNote\15.0\* [*] - %CSIDL_LOCAL_APPDATA%\Microsoft\Office [OneNote.officeUI] - - - - - HKCU\Software\Microsoft\Office\15.0\OneNote\Options\Other [EnableAudioSearch] - - - - - %CSIDL_APPDATA%\Microsoft\OneNote\15.0\* [*] - %CSIDL_LOCAL_APPDATA%\Microsoft\Office [OneNote.officeUI] - - - - - - - - - - Microsoft Office InfoPath 15 - - - OneNote - - - - - - - - - HKCU\Software\Microsoft\Office\15.0\InfoPath\* [*] - - - - - HKCU\Software\Microsoft\Office\15.0\InfoPath\* [*] - - - - - - - - - - Microsoft SharePoint Designer 15 - - - SharePointDesigner - - - - - - - - - HKCU\Software\Microsoft\Office\15.0\SharePoint Designer\* [*] - - - - - HKCU\Software\Microsoft\Office\15.0\SharePoint Designer\* [*] - - - - - - - - - - Microsoft Office Outlook 2013 - - - Outlook - - - HKCU\Software\Microsoft\Office\15.0\Outlook\Profiles\ - - - - - - - - - - HKCU\Software\Microsoft\Office\Outlook\* [*] - HKCU\Software\Microsoft\Office\15.0\Outlook\* [*] - HKCU\Software\Microsoft\Exchange\* [*] - HKCU\Software\Microsoft\Office\15.0\Outlook\Profiles\* [*] - %CSIDL_APPDATA%\Microsoft\Office [*.officeUI] - %CSIDL_LOCAL_APPDATA%\Microsoft\Office [*.officeUI] - %CSIDL_APPDATA%\Microsoft\Templates\* [*] - %CSIDL_APPDATA%\Microsoft\Stationery\* [*] - %CSIDL_APPDATA%\Microsoft\Outlook\* [*] - %CSIDL_APPDATA%\Microsoft\Signatures\* [*] - %CSIDL_LOCAL_APPDATA%\Microsoft\FORMS [frmcache.dat] - %CSIDL_LOCAL_APPDATA%\Microsoft\Outlook\* [*] - - - - HKCU\Software\Microsoft\Office\15.0\Outlook\Search\* [*] - - - - - - HKCU\Software\Microsoft\Office\15.0\Outlook\Journal\* [*] - - - - - - HKCU\Software\Microsoft\Office\15.0\Outlook\Profiles\* [001e023d] - HKCU\Software\Microsoft\Office\15.0\Outlook\Profiles\* [001f023d] - - - - - - - - %CSIDL_LOCAL_APPDATA%\Microsoft\Outlook\* [*.ost] - - - - - %CSIDL_APPDATA%\Microsoft\Outlook\* [*.srs] - %CSIDL_APPDATA%\Microsoft\Outlook\* [*.xml] - %CSIDL_APPDATA%\Microsoft\Outlook\* [*.dat] - %CSIDL_LOCAL_APPDATA%\Microsoft\FORMS [frmcache.dat] - - - - - %CSIDL_APPDATA%\Microsoft\Outlook [*.rwz] - - - - - - - - - - Microsoft Office PowerPoint 15 - - - PowerPoint - - - - - - - - - HKCU\Software\Microsoft\Office\15.0\PowerPoint\Options\* [*] - HKCU\Software\Microsoft\Office\15.0\PowerPoint\Internet\* [*] - - - - - HKCU\Software\Microsoft\Office\15.0\PowerPoint\* [*] - %CSIDL_APPDATA%\Microsoft\PowerPoint\* [*] - - - - - %CSIDL_APPDATA%\Microsoft\PowerPoint\* [*] - - - - - - - - - - Microsoft Project 15 - - - Project - - - - - - - - - HKCU\Software\Microsoft\Office\15.0\MS Project\Options\* [*] - - - - - HKCU\Software\Microsoft\Office\15.0\MS Project\* [*] - %CSIDL_APPDATA%\Microsoft\MS Project\15\* [*] - - - - - %CSIDL_APPDATA%\Microsoft\MS Project\15\* [*] - - - - - - - - - - Microsoft Office Publisher 2013 - - - Publisher - - - - - - - - - HKCU\Software\Microsoft\Office\15.0\Publisher\Preferences\* [*] - - - - - HKCU\Software\Microsoft\Office\15.0\Publisher\* [*] - %CSIDL_APPDATA%\Microsoft\Publisher\* [*] - %CSIDL_APPDATA%\Microsoft\Publisher Building Blocks\* [*] - - - - - %CSIDL_APPDATA%\Microsoft\Publisher\* [*] - %CSIDL_APPDATA%\Microsoft\Publisher Building Blocks\* [*] - - - - - - - - - - Microsoft Office SmartTags - - - - - - - Microsoft Outlook Email Recipients SmartTags - - - - - - HKCU\Software\Microsoft\Office\Common\Smart Tag\Recognizers\{4FFB3E8B-AE75-48F2-BF13-D0D7E93FA8F9} [*] - - - - - HKCU\Software\Microsoft\Office\Common\Smart Tag\Recognizers\{4FFB3E8B-AE75-48F2-BF13-D0D7E93FA8F9}\* [*] - - - - - - - - Microsoft Lists SmartTags - - - - - - HKCU\Software\Microsoft\Office\Common\Smart Tag\Recognizers\{64AB6C69-B40E-40AF-9B7F-F5687B48E2B6}\* [*] - - - - - HKCU\Software\Microsoft\Office\Common\Smart Tag\Recognizers\{64AB6C69-B40E-40AF-9B7F-F5687B48E2B6}\* [*] - - - - - - - - Microsoft Place SmartTags - - - - - - HKCU\Software\Microsoft\Office\Common\Smart Tag\Recognizers\{87EF1CFE-51CA-4E6B-8C76-E576AA926888} [*] - - - - - HKCU\Software\Microsoft\Office\Common\Smart Tag\Recognizers\{87EF1CFE-51CA-4E6B-8C76-E576AA926888}\* [*] - - - - - - - - - - Microsoft Office Visio 15 - - - Visio - - - - - - - - - HKCU\software\Microsoft\Office\15.0\Visio\Application\* [*] - - - - - HKCU\software\Microsoft\Office\15.0\Visio\* [*] - %CSIDL_LOCAL_APPDATA%\Microsoft\Visio\* [*] - - - - - HKCU\Software\Microsoft\Office\15.0\Visio\Application [LicenseCache] - HKCU\Software\Microsoft\Office\15.0\Visio\Application [ConfigChangeID] - HKCU\Software\Microsoft\Office\15.0\Visio\Application [MyShapesPath] - HKCU\Software\Microsoft\Office\15.0\Visio\Application [DrawingsPath] - HKCU\Software\Microsoft\Office\15.0\Visio\Application [StartUpPath] - HKCU\Software\Microsoft\Office\15.0\Visio\Application [StencilPath] - HKCU\Software\Microsoft\Office\15.0\Visio\Application [TemplatePath] - HKCU\Software\Microsoft\Office\15.0\Visio\Quick Shapes\* [*] - HKCU\Software\Microsoft\Office\15.0\Visio\Security\* [*] - HKCU\Software\Microsoft\Office\15.0\Visio\Recent Templates\* [*] - - - - - %CSIDL_LOCAL_APPDATA%\Microsoft\Visio\* [*] - - - - - - - - - - Microsoft Office Lync 15 - - - Lync - - - - - - - - - HKCU\software\Microsoft\Office\15.0\Lync\Application\* [*] - - - - - HKCU\software\Microsoft\Office\15.0\Lync\* [*] - %CSIDL_LOCAL_APPDATA%\Microsoft\Lync\* [*] - - - - - - - - - - %CSIDL_LOCAL_APPDATA%\Microsoft\Lync\* [*] - - - - - - - - - - Microsoft Office Word 2013 (32-bit) - - - Word - - - 15.0 - - - - - - - - - HKCU\software\Microsoft\Office\15.0\Word\Data\* [*] - - - - - HKCU\Software\Microsoft\Office\15.0\Word\* [*] - HKCU\Software\Microsoft\Office\15.0\Common\Toolbars\Word\* [*] - HKCU\Software\Microsoft\Office\15.0\Common\Research\* [*] - HKCU\Software\Microsoft\Office\15.0\Common\General\[SharedDocumentParts] - HKCU\Software\Microsoft\Office\15.0\Common\General\[SharedTemplates] - HKCU\Software\Microsoft\Office\15.0\Common\General\[Templates] - HKCU\Software\Microsoft\Office\15.0\Common\General\[Themes] - HKCU\Software\Microsoft\Office\Common\Blog \* [*] - HKCU\Software\Microsoft\Office\15.0\Common\Spotlight\* [*] - %CSIDL_APPDATA%\Microsoft\Templates\* [*] - %CSIDL_APPDATA%\Microsoft\Proof\* [*] - %CSIDL_APPDATA%\Microsoft\UProof\* [*] - %CSIDL_APPDATA%\Microsoft\QuickStyles\* [*] - %CSIDL_APPDATA%\Microsoft\Document Building Blocks\* [*] - %CSIDL_APPDATA%\Microsoft\Bibliography\* [*] - %CSIDL_LOCAL_APPDATA%\Microsoft\Office\ [Word.qat] - %CSIDL_LOCAL_APPDATA%\Microsoft\Office\ [Word15.customUI] - %CSIDL_APPDATA%\Microsoft\Office\ [Word15.pip] - %CSIDL_APPDATA%\Microsoft\Office\ [WordMa15.pip] - - - - - %CSIDL_APPDATA%\Microsoft\Templates\* [*] - %CSIDL_APPDATA%\Microsoft\Proof\* [*] - %CSIDL_APPDATA%\Microsoft\UProof\* [*] - %CSIDL_APPDATA%\Microsoft\QuickStyles\* [*] - %CSIDL_LOCAL_APPDATA%\Microsoft\Office\ [Word.qat] - %CSIDL_LOCAL_APPDATA%\Microsoft\Office\ [Word15.customUI] - %CSIDL_APPDATA%\Microsoft\Office\ [Word15.pip] - %CSIDL_APPDATA%\Microsoft\Office\ [WordMa15.pip] - %CSIDL_APPDATA%\Microsoft\Office\ [WordMa15.pip] - %CSIDL_APPDATA%\Microsoft\Document Building Blocks\* [*] - - - - - HKCU\Software\Microsoft\Office\15.0\Word\Options\[PROGRAMDIR] - - HKCU\Software\Microsoft\Office\15.0\Word\Options\[LiveDrag] - HKCU\Software\Microsoft\Office\15.0\Word\Options\[LivePreview] - - HKCU\software\Microsoft\Office\15.0\Word\Data\* [*] - - - - - - - - - - - - Microsoft Office 16 - - - - - 16.0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Microsoft Office Access 16 - - - Access - - - - - - - - - HKCU\Software\Microsoft\Office\16.0\Access\Settings\* [*] - - - - - HKCU\Software\Microsoft\Office\16.0\Access\* [*] - %CSIDL_APPDATA%\Microsoft\Access\* [*] - - - - - %CSIDL_APPDATA%\Microsoft\Access\* [*] - - - - - - - %CSIDL_APPDATA%\Microsoft\Office [Access16.pip] - %CSIDL_APPDATA%\* [*.mdw] - HKCU\Software\Microsoft\Office\Access\* [*] - HKCU\Software\Microsoft\Office\16.0\Access\* [*] - HKCU\Software\Microsoft\Office\16.0\CMA\* [*] - HKCU\Software\Microsoft\Office\16.0\Common\Toolbars\Settings\ [Microsoft Access] - HKCU\Software\Microsoft\Office\16.0\Access\File MRU\* [*] - - - - - HKCU\Software\Microsoft\Office\16.0\Access\Settings [MRU1] - HKCU\Software\Microsoft\Office\16.0\Access\Settings [MRU2] - HKCU\Software\Microsoft\Office\16.0\Access\Settings [MRU3] - HKCU\Software\Microsoft\Office\16.0\Access\Settings [MRU4] - HKCU\Software\Microsoft\Office\16.0\Access\Settings [MRU5] - HKCU\Software\Microsoft\Office\16.0\Access\Settings [MRU6] - HKCU\Software\Microsoft\Office\16.0\Access\Settings [MRU7] - HKCU\Software\Microsoft\Office\16.0\Access\Settings [MRU8] - HKCU\Software\Microsoft\Office\16.0\Access\Settings [MRU9] - HKCU\Software\Microsoft\Office\16.0\Access\Settings [MRUFlags1] - HKCU\Software\Microsoft\Office\16.0\Access\Settings [MRUFlags2] - HKCU\Software\Microsoft\Office\16.0\Access\Settings [MRUFlags3] - HKCU\Software\Microsoft\Office\16.0\Access\Settings [MRUFlags4] - HKCU\Software\Microsoft\Office\16.0\Access\Settings [MRUFlags5] - HKCU\Software\Microsoft\Office\16.0\Access\Settings [MRUFlags6] - HKCU\Software\Microsoft\Office\16.0\Access\Settings [MRUFlags7] - HKCU\Software\Microsoft\Office\16.0\Access\Settings [MRUFlags8] - HKCU\Software\Microsoft\Office\16.0\Access\Settings [MRUFlags9] - - - - - HKCU\Software\Microsoft\Office\16.0\Access\Options [Default Database Directory] - - - - - - - - - - Microsoft Office Excel 16 - - - Excel - - - - - - - - - HKCU\Software\Microsoft\Office\16.0\Excel\Error Checking\* [*] - HKCU\Software\Microsoft\Office\16.0\Excel\Internet\* [*] - HKCU\Software\Microsoft\Office\16.0\Excel\Options\* [*] - - - - - HKCU\Software\Microsoft\Office\16.0\Excel\* [*] - HKCU\Software\Microsoft\Office\Excel\* [*] - - - - - - - - - - Microsoft Office OneNote 16 - - - - - - OneNote - - - - - - - - - %OneNoteCachePath%\OneNoteOfflineCache_Files\* [*] - %OneNoteCachePath% [OneNoteOfflineCache.onecache] - - - - - HKCU\Software\Microsoft\Office\16.0\OneNote\* [*] - %CSIDL_APPDATA%\Microsoft\OneNote\16.0\* [*] - %CSIDL_LOCAL_APPDATA%\Microsoft\Office [OneNote.officeUI] - - - - - HKCU\Software\Microsoft\Office\16.0\OneNote\Options\Other [EnableAudioSearch] - - - - - %CSIDL_APPDATA%\Microsoft\OneNote\16.0\* [*] - %CSIDL_LOCAL_APPDATA%\Microsoft\Office [OneNote.officeUI] - - - - - - - - - - Microsoft Office InfoPath 16 - - - OneNote - - - - - - - - - HKCU\Software\Microsoft\Office\16.0\InfoPath\* [*] - - - - - HKCU\Software\Microsoft\Office\16.0\InfoPath\* [*] - - - - - - - - - - Microsoft SharePoint Designer 16 - - - SharePointDesigner - - - - - - - - - HKCU\Software\Microsoft\Office\16.0\SharePoint Designer\* [*] - - - - - HKCU\Software\Microsoft\Office\16.0\SharePoint Designer\* [*] - - - - - - - - - - Microsoft Office Outlook 2016 - - - Outlook - - - HKCU\Software\Microsoft\Office\16.0\Outlook\Profiles\ - - - - - - - - - - HKCU\Software\Microsoft\Office\Outlook\* [*] - HKCU\Software\Microsoft\Office\16.0\Outlook\* [*] - HKCU\Software\Microsoft\Exchange\* [*] - HKCU\Software\Microsoft\Office\16.0\Outlook\Profiles\* [*] - %CSIDL_APPDATA%\Microsoft\Office [*.officeUI] - %CSIDL_LOCAL_APPDATA%\Microsoft\Office [*.officeUI] - %CSIDL_APPDATA%\Microsoft\Templates\* [*] - %CSIDL_APPDATA%\Microsoft\Stationery\* [*] - %CSIDL_APPDATA%\Microsoft\Outlook\* [*] - %CSIDL_APPDATA%\Microsoft\Signatures\* [*] - %CSIDL_LOCAL_APPDATA%\Microsoft\FORMS [frmcache.dat] - %CSIDL_LOCAL_APPDATA%\Microsoft\Outlook\* [*] - - - - HKCU\Software\Microsoft\Office\16.0\Outlook\Search\* [*] - - - - - - HKCU\Software\Microsoft\Office\16.0\Outlook\Journal\* [*] - - - - - - HKCU\Software\Microsoft\Office\16.0\Outlook\Profiles\* [001e023d] - HKCU\Software\Microsoft\Office\16.0\Outlook\Profiles\* [001f023d] - - - - - - - - %CSIDL_LOCAL_APPDATA%\Microsoft\Outlook\* [*.ost] - - - - - %CSIDL_APPDATA%\Microsoft\Outlook\* [*.srs] - %CSIDL_APPDATA%\Microsoft\Outlook\* [*.xml] - %CSIDL_APPDATA%\Microsoft\Outlook\* [*.dat] - %CSIDL_LOCAL_APPDATA%\Microsoft\FORMS [frmcache.dat] - - - - - %CSIDL_APPDATA%\Microsoft\Outlook [*.rwz] - - - - - - - - - - Microsoft Office PowerPoint 16 - - - PowerPoint - - - - - - - - - HKCU\Software\Microsoft\Office\16.0\PowerPoint\Options\* [*] - HKCU\Software\Microsoft\Office\16.0\PowerPoint\Internet\* [*] - - - - - HKCU\Software\Microsoft\Office\16.0\PowerPoint\* [*] - %CSIDL_APPDATA%\Microsoft\PowerPoint\* [*] - - - - - %CSIDL_APPDATA%\Microsoft\PowerPoint\* [*] - - - - - - - - - - Microsoft Project 16 - - - Project - - - - - - - - - HKCU\Software\Microsoft\Office\16.0\MS Project\Options\* [*] - - - - - HKCU\Software\Microsoft\Office\16.0\MS Project\* [*] - %CSIDL_APPDATA%\Microsoft\MS Project\16\* [*] - - - - - %CSIDL_APPDATA%\Microsoft\MS Project\16\* [*] - - - - - - - - - - Microsoft Office Publisher 2016 - - - Publisher - - - - - - - - - HKCU\Software\Microsoft\Office\16.0\Publisher\Preferences\* [*] - - - - - HKCU\Software\Microsoft\Office\16.0\Publisher\* [*] - %CSIDL_APPDATA%\Microsoft\Publisher\* [*] - %CSIDL_APPDATA%\Microsoft\Publisher Building Blocks\* [*] - - - - - %CSIDL_APPDATA%\Microsoft\Publisher\* [*] - %CSIDL_APPDATA%\Microsoft\Publisher Building Blocks\* [*] - - - - - - - - - - Microsoft Office SmartTags - - - - - - - Microsoft Outlook Email Recipients SmartTags - - - - - - HKCU\Software\Microsoft\Office\Common\Smart Tag\Recognizers\{4FFB3E8B-AE75-48F2-BF13-D0D7E93FA8F9} [*] - - - - - HKCU\Software\Microsoft\Office\Common\Smart Tag\Recognizers\{4FFB3E8B-AE75-48F2-BF13-D0D7E93FA8F9}\* [*] - - - - - - - - Microsoft Lists SmartTags - - - - - - HKCU\Software\Microsoft\Office\Common\Smart Tag\Recognizers\{64AB6C69-B40E-40AF-9B7F-F5687B48E2B6}\* [*] - - - - - HKCU\Software\Microsoft\Office\Common\Smart Tag\Recognizers\{64AB6C69-B40E-40AF-9B7F-F5687B48E2B6}\* [*] - - - - - - - - Microsoft Place SmartTags - - - - - - HKCU\Software\Microsoft\Office\Common\Smart Tag\Recognizers\{87EF1CFE-51CA-4E6B-8C76-E576AA926888} [*] - - - - - HKCU\Software\Microsoft\Office\Common\Smart Tag\Recognizers\{87EF1CFE-51CA-4E6B-8C76-E576AA926888}\* [*] - - - - - - - - - - Microsoft Office Visio 16 - - - Visio - - - - - - - - - HKCU\software\Microsoft\Office\16.0\Visio\Application\* [*] - - - - - HKCU\software\Microsoft\Office\16.0\Visio\* [*] - %CSIDL_LOCAL_APPDATA%\Microsoft\Visio\* [*] - - - - - HKCU\Software\Microsoft\Office\16.0\Visio\Application [LicenseCache] - HKCU\Software\Microsoft\Office\16.0\Visio\Application [ConfigChangeID] - HKCU\Software\Microsoft\Office\16.0\Visio\Application [MyShapesPath] - HKCU\Software\Microsoft\Office\16.0\Visio\Application [DrawingsPath] - HKCU\Software\Microsoft\Office\16.0\Visio\Application [StartUpPath] - HKCU\Software\Microsoft\Office\16.0\Visio\Application [StencilPath] - HKCU\Software\Microsoft\Office\16.0\Visio\Application [TemplatePath] - HKCU\Software\Microsoft\Office\16.0\Visio\Quick Shapes\* [*] - HKCU\Software\Microsoft\Office\16.0\Visio\Security\* [*] - HKCU\Software\Microsoft\Office\16.0\Visio\Recent Templates\* [*] - - - - - %CSIDL_LOCAL_APPDATA%\Microsoft\Visio\* [*] - - - - - - - - - - Microsoft Office Lync 16 - - - Lync - - - - - - - - - HKCU\software\Microsoft\Office\16.0\Lync\Application\* [*] - - - - - HKCU\software\Microsoft\Office\16.0\Lync\* [*] - %CSIDL_LOCAL_APPDATA%\Microsoft\Lync\* [*] - - - - - - - - - - %CSIDL_LOCAL_APPDATA%\Microsoft\Lync\* [*] - - - - - - - - - - Microsoft Office Word 2016 (32-bit) - - - Word - - - 16.0 - - - - - - - - - HKCU\software\Microsoft\Office\16.0\Word\Data\* [*] - - - - - HKCU\Software\Microsoft\Office\16.0\Word\* [*] - HKCU\Software\Microsoft\Office\16.0\Common\Toolbars\Word\* [*] - HKCU\Software\Microsoft\Office\16.0\Common\Research\* [*] - HKCU\Software\Microsoft\Office\16.0\Common\General\[SharedDocumentParts] - HKCU\Software\Microsoft\Office\16.0\Common\General\[SharedTemplates] - HKCU\Software\Microsoft\Office\16.0\Common\General\[Templates] - HKCU\Software\Microsoft\Office\16.0\Common\General\[Themes] - HKCU\Software\Microsoft\Office\Common\Blog \* [*] - HKCU\Software\Microsoft\Office\16.0\Common\Spotlight\* [*] - %CSIDL_APPDATA%\Microsoft\Templates\* [*] - %CSIDL_APPDATA%\Microsoft\Proof\* [*] - %CSIDL_APPDATA%\Microsoft\UProof\* [*] - %CSIDL_APPDATA%\Microsoft\QuickStyles\* [*] - %CSIDL_APPDATA%\Microsoft\Document Building Blocks\* [*] - %CSIDL_APPDATA%\Microsoft\Bibliography\* [*] - %CSIDL_LOCAL_APPDATA%\Microsoft\Office\ [Word.qat] - %CSIDL_LOCAL_APPDATA%\Microsoft\Office\ [Word16.customUI] - %CSIDL_APPDATA%\Microsoft\Office\ [Word16.pip] - %CSIDL_APPDATA%\Microsoft\Office\ [WordMa16.pip] - - - - - %CSIDL_APPDATA%\Microsoft\Templates\* [*] - %CSIDL_APPDATA%\Microsoft\Proof\* [*] - %CSIDL_APPDATA%\Microsoft\UProof\* [*] - %CSIDL_APPDATA%\Microsoft\QuickStyles\* [*] - %CSIDL_LOCAL_APPDATA%\Microsoft\Office\ [Word.qat] - %CSIDL_LOCAL_APPDATA%\Microsoft\Office\ [Word16.customUI] - %CSIDL_APPDATA%\Microsoft\Office\ [Word16.pip] - %CSIDL_APPDATA%\Microsoft\Office\ [WordMa16.pip] - %CSIDL_APPDATA%\Microsoft\Office\ [WordMa16.pip] - %CSIDL_APPDATA%\Microsoft\Document Building Blocks\* [*] - - - - - HKCU\Software\Microsoft\Office\16.0\Word\Options\[PROGRAMDIR] - - HKCU\Software\Microsoft\Office\16.0\Word\Options\[LiveDrag] - HKCU\Software\Microsoft\Office\16.0\Word\Options\[LivePreview] - - HKCU\software\Microsoft\Office\16.0\Word\Data\* [*] - - - - - - - - - - - - Microsoft Office 17 - - - - - 17.0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Microsoft Office Access 17 - - - Access - - - - - - - - - HKCU\Software\Microsoft\Office\17.0\Access\Settings\* [*] - - - - - HKCU\Software\Microsoft\Office\17.0\Access\* [*] - %CSIDL_APPDATA%\Microsoft\Access\* [*] - - - - - %CSIDL_APPDATA%\Microsoft\Access\* [*] - - - - - - - %CSIDL_APPDATA%\Microsoft\Office [Access17.pip] - %CSIDL_APPDATA%\* [*.mdw] - HKCU\Software\Microsoft\Office\Access\* [*] - HKCU\Software\Microsoft\Office\17.0\Access\* [*] - HKCU\Software\Microsoft\Office\17.0\CMA\* [*] - HKCU\Software\Microsoft\Office\17.0\Common\Toolbars\Settings\ [Microsoft Access] - HKCU\Software\Microsoft\Office\17.0\Access\File MRU\* [*] - - - - - HKCU\Software\Microsoft\Office\17.0\Access\Settings [MRU1] - HKCU\Software\Microsoft\Office\17.0\Access\Settings [MRU2] - HKCU\Software\Microsoft\Office\17.0\Access\Settings [MRU3] - HKCU\Software\Microsoft\Office\17.0\Access\Settings [MRU4] - HKCU\Software\Microsoft\Office\17.0\Access\Settings [MRU5] - HKCU\Software\Microsoft\Office\17.0\Access\Settings [MRU6] - HKCU\Software\Microsoft\Office\17.0\Access\Settings [MRU7] - HKCU\Software\Microsoft\Office\17.0\Access\Settings [MRU8] - HKCU\Software\Microsoft\Office\17.0\Access\Settings [MRU9] - HKCU\Software\Microsoft\Office\17.0\Access\Settings [MRUFlags1] - HKCU\Software\Microsoft\Office\17.0\Access\Settings [MRUFlags2] - HKCU\Software\Microsoft\Office\17.0\Access\Settings [MRUFlags3] - HKCU\Software\Microsoft\Office\17.0\Access\Settings [MRUFlags4] - HKCU\Software\Microsoft\Office\17.0\Access\Settings [MRUFlags5] - HKCU\Software\Microsoft\Office\17.0\Access\Settings [MRUFlags6] - HKCU\Software\Microsoft\Office\17.0\Access\Settings [MRUFlags7] - HKCU\Software\Microsoft\Office\17.0\Access\Settings [MRUFlags8] - HKCU\Software\Microsoft\Office\17.0\Access\Settings [MRUFlags9] - - - - - HKCU\Software\Microsoft\Office\17.0\Access\Options [Default Database Directory] - - - - - - - - - - Microsoft Office Excel 17 - - - Excel - - - - - - - - - HKCU\Software\Microsoft\Office\17.0\Excel\Error Checking\* [*] - HKCU\Software\Microsoft\Office\17.0\Excel\Internet\* [*] - HKCU\Software\Microsoft\Office\17.0\Excel\Options\* [*] - - - - - HKCU\Software\Microsoft\Office\17.0\Excel\* [*] - HKCU\Software\Microsoft\Office\Excel\* [*] - - - - - - - - - - Microsoft Office OneNote 17 - - - - - - OneNote - - - - - - - - - %OneNoteCachePath%\OneNoteOfflineCache_Files\* [*] - %OneNoteCachePath% [OneNoteOfflineCache.onecache] - - - - - HKCU\Software\Microsoft\Office\17.0\OneNote\* [*] - %CSIDL_APPDATA%\Microsoft\OneNote\17.0\* [*] - %CSIDL_LOCAL_APPDATA%\Microsoft\Office [OneNote.officeUI] - - - - - HKCU\Software\Microsoft\Office\17.0\OneNote\Options\Other [EnableAudioSearch] - - - - - %CSIDL_APPDATA%\Microsoft\OneNote\17.0\* [*] - %CSIDL_LOCAL_APPDATA%\Microsoft\Office [OneNote.officeUI] - - - - - - - - - - Microsoft Office InfoPath 17 - - - OneNote - - - - - - - - - HKCU\Software\Microsoft\Office\17.0\InfoPath\* [*] - - - - - HKCU\Software\Microsoft\Office\17.0\InfoPath\* [*] - - - - - - - - - - Microsoft SharePoint Designer 17 - - - SharePointDesigner - - - - - - - - - HKCU\Software\Microsoft\Office\17.0\SharePoint Designer\* [*] - - - - - HKCU\Software\Microsoft\Office\17.0\SharePoint Designer\* [*] - - - - - - - - - - Microsoft Office Outlook 2017 - - - Outlook - - - HKCU\Software\Microsoft\Office\17.0\Outlook\Profiles\ - - - - - - - - - - HKCU\Software\Microsoft\Office\Outlook\* [*] - HKCU\Software\Microsoft\Office\17.0\Outlook\* [*] - HKCU\Software\Microsoft\Exchange\* [*] - HKCU\Software\Microsoft\Office\17.0\Outlook\Profiles\* [*] - %CSIDL_APPDATA%\Microsoft\Office [*.officeUI] - %CSIDL_LOCAL_APPDATA%\Microsoft\Office [*.officeUI] - %CSIDL_APPDATA%\Microsoft\Templates\* [*] - %CSIDL_APPDATA%\Microsoft\Stationery\* [*] - %CSIDL_APPDATA%\Microsoft\Outlook\* [*] - %CSIDL_APPDATA%\Microsoft\Signatures\* [*] - %CSIDL_LOCAL_APPDATA%\Microsoft\FORMS [frmcache.dat] - %CSIDL_LOCAL_APPDATA%\Microsoft\Outlook\* [*] - - - - HKCU\Software\Microsoft\Office\17.0\Outlook\Search\* [*] - - - - - - HKCU\Software\Microsoft\Office\17.0\Outlook\Journal\* [*] - - - - - - HKCU\Software\Microsoft\Office\17.0\Outlook\Profiles\* [001e023d] - HKCU\Software\Microsoft\Office\17.0\Outlook\Profiles\* [001f023d] - - - - - - - - %CSIDL_LOCAL_APPDATA%\Microsoft\Outlook\* [*.ost] - - - - - %CSIDL_APPDATA%\Microsoft\Outlook\* [*.srs] - %CSIDL_APPDATA%\Microsoft\Outlook\* [*.xml] - %CSIDL_APPDATA%\Microsoft\Outlook\* [*.dat] - %CSIDL_LOCAL_APPDATA%\Microsoft\FORMS [frmcache.dat] - - - - - %CSIDL_APPDATA%\Microsoft\Outlook [*.rwz] - - - - - - - - - - Microsoft Office PowerPoint 17 - - - PowerPoint - - - - - - - - - HKCU\Software\Microsoft\Office\17.0\PowerPoint\Options\* [*] - HKCU\Software\Microsoft\Office\17.0\PowerPoint\Internet\* [*] - - - - - HKCU\Software\Microsoft\Office\17.0\PowerPoint\* [*] - %CSIDL_APPDATA%\Microsoft\PowerPoint\* [*] - - - - - %CSIDL_APPDATA%\Microsoft\PowerPoint\* [*] - - - - - - - - - - Microsoft Project 17 - - - Project - - - - - - - - - HKCU\Software\Microsoft\Office\17.0\MS Project\Options\* [*] - - - - - HKCU\Software\Microsoft\Office\17.0\MS Project\* [*] - %CSIDL_APPDATA%\Microsoft\MS Project\17\* [*] - - - - - %CSIDL_APPDATA%\Microsoft\MS Project\17\* [*] - - - - - - - - - - Microsoft Office Publisher 2017 - - - Publisher - - - - - - - - - HKCU\Software\Microsoft\Office\17.0\Publisher\Preferences\* [*] - - - - - HKCU\Software\Microsoft\Office\17.0\Publisher\* [*] - %CSIDL_APPDATA%\Microsoft\Publisher\* [*] - %CSIDL_APPDATA%\Microsoft\Publisher Building Blocks\* [*] - - - - - %CSIDL_APPDATA%\Microsoft\Publisher\* [*] - %CSIDL_APPDATA%\Microsoft\Publisher Building Blocks\* [*] - - - - - - - - - - Microsoft Office SmartTags - - - - - - - Microsoft Outlook Email Recipients SmartTags - - - - - - HKCU\Software\Microsoft\Office\Common\Smart Tag\Recognizers\{4FFB3E8B-AE75-48F2-BF13-D0D7E93FA8F9} [*] - - - - - HKCU\Software\Microsoft\Office\Common\Smart Tag\Recognizers\{4FFB3E8B-AE75-48F2-BF13-D0D7E93FA8F9}\* [*] - - - - - - - - Microsoft Lists SmartTags - - - - - - HKCU\Software\Microsoft\Office\Common\Smart Tag\Recognizers\{64AB6C69-B40E-40AF-9B7F-F5687B48E2B6}\* [*] - - - - - HKCU\Software\Microsoft\Office\Common\Smart Tag\Recognizers\{64AB6C69-B40E-40AF-9B7F-F5687B48E2B6}\* [*] - - - - - - - - Microsoft Place SmartTags - - - - - - HKCU\Software\Microsoft\Office\Common\Smart Tag\Recognizers\{87EF1CFE-51CA-4E6B-8C76-E576AA926888} [*] - - - - - HKCU\Software\Microsoft\Office\Common\Smart Tag\Recognizers\{87EF1CFE-51CA-4E6B-8C76-E576AA926888}\* [*] - - - - - - - - - - Microsoft Office Visio 17 - - - Visio - - - - - - - - - HKCU\software\Microsoft\Office\17.0\Visio\Application\* [*] - - - - - HKCU\software\Microsoft\Office\17.0\Visio\* [*] - %CSIDL_LOCAL_APPDATA%\Microsoft\Visio\* [*] - - - - - HKCU\Software\Microsoft\Office\17.0\Visio\Application [LicenseCache] - HKCU\Software\Microsoft\Office\17.0\Visio\Application [ConfigChangeID] - HKCU\Software\Microsoft\Office\17.0\Visio\Application [MyShapesPath] - HKCU\Software\Microsoft\Office\17.0\Visio\Application [DrawingsPath] - HKCU\Software\Microsoft\Office\17.0\Visio\Application [StartUpPath] - HKCU\Software\Microsoft\Office\17.0\Visio\Application [StencilPath] - HKCU\Software\Microsoft\Office\17.0\Visio\Application [TemplatePath] - HKCU\Software\Microsoft\Office\17.0\Visio\Quick Shapes\* [*] - HKCU\Software\Microsoft\Office\17.0\Visio\Security\* [*] - HKCU\Software\Microsoft\Office\17.0\Visio\Recent Templates\* [*] - - - - - %CSIDL_LOCAL_APPDATA%\Microsoft\Visio\* [*] - - - - - - - - - - Microsoft Office Lync 17 - - - Lync - - - - - - - - - HKCU\software\Microsoft\Office\17.0\Lync\Application\* [*] - - - - - HKCU\software\Microsoft\Office\17.0\Lync\* [*] - %CSIDL_LOCAL_APPDATA%\Microsoft\Lync\* [*] - - - - - - - - - - %CSIDL_LOCAL_APPDATA%\Microsoft\Lync\* [*] - - - - - - - - - - Microsoft Office Word 2017 (32-bit) - - - Word - - - 17.0 - - - - - - - - - HKCU\software\Microsoft\Office\17.0\Word\Data\* [*] - - - - - HKCU\Software\Microsoft\Office\17.0\Word\* [*] - HKCU\Software\Microsoft\Office\17.0\Common\Toolbars\Word\* [*] - HKCU\Software\Microsoft\Office\17.0\Common\Research\* [*] - HKCU\Software\Microsoft\Office\17.0\Common\General\[SharedDocumentParts] - HKCU\Software\Microsoft\Office\17.0\Common\General\[SharedTemplates] - HKCU\Software\Microsoft\Office\17.0\Common\General\[Templates] - HKCU\Software\Microsoft\Office\17.0\Common\General\[Themes] - HKCU\Software\Microsoft\Office\Common\Blog \* [*] - HKCU\Software\Microsoft\Office\17.0\Common\Spotlight\* [*] - %CSIDL_APPDATA%\Microsoft\Templates\* [*] - %CSIDL_APPDATA%\Microsoft\Proof\* [*] - %CSIDL_APPDATA%\Microsoft\UProof\* [*] - %CSIDL_APPDATA%\Microsoft\QuickStyles\* [*] - %CSIDL_APPDATA%\Microsoft\Document Building Blocks\* [*] - %CSIDL_APPDATA%\Microsoft\Bibliography\* [*] - %CSIDL_LOCAL_APPDATA%\Microsoft\Office\ [Word.qat] - %CSIDL_LOCAL_APPDATA%\Microsoft\Office\ [Word17.customUI] - %CSIDL_APPDATA%\Microsoft\Office\ [Word17.pip] - %CSIDL_APPDATA%\Microsoft\Office\ [WordMa17.pip] - - - - - %CSIDL_APPDATA%\Microsoft\Templates\* [*] - %CSIDL_APPDATA%\Microsoft\Proof\* [*] - %CSIDL_APPDATA%\Microsoft\UProof\* [*] - %CSIDL_APPDATA%\Microsoft\QuickStyles\* [*] - %CSIDL_LOCAL_APPDATA%\Microsoft\Office\ [Word.qat] - %CSIDL_LOCAL_APPDATA%\Microsoft\Office\ [Word17.customUI] - %CSIDL_APPDATA%\Microsoft\Office\ [Word17.pip] - %CSIDL_APPDATA%\Microsoft\Office\ [WordMa17.pip] - %CSIDL_APPDATA%\Microsoft\Office\ [WordMa17.pip] - %CSIDL_APPDATA%\Microsoft\Document Building Blocks\* [*] - - - - - HKCU\Software\Microsoft\Office\17.0\Word\Options\[PROGRAMDIR] - - HKCU\Software\Microsoft\Office\17.0\Word\Options\[LiveDrag] - HKCU\Software\Microsoft\Office\17.0\Word\Options\[LivePreview] - - HKCU\software\Microsoft\Office\17.0\Word\Data\* [*] - - - - - - - - - - -"@ -#endregion migapp xml - -#region miguser xml -$usmtmiguser = [xml] @" - - - - <_locDefinition> - <_locDefault _loc="locNone"/> - <_locTag _loc="locData">displayName - - - - - My Downloads - - %FOLDERID_DOWNLOADS% - - - - - MigXmlHelper.DoesObjectExist("File","%FOLDERID_DOWNLOADS%") - - - - - - %FOLDERID_DOWNLOADS%\* [*] - - - - - %FOLDERID_DOWNLOADS% [desktop.ini] - - - - - - - - - My Video - - %CSIDL_MYVIDEO% - - - - - MigXmlHelper.DoesObjectExist("File","%CSIDL_MYVIDEO%") - - - - - - %CSIDL_MYVIDEO%\* [*] - - - - - %CSIDL_MYVIDEO% [desktop.ini] - - - - - - - - - - My Music - - %CSIDL_MYMUSIC% - - - - - MigXmlHelper.DoesObjectExist("File","%CSIDL_MYMUSIC%") - - - - - - %CSIDL_MYMUSIC%\* [*] - - - - - %CSIDL_MYMUSIC%\ [desktop.ini] - - - - - - - - - Desktop - - %CSIDL_DESKTOP% - - - - - MigXmlHelper.DoesObjectExist("File","%CSIDL_DESKTOP%") - - - - - - %CSIDL_DESKTOP%\* [*] - - - - - %CSIDL_DESKTOP% [desktop.ini] - %CSIDL_DESKTOP%\* [*] - - - - - - - - - Start Menu - - %CSIDL_STARTMENU% - - - - - MigXmlHelper.DoesObjectExist("File","%CSIDL_STARTMENU%") - - - - - - %CSIDL_STARTMENU%\* [*] - - - - - %CSIDL_STARTMENU% [desktop.ini] - %CSIDL_STARTMENU%\* [*] - - - - - - - - - My Documents - - %CSIDL_PERSONAL% - - - - - MigXmlHelper.DoesObjectExist("File","%CSIDL_PERSONAL%") - - - - - - %CSIDL_MYMUSIC%\* [*] - %CSIDL_MYPICTURES%\* [*] - %CSIDL_MYVIDEO%\* [*] - - - - - %CSIDL_PERSONAL%\* [*] - - - - - %CSIDL_PERSONAL% [desktop.ini] - - - - - - - - - My Pictures - - %CSIDL_MYPICTURES% - - - - - MigXmlHelper.DoesObjectExist("File","%CSIDL_MYPICTURES%") - - - - - - %CSIDL_MYPICTURES%\* [*] - - - - - %CSIDL_MYPICTURES% [desktop.ini] - - - - - - - - - Favorites - - %CSIDL_FAVORITES% - - - - - MigXmlHelper.DoesObjectExist("File","%CSIDL_FAVORITES%") - - - - - - %CSIDL_FAVORITES%\* [*] - - - - - %CSIDL_FAVORITES% [desktop.ini] - %CSIDL_FAVORITES%\* [*] - - - - - - - - - Quick Launch - - %CSIDL_APPDATA%\Microsoft\Internet Explorer\Quick Launch - - - - - - MigXmlHelper.DoesObjectExist("File","%CSIDL_APPDATA%\Microsoft\Internet Explorer\Quick Launch") - - - - - - %CSIDL_APPDATA%\Microsoft\Internet Explorer\Quick Launch\* [*] - - - - - %CSIDL_APPDATA%\Microsoft\Internet Explorer\Quick Launch [desktop.ini] - %CSIDL_APPDATA%\Microsoft\Internet Explorer\Quick Launch\* [*] - - - - - - - -"@ - -#endregion miguser xml \ No newline at end of file diff --git a/powershell/InvokePester.ps1 b/powershell/InvokePester.ps1 deleted file mode 100644 index 645f5f1b..00000000 --- a/powershell/InvokePester.ps1 +++ /dev/null @@ -1,24 +0,0 @@ -# Load functions -. ($PSScriptRoot + '/Functions.ps1') - -# Run Pester tests -$PesterResults = Invoke-Pester -Script:(@{ Path = $PSScriptRoot + '/Tests/'; }) -PassThru -$FailedTests = $PesterResults.TestResult | Where-Object {$_.Passed -eq $false} -If ($FailedTests) -{ - Write-Host ('') - Write-Host ('##############################################################################################################') - Write-Host ('##############################Error Description###############################################################') - Write-Host ('##############################################################################################################') - Write-Host ('') - $FailedTests | ForEach-Object {$_.Name + '; ' + $_.FailureMessage + '; '} - Write-Error -Message:('Tests Failed: ' + [string]($FailedTests | Measure-Object).Count) -} - -# Write-Output $error.Count -# if ($error.count -gt 0){ -# Write-Output $error -# exit 1 -# } else { -# exit 0 -# } \ No newline at end of file diff --git a/powershell/Migration.ps1 b/powershell/Migration.ps1 deleted file mode 100644 index 0be40d38..00000000 Binary files a/powershell/Migration.ps1 and /dev/null differ diff --git a/powershell/Start-JCADMU.ps1 b/powershell/Start-JCADMU.ps1 deleted file mode 100644 index 545300e7..00000000 --- a/powershell/Start-JCADMU.ps1 +++ /dev/null @@ -1,13 +0,0 @@ -# Get script path -$scriptPath = (Split-Path -Path:($MyInvocation.MyCommand.Path)) -# Load form -$formResults = Invoke-Expression -Command:('& "' + $scriptPath + '\Form.ps1"') -# Send form results to process -If (-not [System.String]::IsNullOrEmpty($formResults)) -{ - & ($scriptPath + '\Migration.ps1') -inputObject:($formResults) -} -Else -{ - Write-Host ('Exiting ADMU process') -} diff --git a/powershell/Tests/Form.Tests.ps1 b/powershell/Tests/Form.Tests.ps1 deleted file mode 100644 index e69de29b..00000000 diff --git a/powershell/Tests/Functions.Tests.ps1 b/powershell/Tests/Functions.Tests.ps1 deleted file mode 100644 index 5546b7c1..00000000 --- a/powershell/Tests/Functions.Tests.ps1 +++ /dev/null @@ -1,263 +0,0 @@ -Describe 'Functions' { - - Context 'VerifyAccount Function'{ - - It 'VerifyAccount - Real domain account bob.lazar@JCADB2.local' { - VerifyAccount -username bob.lazar -domain JCADB2.local | Should Be $true - } - - It 'VerifyAccount - Wrong account bobby.lazar@JCADB2.local' { - #VerifyAccount -username bobby.lazar -domain JCADB2.local | Should Be $false - } - - It 'VerifyAccount - Real account with wrong domain bob.lazar@JCADB2.localw' { - #VerifyAccount -username bob.lazar -domain JCADB2.localw | Should Be $false - } - - } - - Context 'Write-Log Function'{ - - It 'Write-Log - ' { - if ((Test-Path 'C:\Windows\Temp\jcAdmu.log') -eq $true){ - remove-item -Path 'C:\windows\Temp\jcAdmu.log' -Force - } - Write-Log -Message:('Log is created - test.') -Level:('Info') - $log='C:\windows\Temp\jcAdmu.log' - $log | Should exist - } - - It 'Write-Log - Log is created' { - if ((Test-Path 'C:\Windows\Temp\jcAdmu.log') -eq $true){ - remove-item -Path 'C:\windows\Temp\jcAdmu.log' -Force - } - Write-Log -Message:('Log is created - test.') -Level:('Info') - $log='C:\windows\Temp\jcAdmu.log' - - $log | Should exist - } - - It 'Write-Log - ERROR: Log entry exists' { - if ((Test-Path 'C:\Windows\Temp\jcAdmu.log') -eq $true){ - remove-item -Path 'C:\windows\Temp\jcAdmu.log' -Force - } - # Write-Log -Message:('Test Error Log Entry.') -Level:('Error') -ErrorAction - #$Log = Get-Content 'c:\windows\temp\jcAdmu.log' - #$Log.Contains('ERROR: Test Error Log Entry.') | Should Be $true - # if ($error.Count -eq 1) { - # $error.Clear() - # } - } - - It 'Write-Log - WARNING: Log entry exists' { - if ((Test-Path 'C:\Windows\Temp\jcAdmu.log') -eq $true){ - remove-item -Path 'C:\windows\Temp\jcAdmu.log' -Force - } - Write-Log -Message:('Test Warning Log Entry.') -Level:('Warn') - $Log = Get-Content 'c:\windows\temp\jcAdmu.log' - $Log.Contains('WARNING: Test Warning Log Entry.') | Should Be $true - } - - It 'Write-Log - INFO: Log entry exists' { - if ((Test-Path 'C:\Windows\Temp\jcAdmu.log') -eq $true){ - remove-item -Path 'C:\windows\Temp\jcAdmu.log' -Force - } - Write-Log -Message:('Test Info Log Entry.') -Level:('Info') - $Log = Get-Content 'c:\windows\temp\jcAdmu.log' - $Log.Contains('INFO: Test Info Log Entry.') | Should Be $true - remove-item -Path 'C:\windows\Temp\jcAdmu.log' -Force - } - - } - - Context 'Remove-ItemIfExists Function'{ - - It 'Remove-ItemIfExists - Does Exist c:\windows\temp\test\' { - if(Test-Path 'c:\windows\Temp\test\') {Remove-Item 'c:\windows\Temp\test' -Recurse -Force} - New-Item -ItemType directory -path 'c:\windows\Temp\test\' - New-Item 'c:\windows\Temp\test\test.txt' - Remove-ItemIfExists -Path 'c:\windows\Temp\test\' -Recurse - Test-Path 'c:\windows\Temp\test\' | Should Be $false - } - - It 'Remove-ItemIfExists - Fails c:\windows\temp\test\' { - if ((Test-Path 'C:\Windows\Temp\jcAdmu.log') -eq $true){remove-item -Path 'C:\windows\Temp\jcAdmu.log' -Force} - Mock Remove-ItemIfExists {Write-Log -Message ('Removal Of Temp Files & Folders Failed') -Level Warn} - Remove-ItemIfExists -Path 'c:\windows\Temp\test\' - $Log = Get-Content 'c:\windows\temp\jcAdmu.log' - $Log.Contains('Removal Of Temp Files & Folders Failed') | Should Be $true - } - - } - - Context 'DownloadLink'{ - - # It 'DownloadLink - ' { - # if(Test-Path 'c:\windows\Temp\test\') {Remove-Item 'c:\windows\Temp\test' -Recurse -Force} - # New-Item -ItemType directory -path 'c:\windows\Temp\test\' - # #DownloadLink -Link:('http://download.microsoft.com/download/0/5/6/056dcda9-d667-4e27-8001-8a0c6971d6b1/vcredist_x86.exe') -Path:('c:\windows\Temp\Test\vcredist_x86.exe') - # test-path ('c:\windows\Temp\test\vcredist_x86.exe') | Should be $true - # } - - } - - Context 'Add-LocalUser Function'{ - - It 'Add-LocalUser - testuser to Users ' { - net user testuser /delete | Out-Null - net user testuser Temp123! /add - Remove-LocalGroupMember -Group "Users" -Member "testuser" - $WmiComputerSystem = Get-WmiObject -Class:('Win32_ComputerSystem') - $localComputerName = $WmiComputerSystem.Name - Add-LocalUser -computer:($localComputerName) -group:('Users') -localusername:('testuser') - (Get-LocalGroupMember -Group 'Users' -Member 'testuser') -ne $null | Should Be $true - } - - } - - Context 'Uninstall_Program'{ - - It 'Install & Uninstall - x32 filezilla' { - $app = 'C:\Windows\Temp\FileZilla_3.46.0_win32.exe' - $arg = '/S' - Start-Process $app $arg - start-sleep -Seconds 5 - Uninstall_Program -programName 'FileZilla Client 3.46.0' - start-sleep -Seconds 5 - Check_Program_Installed -programName 'FileZilla' | Should Be $false - } - - } - - Context 'Check_Program_Installed Function'{ - - It 'Check_Program_Installed x64 - Google Chrome' { - Check_Program_Installed -programName 'Google Chrome' | Should Be $true - } - - It 'Check_Program_Installed x32 - TeamViewer 14' { - Check_Program_Installed -programName 'TeamViewer 14' | Should Be $true - } - - It 'Check_Program_Installed - Program Name Does Not Exist' { - Check_Program_Installed -programName 'Google Chrome1' | Should Be $false - } - - } - - Context 'Start-NewProcess Function'{ - - It 'Start-NewProcess - Notepad' { - Start-NewProcess -pfile:('c:\windows\system32\notepad.exe') -Timeout 1000 - (Get-Process -Name 'notepad') -ne $null | Should Be $true - Stop-Process -Name "notepad" - } - - It 'Start-NewProcess & end after 2s timeout - Notepad ' { - if ((Test-Path 'C:\Windows\Temp\jcAdmu.log') -eq $true){ - remove-item -Path 'C:\windows\Temp\jcAdmu.log' -Force - } - Start-NewProcess -pfile:('c:\windows\system32\notepad.exe') -Timeout 1000 - Start-Sleep -s 2 - Stop-Process -Name "notepad" - $Log = Get-Content 'c:\windows\temp\jcAdmu.log' - $Log.Contains('Windows ADK Setup did not complete after 5mins') | Should Be $true - remove-item -Path 'C:\windows\Temp\jcAdmu.log' -Force - } - - } - - Context 'Test-IsNotEmpty Function'{ - - It 'Test-IsNotEmpty - $null' { - Test-IsNotEmpty -field $null | Should Be $true - } - - It 'Test-IsNotEmpty - empty' { - Test-IsNotEmpty -field '' | Should Be $true - } - - It 'Test-IsNotEmpty - test string' { - Test-IsNotEmpty -field 'test' | Should Be $false - } - - } - - Context 'Test-Is40chars Function'{ - - It 'Test-Is40chars - $null' { - Test-Is40chars -field $null | Should Be $false - } - - It 'Test-Is40chars - 39 Chars' { - Test-Is40chars -field '111111111111111111111111111111111111111' | Should Be $false - } - - It 'Test-Is40chars - 40 Chars' { - Test-Is40chars -field '1111111111111111111111111111111111111111' | Should Be $true - } - - } - - Context 'Test-HasNoSpaces Function'{ - - It 'Test-HasNoSpaces - $null' { - Test-HasNoSpaces -field $null | Should Be $true - } - - It 'Test-HasNoSpaces - no spaces' { - Test-HasNoSpaces -field 'testwithnospaces' | Should Be $true - } - - It 'Test-HasNoSpaces - spaces' { - Test-HasNoSpaces -field 'test with spaces' | Should Be $false - } - - } - - Context 'DownloadAndInstallAgent Function'{ - - It 'DownloadAndInstallAgent - Verify Download JCAgent prereq Visual C++ 2013 x64' { - Test-path 'C:\Windows\Temp\JCADMU\vc_redist.x64.exe' | Should Be $true - } - - It 'DownloadAndInstallAgent - Verify Download JCAgent prereq Visual C++ 2013 x86' { - Test-path 'C:\Windows\Temp\JCADMU\vc_redist.x86.exe' | Should Be $true - } - - It 'DownloadAndInstallAgent - Verify Download JCAgent' { - Test-path 'C:\Windows\Temp\JCADMU\JumpCloudInstaller.exe' | Should Be $true - } - - It 'DownloadAndInstallAgent - Verify Install JCAgent prereq Visual C++ 2013 x64' { - (Check_Program_Installed("Microsoft Visual C\+\+ 2013 x64")) | Should Be $true - } - - It 'DownloadAndInstallAgent - Verify Install JCAgent prereq Visual C++ 2013 x86' { - (Check_Program_Installed("Microsoft Visual C\+\+ 2013 x86")) | Should Be $true - } - - It 'DownloadAndInstallAgent - Verify Install JCAgent' { - Start-Sleep -Seconds 10 - (Check_Program_Installed("JumpCloud")) | Should Be $true - } - - } - - Context 'GetNetBiosName Function'{ - - It 'GetNetBiosName - JCADB2' { - GetNetBiosName | Should Be 'JCADB2' - } - - } - - Context 'ConvertSID Function'{ - - It 'ConvertSID - Built In Administrator SID' { - ConvertSID -Sid 'S-1-5-21-1382148263-173757150-4289105529-500' | Should Be '10PRO18091\Administrator' - } - - } -} - diff --git a/powershell/Tests/Migration.Tests.ps1 b/powershell/Tests/Migration.Tests.ps1 deleted file mode 100644 index e69de29b..00000000 diff --git a/powershell/Tests/Start-JCADMU.Tests.ps1 b/powershell/Tests/Start-JCADMU.Tests.ps1 deleted file mode 100644 index e69de29b..00000000 diff --git a/powershell/Tests/TestSetup.ps1 b/powershell/Tests/TestSetup.ps1 deleted file mode 100644 index abaf98cb..00000000 --- a/powershell/Tests/TestSetup.ps1 +++ /dev/null @@ -1,43 +0,0 @@ -Param( -[Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true, Position = 0)][ValidateNotNullOrEmpty()][System.String]$TestOrgConnectKey -) - -# Load functions -. 'C:\agent\_work\1\s\ADMU\powershell\Functions.ps1' -#USMT & VC Variables -$jcAdmuTempPath = 'C:\Windows\Temp\JCADMU\' -$msvc2013x64File = 'vc_redist.x64.exe' -$msvc2013x86File = 'vc_redist.x86.exe' -$msvc2013x86Link = 'http://download.microsoft.com/download/0/5/6/056dcda9-d667-4e27-8001-8a0c6971d6b1/vcredist_x86.exe' -$msvc2013x64Link = 'http://download.microsoft.com/download/0/5/6/056dcda9-d667-4e27-8001-8a0c6971d6b1/vcredist_x64.exe' -$msvc2013x86Install = "$jcAdmuTempPath$msvc2013x86File /install /quiet /norestart" -$msvc2013x64Install = "$jcAdmuTempPath$msvc2013x64File /install /quiet /norestart" -# JumpCloud Agent Installation Variables -$AGENT_PATH = "${env:ProgramFiles}\JumpCloud" -$AGENT_CONF_FILE = "\Plugins\Contrib\jcagent.conf" -$AGENT_BINARY_NAME = "JumpCloud-agent.exe" -$AGENT_SERVICE_NAME = "JumpCloud-agent" -$AGENT_INSTALLER_URL = "https://s3.amazonaws.com/jumpcloud-windows-agent/production/JumpCloudInstaller.exe" -$AGENT_INSTALLER_PATH = "C:\windows\Temp\JCADMU\JumpCloudInstaller.exe" -$AGENT_UNINSTALLER_NAME = "unins000.exe" -$EVENT_LOGGER_KEY_NAME = "hklm:\SYSTEM\CurrentControlSet\services\eventlog\Application\JumpCloud-agent" -$INSTALLER_BINARY_NAMES = "JumpCloudInstaller.exe,JumpCloudInstaller.tmp" -$JumpCloudConnectKey = $TestOrgConnectKey - -#Prechecks -#Clear Temp\JCADMU folder -if ((Test-Path 'C:\Windows\Temp\JCADMU') -eq $true){ - remove-item -Path 'C:\windows\Temp\JCADMU' -Force -Recurse -} -#Recreate JCADMU folder -New-Item -ItemType Directory -Path 'C:\windows\Temp\JCADMU' -Force -#Is agent installed? If so uninstall it -if (Check_Program_Installed('Jumpcloud')){ -& cmd /C "C:\Program Files\JumpCloud\unins000.exe" /Silent -} -#Is vcredistx86 & vcredistx64 installed? If so uninstall it -if(Check_Program_Installed('Microsoft Visual C\+\+ 2013 x64') -or (Check_Program_Installed('Microsoft Visual C\+\+ 2013 x86'))){ - Uninstall_Program -programName 'Microsoft Visual C' -} -#install jcagent and prereq - DownloadAndInstallAgent -msvc2013x64link:($msvc2013x64Link) -msvc2013path:($jcAdmuTempPath) -msvc2013x64file:($msvc2013x64File) -msvc2013x64install:($msvc2013x64Install) -msvc2013x86link:($msvc2013x86Link) -msvc2013x86file:($msvc2013x86File) -msvc2013x86install:($msvc2013x86Install) \ No newline at end of file