Jump to content

Recommended Posts

Posted

Hi,

Just wondering if anyone has any recommendations for software (if free, even better) that would take an image of an entire system.

There are a small number of computers in the school it would be really handy to be able to take an entire image of such that if the SSD failed, we could just restore the image back onto a same sized replacement SSD.

 

The main example would be a unique system like the site manager's computer which is not domain joned, is independent but has lots of not very common software such as various CCTV packages to access various NVRs, fire panel control software, access control software etc.

 

It has been years since I have had the need to clone a system as we just use SCCM/WDS of Autopilot these days but for these one off systems, I think it would still be handy to take an entire backup copy now and then as the time involved in starting fresh and obtaining, installing and configuring some of this software would be quite time consuming.

 

Any suggestions would be greatly appreciated:)

Posted

If you're just talking a re-image with new HDD/SSD, the basic windows image backup should work fine.

 

If you're talking migrating to new hardware etc etc I'd use something like an Acronis clone

 

Steve

  • Thanks 1
Posted (edited)

i've used clonezilla in the past to clone images, fairly simple, but not as simple as some software about which has a proper GUI

 

edit : I imaged a load of the DfE laptops using Clonezilla, as majority we received didnt support PXE boot (grrrr!!!), or didn't like the USB to ethernet adapters we had

Edited by Olliedawg
Posted
Used to use Disk2VHD back in day, still use it time to time when moving physical to virtual and does the job. But this is a 1 run jobbie not a scheduled one.
Posted
Just wondering if anyone has any recommendations for software (if free, even better) that would take an image of an entire system.

 

Veeam "Community Edition" (free version) should do for up to 10 backup targets - I've not actually used it to backup individual PCs, but I assume it works as well for that as it does for virtual machines.

 

If it's any help, for specialised software like fire panel software, etc, we tend to install that to a remote desktop machine and have the appropriate user log in to that.

Posted
Clonezilla we used to back in the day have it setup on a 1TB portable hdd as a boot device with a large ext4 partition to store the images on. As others have said not the simplest to use but does work really great once you get your head around the interface
Posted
We use Veeam Community Edition to back up our technician workstations and a physical DC. We also use the paid version of Veeam B&R for our VMs, though they are managed on two different servers and the backup files are on the same repository.
Posted (edited)

We've created a couple of task sequences in SCCM which can backup and restore devices using DISM with the /ffu option to use full disk images.

 

The backup TS starts from within Windows and suspends bitlocker, reboots into PXE then runs the following Powershell script (slightly edited) which pops up a windows form to ask where and what to call the backup file, abd then runs the backup command:

 

