OOBE를 실행하려는 첫 번째 시도에서 스크립트가 실패하지만 두 번째 실행에서는 작동하는 이유는 무엇입니까?

OOBE를 실행하려는 첫 번째 시도에서 스크립트가 실패하지만 두 번째 실행에서는 작동하는 이유는 무엇입니까?

Powershell에서 C# 코드를 사용하여 Windows 이미지를 개발 중인 장치의 화면 해상도와 방향을 설정하는 스크립트가 있습니다.

주로 화면 방향과 관련된 다양한 이유로 unattend.xml의 설정을 사용하지 않기로 선택했습니다.

대상 장치에 이미지를 설치한 후 장치를 부팅하고 unattend.xml 응답 파일을 사용하여 OOBE를 완료하면 스크립트가 실행되지만 요청을 처리하지 못했다는 결과가 반환됩니다.

그런 다음 완성된 장치를 가져와서 sysprep을 실행하여 OOBE를 다시 실행하도록 설정하면 두 번째 실행에서 스크립트가 성공합니다.

왜 그럴까요?

다음은 powershell/C# 스크립트의 코드입니다.

using System; 
using System.Runtime.InteropServices; 

namespace Resolution 
{ 

    [StructLayout(LayoutKind.Sequential)] 
    public struct DEVMODE 
    { 
       [MarshalAs(UnmanagedType.ByValTStr,SizeConst=32)]
       public string dmDeviceName;

       public short  dmSpecVersion;
       public short  dmDriverVersion;
       public short  dmSize;
       public short  dmDriverExtra;
       public int    dmFields;
       public int    dmPositionX;
       public int    dmPositionY;
       public int    dmDisplayOrientation;
       public int    dmDisplayFixedOutput;
       public short  dmColor;
       public short  dmDuplex;
       public short  dmYResolution;
       public short  dmTTOption;
       public short  dmCollate;

       [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
       public string dmFormName;

       public short  dmLogPixels;
       public short  dmBitsPerPel;
       public int    dmPelsWidth;
       public int    dmPelsHeight;
       public int    dmDisplayFlags;
       public int    dmDisplayFrequency;
       public int    dmICMMethod;
       public int    dmICMIntent;
       public int    dmMediaType;
       public int    dmDitherType;
       public int    dmReserved1;
       public int    dmReserved2;
       public int    dmPanningWidth;
       public int    dmPanningHeight;
    }; 

    class NativeMethods 
    { 
        [DllImport("user32.dll")] 
        public static extern int EnumDisplaySettings(string deviceName, int modeNum, ref DEVMODE devMode); 
        [DllImport("user32.dll")] 
        public static extern int ChangeDisplaySettings(ref DEVMODE devMode, int flags); 

        public const int ENUM_CURRENT_SETTINGS = -1; 
        public const int CDS_UPDATEREGISTRY = 0x01; 
        public const int CDS_TEST = 0x02; 
        public const int DISP_CHANGE_SUCCESSFUL = 0; 
        public const int DISP_CHANGE_RESTART = 1; 
        public const int DISP_CHANGE_FAILED = -1;
        public const int DISP_CHANGE_BADMODE = -2;
        public const int DISP_CHANGE_NOTUPDATED = -3;
        public const int DISP_CHANGE_BADFLAGS = -4;
        public const int DISP_CHANGE_BADPARAM = -5;
        public const int DISP_CHANGE_BADDUALVIEW = -6;
        public const int DMDO_DEFAULT = 0;
        public const int DMDO_90 = 1;
        public const int DMDO_180 = 2;
        public const int DMDO_270 = 3;
    } 



    public class PrmaryScreenResolution 
    { 
        static public string SetDevAResolution() //Landscape oriented device
        {
            return ChangeResolution(1024, 768, NativeMethods.DMDO_DEFAULT);
        }

        static public string SetDevBResolution() //High resolution portrait device
        {
            return ChangeResolution(800, 1280, NativeMethods.DMDO_90);
        }

        static public string SetDevCResolution() //Portrait oriented device
        {
            return ChangeResolution(768, 1024, NativeMethods.DMDO_90);
        }

        static public string ChangeResolution(int width, int height, int orientation) 
        { 

            DEVMODE dm = GetDevMode(); 

            if (0 != NativeMethods.EnumDisplaySettings(null, NativeMethods.ENUM_CURRENT_SETTINGS, ref dm)) 
            {

                // Set Width and heigh
                dm.dmPelsHeight = height;
                dm.dmPelsWidth = width;
                //dm.dmLogPixels = 96;

                dm.dmDisplayOrientation = orientation;

                int iRet = NativeMethods.ChangeDisplaySettings(ref dm, NativeMethods.CDS_TEST); 

                if (iRet == NativeMethods.DISP_CHANGE_FAILED) 
                { 
                    return "Unable To Process Your Request. Sorry For This Inconvenience."; 
                } 
                else 
                { 
                    iRet = NativeMethods.ChangeDisplaySettings(ref dm, NativeMethods.CDS_UPDATEREGISTRY); 
                    switch (iRet) 
                    { 
                        case NativeMethods.DISP_CHANGE_SUCCESSFUL: 
                            { 
                                return "Success"; 
                            } 
                        case NativeMethods.DISP_CHANGE_RESTART: 
                            { 
                                return "You Need To Reboot For The Change To Happen.\n If You Feel Any Problem After Rebooting Your Machine\nThen Try To Change Resolution In Safe Mode."; 
                            }
                        case NativeMethods.DISP_CHANGE_FAILED:
                            {
                                return "Display change failed.";
                            }
                        case NativeMethods.DISP_CHANGE_BADMODE:
                            {
                                return "Bad Mode";
                            }
                        case NativeMethods.DISP_CHANGE_NOTUPDATED:
                            {
                                return "Display not updated.";
                            }
                        case NativeMethods.DISP_CHANGE_BADFLAGS:
                            {
                                return "Bad Flags";
                            }
                        case NativeMethods.DISP_CHANGE_BADPARAM:
                            {
                                return "Bad Parameter";
                            }
                        case NativeMethods.DISP_CHANGE_BADDUALVIEW:
                            {
                                return "Bad Dual View";
                            }
                        default: 
                            { 
                                return "Failed To Change The Resolution (B)"; 
                            } 
                    } 

                } 


            } 
            else 
            { 
                return "Failed To Change The Resolution. (A)"; 
            } 
        } 

        private static DEVMODE GetDevMode() 
        { 
            DEVMODE dm = new DEVMODE(); 
            dm.dmDeviceName = new String(new char[32]); 
            dm.dmFormName = new String(new char[32]); 
            dm.dmSize = (short)Marshal.SizeOf(dm); 
            return dm; 
        } 
    } 
}

스크립트가 처음 실행될 때(OOBE 시도 1 중) SetDev*Resolution() 함수 중 하나를 실행하면 "ChangeResolution()" 함수가 "요청을 처리할 수 없습니다. 불편을 끼쳐드려 죄송합니다."를 반환합니다. 이것은 "ChangeDisplaySettings()" 호출을 시도했을 때 실패했음을 알려줍니다.

이 스크립트가 실행될 때 사용자가 없는 것과 관련이 있을 수 있습니까? 그렇다면 해결 방법이 있습니까, 아니면 다른 방법을 찾아야 합니까?

관련 정보