// 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 { /// /// 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. /// [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 /// /// The following is the definition of the input parameter "Authentication". /// The following is the validation set for allowed authentication types. /// [Parameter(ValueFromPipelineByPropertyName = true, ParameterSetName = CredentialParameterSet)] public PasswordAuthenticationMechanism Authentication { get { return authentication; } set { authentication = value; authenticationSet = true; } } private PasswordAuthenticationMechanism authentication; private bool authenticationSet = false; /// /// 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. /// [Parameter(Position = 1, ParameterSetName = CredentialParameterSet)] [Credential()] public PSCredential Credential { get { return credential; } set { credential = value; } } private PSCredential credential; /// /// The following is the definition of the input parameter "CertificateThumbprint". /// This is specificly for wsman protocol. /// [Parameter(ValueFromPipelineByPropertyName = true, ParameterSetName = CertificateParameterSet)] public string CertificateThumbprint { get { return certificatethumbprint; } set { certificatethumbprint = value; } } private string certificatethumbprint; /// /// 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. /// [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; /// /// /// The following is the definition of the input parameter "Name". /// Specifies a friendly name for the CIM Session connection. /// /// /// If a name is not passed, then the session is given the name CimSession, /// where is the next available session number. Example, CimSession1, /// CimSession2, etc... /// /// [Parameter(ValueFromPipelineByPropertyName = true)] public string Name { get { return name; } set { name = value; } } private string name; /// /// /// 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. /// /// /// The unit is Second. /// /// [Alias(AliasOT)] [Parameter(ValueFromPipelineByPropertyName = true)] public UInt32 OperationTimeoutSec { get { return operationTimeout; } set { operationTimeout = value; operationTimeoutSet = true; } } private UInt32 operationTimeout; internal bool operationTimeoutSet = false; /// /// /// The following is the definition of the input parameter "SkipTestConnection". /// Specifies where test connection should be skipped /// /// [Parameter(ValueFromPipelineByPropertyName = true)] public SwitchParameter SkipTestConnection { get { return skipTestConnection; } set { skipTestConnection = value; } } private SwitchParameter skipTestConnection; /// /// 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. /// [Parameter(ValueFromPipelineByPropertyName = true)] public UInt32 Port { get { return port; } set { port = value; portSet = true; } } private UInt32 port; private bool portSet = false; /// /// /// The following is the definition of the input parameter "SessionOption". /// Specifies the SessionOption object that is passed to the Cmdlet as argument. /// /// /// If the argument is not given, a default SessionOption will be created for /// the session in .NET API layer. /// /// If a object is passed, then /// connection is made using DCOM. If a /// object is passed, then connection is made using WsMan. /// [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 /// /// BeginProcessing method. /// protected override void BeginProcessing() { cimNewSession = new CimNewSession(); this.CmdletOperation = new CmdletOperationTestCimSession(this, this.cimNewSession); this.AtBeginProcess = false; } /// /// ProcessRecord method. /// protected override void ProcessRecord() { CimSessionOptions outputOptions; CimCredential outputCredential; BuildSessionOptions(out outputOptions, out outputCredential); cimNewSession.NewCimSession(this, outputOptions, outputCredential); cimNewSession.ProcessActions(this.CmdletOperation); } /// /// EndProcessing method. /// protected override void EndProcessing() { cimNewSession.ProcessRemainActions(this.CmdletOperation); } #endregion #region helper methods /// /// Build a CimSessionOptions, used to create CimSession. /// /// Null means no prefer CimSessionOptions. 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 /// /// /// CimNewSession object /// /// private CimNewSession cimNewSession; #endregion #region IDisposable /// /// Clean up resources. /// protected override void DisposeInternal() { base.DisposeInternal(); // Dispose managed resources. if (this.cimNewSession != null) { this.cimNewSession.Dispose(); } } #endregion } }