Warum schlägt mein Skript beim ersten Versuch, die OOBE auszuführen, fehl (beim zweiten funktioniert es aber)?

Warum schlägt mein Skript beim ersten Versuch, die OOBE auszuführen, fehl (beim zweiten funktioniert es aber)?

Ich habe ein Skript, das C#-Code in Powershell verwendet, um die Bildschirmauflösung und -ausrichtung für die Geräte einzustellen, für die ich ein Windows-Image entwickle.

Aus verschiedenen Gründen, die hauptsächlich mit der Bildschirmausrichtung zusammenhängen, möchte ich die Einstellungen in meiner unattend.xml nicht verwenden.

Wenn ich nach der Installation des Images auf einem der Zielgeräte das Gerät starte und die OOBE mithilfe meiner unattend.xml-Antwortdatei abschließen lasse, wird mein Skript ausgeführt, gibt jedoch ein Ergebnis zurück, das angibt, dass die Verarbeitung meiner Anforderung fehlgeschlagen ist.

Wenn ich dann die fertige Einheit nehme und Sysprep darauf ausführe, um sie so einzustellen, dass die OOBE erneut ausgeführt wird, ist das Skript beim zweiten Durchlauf erfolgreich.

Warum sollte das so sein?

Hier ist der Code für das Powershell/C#-Skript.

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; 
        } 
    } 
}

Beim ersten Ausführen des Skripts (während OOBE-Versuch 1) führe ich eine der SetDev*Resolution()-Funktionen aus und die Funktion „ChangeResolution()“ gibt zurück: „Ihre Anfrage konnte nicht verarbeitet werden. Entschuldigen Sie die Unannehmlichkeiten.“ Dies sagt mir, dass mein Versuch, „ChangeDisplaySettings()“ aufzurufen, fehlgeschlagen ist.

Könnte es damit zu tun haben, dass beim Ausführen dieses Skripts kein Benutzer vorhanden ist? Wenn dies der Fall ist, gibt es eine Problemumgehung oder muss ich mir eine andere Methode überlegen?

verwandte Informationen