//---------------------------------------------------------------------------- // // Copyright (c) Intel Corporation, 2011 - 2014 All Rights Reserved. // // File: RemoteControlSample.cs // // Contents: Sample code for Intel(R) Active Management Technology // (Intel® AMT) RemoteControl Sample. // // Notes: This sample demonstrates how to use various commands of // the RemoteControl service. // //---------------------------------------------------------------------------- using System; using System.Runtime.InteropServices; using Utils; namespace RemoteControl { class RemoteControlSample { #region CONSTANTS //Command line Flags // *** Do GET_CONFIG_TO_NEXT_BOOT private const string ALL = "api"; private const string GET_SYSTEM_POWER_STATE = "getpower"; private const string GET_POWER_CAPABILITIES = "powercap"; private const string CHANGE_POWER_STATE = "changepower"; private const string GET_BOOT_DETAILS = "bootdetails"; private const string GET_BOOT_CAPABILITIES = "bootcap"; private const string SET_RSE_FLAG = "setrseflag"; private const string SET_RSE_PASSWORD = "setrsepass"; private const string CLEAR_BOOT_OPTIONS = "clearoptions"; private const string SET_BOOT_SOURCE = "setbootsource"; private const string GET_CONFIG_TO_NEXT_BOOT = "getbootconfig"; private const string SET_RSE_NEXT_BOOT = "setrsenextboot"; private const string CPU_STATE = "cpu"; //Command line Flags's descriptions private const string CHANGE_POWER_STATE_DESCRIPTION = "To activate an Intel AMT power change.\n\t NOTE: This option can cause a remote reboot to the Intel AMT machine.\n\t Value can be one of the following:\n \t on | off | wakefromconnectedstandby | powercycle | busreset | \n \t sleep | hibernate | gracefulOff | gracefulReset | nmi \n"; private const string GET_BOOT_DETAILS_DESCRIPTION = "Get and display Boot details"; private const string GET_BOOT_CAPABILITIES_DESCRIPTION = "Get and display the “Managed System” Boot Capabilities"; private const string SET_RSE_FLAG_DESCRIPTION = "Set RSE boot flag for the next Intel AMT power change. (When True, the BIOS performs secure erase operation)"; private const string SET_RSE_PASSWORD_DESCRIPTION = "Set RSE password"; private const string SET_RSE_NEXT_BOOT_DESCRIPTION = "Set RSE boot for the next Intel AMT power change.\n WARNING: This option erases the content of the primary or boot drive of the machine after performing reboot"; private const string CLEAR_BOOT_OPTIONS_DESCRIPTION = "clear all boot options for the next Intel AMT power change. (When True, the BIOS performs secure erase operation)"; private const string GET_POWER_CAPABILITIES_DESCRIPTION = "Get and display Power Management Capabilities"; private const string CPU_STATE_DESCRIPTION = "Check if the Host CPU has halted unexpectedly"; private const string GET_SYSTEM_POWER_STATE_DESCRIPTION = "Get system power state and power saving state"; private const string ALL_DESCRIPTION = "Perform all Remote Control options"; private const string SET_BOOT_SOURCE_DESCRIPTION = "Set a boot device for next Intel AMT power change.\n\t Value can be one of the following:\n\t none, harddisk, cd, pxe, idercd, iderfloppy\n"; private const string DEACTIVATE = "deactivate"; private const string ACTIVATE = "activate"; private const string POWER_ON = "on"; private const string WAKE_FROM_POWER_SAVING = "wakefromconnectedstandby"; private const string POWER_CYCLE = "powercycle"; private const string POWER_OFF = "off"; private const string MASTER_BUS_RESET = "busreset"; private const string SLEEP = "sleep"; private const string HIBERNATE = "hibernate"; private const string GRACEFUL_OFF = "gracefuloff"; private const string GRACEFUL_RESET = "gracefulreset"; private const string NMI = "nmi"; // Exit Codes Types private enum exitCodes { EXIT_SUCCESS = 0, EXIT_FAILURE, EXIT_USAGE, EXIT_COMMUNICATION_ERROR, EXIT_ARGUMENT_ERROR, } #endregion CONSTANTS #region MAIN [DllImport("kernel32.dll", CallingConvention = CallingConvention.StdCall)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool SetDefaultDllDirectories(int directoryFlags); /// /// This is the main entry point for the function. /// static int Main(string[] args) { // set default dll lookup directory to system SetDefaultDllDirectories(0x00000800); //LOAD_LIBRARY_SEARCH_SYSTEM32 exitCodes exitCode = exitCodes.EXIT_SUCCESS; CmdLineArguments Params = new CmdLineArguments(); RemoteControlApi api = null; // Add command line argument options. Params.init_functions(); // Add options to activate Params.AddArg(ALL, false, false, ALL_DESCRIPTION); Params.AddArg(GET_SYSTEM_POWER_STATE, false, false, GET_SYSTEM_POWER_STATE_DESCRIPTION); Params.AddArg(GET_POWER_CAPABILITIES, false, false, GET_POWER_CAPABILITIES_DESCRIPTION); Params.AddArg(CHANGE_POWER_STATE, true, false, CHANGE_POWER_STATE_DESCRIPTION); Params.AddArg(GET_BOOT_DETAILS, false, false, GET_BOOT_DETAILS_DESCRIPTION); Params.AddArg(GET_BOOT_CAPABILITIES, false, false, GET_BOOT_CAPABILITIES_DESCRIPTION); Params.AddArg(SET_RSE_FLAG, true, false, SET_RSE_FLAG_DESCRIPTION); Params.AddArg(SET_RSE_PASSWORD, true, false, SET_RSE_PASSWORD); Params.AddArg(SET_BOOT_SOURCE, true, false, SET_BOOT_SOURCE_DESCRIPTION); Params.AddArg(CPU_STATE, false, false, CPU_STATE_DESCRIPTION); Params.AddArg(CLEAR_BOOT_OPTIONS, false, false, CLEAR_BOOT_OPTIONS_DESCRIPTION); Params.AddArg(SET_RSE_NEXT_BOOT, false, false, SET_RSE_NEXT_BOOT_DESCRIPTION); string usage = string.Empty; string assembly = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name; // If no params were given, just print the usage if (args.Length == 0) { // creates usage string usage = Params.CreateUsage(assembly, false); Console.WriteLine("\n" + usage); return (int)exitCodes.EXIT_SUCCESS;//as Exit_Success = 0 ; } try { try { // Verify command line arguments. Params.Parse(args); // If Set RSE Password was inserted, validate password. if (args[0].Trim('-').Equals(SET_RSE_PASSWORD)) { string setRsePasswordParam = Params[SET_RSE_PASSWORD]; if (setRsePasswordParam == null || setRsePasswordParam.Length < 8 || setRsePasswordParam.Length > 32) { throw new Exception("Invalid Argument: RSE Password must contain between 8 to 32 characters."); } } } catch (Exception e) { Console.WriteLine(e.Message); usage = Params.CreateUsage(assembly, false); Console.WriteLine(usage); return 0; } bool verbose = Params.Selected(CmdLineArguments.OPT_VERBOSE); //Create the WSMan Connection. //Check if TLS option is selected or not. if (Params.Selected(CmdLineArguments.OPT_SECURE) == false) { api = new RemoteControlApi(Params[CmdLineArguments.OPT_HOST], Params[CmdLineArguments.OPT_USER], Params[CmdLineArguments.OPT_PASS], Params.Selected(CmdLineArguments.OPT_KRB), Params.GetWebProxy(), Params.Selected(CmdLineArguments.ACCEPT_SELF_SIGNED_CERTIFICATE)); } else { api = new RemoteControlApi(Params[CmdLineArguments.OPT_HOST], Params[CmdLineArguments.OPT_USER], Params[CmdLineArguments.OPT_PASS], Params[CmdLineArguments.OPT_CERT], Params.Selected(CmdLineArguments.OPT_KRB), Params.GetWebProxy(), Params.Selected(CmdLineArguments.ACCEPT_SELF_SIGNED_CERTIFICATE)); } // Main flow //check for only 1 parameter switch (args[0].Trim('-')) { case ALL: api.GetSystemPowerState(); api.GetSystemPowerManagementCapabilities(); api.ChangeSystemPowerState(PowerState.On, verbose); api.RetrieveTheBootConfigurationSettings(verbose); api.GetBootDetails(verbose); api.GetBootCapabilities(verbose); api.ConfigBootSource("none", verbose); api.GetCPUState(); break; case GET_POWER_CAPABILITIES: api.GetSystemPowerManagementCapabilities(); break; case CPU_STATE: api.GetCPUState(); break; //call DisplayStatus option case GET_BOOT_DETAILS: api.GetBootDetails(verbose); break; //set boot source case SET_BOOT_SOURCE: Console.WriteLine("\nSet the boot source for the next boot"); string bootSource = Params[SET_BOOT_SOURCE]; if (bootSource == null) throw new Exception(); api.ConfigBootSource(bootSource.ToLower(), verbose); Console.WriteLine("Success"); break; //display BootCapabilities Option case GET_BOOT_CAPABILITIES: api.GetBootCapabilities(verbose); break; //change power state case CHANGE_POWER_STATE: Console.WriteLine("\nChange the power state of the Intel AMT machine"); string requestedPowerState = Params[CHANGE_POWER_STATE]; if (requestedPowerState == null) throw new Exception(); requestedPowerState = requestedPowerState.ToLower(); PowerState powerState; switch (requestedPowerState) { case POWER_ON: powerState = PowerState.On; break; case WAKE_FROM_POWER_SAVING: powerState = PowerState.WakeFromPowerSaving; break; case POWER_OFF: powerState = PowerState.SoftOff; break; case POWER_CYCLE: powerState = PowerState.SoftPowerCycle; break; case MASTER_BUS_RESET: powerState = PowerState.MasterBusReset; break; case SLEEP: powerState = PowerState.DeepSleep; break; case HIBERNATE: powerState = PowerState.Hibernate; break; case GRACEFUL_RESET: powerState = PowerState.GracefulReset; break; case GRACEFUL_OFF: powerState = PowerState.GracefulOff; break; case NMI: powerState = PowerState.DiagnosticInterrupt; break; default: throw new ArgumentException("Power state is not a valid power state. " + "Please check the usage for valid options"); } uint result = api.ChangeSystemPowerState(powerState, verbose); if (result == 0) Console.WriteLine("\n Success - Power state change performed.. "); break; case GET_SYSTEM_POWER_STATE: api.GetSystemPowerState(); break; case SET_RSE_FLAG: Console.WriteLine("\nSet the RSE for the next boot"); bool rse; string set_rse_flag = Params[SET_RSE_FLAG]; if (set_rse_flag == null) throw new Exception(); bool succ = Boolean.TryParse(set_rse_flag.ToLower(), out rse); if (!succ) Params.MessageDisplay_Color("RSE boot flag value need to be Boolean.", ConsoleColor.Red); else api.SetRSE(rse, verbose); break; case CLEAR_BOOT_OPTIONS: Console.WriteLine("\nClearing all boot options"); api.ClearBootOptions(verbose); break; case SET_RSE_PASSWORD: Console.WriteLine("\nSetting RSE password"); api.SetRSEPassword(Params[SET_RSE_PASSWORD], verbose); break; case SET_RSE_NEXT_BOOT: Console.WriteLine("\nSetting RSE for the next boot"); api.setRSENextBoot(verbose); break; default: Console.WriteLine("No option was selected"); break; } } catch (Exception e) { Params.MessageDisplay_Color("\nFailed!!!", ConsoleColor.Red); //Check for the Type of Exception created during execution. exitCode = (exitCodes)Params.catchType(e, null); } finally { api?.Dispose(); } return (int)exitCode; } #endregion } }