Src/Resources.cs
using System;
using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Management.Automation; using Microsoft.EnterpriseManagement; using Microsoft.EnterpriseManagement.Common; using Microsoft.EnterpriseManagement.Configuration; using Microsoft.EnterpriseManagement.Configuration.IO; using Microsoft.EnterpriseManagement.ConnectorFramework; using System.Text.RegularExpressions; namespace SMLets { [Cmdlet(VerbsCommon.Get, "SCSMResource", DefaultParameterSetName = "MP")] public class GetSMResourceCommand : ObjectCmdletHelper { private Guid _id = Guid.Empty; [Parameter(ParameterSetName = "Guid", Position = 0)] public Guid Id { get { return _id; } set { _id = value; } } private ManagementPack _managementPack; [Parameter(ParameterSetName = "MP")] public ManagementPack ManagementPack { get { return _managementPack; } set { _managementPack = value; } } private string _name; [Parameter(ParameterSetName = "MP", ValueFromPipeline = true)] public string Name { get { return _name; } set { _name = value; } } private string _tag = ".*"; [Parameter] public string Tag { get { return _tag; } set { _tag = value; } } private SwitchParameter _data; [Parameter] public SwitchParameter Data { get { return _data; } set { _data = value; } } private void HandleOutput(ManagementPackResource res) { Regex myTag = new Regex(Tag, RegexOptions.IgnoreCase); // If we don't match our tag, just return if (!myTag.Match(res.XmlTag).Success) { return; } PSObject CompositeResource = new PSObject(res); ManagementPackImage i = res as ManagementPackImage; bool isImage = false; if (i != null) { isImage = true; WriteVerbose("resource is an image!"); } ManagementPackReportResource rep = res as ManagementPackReportResource; bool isReport = false; if (rep != null) { isReport = true; WriteVerbose("resource is an report!"); } if (this.Data || isImage || isReport) { // Just add something if it might be there if (!res.HasNullStream) { try { Stream s = _mg.Resources.GetResourceData(res); int l = (int)s.Length; byte[] data = new byte[l]; s.Read(data, 0, l); s.Close(); s.Dispose(); CompositeResource.Members.Add(new PSNoteProperty("StreamData", data)); CompositeResource.Members.Add(new PSScriptMethod("ConvertToString", ScriptBlock.Create("[char[]]($this.StreamData) -join ''"))); CompositeResource.Members.Add(new PSScriptMethod("Save", ScriptBlock.Create(@" $fs = new-object io.filestream (""$PWD/"" + $this.FileName),OpenOrCreate $result = $fs.write($this.StreamData,0,$this.StreamData.length) $fs.close() $fs.dispose() ""File saved as: "" + $this.Filename "))); } catch { this.WriteWarning("Resource stream " + res.Name + " is unexpectedly null"); } } } CompositeResource.Members.Add(new PSNoteProperty("__TYPE", res.GetType().Name)); this.WriteObject(CompositeResource); } protected override void ProcessRecord() { base.BeginProcessing(); if (Id != Guid.Empty) { try { ManagementPackResource res = _mg.Resources.GetResource<ManagementPackResource>(Id); HandleOutput(res); } catch (Exception e) { ThrowTerminatingError(new ErrorRecord(e, "Resource Failure", ErrorCategory.InvalidOperation, Id)); } } else if (ManagementPack != null) { if (Name != null) { try { ManagementPackResource res = ManagementPack.GetResource<ManagementPackResource>(Name); HandleOutput(res); } catch (Exception e) { ThrowTerminatingError(new ErrorRecord(e, "Resource Failure", ErrorCategory.InvalidOperation, Name)); } } else { foreach (ManagementPackResource r in ManagementPack.GetResources<ManagementPackResource>()) { HandleOutput(r); } } } else // Get all the resources!!! { foreach (ManagementPackResource r in _mg.Resources.GetResources<ManagementPackResource>()) { HandleOutput(r); } } } } } |