PowerShell/src/Microsoft.Management.Infrastructure.CimCmdlets/NewCimSessionCommand.cs

378 lines
12 KiB
C#

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
#region Using directives
using System;
using System.Management.Automation;
using System.Diagnostics.CodeAnalysis;
using Microsoft.Management.Infrastructure.Options;
#endregion
namespace Microsoft.Management.Infrastructure.CimCmdlets
{
/// <summary>
/// This Cmdlet enables the IT Pro to create a CIM Session. CIM Session object
/// is a client-side representation of the connection between the client and the
/// server.
/// The CimSession object returned by the Cmdlet is used by all other CIM
/// cmdlets.
/// </summary>
[Cmdlet(VerbsCommon.New, "CimSession", DefaultParameterSetName = CredentialParameterSet, HelpUri = "https://go.microsoft.com/fwlink/?LinkId=227967")]
[OutputType(typeof(CimSession))]
public sealed class NewCimSessionCommand : CimBaseCommand
{
#region cmdlet parameters
/// <summary>
/// The following is the definition of the input parameter "Authentication".
/// The following is the validation set for allowed authentication types.
/// </summary>
[Parameter(ValueFromPipelineByPropertyName = true,
ParameterSetName = CredentialParameterSet)]
public PasswordAuthenticationMechanism Authentication
{
get { return authentication; }
set
{
authentication = value;
authenticationSet = true;
}
}
private PasswordAuthenticationMechanism authentication;
private bool authenticationSet = false;
/// <summary>
/// The following is the definition of the input parameter "Credential".
/// Specifies a user account that has permission to perform this action.
/// The default is the current user.
/// </summary>
[Parameter(Position = 1, ParameterSetName = CredentialParameterSet)]
[Credential()]
public PSCredential Credential
{
get { return credential; }
set { credential = value; }
}
private PSCredential credential;
/// <summary>
/// The following is the definition of the input parameter "CertificateThumbprint".
/// This is specificly for wsman protocol.
/// </summary>
[Parameter(ValueFromPipelineByPropertyName = true,
ParameterSetName = CertificateParameterSet)]
public string CertificateThumbprint
{
get { return certificatethumbprint; }
set { certificatethumbprint = value; }
}
private string certificatethumbprint;
/// <summary>
/// The following is the definition of the input parameter "ComputerName".
/// Specifies the computer on which the commands associated with this session
/// will run. The default value is LocalHost.
/// </summary>
[Alias(AliasCN, AliasServerName)]
[Parameter(
Position = 0,
ValueFromPipelineByPropertyName = true)]
[ValidateNotNullOrEmpty]
[SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays")]
public string[] ComputerName
{
get { return computername; }
set { computername = value; }
}
private string[] computername;
/// <summary>
/// <para>
/// The following is the definition of the input parameter "Name".
/// Specifies a friendly name for the CIM Session connection.
/// </para>
/// <para>
/// If a name is not passed, then the session is given the name CimSession<int>,
/// where <int> is the next available session number. Example, CimSession1,
/// CimSession2, etc...
/// </para>
/// </summary>
[Parameter(ValueFromPipelineByPropertyName = true)]
public string Name
{
get { return name; }
set { name = value; }
}
private string name;
/// <summary>
/// <para>
/// The following is the definition of the input parameter "OperationTimeoutSec".
/// Specifies the operation timeout for all operations in session. Individual
/// operations can override this timeout.
/// </para>
/// <para>
/// The unit is Second.
/// <para>
/// </summary>
[Alias(AliasOT)]
[Parameter(ValueFromPipelineByPropertyName = true)]
public UInt32 OperationTimeoutSec
{
get { return operationTimeout; }
set
{
operationTimeout = value;
operationTimeoutSet = true;
}
}
private UInt32 operationTimeout;
internal bool operationTimeoutSet = false;
/// <summary>
/// <para>
/// The following is the definition of the input parameter "SkipTestConnection".
/// Specifies where test connection should be skipped
/// </para>
/// </summary>
[Parameter(ValueFromPipelineByPropertyName = true)]
public SwitchParameter SkipTestConnection
{
get { return skipTestConnection; }
set
{
skipTestConnection = value;
}
}
private SwitchParameter skipTestConnection;
/// <summary>
/// The following is the definition of the input parameter "Port".
/// Specifies the port number to use, if different than the default port number.
/// This is specificly for wsman protocol.
/// </summary>
[Parameter(ValueFromPipelineByPropertyName = true)]
public UInt32 Port
{
get { return port; }
set
{
port = value;
portSet = true;
}
}
private UInt32 port;
private bool portSet = false;
/// <summary>
/// <para>
/// The following is the definition of the input parameter "SessionOption".
/// Specifies the SessionOption object that is passed to the Cmdlet as argument.
/// </para>
/// <para>
/// If the argument is not given, a default SessionOption will be created for
/// the session in .NET API layer.
/// </para>
/// If a <see cref="DCOMSessionOption"/> object is passed, then
/// connection is made using DCOM. If a <see cref="WsManSessionOption"/>
/// object is passed, then connection is made using WsMan.
/// </summary>
[Parameter(ValueFromPipelineByPropertyName = true)]
public Microsoft.Management.Infrastructure.Options.CimSessionOptions SessionOption
{
get { return sessionOption; }
set { sessionOption = value; }
}
private Microsoft.Management.Infrastructure.Options.CimSessionOptions sessionOption;
#endregion
#region cmdlet processing methods
/// <summary>
/// BeginProcessing method.
/// </summary>
protected override void BeginProcessing()
{
cimNewSession = new CimNewSession();
this.CmdletOperation = new CmdletOperationTestCimSession(this, this.cimNewSession);
this.AtBeginProcess = false;
}
/// <summary>
/// ProcessRecord method.
/// </summary>
protected override void ProcessRecord()
{
CimSessionOptions outputOptions;
CimCredential outputCredential;
BuildSessionOptions(out outputOptions, out outputCredential);
cimNewSession.NewCimSession(this, outputOptions, outputCredential);
cimNewSession.ProcessActions(this.CmdletOperation);
}
/// <summary>
/// EndProcessing method.
/// </summary>
protected override void EndProcessing()
{
cimNewSession.ProcessRemainActions(this.CmdletOperation);
}
#endregion
#region helper methods
/// <summary>
/// Build a CimSessionOptions, used to create CimSession.
/// </summary>
/// <returns>Null means no prefer CimSessionOptions.</returns>
internal void BuildSessionOptions(out CimSessionOptions outputOptions, out CimCredential outputCredential)
{
DebugHelper.WriteLogEx();
CimSessionOptions options = null;
if (this.SessionOption != null)
{
// clone the sessionOption object
if (this.SessionOption is WSManSessionOptions)
{
options = new WSManSessionOptions(this.sessionOption as WSManSessionOptions);
}
else
{
options = new DComSessionOptions(this.sessionOption as DComSessionOptions);
}
}
outputOptions = null;
outputCredential = null;
if (options != null)
{
DComSessionOptions dcomOptions = (options as DComSessionOptions);
if (dcomOptions != null)
{
bool conflict = false;
string parameterName = string.Empty;
if (this.CertificateThumbprint != null)
{
conflict = true;
parameterName = @"CertificateThumbprint";
}
if (portSet)
{
conflict = true;
parameterName = @"Port";
}
if (conflict)
{
ThrowConflictParameterWasSet(@"New-CimSession", parameterName, @"DComSessionOptions");
return;
}
}
}
if (portSet || (this.CertificateThumbprint != null))
{
WSManSessionOptions wsmanOptions = (options == null) ? new WSManSessionOptions() : options as WSManSessionOptions;
if (portSet)
{
wsmanOptions.DestinationPort = this.Port;
portSet = false;
}
if (this.CertificateThumbprint != null)
{
CimCredential credentials = new CimCredential(CertificateAuthenticationMechanism.Default, this.CertificateThumbprint);
wsmanOptions.AddDestinationCredentials(credentials);
}
options = wsmanOptions;
}
if (this.operationTimeoutSet)
{
if (options != null)
{
options.Timeout = TimeSpan.FromSeconds((double)this.OperationTimeoutSec);
}
}
if (this.authenticationSet || (this.credential != null))
{
PasswordAuthenticationMechanism authentication = this.authenticationSet ? this.Authentication : PasswordAuthenticationMechanism.Default;
if (this.authenticationSet)
{
this.authenticationSet = false;
}
CimCredential credentials = CreateCimCredentials(this.Credential, authentication, @"New-CimSession", @"Authentication");
if (credentials == null)
{
return;
}
DebugHelper.WriteLog("Credentials: {0}", 1, credentials);
outputCredential = credentials;
if (options != null)
{
DebugHelper.WriteLog("Add credentials to option: {0}", 1, options);
options.AddDestinationCredentials(credentials);
}
}
DebugHelper.WriteLogEx("Set outputOptions: {0}", 1, outputOptions);
outputOptions = options;
}
#endregion
#region private members
/// <summary>
/// <para>
/// CimNewSession object
/// </para>
/// </summary>
private CimNewSession cimNewSession;
#endregion
#region IDisposable
/// <summary>
/// Clean up resources.
/// </summary>
protected override void DisposeInternal()
{
base.DisposeInternal();
// Dispose managed resources.
if (this.cimNewSession != null)
{
this.cimNewSession.Dispose();
}
}
#endregion
}
}