Loading

WDS+MDT网络启动自动部署windows(二十一)MDT 最常见重装备份用户数据,重装系统。

简介

我们已经实现了MDT这么多功能,尽可能覆盖了各种环境,各种情况。

但是最重要的用户数据备份,然后格盘全新安装则仍未涉及。

需要考虑一下如何自动备份用户数据,并格盘重装了。

似乎只有自定义脚本一条路可走了。

备份

要将用户数据,备份到nas上去,nas执行定时任务来删除过期数据。

这个脚本用什么写呢?vbs?wsf?powershell?

备份用户目录,users,不是单独的用户的目录,是所有用户的目录。

备份除系统盘外的所有盘。

也不知道python编译成exe,能否在这个PE下运行。

反正我还不知道python如何获取MDT环境变量,现在都是凑着wsf,引入vbs,来获取oenv

凑活写了个powershell脚本,可以备份了。

不备份系统,只备份非系统安装分区,先评估一下所有非系统分区总使用量,是否超过最大的磁盘。

不超过,就复制所有分区到samba共享盘。

剩下的就可以标准安装了。恢复么。再写吧。

貌似以计算机名来设置目录不太好啊,恢复的时候如果计算机名改了怎么办?

下一版再更新吧,预计下一版要考虑单硬盘的情况,如果使用数据大于单硬盘容量-100G,也要提示停止备份。

 

function Get-TotalNonSystemDrivesUsedSpaceGB {
    $systemDrive = $emv:systemDrive
    $noSystemDrives = Get-PSDrive -PSProvider FileSystem | Where-Object {
        $_.Root -ne "$($systemDrive):\" -and $_.Used -ne $null
    }
    
    $totalUsedSpaceBytes = 0
    foreach ($drive in $noSystemDrives) {
        $totalUsedSpaceBytes += $drive.Used
    }

    $totalUsedSpaceGB = $totalUsedSpaceBytes

    return $totalUsedSpaceGB
}

function Get-LargestDiskSpaceGB {
    $disks = Get-Disk | Where-Object { $_.OperationalStatus -eq 'Online' }
    Write-Host $disks.Count
    if ($disks.Count -eq 0 ) {
        Write-Warning "No online disks found."
        return
    }

    $largestDisk = $disks | Sort-Object -Property Size -Descending | Select-Object -First 1
    $largestDiskSizeGB = [Math]::Round($largestDisk.Size, 2)
    return $largestDiskSizeGB
}

function Copy_Diretctory {
    param([string]$from, [string]$to)
    $FileList = Get-ChildItem "$from" -Recurse
    $Total = $FileList.count
    $Position = 0

    foreach ($File in $FileList) {
        $Filename = $File.Fullname.replace($from, '')
        $DestinationFile = ($to + "\" + $Filename)


        Write-Progress -Activity "从[$from]复制到[$to]" -PercentComplete (($Position / $Total) * 100)

        Write-Host $File.FullName
        Write-Host $DestinationFile
        Copy-Item $File.FullName -Destination $DestinationFile
        $position++

    }

}

function Check_Copy {
    
    $username = "JACK\mdt"
    $password = "pass@1234"
    $networkSharePath = "\\wds2022\udshare$"

    $mainBackFolder = "Backup"
    $systemDrive = $env:SystemDrive
    $computerName = $env:COMPUTERNAME
    $mapperdDrive = "Z"

    $password = ConvertTo-SecureString -String $password -AsPlainText -Force
    $credential = New-Object System.Management.Automation.PSCredential($username, $password)
    # New-PSDrive -Name "Public" -PSProvider FileSystem -r "\\wds2022\udshare$\Backup

    $drives = Get-WmiObject -Class Win32_LogicalDisk

    New-PSDrive -Name $mapperdDrive -Persist -PSProvider FileSystem -Root $networkSharePath -Credential $credential -Scope Global
    Net use

    Write-Host $drivers
    foreach ($drive in $drives) {
        
        $driveID = $drive.DeviceID
        $driveLetter = $drive.DeviceID.remove(1, 1)

        $isSystemDrive = $driveID -eq $systemDrive

        if (-not $isSystemDrive) {
            $sourceFolder = "$($driveID)\"
            Write-Host $sourceFolder
            $destinationFolder = "$mapperdDrive" + ":\$mainBackFolder\$computerName\$driveLetter"

            if (-not (Test-Path $destinationFolder)) {
                New-Item -Path $destinationFolder -ItemType Directory -Force
            }
            
            Copy_Diretctory $sourceFolder $destinationFolder

            Write-Host "已将 $driveID 的文件复制到 $destinationFolder "
        }
    
    }
    Remove-PSDrive -Name $mapperdDrive
}


function MainFunction {
    $usedSpaceGB = Get-TotalNonSystemDrivesUsedSpaceGB
    $diskSpaceGB = Get-LargestDiskSpaceGB

    if ($diskSpaceGB -gt $usedSpaceGB) {
        Check_Copy
    }
    else {
        Write-Host "磁盘使用率超限,请删除一些多余无用文件"
    }
}

MainFunction

 

恢复

如果用户原来是双盘多分区,那么有没有可能所有的备份数据,使用一个最大的备份盘仍然无法装下呢?

似乎恢复需要更高级语言的程序来实现了。凑活用powershell实现了备份,评估所有使用的数据是否大于最大的备份盘。

 

posted @ 2024-05-14 00:34  上官飞鸿  阅读(168)  评论(0编辑  收藏  举报