function button
{
   ###################Load Assembly for creating form & button######
   [void][system.Reflection.Assembly]::LoadWithPartialName(“System.Windows.Forms”)
   [void][system.Reflection.Assembly]::LoadWithPartialName(“Microsoft.VisualBasic”)
   
   #####Define the form size & placement
   $form = New-Object “System.Windows.Forms.Form”;
   $form.Width = 650;
   $form.Height = 250;
   $form.Text = $title;
   $form.StartPosition = [system.Windows.Forms.FormStartPosition]::CenterScreen;
   
   ##############Define text label1
   $textLabel1 = New-Object “System.Windows.Forms.Label”;
   $textLabel1.Left = 25;
   $textLabel1.Top = 15;
   $textLabel1.Width = 175;
   $textLabel1.Height = 50;
   $textLabel1.Text = "Please enter the desired filename for the backup";

   ##############Define text label2
   $textLabel2 = New-Object “System.Windows.Forms.Label”;
   $textLabel2.Left = 25;
   $textLabel2.Top = 70;
   $textLabel2.Width = 175;
   $textLabel2.Height = 15;
   $textLabel2.Text = "Please enter the desired location for the backup";

   ##############Define text label3
   $textLabel3 = New-Object “System.Windows.Forms.Label”;
   $textLabel3.Left = 25;
   $textLabel3.Top = 100;
   $textLabel3.Width = 600;
   $textLabel3.Height = 25;
   $textLabel3.Text = "Examples - \\\MasterImages - \\\Builds\PCBackups";
   
   ##############Define text label5
   $textLabel5 = New-Object “System.Windows.Forms.Label”;
   $textLabel5.Left = 50;
   $textLabel5.Top = 160;
   $textLabel5.Width = 350;
   $textlabel5.Height = 50;
   $textLabel5.Text = “If you are not expecting to see this screen, please contact the IT Service Desk on x22222”;
   
   ############Define text box1 for input
   $textBox1 = New-Object “System.Windows.Forms.TextBox”;
   $textBox1.Left = 225;
   $textBox1.Top = 15;
   $textBox1.width = 200;

   ############Define text box2 for input
   $textBox2 = New-Object “System.Windows.Forms.TextBox”;
   $textBox2.Left = 225;
   $textBox2.Top = 70;
   $textBox2.width = 200;

   #############Define default values for the input boxes
   $textBox1.Text = "";
   $textBox2.Text = "\\\MasterImages";
   
   #############define OK button
   $button = New-Object “System.Windows.Forms.Button”;
   $button.Left = 425;
   $button.Top = 120;
   $button.Width = 75;
   $button.Text = “OK”;
   
   ############# This is when you have to close the form after getting values
   $eventHandler = [system.EventHandler]{
   $global:filename = $TextBox1.Text
   $TextBox1.Text
   $global:location = $TextBox2.Text
   $TextBox2.Text
   $form.Close();
   };
   
   $button.Add_Click($eventHandler);
   
   #############Add controls to all the above objects defined
   $form.Controls.Add($button);
   $form.Controls.Add($textLabel1);
   $form.Controls.Add($textLabel2);
   $form.Controls.Add($textLabel3);
   $form.Controls.Add($textLabel5);
   $form.Controls.Add($textBox1);
   $form.Controls.Add($textBox2);
   $ret = $form.ShowDialog();
   
   #################return values
   
   return $TextBox1.Text, $TextBox2.Text

}

[system.Reflection.Assembly]::LoadWithPartialName(“System.Windows.Forms”)

#Hide the progress dialog
$TSProgressUI = new-object -comobject Microsoft.SMS.TSProgressUI
$TSProgressUI.CloseProgressDialog()

# Pop up device backup name message
[system.Windows.Forms.MessageBox]::Show("Please enter the desired name and location of the backup file", "Device Backup TS")

$return = button

# Capture device backup name
$BackupName1 = $global:filename
$BackupName2 = $BackupName1 + "D"
$BackupLocation1 = $global:location

# Set actual TS variable
$tsenv = New-Object -COMObject Microsoft.SMS.TSEnvironment
$tsenv.value("BackupName") = $BackupName1
$tsenv.value("BackupLocation") = $BackupLocation1

$Server = ($BackupLocation1 -split '\\')[2]
$Share = ($BackupLocation1 -split '\\')[3]

$NetworkPath = "\\" + $Server + "\" + $Share

Write-Host "Server is $Server"
Write-Host "Share is $Share"
Write-Host "NetworkPath is $NetworkPath"

Write-Host "BackupName1 is $BackupName1"
Write-Host "BackupLocation1 is $BackupLocation1"

$tsenv.value("NetworkPath") = $NetworkPath

$TSName = $tsenv.value("_SMSTSPackageName")

# Create auditing variables
$hostname = hostname
$macaddress1 = (get-wmiobject -class "Win32_NetworkAdapterConfiguration" | Where{$_.IpEnabled -Match "True"} | Where{ $_.IPADDRESS -like "10.*.*.*" } | select MACAddress).macaddress
$system = get-wmiobject win32_computersystem
[string]$DT = date
$nic = Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE
$ipaddress = ($NIC.IPAddress[0])

net use \\  /u:

# Specify the path to the audit file, and the string to output to it
[string]$audit1 = "\\\PCbackups\pcbackups.log"
[string]$auditinfo1 = $macaddress1 + "," + $DT + "," + $ipaddress + "," + $hostname + "," + $system.manufacturer + "," + $system.model + ",JUST STARTED " + $TSName + " capturing FFU to " + $BackupName1 + ".wim" + ",on share" + $NetworkPath + " with full file path of " + $BackupLocation1

# Add audit string to the audit file
$auditinfo1 | Out-File $audit1 -Append -Encoding ASCII
Start-Sleep 2

net use \\ /d

net use $NetworkPath  /u:

Start-Sleep 5

Start-Process dism -ArgumentList "/capture-ffu /imagefile:$BackupLocation1\$BackupName1.wim /capturedrive:\\.\PhysicalDrive0 /name:$BackupName1" -Wait

Start-Sleep 10

net use $NetworkPath /d

net use \\  /u:

[string]$audit2 = "\\\PCbackups\pcbackups.log"
[string]$auditinfo2 = $macaddress1 + "," + $DT + "," + $ipaddress + "," + $hostname + "," + $system.manufacturer + "," + $system.model + ",JUST FINISHED " + $TSName + " capturing FFU to " + $BackupName1 + ".wim" + ",on share" + $NetworkPath + " with full file path of " + $BackupLocation1

$auditinfo2 | Out-File $audit2 -Append -Encoding ASCII
Start-Sleep 2

net use \\ /d

[system.Windows.Forms.MessageBox]::Show("Device has successfully been captured to $BackupLocation1", "Device Backup TS")

exit 0

 

The restore TS is only available in PXE and formats the disk and then runs the following powershell which pops up a windows form to ask where and what the backup file to restore is, and then runs the restore command:

 

function button
{
   
   ###################Load Assembly for creating form & button######
   [void][system.Reflection.Assembly]::LoadWithPartialName(“System.Windows.Forms”)
   [void][system.Reflection.Assembly]::LoadWithPartialName(“Microsoft.VisualBasic”)
   
   #####Define the form size & placement
   $form = New-Object “System.Windows.Forms.Form”;
   $form.Width = 650;
   $form.Height = 250;
   $form.Text = $title;
   $form.StartPosition = [system.Windows.Forms.FormStartPosition]::CenterScreen;
   
   ##############Define text label1
   $textLabel1 = New-Object “System.Windows.Forms.Label”;
   $textLabel1.Left = 25;
   $textLabel1.Top = 15;
   $textLabel1.Width = 175;
   $textLabel1.Height = 50;
   $textLabel1.Text = "Please enter the desired filename to restore";

   ##############Define text label2
   $textLabel2 = New-Object “System.Windows.Forms.Label”;
   $textLabel2.Left = 25;
   $textLabel2.Top = 70;
   $textLabel2.Width = 175;
   $textLabel2.Height = 15;
   $textLabel2.Text = "Please enter the desired location to restore from";

   ##############Define text label3
   $textLabel3 = New-Object “System.Windows.Forms.Label”;
   $textLabel3.Left = 25;
   $textLabel3.Top = 100;
   $textLabel3.Width = 600;
   $textLabel3.Height = 25;
   $textLabel3.Text = "Examples - \\\MasterImages - \\\Builds\PCBackups";

   
   ##############Define text label5
   $textLabel5 = New-Object “System.Windows.Forms.Label”;
   $textLabel5.Left = 50;
   $textLabel5.Top = 160;
   $textLabel5.Width = 350;
   $textlabel5.Height = 50;
   $textLabel5.Text = “If you are not expecting to see this screen, please contact the IT Service Desk on x22222”;
   
   ############Define text box1 for input
   $textBox1 = New-Object “System.Windows.Forms.TextBox”;
   $textBox1.Left = 225;
   $textBox1.Top = 15;
   $textBox1.width = 200;

   ############Define text box2 for input
   $textBox2 = New-Object “System.Windows.Forms.TextBox”;
   $textBox2.Left = 225;
   $textBox2.Top = 70;
   $textBox2.width = 200;

   #############Define default values for the input boxes
   $textBox1.Text = "";
   $textBox2.Text = "\\\MasterImages";
   
   #############define OK button
   $button = New-Object “System.Windows.Forms.Button”;
   $button.Left = 425;
   $button.Top = 120;
   $button.Width = 75;
   $button.Text = “OK”;
   
   ############# This is when you have to close the form after getting values
   $eventHandler = [system.EventHandler]{
   $global:filename = $TextBox1.Text
   $TextBox1.Text
   $global:location = $TextBox2.Text
   $TextBox2.Text
   $form.Close();
   };
   
   $button.Add_Click($eventHandler);
   
   #############Add controls to all the above objects defined
   $form.Controls.Add($button);
   $form.Controls.Add($textLabel1);
   $form.Controls.Add($textLabel2);
   $form.Controls.Add($textLabel3);
   $form.Controls.Add($textLabel5);
   $form.Controls.Add($textBox1);
   $form.Controls.Add($textBox2);
   $ret = $form.ShowDialog();
   
   #################return values
   
   return $TextBox1.Text, $TextBox2.Text
   
}

