-
Notifications
You must be signed in to change notification settings - Fork 72
/
Copy pathExpand-UsmtMig.ps1
58 lines (48 loc) · 1.77 KB
/
Expand-UsmtMig.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
[CmdletBinding()]
param(
[Parameter(Mandatory = $false)]
[ValidateScript( {
if ((Get-Item $_).Extension -ne '.MIG') {
throw "[$_] is not a USMT migration file (mig)."
}
else { $true }
})]
[string]$MigPath
)
$CurrentID = [System.Security.Principal.WindowsIdentity]::GetCurrent()
$WindowsPrincipal = New-Object System.Security.Principal.WindowsPrincipal($CurrentID)
$AdminRole = [System.Security.Principal.WindowsBuiltInRole]::Administrator
if (-not $WindowsPrincipal.IsInRole($AdminRole)) {
$NewProcess = New-Object System.Diagnostics.ProcessStartInfo 'PowerShell'
$NewProcess.Arguments = $MyInvocation.MyCommand.Definition
$NewProcess.Verb = 'RunAs'
[System.Diagnostics.Process]::Start($NewProcess)
exit
}
# Get USMT binary path according to OS architecture
$arch = (Get-WmiObject Win32_OperatingSystem).OSArchitecture
if ($arch -match '64') {
$usmtPath = "$PSScriptRoot\USMT\amd64"
} elseif ($arch -match '86') {
$usmtPath = "$PSScriptRoot\USMT\x86"
}
else {
$usmtPath = "$PSScriptRoot\USMT\arm64"
}
if ([string]::IsNullOrEmpty($MigPath)) {
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null
$OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog
$OpenFileDialog.Title = "Select a USMT migration file to expand"
$OpenFileDialog.Filter = "MIG (*.MIG)| *.MIG"
$OpenFileDialog.ShowHelp = $true
$OpenFileDialog.ShowDialog() | Out-Null
$MigPath = Get-Item $OpenFileDialog.FileName
}
$destination = Split-Path $MigPath -Parent
try {
Start-Process -FilePath "$usmtPath\usmtutils.exe" -ArgumentList "/extract `"$MigPath`" `"$destination`"" -Wait -NoNewWindow
}
catch {
Write-Host $_.Exception.Message -ForegroundColor Red
}
pause