Сценарий PowerShell не запускается из файла autounattend.xml
Добрый день!
Я создал файл autounattend.xml с настройками для пропуска OOBE, создания профиля пользователя и запуска сценария PowerShell при первом входе в систему. Первые два работали нормально, за исключением запуска сценария. Я прочитал много тем по этому вопросу, но, к сожалению, ни одна из них не нашла для меня рабочего ответа.
Вот пример autounattend.xml:
<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State">
<settings pass="offlineServicing" />
<settings pass="windowsPE">
<component name="Microsoft-Windows-International-Core-WinPE" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
<SetupUILanguage>
<UILanguage>en-US</UILanguage>
</SetupUILanguage>
<InputLocale>0409:00000409</InputLocale>
<SystemLocale>en-US</SystemLocale>
<UILanguage>en-US</UILanguage>
<UserLocale>en-US</UserLocale>
</component>
</settings>
<settings pass="generalize" />
<settings pass="specialize" />
<settings pass="auditSystem" />
<settings pass="auditUser" />
<settings pass="oobeSystem">
<component name="Microsoft-Windows-International-Core" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
<InputLocale>0409:00000409</InputLocale>
<SystemLocale>en-US</SystemLocale>
<UILanguage>en-US</UILanguage>
<UserLocale>en-US</UserLocale>
</component>
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
<UserAccounts>
<LocalAccounts>
<LocalAccount wcm:action="add">
<Name>Admin</Name>
<Group>Administrators</Group>
<Password>
<Value>mypassword</Value>
<PlainText>true</PlainText>
</Password>
</LocalAccount>
</LocalAccounts>
</UserAccounts>
<OOBE>
<HideEULAPage>true</HideEULAPage>
<ProtectYourPC>3</ProtectYourPC>
<HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE>
<NetworkLocation>Work</NetworkLocation>
</OOBE>
<FirstLogonCommands>
<SynchronousCommand wcm:action="add">
<CommandLine>FOR %i IN (C D E F G H I J K L N M) DO IF EXIST %i:\setup.ps1 Powershell -executionpolicy ByPass %i:\setup.ps1</CommandLine>
<Description>Setup</Description>
<Order>1</Order>
<RequiresUserInput>false</RequiresUserInput>
</SynchronousCommand>
</FirstLogonCommands>
</component>
</settings>
</unattend>
Не могли бы вы помочь мне разобраться в этом?
Спасибо!
===Обновлено===
Скрипт очень простой. Содержимое скрипта:
В целях отладки я добавил строки с выводом в текстовый файл на рабочем столе и на диске C.
$machineName = (Get-WmiObject Win32_bios).SerialNumber
Rename-Computer $machineName
"Hello World!" | Out-File "C:\delete_me.txt"
"Hello World!" | Out-File "$($home)\Desktop\delete_me.txt"
Это означает, что он не работает с обычными правами и правами администратора. Кроме того, setupact.log сначала пытается запустить сценарий, а затем создает пользователя. Может ли это быть проблемой?
2023-03-09 23:36:39, Info [Shell Unattend] Running 'oobeSystem' pass
2023-03-09 23:36:39, Info [Shell Unattend] LogonCommands: Set command 'FOR %i IN (C D E F G H I J K L N M) DO IF EXIST %i:\setup.ps1 Powershell -executionpolicy ByPass %i:\setup.ps1'
2023-03-09 23:36:39, Info [Shell Unattend] UserAccounts: created account 'User'
2023-03-09 23:36:39, Info [Shell Unattend] UserAccounts: added 'User2' to group 'Users'
2023-03-09 23:36:39, Info [Shell Unattend] UserAccounts: Password set for 'User'
2023-03-09 23:36:39, Info [Shell Unattend] UserAccounts: added 'User2' to group 'Administrators'
2023-03-09 23:36:39, Info [Shell Unattend] Exiting 'oobeSystem' pass with status 0x00000000
2 ответа
Чтобы приступить к устранению неполадок, вам нужно больше информации о том, что происходит не так. Подробный журнал ошибок можно получить по адресу
%WINDIR%\Panther\UnattendGC\SetupAct.log
Получив содержимое этого файла, обновите свое сообщение, и мы сможем предложить дополнительную помощь.
Обновлять:
Похоже, вы пытаетесь выполнить действия администратора внутри LogonCommands; это не идеально, поскольку это будет выполняться в контексте пользователя и, скорее всего, не будет повышено, даже если пользователь является администратором.
Учитывая ваш вариант использования динамической установки имени хоста, я рекомендую вместо этого использовать RunSynchronousCommand на этапе специализации, поскольку в этом случае он будет работать как система.
Кроме того, вы можете выполнить встроенную команду PowerShell вместо использования внешнего файла, который вам нужно найти. См. приведенный ниже пример.
<RunSynchronousCommand wcm:action="add">
<Description>Rename computer using PowerShell</Description>
<Order>1</Order>
<CommandLine>powershell -ExecutionPolicy Bypass -Command "& {(Get-WmiObject Win32_bios).SerialNumber | Rename-Computer}"</CommandLine>
<RequiresUserInput>false</RequiresUserInput>
</RunSynchronousCommand>
Спасибо, что указали мне на документацию!
Мне удалось запустить скрипт со следующей конфигурацией: (все еще хотелось использовать файл сценария, а не команду, потому что я добавил дополнительный код)
<settings pass="specialize">
<component name="Microsoft-Windows-Deployment" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
<RunSynchronous>
<RunSynchronousCommand wcm:action="add">
<Description>Setup</Description>
<Order>1</Order>
<Path>cmd /c FOR %i IN (C D E F G H I J K L N M) DO IF EXIST %i:\setup.ps1 Powershell -executionpolicy ByPass %i:\setup.ps1</Path>
<WillReboot>Never</WillReboot>
</RunSynchronousCommand>
</RunSynchronous>
</component>
</settings>