[system.Reflection.Assembly]::LoadWithPartialName(“System.Windows.Forms”)

#Hide the progress dialog
$TSProgressUI = new-object -comobject Microsoft.SMS.TSProgressUI
$TSProgressUI.CloseProgressDialog()

# Pop up device backup name message
[system.Windows.Forms.MessageBox]::Show("Please enter the name and location of the backup file to restore", "Device Backup TS")

$return = button

# Capture device backup name
$BackupName1 = $global:filename
$BackupName2 = $BackupName1 + "D"
$BackupLocation1 = $global:location

# Set actual TS variable
$tsenv = New-Object -COMObject Microsoft.SMS.TSEnvironment
$tsenv.value("BackupName") = $BackupName1
$tsenv.value("BackupLocation") = $BackupLocation1

$Server = ($BackupLocation1 -split '\\')[2]
$Share = ($BackupLocation1 -split '\\')[3]

$NetworkPath = "\\" + $Server + "\" + $Share

$tsenv.value("NetworkPath") = $NetworkPath

$TSName = $tsenv.value("_SMSTSPackageName")

# Create auditing variables
$hostname = hostname
$macaddress1 = (get-wmiobject -class "Win32_NetworkAdapterConfiguration" | Where{$_.IpEnabled -Match "True"} | Where{ $_.IPADDRESS -like "10.*.*.*" } | select MACAddress).macaddress
$system = get-wmiobject win32_computersystem
[string]$DT = date
$nic = Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE
$ipaddress = ($NIC.IPAddress[0])

# Specify the path to the audit file, and the string to output to it
[string]$audit1 = "\\\PCbackups\pcbackups.log"
[string]$auditinfo1 = $macaddress1 + "," + $DT + "," + $ipaddress + "," + $hostname + "," + $system.manufacturer + "," + $system.model + ",JUST STARTED " + $TSName + " restoring " + $BackupName1 + ".wim" + ",on share " + $NetworkPath

# Add audit string to the audit file
$auditinfo1 | Out-File $audit1 -Append -Encoding ASCII
Start-Sleep 2

net use $NetworkPath  /u:

Start-Process DISM -ArgumentList "/apply-ffu /ImageFile:$BackupLocation1\$BackupName1.wim /ApplyDrive:\\.\PhysicalDrive0" -Wait

net use $NetworkPath /d

[string]$audit2 = "\\\PCbackups\pcbackups.log"
[string]$auditinfo2 = $macaddress1 + "," + $DT + "," + $ipaddress + "," + $hostname + "," + $system.manufacturer + "," + $system.model + ",JUST FINISHED " + $TSName + " restoring " + $BackupName1 + ".wim" + ",on share " + $NetworkPath
$auditinfo2 | Out-File $audit2 -Append -Encoding ASCII

[system.Windows.Forms.MessageBox]::Show("Device has successfully been restored", "Device Backup TS")

exit 0

 

It's not been used in anger yet, but the etesting i've run on approx half a dozen devices has worked with no problem. Even mixing disk sizes, so restoring onto a bigger disk than it was captured on worked, but it did not automatically resize to fill bigger disks.

Edited by MartinByard
  • Thanks 1
Posted

I've used clonezilla a deploy fat images from USB onto PC, worked fine at the time.

There's also FOG https://fogproject.org/ which I used briefly before we moved to MDT.

These days, if we want to fat image then we use a Startech disk cloner like this one https://www.amazon.co.uk/dp/B00FSVD9PE (we originally got it scrub drives pulled out of old machines)

Aomie backup has been pretty good for drive migrations on my home PC, but I've had mixed results using it against a boot drive. https://www.aomeitech.com/aomei-backupper.html

Posted

I did this for an organization, not a school - big USB stick, Windows 7 backup and restore a fully built machine, Windows RE tools on the stick, boot it, enter RE, restore the image from the stick, rename and join to domain.

 

I've since moved to Windows Config Designer which allows you to do all of the above and join to a domain.

 

Also worth mentioning autopilot if you have the apropriate devices and Intune - only need to provide a windows image.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now



×
×
  • Create New...