2020-03-24 19:08:37 +01:00
|
|
|
// Copyright (c) Microsoft Corporation.
|
2018-02-13 18:23:53 +01:00
|
|
|
// Licensed under the MIT License.
|
|
|
|
|
2016-07-14 04:27:37 +02:00
|
|
|
using System;
|
2019-04-30 07:25:11 +02:00
|
|
|
using System.Collections;
|
|
|
|
using System.Collections.Generic;
|
2016-07-14 04:27:37 +02:00
|
|
|
using System.ComponentModel;
|
2019-04-30 07:25:11 +02:00
|
|
|
using System.Diagnostics.CodeAnalysis;
|
|
|
|
using System.IO;
|
2016-07-14 04:27:37 +02:00
|
|
|
using System.Management.Automation;
|
|
|
|
using System.Management.Automation.Provider;
|
2019-04-30 07:25:11 +02:00
|
|
|
using System.Reflection;
|
|
|
|
using System.Runtime.CompilerServices;
|
|
|
|
using System.Runtime.InteropServices;
|
2016-07-14 04:27:37 +02:00
|
|
|
using System.Xml;
|
|
|
|
|
|
|
|
namespace Microsoft.WSMan.Management
|
|
|
|
{
|
|
|
|
#region Set-WsManQuickConfig
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
/// <summary>
|
2017-01-16 22:31:14 +01:00
|
|
|
/// Performs configuration actions to enable the local machine for remote
|
2016-07-14 04:27:37 +02:00
|
|
|
/// management. Steps include:
|
|
|
|
/// 1. Check if WinRM service is running. If not start the WinRM service
|
|
|
|
/// 2. Set the WinRM service type to auto start
|
2017-01-16 22:31:14 +01:00
|
|
|
/// 3. Create a listener to accept request on any IP address. By default
|
2016-07-14 04:27:37 +02:00
|
|
|
/// transport is http
|
2019-01-06 00:40:24 +01:00
|
|
|
/// 4. Enable firewall exception for WS-Management traffic.
|
2016-07-14 04:27:37 +02:00
|
|
|
/// </summary>
|
2019-12-02 19:25:56 +01:00
|
|
|
[Cmdlet(VerbsCommon.Set, "WSManQuickConfig", HelpUri = "https://go.microsoft.com/fwlink/?LinkID=2097112")]
|
2016-07-14 04:27:37 +02:00
|
|
|
public class SetWSManQuickConfigCommand : PSCmdlet, IDisposable
|
|
|
|
{
|
|
|
|
/// <summary>
|
|
|
|
/// The following is the definition of the input parameter "UseSSL".
|
2017-01-16 22:31:14 +01:00
|
|
|
/// Indicates a https listener to be created. If this switch is not specified
|
2019-01-06 00:40:24 +01:00
|
|
|
/// then by default a http listener will be created.
|
2016-07-14 04:27:37 +02:00
|
|
|
/// </summary>
|
|
|
|
[Parameter]
|
|
|
|
[SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "SSL")]
|
|
|
|
public SwitchParameter UseSSL
|
|
|
|
{
|
|
|
|
get { return usessl; }
|
2018-12-24 07:20:06 +01:00
|
|
|
|
2016-07-14 04:27:37 +02:00
|
|
|
set { usessl = value; }
|
|
|
|
}
|
2018-12-24 07:20:06 +01:00
|
|
|
|
2016-07-14 04:27:37 +02:00
|
|
|
private SwitchParameter usessl;
|
|
|
|
|
2019-01-06 02:51:20 +01:00
|
|
|
// helper variable
|
2016-07-14 04:27:37 +02:00
|
|
|
private WSManHelper helper;
|
2017-01-16 22:31:14 +01:00
|
|
|
|
2016-07-14 04:27:37 +02:00
|
|
|
/// <summary>
|
|
|
|
/// Property that sets force parameter. This will allow
|
|
|
|
/// configuring WinRM without prompting the user.
|
|
|
|
/// </summary>
|
|
|
|
[Parameter()]
|
|
|
|
public SwitchParameter Force
|
|
|
|
{
|
|
|
|
get { return force; }
|
2018-12-24 07:20:06 +01:00
|
|
|
|
2016-07-14 04:27:37 +02:00
|
|
|
set { force = value; }
|
|
|
|
}
|
2018-12-24 07:20:06 +01:00
|
|
|
|
2016-07-14 04:27:37 +02:00
|
|
|
private bool force = false;
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Property that will allow configuring WinRM with Public profile exception enabled.
|
|
|
|
/// </summary>
|
|
|
|
[Parameter()]
|
|
|
|
public SwitchParameter SkipNetworkProfileCheck
|
|
|
|
{
|
|
|
|
get { return skipNetworkProfileCheck; }
|
2018-12-24 07:20:06 +01:00
|
|
|
|
2016-07-14 04:27:37 +02:00
|
|
|
set { skipNetworkProfileCheck = value; }
|
|
|
|
}
|
2018-12-24 07:20:06 +01:00
|
|
|
|
2016-07-14 04:27:37 +02:00
|
|
|
private bool skipNetworkProfileCheck = false;
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// BeginProcessing method.
|
|
|
|
/// </summary>
|
|
|
|
protected override void BeginProcessing()
|
|
|
|
{
|
2019-01-06 02:51:20 +01:00
|
|
|
// If not running elevated, then throw an "elevation required" error message.
|
2016-07-14 04:27:37 +02:00
|
|
|
WSManHelper.ThrowIfNotAdministrator();
|
|
|
|
helper = new WSManHelper(this);
|
2019-01-07 19:46:00 +01:00
|
|
|
string query = helper.GetResourceMsgFromResourcetext("QuickConfigContinueQuery");
|
|
|
|
string caption = helper.GetResourceMsgFromResourcetext("QuickConfigContinueCaption");
|
2016-07-14 04:27:37 +02:00
|
|
|
if (!force && !ShouldContinue(query, caption))
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
2018-12-24 07:20:06 +01:00
|
|
|
|
2016-07-14 04:27:37 +02:00
|
|
|
QuickConfigRemoting(true);
|
|
|
|
QuickConfigRemoting(false);
|
2019-01-06 02:51:20 +01:00
|
|
|
}
|
2016-07-14 04:27:37 +02:00
|
|
|
|
|
|
|
#region private
|
|
|
|
|
|
|
|
private void QuickConfigRemoting(bool serviceonly)
|
|
|
|
{
|
|
|
|
IWSManSession m_SessionObj = null;
|
|
|
|
try
|
|
|
|
{
|
|
|
|
string transport;
|
|
|
|
IWSManEx wsmanObject = (IWSManEx)new WSManClass();
|
|
|
|
m_SessionObj = (IWSManSession)wsmanObject.CreateSession(null, 0, null);
|
|
|
|
string xpathEnabled = string.Empty;
|
|
|
|
string xpathText = string.Empty;
|
|
|
|
string xpathUpdate = string.Empty;
|
|
|
|
string analysisInputXml = string.Empty;
|
|
|
|
string action = string.Empty;
|
|
|
|
string xpathStatus = string.Empty;
|
|
|
|
string xpathResult = string.Empty;
|
|
|
|
|
|
|
|
if (!usessl)
|
|
|
|
{
|
|
|
|
transport = "http";
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
transport = "https";
|
|
|
|
}
|
|
|
|
|
|
|
|
if (serviceonly)
|
|
|
|
{
|
|
|
|
analysisInputXml = @"<AnalyzeService_INPUT xmlns=""http://schemas.microsoft.com/wbem/wsman/1/config/service""></AnalyzeService_INPUT>";
|
|
|
|
action = "AnalyzeService";
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2018-12-31 16:44:16 +01:00
|
|
|
string openAllProfiles = skipNetworkProfileCheck ? "<Force/>" : string.Empty;
|
2016-07-14 04:27:37 +02:00
|
|
|
analysisInputXml = @"<Analyze_INPUT xmlns=""http://schemas.microsoft.com/wbem/wsman/1/config/service""><Transport>" + transport + "</Transport>" + openAllProfiles + "</Analyze_INPUT>";
|
|
|
|
action = "Analyze";
|
|
|
|
}
|
|
|
|
|
|
|
|
string analysisOutputXml = m_SessionObj.Invoke(action, "winrm/config/service", analysisInputXml, 0);
|
|
|
|
XmlDocument resultopxml = new XmlDocument();
|
|
|
|
resultopxml.LoadXml(analysisOutputXml);
|
|
|
|
|
|
|
|
if (serviceonly)
|
|
|
|
{
|
|
|
|
xpathEnabled = "/cfg:AnalyzeService_OUTPUT/cfg:RemotingEnabled";
|
|
|
|
xpathText = "/cfg:AnalyzeService_OUTPUT/cfg:Results";
|
|
|
|
xpathUpdate = "/cfg:AnalyzeService_OUTPUT/cfg:EnableService_INPUT";
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
xpathEnabled = "/cfg:Analyze_OUTPUT/cfg:RemotingEnabled";
|
|
|
|
xpathText = "/cfg:Analyze_OUTPUT/cfg:Results";
|
|
|
|
xpathUpdate = "/cfg:Analyze_OUTPUT/cfg:EnableRemoting_INPUT";
|
|
|
|
}
|
|
|
|
|
|
|
|
XmlNamespaceManager nsmgr = new XmlNamespaceManager(resultopxml.NameTable);
|
|
|
|
nsmgr.AddNamespace("cfg", "http://schemas.microsoft.com/wbem/wsman/1/config/service");
|
|
|
|
string enabled = resultopxml.SelectSingleNode(xpathEnabled, nsmgr).InnerText;
|
|
|
|
XmlNode sourceAttribute = resultopxml.SelectSingleNode(xpathEnabled, nsmgr).Attributes.GetNamedItem("Source");
|
|
|
|
string source = null;
|
|
|
|
if (sourceAttribute != null)
|
|
|
|
{
|
|
|
|
source = sourceAttribute.Value;
|
|
|
|
}
|
2018-12-24 07:20:06 +01:00
|
|
|
|
2018-06-12 21:30:10 +02:00
|
|
|
string rxml = string.Empty;
|
2016-07-14 04:27:37 +02:00
|
|
|
if (enabled.Equals("true"))
|
|
|
|
{
|
2018-06-12 21:30:10 +02:00
|
|
|
string Err_Msg = string.Empty;
|
2016-07-14 04:27:37 +02:00
|
|
|
if (serviceonly)
|
|
|
|
{
|
|
|
|
Err_Msg = WSManResourceLoader.GetResourceString("L_QuickConfigNoServiceChangesNeeded_Message");
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Err_Msg = WSManResourceLoader.GetResourceString("L_QuickConfigNoChangesNeeded_Message");
|
|
|
|
}
|
|
|
|
// ArgumentException e = new ArgumentException(Err_Msg);
|
|
|
|
// ErrorRecord er = new ErrorRecord(e, "InvalidOperation", ErrorCategory.InvalidOperation, null);
|
|
|
|
// WriteError(er);
|
|
|
|
WriteObject(Err_Msg);
|
|
|
|
return;
|
|
|
|
}
|
2018-12-24 07:20:06 +01:00
|
|
|
|
2016-07-14 04:27:37 +02:00
|
|
|
if (!enabled.Equals("false"))
|
|
|
|
{
|
|
|
|
ArgumentException e = new ArgumentException(WSManResourceLoader.GetResourceString("L_QuickConfig_InvalidBool_0_ErrorMessage"));
|
|
|
|
ErrorRecord er = new ErrorRecord(e, "InvalidOperation", ErrorCategory.InvalidOperation, null);
|
|
|
|
WriteError(er);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
string resultAction = resultopxml.SelectSingleNode(xpathText, nsmgr).InnerText;
|
2019-04-19 05:30:24 +02:00
|
|
|
if (source != null && source.Equals("GPO"))
|
2016-07-14 04:27:37 +02:00
|
|
|
{
|
2019-01-07 19:46:00 +01:00
|
|
|
string Info_Msg = WSManResourceLoader.GetResourceString("L_QuickConfig_RemotingDisabledbyGP_00_ErrorMessage");
|
2016-07-14 04:27:37 +02:00
|
|
|
Info_Msg += " " + resultAction;
|
|
|
|
ArgumentException e = new ArgumentException(Info_Msg);
|
|
|
|
WriteError(new ErrorRecord(e, "NotSpecified", ErrorCategory.NotSpecified, null));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
string inputXml = resultopxml.SelectSingleNode(xpathUpdate, nsmgr).OuterXml;
|
2018-06-12 21:30:10 +02:00
|
|
|
if (resultAction.Equals(string.Empty) || inputXml.Equals(string.Empty))
|
2016-07-14 04:27:37 +02:00
|
|
|
{
|
|
|
|
ArgumentException e = new ArgumentException(WSManResourceLoader.GetResourceString("L_ERR_Message") + WSManResourceLoader.GetResourceString("L_QuickConfig_MissingUpdateXml_0_ErrorMessage"));
|
|
|
|
ErrorRecord er = new ErrorRecord(e, "InvalidOperation", ErrorCategory.InvalidOperation, null);
|
|
|
|
WriteError(er);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (serviceonly)
|
|
|
|
{
|
|
|
|
action = "EnableService";
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
action = "EnableRemoting";
|
|
|
|
}
|
2018-12-24 07:20:06 +01:00
|
|
|
|
2016-07-14 04:27:37 +02:00
|
|
|
rxml = m_SessionObj.Invoke(action, "winrm/config/service", inputXml, 0);
|
|
|
|
XmlDocument finalxml = new XmlDocument();
|
|
|
|
finalxml.LoadXml(rxml);
|
|
|
|
|
|
|
|
if (serviceonly)
|
|
|
|
{
|
|
|
|
xpathStatus = "/cfg:EnableService_OUTPUT/cfg:Status";
|
|
|
|
xpathResult = "/cfg:EnableService_OUTPUT/cfg:Results";
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
xpathStatus = "/cfg:EnableRemoting_OUTPUT/cfg:Status";
|
|
|
|
xpathResult = "/cfg:EnableRemoting_OUTPUT/cfg:Results";
|
|
|
|
}
|
2018-12-24 07:20:06 +01:00
|
|
|
|
2020-06-11 08:25:35 +02:00
|
|
|
if (finalxml.SelectSingleNode(xpathStatus, nsmgr).InnerText.Equals("succeeded"))
|
2016-07-14 04:27:37 +02:00
|
|
|
{
|
|
|
|
if (serviceonly)
|
|
|
|
{
|
|
|
|
WriteObject(WSManResourceLoader.GetResourceString("L_QuickConfigUpdatedService_Message"));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
WriteObject(WSManResourceLoader.GetResourceString("L_QuickConfigUpdated_Message"));
|
|
|
|
}
|
2018-12-24 07:20:06 +01:00
|
|
|
|
2016-07-14 04:27:37 +02:00
|
|
|
WriteObject(finalxml.SelectSingleNode(xpathResult, nsmgr).InnerText);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
helper.AssertError(WSManResourceLoader.GetResourceString("L_ERR_Message") + WSManResourceLoader.GetResourceString("L_QuickConfigUpdateFailed_ErrorMessage"), false, null);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
finally
|
|
|
|
{
|
2018-12-31 11:10:15 +01:00
|
|
|
if (!string.IsNullOrEmpty(m_SessionObj.Error))
|
2016-07-14 04:27:37 +02:00
|
|
|
{
|
|
|
|
helper.AssertError(m_SessionObj.Error, true, null);
|
|
|
|
}
|
2018-12-24 07:20:06 +01:00
|
|
|
|
2016-07-14 04:27:37 +02:00
|
|
|
if (m_SessionObj != null)
|
|
|
|
Dispose(m_SessionObj);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endregion private
|
|
|
|
|
|
|
|
#region IDisposable Members
|
|
|
|
|
|
|
|
/// <summary>
|
2019-01-09 22:07:41 +01:00
|
|
|
/// Public dispose method.
|
2016-07-14 04:27:37 +02:00
|
|
|
/// </summary>
|
|
|
|
public
|
|
|
|
void
|
|
|
|
Dispose()
|
|
|
|
{
|
2019-01-06 02:51:20 +01:00
|
|
|
// CleanUp();
|
2016-07-14 04:27:37 +02:00
|
|
|
GC.SuppressFinalize(this);
|
|
|
|
}
|
|
|
|
/// <summary>
|
2019-01-09 22:07:41 +01:00
|
|
|
/// Public dispose method.
|
2016-07-14 04:27:37 +02:00
|
|
|
/// </summary>
|
|
|
|
public
|
|
|
|
void
|
|
|
|
Dispose(IWSManSession sessionObject)
|
|
|
|
{
|
|
|
|
sessionObject = null;
|
|
|
|
this.Dispose();
|
|
|
|
}
|
|
|
|
|
|
|
|
#endregion IDisposable Members
|
2019-01-06 02:51:20 +01:00
|
|
|
}
|
2016-07-14 04:27:37 +02:00
|
|
|
#endregion Set-WsManQuickConfig
|
|
|
|
}
|