using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; using System.Management.Automation.Provider; using Intel.Management.Wsman; namespace Intel.Management.PSModule.Amt { class EventLogService : DriveContainer { public EventLogService(DriveItem parent) : base("Logs", parent) { } public override void GetChildItems(ChildWriter writer) { IWsmanConnection conn = ((AmtRootService)GetRoot()).Connection; IManagedReference eventLogRef = conn.NewReference("AMT_MessageLog"); eventLogRef.AddSelector("Name", "Intel(r) AMT:MessageLog 1"); IManagedReference auditLogRef = conn.NewReference("AMT_AuditLog"); auditLogRef.AddSelector("Name", "Intel(r) AMT:Audit Log"); writer.Add(new Log(eventLogRef, "EventLog", this)); writer.Add(new AuditLogService(auditLogRef, this)); writer.Add(new IDERLog(this)); writer.Add(new SetupLog( this)); } public override object GetReturnObject() { return new NameValuePairItem(Name, Value); } class IDERLog : DriveItem { public IDERLog(DriveItem parent) : base("Redirection",new Content(), parent) { } public override IContentReader GetContentReader( DriveProvider provider) { IWsmanConnection conn = ((AmtRootService)GetRoot()).Connection; IManagedReference refToLog = conn.NewReference("AMT_RedirectionService"); return new IDERLogReader(refToLog); } public override object GetReturnObject() { return new NameValuePairItem(Name, Value); } } class IDERLogReader : IContentReader { IManagedReference _refToLog; int _count; public IDERLogReader(IManagedReference refToLog) { _refToLog = refToLog; _count = -1; } public void Dispose() { } public void Close() { _count = -1; } public void Seek(long offset, System.IO.SeekOrigin origin) { } public System.Collections.IList Read(long size) { System.Collections.IList list = new System.Collections.ArrayList(); if (_count < 0) { _count = 0; IManagedInstance service = _refToLog.Get(); foreach (IWsmanItem item in service.GetProperty("AccessLog")) { list.Add(item.ToString()); _count++; } } return list; } } class SetupLog : DriveItem { public SetupLog(DriveItem parent) : base("Setup", new Content(), parent) { } public override IContentReader GetContentReader(DriveProvider provider) { IWsmanConnection conn = ((AmtRootService)GetRoot()).Connection; IManagedReference refToLog = conn.NewReference("AMT_SetupAndConfigurationService"); return new SetupLogReader(refToLog); } public override object GetReturnObject() { return new NameValuePairItem(Name, Value); } } class SetupLogReader : IContentReader { IManagedReference _refToLog; int _count; public SetupLogReader(IManagedReference refToLog) { _refToLog = refToLog; _count = -1; } public void Dispose() { } public void Close() { _count = -1; } public void Seek(long offset, System.IO.SeekOrigin origin) { } public System.Collections.IList Read(long size) { System.Collections.IList list = new System.Collections.ArrayList(); if (_count < 0) { _count = 0; IManagedInstance service = _refToLog.Get(); IManagedInstance inputObj = _refToLog.CreateMethodInput("GetProvisioningAuditRecord"); IManagedInstance outObj = _refToLog.InvokeMethod(inputObj); if (outObj.GetProperty("ReturnValue").ToString().Equals("0")) { string suffix = outObj.GetProperty("ProvServerFQDN").ToString(); long sec = long.Parse(outObj.GetProperty("TlsStartTime").ToString()); DateTime timestamp = new DateTime(1970, 1, 1); timestamp = timestamp.AddSeconds(sec); uint isDefault = 0; if (outObj.GetProperty("IsOemDefault").ToString().Equals("true")) isDefault = 1; uint isTimeValid = 0; if (outObj.GetProperty("IsTimeValid").ToString().Equals("true")) isTimeValid = 1; uint additionalSerials = 0; if (outObj.GetProperty("AdditionalCaSerialNums").ToString().Equals("true")) additionalSerials = 1; byte[] serials = new byte[0]; if (additionalSerials != 0) serials = Convert.FromBase64String(outObj.GetProperty("CaCertificateSerials").ToString()); Intel.Management.Mei.HECIClass.HashAlgorithm hashAlg = (Intel.Management.Mei.HECIClass.HashAlgorithm) int.Parse(outObj.GetProperty("SelectedHashType").ToString()); Intel.Management.Mei.HECIClass.AuditRecord record = new Intel.Management.Mei.HECIClass.AuditRecord(timestamp, suffix, uint.Parse(outObj.GetProperty("ProvServerIP").ToString()), isDefault, Convert.FromBase64String(outObj.GetProperty("SelectedHashData").ToString()), hashAlg, isTimeValid, additionalSerials, serials); list.Add(record); _count = 1; } } return list; } } enum CharacterSetType { Unknown=0, Other=1, ASCII=2, Unicode=3, ISO2022=4, ISO8859=5, ExtendedUNIXCode=6, UTF8=7, UCS2=8, BitmappedData=9, OctetString=10, DefinedByIndividualRecords=11 } enum LastChangeType { Unknown=0, Add=1, Delete=2, Modify=3, Cleared=4 } enum OverwritePolicyType { Unknown=0, Other=1, WrapsWhenFull=2, ClearWhenNearFull=3, OverwriteOutdatedWhenNeeded=4, RemoveOutdatedRecords=5, OverwriteSpecificRecords=6, NeverOverwrite=7, } enum CapabilitiesType { Unknown=0, Other=1, WriteRecordSupported=2, DeleteRecordSupported=3, CanMoveBackward=4, FreezeSupported=5, ClearLogSupported=6, SupportsAddressingByOrdinalRecordNumber=7, VariableLengthRecordsSupported=8, VariableFormatsForRecords=9, CanFlagRecordsForOverwrite=10 } enum LogStateType { Unknown=0, Normal=2, Erasing=3, NotApplicable=4, } class AmtLogReader : IContentReader { IManagedReference _refToLog; string _iterator; bool _reading; List _records; IFormatProvider _formatProvider; public AmtLogReader(IManagedReference refToLog) { _refToLog = refToLog; _records = new List(); _reading=true; _formatProvider = new MessageFormat(); } public void Dispose() { } public void Close() { _iterator = null; } public void Seek(long offset, System.IO.SeekOrigin origin) { } public System.Collections.IList Read(long size) { System.Collections.IList list = new System.Collections.ArrayList(); if (_iterator == null) PositionToFirstRecord(); if (_iterator != null) { if (_records.Count < size && _reading) GetRecords(); for (int i=0; i0; i++) { byte[] data = _records[0]; _records.RemoveAt(0); IntPtr recPtr = Marshal.AllocCoTaskMem(data.Length); try { Marshal.Copy(data, 0, recPtr, data.Length); list.Add(AmtMessageLogEntry.CreateFromPtr(recPtr,_formatProvider)); } finally { Marshal.FreeCoTaskMem(recPtr); } } } return list; } void PositionToFirstRecord() { IManagedInstance inputObj = _refToLog.CreateMethodInput("PositionToFirstRecord"); IManagedInstance outObj = _refToLog.InvokeMethod(inputObj); string returnValue = outObj.GetProperty("ReturnValue").ToString(); if (returnValue.Equals("0")) { _iterator= outObj.GetProperty("IterationIdentifier").ToString(); } else if (returnValue.Equals("1")) { ThrowReadError(outObj, returnValue, "Not Supported"); } } void GetRecords() { IManagedInstance inputObj = _refToLog.CreateMethodInput("GetRecords"); inputObj.SetProperty("IterationIdentifier", _iterator); inputObj.SetProperty("MaxReadRecords","195"); IManagedInstance outObj = _refToLog.InvokeMethod(inputObj); string returnValue = outObj.GetProperty("ReturnValue").ToString(); if (returnValue.Equals("0")) { foreach (IWsmanItem item in outObj.GetProperty("RecordArray")) { _records.Add(Convert.FromBase64String(item.ToString())); } _iterator = outObj.GetProperty("IterationIdentifier").ToString(); _reading = outObj.GetProperty("NoMoreRecords").ToString().Equals("false"); } else if (returnValue.Equals("1")) { ThrowReadError(outObj, returnValue, "Not Supported"); } else if (returnValue.Equals("2")) { ThrowReadError(outObj, returnValue, "Invalid record pointed"); } else if (returnValue.Equals("3")) { ThrowReadError(outObj, returnValue, "No record exists in log"); } } void ThrowReadError(IManagedInstance resultObj,string value,string message) { StringBuilder builder = new StringBuilder(); builder.Append(resultObj.SimpleName); builder.Append(".ReturnValue="); builder.Append(value); builder.Append(" "); builder.Append(message); throw new AmtException(builder.ToString()); } } class Log : DriveItem { IManagedReference _refToLog; static string[] _properties = {"CharacterSet", "IsFrozen", "LastChange", "PercentageNearFull", "OverwritePolicy", "SizeOfRecordHeader", "MaxRecordSize", "SizeOfHeader", "MaxLogSize", "Capabilities", "MaxNumberOfRecords", "CurrentNumberOfRecords", "LogState",}; CharacterSetType _characterSet; bool _isFrozen; LastChangeType _lastChange; int _percentageNearFull; OverwritePolicyType _overwritePolicy; ulong _sizeOfRecordHeader; ulong _maxRecordSize; ulong _sizeOfHeader; ulong _maxLogSize; CapabilitiesType[] _capabilities; ulong _maxNumberOfRecords; ulong _currentNumberOfRecords; LogStateType _logState; public Log(IManagedReference refToLog,string logName,DriveItem parent) : base(logName,new Content(), parent) { IManagedInstance logObj = refToLog.Get(); _characterSet= (CharacterSetType)int.Parse(logObj.GetProperty("CharacterSet").ToString()); _isFrozen=bool.Parse(logObj.GetProperty("IsFrozen").ToString()); _lastChange=(LastChangeType)int.Parse(logObj.GetProperty("LastChange").ToString()); _percentageNearFull=int.Parse(logObj.GetProperty("PercentageNearFull").ToString()); _overwritePolicy=(OverwritePolicyType)int.Parse(logObj.GetProperty("OverwritePolicy").ToString()); _sizeOfRecordHeader=ulong.Parse(logObj.GetProperty("SizeOfRecordHeader").ToString()); _maxRecordSize=ulong.Parse(logObj.GetProperty("MaxRecordSize").ToString()); _sizeOfHeader=ulong.Parse(logObj.GetProperty("SizeOfHeader").ToString()); _maxLogSize=ulong.Parse(logObj.GetProperty("MaxLogSize").ToString()); List caps = new List(); foreach (IWsmanItem item in logObj.GetProperty("Capabilities")) { caps.Add((CapabilitiesType)int.Parse(item.ToString())); } _capabilities=caps.ToArray(); _maxNumberOfRecords=ulong.Parse(logObj.GetProperty("MaxNumberOfRecords").ToString()); _currentNumberOfRecords=ulong.Parse(logObj.GetProperty("CurrentNumberOfRecords").ToString()); if (!logObj.GetProperty("LogState").IsNull) _logState = (LogStateType)int.Parse(logObj.GetProperty("LogState").ToString()); _refToLog = refToLog; } public override IContentReader GetContentReader( DriveProvider provider) { return new AmtLogReader(_refToLog); } public override object GetReturnObject() { return new NameValuePairItem(Name, Value); } public override string[] Properties { get { return _properties; } } public CharacterSetType CharacterSet { get { return _characterSet; } } public bool IsFrozen { get { return _isFrozen; } } public LastChangeType LastChange { get { return _lastChange; } } public int PercentageNearFull { get { return _percentageNearFull; } } public OverwritePolicyType OverwritePolicy { get { return _overwritePolicy; } } public ulong SizeOfRecordHeader { get { return _sizeOfRecordHeader; } } public ulong MaxRecordSize { get { return _maxRecordSize; } } public ulong SizeOfHeader { get { return _sizeOfHeader; } } public ulong MaxLogSize { get { return _maxLogSize; } } public CapabilitiesType[] Capabilities { get { return _capabilities; } } public ulong MaxNumberOfRecords { get { return _maxNumberOfRecords; } } public ulong CurrentNumberOfRecords { get { return _currentNumberOfRecords; } } public LogStateType LogState { get { return _logState; } } } } //end eventlog service }// end namespace