Правильно ли мое понимание по этому поводу?

USMT копирует пользовательские данные, настройки и т.д. На сетевой диск, а затем вы устанавливаете операционную систему, а затем снова используете USMT для копирования файлов, настроек и т.д. Обратно.

1 ответ1

1

Если вам нужна короткая, простая, развернутая версия, да, USMT - это "просто" инструмент резервного копирования. Я довольно новичок в этом, но при написании сценариев он может стать ценным инструментом для администратора. Надеюсь это поможет!

Следующий файл, представляющий собой пакетный файл, автоматизирует загрузочную часть USMT. У меня нет кода для array_compare.ps1, но если кому-то действительно интересно, я могу опубликовать его. Получайте удовольствие и дайте мне знать, если у вас есть какие-либо вопросы!

Проверка того, выполняется ли сценарий с повышенными правами и, если нет, повышается.

:::::::::::::::::::::::::::::::::::::::::
::
:: Automatically check & get admin rights
:::::::::::::::::::::::::::::::::::::::::
@echo off
CLS 
ECHO.
ECHO =============================
ECHO Running Admin shell
ECHO =============================
: checkPrivileges 
NET FILE 1>NUL 2>NUL
if '%errorlevel%' == '0' ( goto gotPrivileges ) else ( goto getPrivileges )  
:getPrivileges 
if '%1'=='ELEV' 
(shift & goto gotPrivileges)  
ECHO. 
ECHO **************************************
ECHO Invoking UAC for Privilege Escalation 
ECHO ************************************** 
setlocal DisableDelayedExpansion
set "batchPath=%~0"
setlocal EnableDelayedExpansion
ECHO Set UAC = CreateObject^("Shell.Application"^) > "%temp%\OEgetPrivileges.vbs" 
ECHO UAC.ShellExecute "!batchPath!", "ELEV", "", "runas", 1 >> "%temp%\OEgetPrivileges.vbs" 
"%temp%\OEgetPrivileges.vbs" 
exit /B  
:gotPrivileges 
::::::::::::::::::::::::::::
::START::::::::::::::::::::::::::::
setlocal & pushd . 

REM Run shell as admin (example)
:::::::::::::::::::::::::::: 

Сопоставление сетевого диска, который я использовал для хранения и поддержки разных необходимых файлов. В нем также хранятся файлы USMT, которые будут загружены в несколько раз.

@ECHO OFF
START /wait NET USE z: \\NETWORK SHARE\FOLDER\FOLDER
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Lines 42 - 44 Run the array_compare.ps1 as Admin      ::
:: to run a search to find the new user name and output  ::
:: it to a file that we will read from shortly.          ::
:: THIS CAN BE PROVIDED...LET ME KNOW!!                  ::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Массив array_compare.ps1, берет два списка имен пользователей и сравнивает их, выводит в файл csv, который будет прочитан для импорта профилей.

SET ThisScriptsDirectory=%~dp0 
SET PowerShellScriptPath="Z:\Path\to\powershell\comparison\array_compare.ps1"
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& {Start-Process PowerShell -ArgumentList '->NoProfile -ExecutionPolicy Bypass -File ""%PowerShellScriptPath%""' -Verb RunAs}";

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::  Change the Powershell ExecutionPolicy so that scripts will run without issue. ::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

PowerShell -NoProfile -ExecutionPolicy Unrestricted -Command "& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Unrestricted'}"

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::      ***Declaring our variables***               ::
:: Location is the folder name where we stored the scanstate information.  ::
:: Domain2 is the new domain that we are migrating to.                     ::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Scanstate сохраняет файлы в сетевой папке в папке с именем хоста. Здесь нам предлагается ввести имя хоста заменяемого устройства.

set /P location= Please enter the OLD computer name:

Поскольку USMT имеет два разных .exe-файла, основанных на битовом уровне ОС, Win 7x86 против Win 7x64, я хотел выполнить проверку и, исходя из этого, выполнить правильное loadstate.

Опрос процессора для определения типа архитектуры.

:CheckOS

   if /i %processor_architecture%==AMD64 GOTO AMD64
Else    
if /i %processor_architecture%==x86 GOTO x86
Else
if /i %PROCESSOR_ARCHITEW6432%==AMD64 GOTO AMD64

 :AMD64
Z:
CD Z:\Program Files\USMT\x64\
xcopy *.* /e /v /y c:\windows\usmt\

C:
CD c:\windows\usmt\

setlocal EnableDelayedExpansion



Set inputfile=Z:\%location%\NAME_OF_FILE_THAT_CONTAINS_BOTH_USERIDS.txt

for /f "tokens=1-2" %%A in (%inputfile%) do call :USMTx64 %%A%%B

:USMTx64
ECHO Syncing %1 ...
loadstate Z:\%location% /c /lac /lae /i:miguser.xml /i:migapp.xml /i:novell_excl.xml /config:config.xml /ue:Administrator /ue:Admin* /ue:EO-* /ue:*\* /ui:%1 /mu:<OLDDOMAIN>\%1:ID\%2 /mu:%1:ID\%2 /v:13 

if NOT ["%errorlevel%"]==["0"] (
    GOTO END        
    )
exit /b

:x86
Z:
CD Z:\Program Files\USMT\x86
xcopy *.* /e /v /y c:\windows\usmt\

C:
CD c:\windows\usmt\

Set inputfile=Z:\%location%\NAME_OF_FILE_THAT_CONTAINS_BOTH_USERIDS.txt

Создан цикл for /f, который считывает выходной файл из array_compare.ps1, созданного ранее. Это то, что действительно автоматизирует USMT для нас. Он пройдет X раз, каждый раз загружая нового пользователя.

for /f "tokens=1-2" %%A in (%inputfile%) do call :USMTx86 %%A%%B
:USMTx86
ECHO Syncing %1 ...
loadstate Z:\%location% /c /lac /lae /i:miguser.xml /i:migapp.xml /i:novell_excl.xml /config:config.xml /ue:Administrator /ue:EO-* /ue:Admin* /ui:%1 /ue:*\* /mu:<OLDDOMAIN>\%1:ID\%2 /mu:%1:ID\%2 /v:13 

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::    :::::::::::: 
:: Checks for errors in the USMT commands.  
:: If found exits the CALL sub and continues with the script.
::::  SOURCE: https://coderwall.com/p/jexjlw
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Эта ошибка была абсолютно необходима, по крайней мере, для меня! Когда for /f дойдет до последней итерации, USMT выдаст ошибку. Если это произойдет и команды по-прежнему будут выполняться, пакетный файл завершится ошибкой. Это обрабатывает его, выходит из цикла for /f и продолжает работу.

if NOT ["%errorlevel%"]==["0"] (
    GOTO END
    )
exit /b

:END

:: Deletes the mapped network drive

net use z: /delete /yes

Exit

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .