Сценарий 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 на этапе специализации, поскольку в этом случае он будет работать как система.

https://learn.microsoft.com/en-us/windows-hardware/customize/desktop/unattend/microsoft-windows-deployment-runsynchronous-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>
Другие вопросы по тегам