PowerShell/src/Microsoft.WSMan.Management/WSManInstance.cs

1636 lines
55 KiB
C#

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.IO;
using System.Management.Automation;
using System.Management.Automation.Provider;
using System.Management.Automation.Runspaces;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Xml;
using Dbg = System.Management.Automation;
namespace Microsoft.WSMan.Management
{
#region Get-WSManInstance
/// <summary>
/// Executes action on a target object specified by RESOURCE_URI, where
/// parameters are specified by key value pairs.
/// eg., Call StartService method on the spooler service
/// Invoke-WSManAction -Action StartService -ResourceURI wmicimv2/Win32_Service
/// -SelectorSet {Name=Spooler}
/// </summary>
[Cmdlet(VerbsCommon.Get, "WSManInstance", DefaultParameterSetName = "GetInstance", HelpUri = "https://go.microsoft.com/fwlink/?LinkId=2096627")]
public class GetWSManInstanceCommand : AuthenticatingWSManCommand, IDisposable
{
#region parameter
/// <summary>
/// The following is the definition of the input parameter "ApplicationName".
/// ApplicationName identifies the remote endpoint.
/// </summary>
[Parameter(ParameterSetName = "GetInstance")]
[Parameter(ParameterSetName = "Enumerate")]
public string ApplicationName
{
get
{
return applicationname;
}
set
{
{ applicationname = value; }
}
}
private string applicationname = null;
/// <summary>
/// The following is the definition of the input parameter "BasePropertiesOnly".
/// Enumerate only those properties that are part of the base class
/// specification in the Resource URI. When
/// Shallow is specified then this flag has no effect.
/// </summary>
[Parameter(ParameterSetName = "Enumerate")]
[Alias("UBPO", "Base")]
public SwitchParameter BasePropertiesOnly
{
get
{
return basepropertiesonly;
}
set
{
{ basepropertiesonly = value; }
}
}
private SwitchParameter basepropertiesonly;
/// <summary>
/// The following is the definition of the input parameter "ComputerName".
/// Executes the management operation on the specified computer(s). The default
/// is the local computer. Type the fully qualified domain name, NETBIOS name or
/// IP address to indicate the remote host(s)
/// </summary>
[Parameter(ParameterSetName = "GetInstance")]
[Parameter(ParameterSetName = "Enumerate")]
[Alias("CN")]
public string ComputerName
{
get
{
return computername;
}
set
{
computername = value;
if ((string.IsNullOrEmpty(computername)) || (computername.Equals(".", StringComparison.OrdinalIgnoreCase)))
{
computername = "localhost";
}
}
}
private string computername = null;
/// <summary>
/// The following is the definition of the input parameter "ConnectionURI".
/// Specifies the transport, server, port, and Prefix, needed to connect to the
/// remote machine. The format of this string is:
/// transport://server:port/Prefix.
/// </summary>
[Parameter(
ParameterSetName = "GetInstance")]
[Parameter(
ParameterSetName = "Enumerate")]
[Alias("CURI", "CU")]
[SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "URI")]
public Uri ConnectionURI
{
get
{
return connectionuri;
}
set
{
{ connectionuri = value; }
}
}
private Uri connectionuri;
/// <summary>
/// The following is the definition of the input parameter "Dialect".
/// Defines the dialect for the filter predicate.
/// </summary>
[Parameter]
public Uri Dialect
{
get
{
return dialect;
}
set
{
{ dialect = value; }
}
}
private Uri dialect;
/// <summary>
/// The following is the definition of the input parameter "Enumerate".
/// Switch indicates list all instances of a management resource. Equivalent to
/// WSManagement Enumerate.
/// </summary>
[Parameter(Mandatory = true,
ParameterSetName = "Enumerate")]
public SwitchParameter Enumerate
{
get
{
return enumerate;
}
set
{
{ enumerate = value; }
}
}
private SwitchParameter enumerate;
/// <summary>
/// The following is the definition of the input parameter "Filter".
/// Indicates the filter expression for the enumeration.
/// </summary>
[Parameter(ParameterSetName = "Enumerate")]
[ValidateNotNullOrEmpty]
public string Filter
{
get
{
return filter;
}
set
{
{ filter = value; }
}
}
private string filter;
/// <summary>
/// The following is the definition of the input parameter "Fragment".
/// Specifies a section inside the instance that is to be updated or retrieved
/// for the given operation.
/// </summary>
[Parameter(ParameterSetName = "GetInstance")]
[ValidateNotNullOrEmpty]
public string Fragment
{
get
{
return fragment;
}
set
{
{ fragment = value; }
}
}
private string fragment;
/// <summary>
/// The following is the definition of the input parameter "OptionSet".
/// OptionSet is a hashtable and is used to pass a set of switches to the
/// service to modify or refine the nature of the request.
/// </summary>
[Parameter(ValueFromPipeline = true,
ValueFromPipelineByPropertyName = true)]
[ValidateNotNullOrEmpty]
[Alias("OS")]
[SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public Hashtable OptionSet
{
get
{
return optionset;
}
set
{
{ optionset = value; }
}
}
private Hashtable optionset;
/// <summary>
/// The following is the definition of the input parameter "Port".
/// Specifies the port to be used when connecting to the ws management service.
/// </summary>
[Parameter(ParameterSetName = "Enumerate")]
[Parameter(ParameterSetName = "GetInstance")]
public int Port
{
get
{
return port;
}
set
{
{ port = value; }
}
}
private int port = 0;
/// <summary>
/// The following is the definition of the input parameter "Associations".
/// Associations indicates retrieval of association instances as opposed to
/// associated instances. This can only be used when specifying the Dialect as
/// Association.
/// </summary>
[Parameter(ParameterSetName = "Enumerate")]
public SwitchParameter Associations
{
get
{
return associations;
}
set
{
{ associations = value; }
}
}
private SwitchParameter associations;
/// <summary>
/// The following is the definition of the input parameter "ResourceURI".
/// URI of the resource class/instance representation.
/// </summary>
[Parameter(Mandatory = true,
Position = 0,
ValueFromPipeline = true,
ValueFromPipelineByPropertyName = true)]
[SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "URI")]
[Alias("RURI")]
public Uri ResourceURI
{
get
{
return resourceuri;
}
set
{
{ resourceuri = value; }
}
}
private Uri resourceuri;
/// <summary>
/// The following is the definition of the input parameter "ReturnType".
/// Indicates the type of data returned. Possible options are 'Object', 'EPR',
/// and 'ObjectAndEPR'. Default is Object.
/// If Object is specified or if this parameter is absent then only the objects
/// are returned
/// If EPR is specified then only the EPRs of the objects
/// are returned. EPRs contain information about the Resource URI and selectors
/// for the instance
/// If ObjectAndEPR is specified, then both the object and the associated EPRs
/// are returned.
/// </summary>
[Parameter(ParameterSetName = "Enumerate")]
[ValidateNotNullOrEmpty]
[ValidateSetAttribute(new string[] { "object", "epr", "objectandepr" })]
[Alias("RT")]
public string ReturnType
{
get
{
return returntype;
}
set
{
{ returntype = value; }
}
}
private string returntype = "object";
/// <summary>
/// The following is the definition of the input parameter "SelectorSet".
/// SelectorSet is a hash table which helps in identify an instance of the
/// management resource if there are more than 1 instance of the resource
/// class.
/// </summary>
[Parameter(
ParameterSetName = "GetInstance")]
[SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public Hashtable SelectorSet
{
get
{
return selectorset;
}
set
{
{ selectorset = value; }
}
}
private Hashtable selectorset;
/// <summary>
/// The following is the definition of the input parameter "SessionOption".
/// Defines a set of extended options for the WSMan session. This can be
/// created by using the cmdlet New-WSManSessionOption.
/// </summary>
[Parameter]
[ValidateNotNullOrEmpty]
[Alias("SO")]
[SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public SessionOption SessionOption
{
get
{
return sessionoption;
}
set
{
{ sessionoption = value; }
}
}
private SessionOption sessionoption;
/// <summary>
/// The following is the definition of the input parameter "Shallow".
/// Enumerate only instances of the base class specified in the resource URI. If
/// this flag is not specified, instances of the base class specified in the URI
/// and all its derived classes are returned.
/// </summary>
[Parameter(ParameterSetName = "Enumerate")]
public SwitchParameter Shallow
{
get
{
return shallow;
}
set
{
{ shallow = value; }
}
}
private SwitchParameter shallow;
/// <summary>
/// The following is the definition of the input parameter "UseSSL".
/// Uses the Secure Sockets Layer (SSL) protocol to establish a connection to
/// the remote computer. If SSL is not available on the port specified by the
/// Port parameter, the command fails.
/// </summary>
[Parameter(ParameterSetName = "GetInstance")]
[Parameter(ParameterSetName = "Enumerate")]
[SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "SSL")]
[Alias("SSL")]
public SwitchParameter UseSSL
{
get
{
return usessl;
}
set
{
{ usessl = value; }
}
}
private SwitchParameter usessl;
#endregion parameter
#region private
private WSManHelper helper;
private string GetFilter()
{
string name;
string value;
string[] Split = filter.Trim().Split(new char[] { '=', ';' });
if ((Split.Length) % 2 != 0)
{
// mismatched property name/value pair
return null;
}
filter = "<wsman:SelectorSet xmlns:wsman='http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd'>";
for (int i = 0; i < Split.Length; i += 2)
{
value = Split[i + 1].Substring(1, Split[i + 1].Length - 2);
name = Split[i];
filter = filter + "<wsman:Selector Name='" + name + "'>" + value + "</wsman:Selector>";
}
filter += "</wsman:SelectorSet>";
return (filter);
}
private void ReturnEnumeration(IWSManEx wsmanObject, IWSManResourceLocator wsmanResourceLocator, IWSManSession wsmanSession)
{
string fragment;
try
{
int flags = 0;
IWSManEnumerator obj;
if (returntype != null)
{
if (returntype.Equals("object", StringComparison.OrdinalIgnoreCase))
{
flags = wsmanObject.EnumerationFlagReturnObject();
}
else if (returntype.Equals("epr", StringComparison.OrdinalIgnoreCase))
{
flags = wsmanObject.EnumerationFlagReturnEPR();
}
else
{
flags = wsmanObject.EnumerationFlagReturnObjectAndEPR();
}
}
if (shallow)
{
flags |= wsmanObject.EnumerationFlagHierarchyShallow();
}
else if (basepropertiesonly)
{
flags |= wsmanObject.EnumerationFlagHierarchyDeepBasePropsOnly();
}
else
{
flags |= wsmanObject.EnumerationFlagHierarchyDeep();
}
if (dialect != null && filter != null)
{
if (dialect.ToString().Equals(helper.ALIAS_WQL, StringComparison.OrdinalIgnoreCase) || dialect.ToString().Equals(helper.URI_WQL_DIALECT, StringComparison.OrdinalIgnoreCase))
{
fragment = helper.URI_WQL_DIALECT;
dialect = new Uri(fragment);
}
else if (dialect.ToString().Equals(helper.ALIAS_ASSOCIATION, StringComparison.OrdinalIgnoreCase) || dialect.ToString().Equals(helper.URI_ASSOCIATION_DIALECT, StringComparison.OrdinalIgnoreCase))
{
if (associations)
{
flags |= wsmanObject.EnumerationFlagAssociationInstance();
}
else
{
flags |= wsmanObject.EnumerationFlagAssociatedInstance();
}
fragment = helper.URI_ASSOCIATION_DIALECT;
dialect = new Uri(fragment);
}
else if (dialect.ToString().Equals(helper.ALIAS_SELECTOR, StringComparison.OrdinalIgnoreCase) || dialect.ToString().Equals(helper.URI_SELECTOR_DIALECT, StringComparison.OrdinalIgnoreCase))
{
filter = GetFilter();
fragment = helper.URI_SELECTOR_DIALECT;
dialect = new Uri(fragment);
}
obj = (IWSManEnumerator)wsmanSession.Enumerate(wsmanResourceLocator, filter, dialect.ToString(), flags);
}
else if (filter != null)
{
fragment = helper.URI_WQL_DIALECT;
dialect = new Uri(fragment);
obj = (IWSManEnumerator)wsmanSession.Enumerate(wsmanResourceLocator, filter, dialect.ToString(), flags);
}
else
{
obj = (IWSManEnumerator)wsmanSession.Enumerate(wsmanResourceLocator, filter, null, flags);
}
while (!obj.AtEndOfStream)
{
XmlDocument xmldoc = new XmlDocument();
xmldoc.LoadXml(obj.ReadItem());
WriteObject(xmldoc.FirstChild);
}
}
catch (Exception ex)
{
ErrorRecord er = new ErrorRecord(ex, "Exception", ErrorCategory.InvalidOperation, null);
WriteError(er);
}
}
#endregion private
#region override
/// <summary>
/// ProcessRecord method.
/// </summary>
protected override void ProcessRecord()
{
IWSManSession m_session = null;
IWSManEx m_wsmanObject = (IWSManEx)new WSManClass();
helper = new WSManHelper(this);
helper.WSManOp = "Get";
string connectionStr = null;
connectionStr = helper.CreateConnectionString(connectionuri, port, computername, applicationname);
if (connectionuri != null)
{
try
{
// in the format http(s)://server[:port/applicationname]
string[] constrsplit = connectionuri.OriginalString.Split(":" + port + "/" + applicationname, StringSplitOptions.None);
string[] constrsplit1 = constrsplit[0].Split("//", StringSplitOptions.None);
computername = constrsplit1[1].Trim();
}
catch (IndexOutOfRangeException)
{
helper.AssertError(helper.GetResourceMsgFromResourcetext("NotProperURI"), false, connectionuri);
}
}
try
{
IWSManResourceLocator m_resource = helper.InitializeResourceLocator(optionset, selectorset, fragment, dialect, m_wsmanObject, resourceuri);
m_session = helper.CreateSessionObject(m_wsmanObject, Authentication, sessionoption, Credential, connectionStr, CertificateThumbprint, usessl.IsPresent);
if (!enumerate)
{
XmlDocument xmldoc = new XmlDocument();
try
{
xmldoc.LoadXml(m_session.Get(m_resource, 0));
}
catch (XmlException ex)
{
helper.AssertError(ex.Message, false, computername);
}
if (!string.IsNullOrEmpty(fragment))
{
WriteObject(xmldoc.FirstChild.LocalName + "=" + xmldoc.FirstChild.InnerText);
}
else
{
WriteObject(xmldoc.FirstChild);
}
}
else
{
try
{
ReturnEnumeration(m_wsmanObject, m_resource, m_session);
}
catch (Exception ex)
{
helper.AssertError(ex.Message, false, computername);
}
}
}
finally
{
if (!string.IsNullOrEmpty(m_wsmanObject.Error))
{
helper.AssertError(m_wsmanObject.Error, true, resourceuri);
}
if (!string.IsNullOrEmpty(m_session.Error))
{
helper.AssertError(m_session.Error, true, resourceuri);
}
if (m_session != null)
Dispose(m_session);
}
}
#endregion override
#region IDisposable Members
/// <summary>
/// Public dispose method.
/// </summary>
public
void
Dispose()
{
// CleanUp();
GC.SuppressFinalize(this);
}
/// <summary>
/// Public dispose method.
/// </summary>
public
void
Dispose(IWSManSession sessionObject)
{
sessionObject = null;
this.Dispose();
}
#endregion IDisposable Members
/// <summary>
/// BeginProcessing method.
/// </summary>
protected override void EndProcessing()
{
helper.CleanUp();
}
}
#endregion
#region Set-WsManInstance
/// <summary>
/// Executes action on a target object specified by RESOURCE_URI, where
/// parameters are specified by key value pairs.
/// eg., Call StartService method on the spooler service
/// Set-WSManInstance -Action StartService -ResourceURI wmicimv2/Win32_Service
/// -SelectorSet {Name=Spooler}
/// </summary>
[Cmdlet(VerbsCommon.Set, "WSManInstance", DefaultParameterSetName = "ComputerName", HelpUri = "https://go.microsoft.com/fwlink/?LinkId=2096937")]
public class SetWSManInstanceCommand : AuthenticatingWSManCommand, IDisposable
{
#region Parameters
/// <summary>
/// The following is the definition of the input parameter "ApplicationName".
/// ApplicationName identifies the remote endpoint.
/// </summary>
[Parameter(ParameterSetName = "ComputerName")]
[ValidateNotNullOrEmpty]
public string ApplicationName
{
get { return applicationname; }
set { applicationname = value; }
}
private string applicationname = null;
/// <summary>
/// The following is the definition of the input parameter "ComputerName".
/// Executes the management operation on the specified computer(s). The default
/// is the local computer. Type the fully qualified domain name, NETBIOS name or
/// IP address to indicate the remote host(s)
/// </summary>
[Parameter(ParameterSetName = "ComputerName")]
[Alias("cn")]
public string ComputerName
{
get
{
return computername;
}
set
{
computername = value;
if ((string.IsNullOrEmpty(computername)) || (computername.Equals(".", StringComparison.OrdinalIgnoreCase)))
{
computername = "localhost";
}
}
}
private string computername = null;
/// <summary>
/// The following is the definition of the input parameter "ConnectionURI".
/// Specifies the transport, server, port, and ApplicationName of the new
/// runspace. The format of this string is:
/// transport://server:port/ApplicationName.
/// </summary>
[SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "URI")]
[Parameter(ParameterSetName = "URI")]
[ValidateNotNullOrEmpty]
public Uri ConnectionURI
{
get { return connectionuri; }
set { connectionuri = value; }
}
private Uri connectionuri;
/// <summary>
/// The following is the definition of the input parameter "Dialect".
/// Defines the dialect for the filter predicate.
/// </summary>
[Parameter]
[ValidateNotNullOrEmpty]
public Uri Dialect
{
get { return dialect; }
set { dialect = value; }
}
private Uri dialect;
/// <summary>
/// The following is the definition of the input parameter "FilePath".
/// Updates the management resource specified by the ResourceURI and SelectorSet
/// via this input file.
/// </summary>
[Parameter(ValueFromPipelineByPropertyName = true)]
[Alias("Path")]
[ValidateNotNullOrEmpty]
public string FilePath
{
get { return filepath; }
set { filepath = value; }
}
private string filepath;
/// <summary>
/// The following is the definition of the input parameter "Fragment".
/// Specifies a section inside the instance that is to be updated or retrieved
/// for the given operation.
/// </summary>
[Parameter(ParameterSetName = "ComputerName")]
[Parameter(ParameterSetName = "URI")]
[ValidateNotNullOrEmpty]
public string Fragment
{
get { return fragment; }
set { fragment = value; }
}
private string fragment;
/// <summary>
/// The following is the definition of the input parameter "OptionSet".
/// OptionSet is a hahs table which help modify or refine the nature of the
/// request. These are similar to switches used in command line shells in that
/// they are service-specific.
/// </summary>
[Parameter]
[SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
[Alias("os")]
[ValidateNotNullOrEmpty]
public Hashtable OptionSet
{
get { return optionset; }
set { optionset = value; }
}
private Hashtable optionset;
/// <summary>
/// The following is the definition of the input parameter "Port".
/// Specifies the port to be used when connecting to the ws management service.
/// </summary>
[Parameter(ParameterSetName = "ComputerName")]
[ValidateNotNullOrEmpty]
[ValidateRange(1, int.MaxValue)]
public int Port
{
get { return port; }
set { port = value; }
}
private int port = 0;
/// <summary>
/// The following is the definition of the input parameter "ResourceURI".
/// URI of the resource class/instance representation.
/// </summary>
[SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "URI")]
[SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Resourceuri")]
[Parameter(Mandatory = true, Position = 0)]
[Alias("ruri")]
[ValidateNotNullOrEmpty]
public Uri ResourceURI
{
get { return resourceuri; }
set { resourceuri = value; }
}
private Uri resourceuri;
/// <summary>
/// The following is the definition of the input parameter "SelectorSet".
/// SelectorSet is a hash table which helps in identify an instance of the
/// management resource if there are more than 1 instance of the resource
/// class.
/// </summary>
[Parameter(Position = 1,
ValueFromPipeline = true,
ValueFromPipelineByPropertyName = true)]
[SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
[ValidateNotNullOrEmpty]
public Hashtable SelectorSet
{
get { return selectorset; }
set { selectorset = value; }
}
private Hashtable selectorset;
/// <summary>
/// The following is the definition of the input parameter "SessionOption".
/// Defines a set of extended options for the WSMan session. This can be created
/// by using the cmdlet New-WSManSessionOption.
/// </summary>
[Parameter]
[SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
[Alias("so")]
[ValidateNotNullOrEmpty]
public SessionOption SessionOption
{
get { return sessionoption; }
set { sessionoption = value; }
}
private SessionOption sessionoption;
/// <summary>
/// The following is the definition of the input parameter "UseSSL".
/// Uses the Secure Sockets Layer (SSL) protocol to establish a connection to
/// the remote computer. If SSL is not available on the port specified by the
/// Port parameter, the command fails.
/// </summary>
[Parameter(ParameterSetName = "ComputerName")]
[SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "SSL")]
[Alias("ssl")]
public SwitchParameter UseSSL
{
get { return usessl; }
set { usessl = value; }
}
private SwitchParameter usessl;
/// <summary>
/// The following is the definition of the input parameter "ValueSet".
/// ValueSet is a hash table which helps to modify resource represented by the
/// ResourceURI and SelectorSet.
/// </summary>
[Parameter(ValueFromPipelineByPropertyName = true)]
[SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
[ValidateNotNullOrEmpty]
public Hashtable ValueSet
{
get { return valueset; }
set { valueset = value; }
}
private Hashtable valueset;
#endregion
private WSManHelper helper;
/// <summary>
/// ProcessRecord method.
/// </summary>
protected override void ProcessRecord()
{
IWSManEx m_wsmanObject = (IWSManEx)new WSManClass();
helper = new WSManHelper(this);
helper.WSManOp = "set";
IWSManSession m_session = null;
if (dialect != null)
{
if (dialect.ToString().Equals(helper.ALIAS_WQL, StringComparison.OrdinalIgnoreCase))
dialect = new Uri(helper.URI_WQL_DIALECT);
if (dialect.ToString().Equals(helper.ALIAS_SELECTOR, StringComparison.OrdinalIgnoreCase))
dialect = new Uri(helper.URI_SELECTOR_DIALECT);
if (dialect.ToString().Equals(helper.ALIAS_ASSOCIATION, StringComparison.OrdinalIgnoreCase))
dialect = new Uri(helper.URI_ASSOCIATION_DIALECT);
}
try
{
string connectionStr = string.Empty;
connectionStr = helper.CreateConnectionString(connectionuri, port, computername, applicationname);
if (connectionuri != null)
{
try
{
// in the format http(s)://server[:port/applicationname]
string[] constrsplit = connectionuri.OriginalString.Split(":" + port + "/" + applicationname, StringSplitOptions.None);
string[] constrsplit1 = constrsplit[0].Split("//", StringSplitOptions.None);
computername = constrsplit1[1].Trim();
}
catch (IndexOutOfRangeException)
{
helper.AssertError(helper.GetResourceMsgFromResourcetext("NotProperURI"), false, connectionuri);
}
}
IWSManResourceLocator m_resource = helper.InitializeResourceLocator(optionset, selectorset, fragment, dialect, m_wsmanObject, resourceuri);
m_session = helper.CreateSessionObject(m_wsmanObject, Authentication, sessionoption, Credential, connectionStr, CertificateThumbprint, usessl.IsPresent);
string rootNode = helper.GetRootNodeName(helper.WSManOp, m_resource.ResourceUri, null);
string input = helper.ProcessInput(m_wsmanObject, filepath, helper.WSManOp, rootNode, valueset, m_resource, m_session);
XmlDocument xmldoc = new XmlDocument();
try
{
xmldoc.LoadXml(m_session.Put(m_resource, input, 0));
}
catch (XmlException ex)
{
helper.AssertError(ex.Message, false, computername);
}
if (!string.IsNullOrEmpty(fragment))
{
if (xmldoc.DocumentElement.ChildNodes.Count > 0)
{
foreach (XmlNode node in xmldoc.DocumentElement.ChildNodes)
{
if (node.Name.Equals(fragment, StringComparison.OrdinalIgnoreCase))
WriteObject(node.Name + " = " + node.InnerText);
}
}
}
else
WriteObject(xmldoc.DocumentElement);
}
finally
{
if (!string.IsNullOrEmpty(m_wsmanObject.Error))
{
helper.AssertError(m_wsmanObject.Error, true, resourceuri);
}
if (!string.IsNullOrEmpty(m_session.Error))
{
helper.AssertError(m_session.Error, true, resourceuri);
}
if (m_session != null)
Dispose(m_session);
}
}
#region IDisposable Members
/// <summary>
/// Public dispose method.
/// </summary>
public
void
Dispose()
{
// CleanUp();
GC.SuppressFinalize(this);
}
/// <summary>
/// Public dispose method.
/// </summary>
public
void
Dispose(IWSManSession sessionObject)
{
sessionObject = null;
this.Dispose();
}
#endregion IDisposable Members
/// <summary>
/// BeginProcessing method.
/// </summary>
protected override void EndProcessing()
{
helper.CleanUp();
}
}
#endregion
#region Remove-WsManInstance
/// <summary>
/// Executes action on a target object specified by RESOURCE_URI, where
/// parameters are specified by key value pairs.
/// eg., Call StartService method on the spooler service
/// Set-WSManInstance -Action StartService -ResourceURI wmicimv2/Win32_Service
/// -SelectorSet {Name=Spooler}
/// </summary>
[Cmdlet(VerbsCommon.Remove, "WSManInstance", DefaultParameterSetName = "ComputerName", HelpUri = "https://go.microsoft.com/fwlink/?LinkId=2096721")]
public class RemoveWSManInstanceCommand : AuthenticatingWSManCommand, IDisposable
{
#region Parameters
/// <summary>
/// The following is the definition of the input parameter "ApplicationName".
/// ApplicationName identifies the remote endpoint.
/// </summary>
[Parameter(ParameterSetName = "ComputerName")]
[ValidateNotNullOrEmpty]
public string ApplicationName
{
get { return applicationname; }
set { applicationname = value; }
}
private string applicationname = null;
/// <summary>
/// The following is the definition of the input parameter "ComputerName".
/// Executes the management operation on the specified computer(s). The default
/// is the local computer. Type the fully qualified domain name, NETBIOS name or
/// IP address to indicate the remote host(s)
/// </summary>
[Parameter(ParameterSetName = "ComputerName")]
[Alias("cn")]
public string ComputerName
{
get
{
return computername;
}
set
{
computername = value;
if ((string.IsNullOrEmpty(computername)) || (computername.Equals(".", StringComparison.OrdinalIgnoreCase)))
{
computername = "localhost";
}
}
}
private string computername = null;
/// <summary>
/// The following is the definition of the input parameter "ConnectionURI".
/// Specifies the transport, server, port, and ApplicationName of the new
/// runspace. The format of this string is:
/// transport://server:port/ApplicationName.
/// </summary>
[SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "URI")]
[Parameter(ParameterSetName = "URI")]
[ValidateNotNullOrEmpty]
public Uri ConnectionURI
{
get { return connectionuri; }
set { connectionuri = value; }
}
private Uri connectionuri;
/// <summary>
/// The following is the definition of the input parameter "OptionSet".
/// OptionSet is a hahs table which help modify or refine the nature of the
/// request. These are similar to switches used in command line shells in that
/// they are service-specific.
/// </summary>
[Parameter]
[SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
[Alias("os")]
[ValidateNotNullOrEmpty]
public Hashtable OptionSet
{
get { return optionset; }
set { optionset = value; }
}
private Hashtable optionset;
/// <summary>
/// The following is the definition of the input parameter "Port".
/// Specifies the port to be used when connecting to the ws management service.
/// </summary>
[Parameter(ParameterSetName = "ComputerName")]
[ValidateNotNullOrEmpty]
[ValidateRange(1, int.MaxValue)]
public int Port
{
get { return port; }
set { port = value; }
}
private int port = 0;
/// <summary>
/// The following is the definition of the input parameter "ResourceURI".
/// URI of the resource class/instance representation.
/// </summary>
[SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "URI")]
[SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Resourceuri")]
[Parameter(Mandatory = true, Position = 0)]
[Alias("ruri")]
[ValidateNotNullOrEmpty]
public Uri ResourceURI
{
get { return resourceuri; }
set { resourceuri = value; }
}
private Uri resourceuri;
/// <summary>
/// The following is the definition of the input parameter "SelectorSet".
/// SelectorSet is a hash table which helps in identify an instance of the
/// management resource if there are more than 1 instance of the resource
/// class.
/// </summary>
[Parameter(Position = 1, Mandatory = true,
ValueFromPipeline = true,
ValueFromPipelineByPropertyName = true)]
[SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
[ValidateNotNullOrEmpty]
public Hashtable SelectorSet
{
get { return selectorset; }
set { selectorset = value; }
}
private Hashtable selectorset;
/// <summary>
/// The following is the definition of the input parameter "SessionOption".
/// Defines a set of extended options for the WSMan session. This can be created
/// by using the cmdlet New-WSManSessionOption.
/// </summary>
[Parameter]
[SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
[Alias("so")]
[ValidateNotNullOrEmpty]
public SessionOption SessionOption
{
get { return sessionoption; }
set { sessionoption = value; }
}
private SessionOption sessionoption;
/// <summary>
/// The following is the definition of the input parameter "UseSSL".
/// Uses the Secure Sockets Layer (SSL) protocol to establish a connection to
/// the remote computer. If SSL is not available on the port specified by the
/// Port parameter, the command fails.
/// </summary>
[Parameter(ParameterSetName = "ComputerName")]
[SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "SSL")]
[Alias("ssl")]
public SwitchParameter UseSSL
{
get { return usessl; }
set { usessl = value; }
}
private SwitchParameter usessl;
#endregion
/// <summary>
/// ProcessRecord method.
/// </summary>
protected override void ProcessRecord()
{
WSManHelper helper = new WSManHelper(this);
IWSManEx m_wsmanObject = (IWSManEx)new WSManClass();
helper.WSManOp = "remove";
IWSManSession m_session = null;
try
{
string connectionStr = string.Empty;
connectionStr = helper.CreateConnectionString(connectionuri, port, computername, applicationname);
if (connectionuri != null)
{
try
{
// in the format http(s)://server[:port/applicationname]
string[] constrsplit = connectionuri.OriginalString.Split(":" + port + "/" + applicationname, StringSplitOptions.None);
string[] constrsplit1 = constrsplit[0].Split("//", StringSplitOptions.None);
computername = constrsplit1[1].Trim();
}
catch (IndexOutOfRangeException)
{
helper.AssertError(helper.GetResourceMsgFromResourcetext("NotProperURI"), false, connectionuri);
}
}
IWSManResourceLocator m_resource = helper.InitializeResourceLocator(optionset, selectorset, null, null, m_wsmanObject, resourceuri);
m_session = helper.CreateSessionObject(m_wsmanObject, Authentication, sessionoption, Credential, connectionStr, CertificateThumbprint, usessl.IsPresent);
string ResourceURI = helper.GetURIWithFilter(resourceuri.ToString(), null, selectorset, helper.WSManOp);
try
{
((IWSManSession)m_session).Delete(ResourceURI, 0);
}
catch (Exception ex)
{
helper.AssertError(ex.Message, false, computername);
}
}
finally
{
if (!string.IsNullOrEmpty(m_session.Error))
{
helper.AssertError(m_session.Error, true, resourceuri);
}
if (!string.IsNullOrEmpty(m_wsmanObject.Error))
{
helper.AssertError(m_wsmanObject.Error, true, resourceuri);
}
if (m_session != null)
Dispose(m_session);
}
}
#region IDisposable Members
/// <summary>
/// Public dispose method.
/// </summary>
public
void
Dispose()
{
// CleanUp();
GC.SuppressFinalize(this);
}
/// <summary>
/// Public dispose method.
/// </summary>
public
void
Dispose(IWSManSession sessionObject)
{
sessionObject = null;
this.Dispose();
}
#endregion IDisposable Members
}
#endregion
#region New-WsManInstance
/// <summary>
/// Creates an instance of a management resource identified by the resource URI
/// using specified ValueSet or input File.
/// </summary>
[Cmdlet(VerbsCommon.New, "WSManInstance", DefaultParameterSetName = "ComputerName", HelpUri = "https://go.microsoft.com/fwlink/?LinkId=2096933")]
public class NewWSManInstanceCommand : AuthenticatingWSManCommand, IDisposable
{
/// <summary>
/// The following is the definition of the input parameter "ApplicationName".
/// ApplicationName identifies the remote endpoint.
/// </summary>
[Parameter(ParameterSetName = "ComputerName")]
[ValidateNotNullOrEmpty]
public string ApplicationName
{
get { return applicationname; }
set { applicationname = value; }
}
private string applicationname = null;
/// <summary>
/// The following is the definition of the input parameter "ComputerName".
/// Executes the management operation on the specified computer(s). The default
/// is the local computer. Type the fully qualified domain name, NETBIOS name or
/// IP address to indicate the remote host(s)
/// </summary>
[Parameter(ParameterSetName = "ComputerName")]
[Alias("cn")]
public string ComputerName
{
get
{
return computername;
}
set
{
computername = value;
if ((string.IsNullOrEmpty(computername)) || (computername.Equals(".", StringComparison.OrdinalIgnoreCase)))
{
computername = "localhost";
}
}
}
private string computername = null;
/// <summary>
/// The following is the definition of the input parameter "ConnectionURI".
/// Specifies the transport, server, port, and ApplicationName of the new
/// runspace. The format of this string is:
/// transport://server:port/ApplicationName.
/// </summary>
[Parameter(ParameterSetName = "URI")]
[ValidateNotNullOrEmpty]
[Alias("CURI", "CU")]
[SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "URI")]
public Uri ConnectionURI
{
get { return connectionuri; }
set { connectionuri = value; }
}
private Uri connectionuri;
/// <summary>
/// The following is the definition of the input parameter "FilePath".
/// Updates the management resource specified by the ResourceURI and SelectorSet
/// via this input file.
/// </summary>
[Parameter]
[ValidateNotNullOrEmpty]
[Alias("Path")]
public string FilePath
{
get { return filepath; }
set { filepath = value; }
}
private string filepath;
/// <summary>
/// The following is the definition of the input parameter "OptionSet".
/// OptionSet is a hash table and is used to pass a set of switches to the
/// service to modify or refine the nature of the request.
/// </summary>
[Parameter]
[ValidateNotNullOrEmpty]
[SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
[Alias("os")]
public Hashtable OptionSet
{
get { return optionset; }
set { optionset = value; }
}
private Hashtable optionset;
/// <summary>
/// The following is the definition of the input parameter "Port".
/// Specifies the port to be used when connecting to the ws management service.
/// </summary>
[Parameter(ParameterSetName = "ComputerName")]
[ValidateNotNullOrEmpty]
[ValidateRange(1, int.MaxValue)]
public int Port
{
get { return port; }
set { port = value; }
}
private int port = 0;
/// <summary>
/// The following is the definition of the input parameter "ResourceURI".
/// URI of the resource class/instance representation.
/// </summary>
[Parameter(Mandatory = true, Position = 0)]
[ValidateNotNullOrEmpty]
[Alias("ruri")]
[SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "URI")]
public Uri ResourceURI
{
get { return resourceuri; }
set { resourceuri = value; }
}
private Uri resourceuri;
/// <summary>
/// The following is the definition of the input parameter "SelectorSet".
/// SelectorSet is a hash table which helps in identify an instance of the
/// management resource if there are more than 1 instance of the resource
/// class.
/// </summary>
[Parameter(Mandatory = true, Position = 1,
ValueFromPipeline = true)]
[ValidateNotNullOrEmpty]
[SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public Hashtable SelectorSet
{
get { return selectorset; }
set { selectorset = value; }
}
private Hashtable selectorset;
/// <summary>
/// The following is the definition of the input parameter "SessionOption".
/// Defines a set of extended options for the WSMan session.
/// </summary>
[Parameter]
[ValidateNotNullOrEmpty]
[SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
[Alias("so")]
public SessionOption SessionOption
{
get { return sessionoption; }
set { sessionoption = value; }
}
private SessionOption sessionoption;
/// <summary>
/// The following is the definition of the input parameter "UseSSL".
/// Uses the Secure Sockets Layer (SSL) protocol to establish a connection to
/// the remote computer. If SSL is not available on the port specified by the
/// Port parameter, the command fails.
/// </summary>
[Parameter(ParameterSetName = "ComputerName")]
[SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "SSL")]
public SwitchParameter UseSSL
{
get { return usessl; }
set { usessl = value; }
}
private SwitchParameter usessl;
/// <summary>
/// The following is the definition of the input parameter "ValueSet".
/// ValueSet is a hash table which helps to modify resource represented by the
/// ResourceURI and SelectorSet.
/// </summary>
[Parameter]
[SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public Hashtable ValueSet
{
get { return valueset; }
set { valueset = value; }
}
private Hashtable valueset;
private WSManHelper helper;
private readonly IWSManEx m_wsmanObject = (IWSManEx)new WSManClass();
private IWSManSession m_session = null;
private string connectionStr = string.Empty;
/// <summary>
/// BeginProcessing method.
/// </summary>
protected override void BeginProcessing()
{
helper = new WSManHelper(this);
helper.WSManOp = "new";
connectionStr = helper.CreateConnectionString(connectionuri, port, computername, applicationname);
if (connectionuri != null)
{
try
{
// in the format http(s)://server[:port/applicationname]
string[] constrsplit = connectionuri.OriginalString.Split(":" + port + "/" + applicationname, StringSplitOptions.None);
string[] constrsplit1 = constrsplit[0].Split("//", StringSplitOptions.None);
computername = constrsplit1[1].Trim();
}
catch (IndexOutOfRangeException)
{
helper.AssertError(helper.GetResourceMsgFromResourcetext("NotProperURI"), false, connectionuri);
}
}
}
/// <summary>
/// ProcessRecord method.
/// </summary>
protected override void ProcessRecord()
{
try
{
IWSManResourceLocator m_resource = helper.InitializeResourceLocator(optionset, selectorset, null, null, m_wsmanObject, resourceuri);
// create the session object
m_session = helper.CreateSessionObject(m_wsmanObject, Authentication, sessionoption, Credential, connectionStr, CertificateThumbprint, usessl.IsPresent);
string rootNode = helper.GetRootNodeName(helper.WSManOp, m_resource.ResourceUri, null);
string input = helper.ProcessInput(m_wsmanObject, filepath, helper.WSManOp, rootNode, valueset, m_resource, m_session);
try
{
string resultXml = m_session.Create(m_resource, input, 0);
XmlDocument xmldoc = new XmlDocument();
xmldoc.LoadXml(resultXml);
WriteObject(xmldoc.DocumentElement);
}
catch (Exception ex)
{
helper.AssertError(ex.Message, false, computername);
}
}
finally
{
if (!string.IsNullOrEmpty(m_wsmanObject.Error))
{
helper.AssertError(m_wsmanObject.Error, true, resourceuri);
}
if (!string.IsNullOrEmpty(m_session.Error))
{
helper.AssertError(m_session.Error, true, resourceuri);
}
if (m_session != null)
{
Dispose(m_session);
}
}
}
#region IDisposable Members
/// <summary>
/// Public dispose method.
/// </summary>
public
void
Dispose()
{
// CleanUp();
GC.SuppressFinalize(this);
}
/// <summary>
/// Public dispose method.
/// </summary>
public
void
Dispose(IWSManSession sessionObject)
{
sessionObject = null;
this.Dispose();
}
#endregion IDisposable Members
/// <summary>
/// EndProcessing method.
/// </summary>
protected override void EndProcessing()
{
helper.CleanUp();
}
}
#endregion
}