Eu tenho um script que usa código C# no PowerShell para definir a resolução e orientação da tela para os dispositivos para os quais estou desenvolvendo uma imagem do Windows.
Por vários motivos, principalmente relacionados à orientação da tela, optei por não usar as configurações em meu unattend.xml.
Depois de instalar a imagem em qualquer um dos dispositivos de destino, quando inicializo o dispositivo e deixo o OOBE ser concluído usando meu arquivo de resposta unattend.xml, o script que tenho é executado, mas retorna um resultado indicando que falhou ao processar minha solicitação.
Se eu pegar a unidade finalizada e executar o sysprep nela para configurá-la para executar o OOBE novamente, o script será bem-sucedido na segunda execução.
Por que isso aconteceria?
Aqui está o código para o script 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;
}
}
}
Na primeira vez que o script é executado (durante a tentativa 1 do OOBE), executo uma das funções SetDev*Resolution() e a função "ChangeResolution()" retorna: "Não é possível processar sua solicitação. Desculpe por este inconveniente." Isso me diz que quando tentei chamar "ChangeDisplaySettings ()" falhou.
Poderia ter algo a ver com não haver um usuário quando este script é executado? Se for esse o caso, existe uma solução alternativa ou preciso descobrir outro método?