Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WCF / Tools / WSATConfig / Configuration / RemoteHelper.cs / 1305376 / RemoteHelper.cs
//------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
namespace Microsoft.Tools.ServiceModel.WsatConfig
{
using System;
using System.Collections;
using System.Collections.Generic;
using System.Management;
using System.Threading;
using System.IO;
using System.Runtime.InteropServices;
class RemoteHelper
{
// the name of the remote machine on which the commands are executed
string machineName;
// the class that represnets the WMI Win32_Process
ManagementClass processClass;
ManagementScope managementScope;
const int autoEventTimeout = 90000; // 90 secs
const int delayInAutoEventTimeout = 400; // 400 milliseconds
internal RemoteHelper(string machineName)
{
this.machineName = machineName;
// establish connection
ConnectionOptions co = new ConnectionOptions();
co.Authentication = AuthenticationLevel.PacketPrivacy;
co.Impersonation = ImpersonationLevel.Impersonate;
// define the management scope
managementScope = new ManagementScope("\\\\" + machineName + "\\root\\cimv2", co);
// define the path used
ManagementPath path = new ManagementPath("Win32_Process");
ObjectGetOptions options = new ObjectGetOptions(new ManagementNamedValueCollection(), TimeSpan.FromSeconds(15), false);
// get the object for the defined path in the defined scope
// this object will be the object on which the InvokeMethod will be called
processClass = new ManagementClass(managementScope, path, options);
}
const string MethodCreate = "Create";
const string QueryProcessExitEvent = "SELECT * FROM Win32_ProcessStopTrace";
static class InputParameters
{
public const string CommandLine = "CommandLine";
}
static class OutputParameters
{
public const string ProcessId = "ProcessID";
public const string ReturnValue = "ReturnValue";
}
internal void ExecuteWsatProcess(string arguments)
{
ProcessStopTraceHandler handler;
Utilities.Log("ExecuteWsatProcess(" + arguments + ")");
try
{
ManagementBaseObject inParams = processClass.GetMethodParameters(MethodCreate);
inParams[InputParameters.CommandLine] = GetDeploymentPath() + " " + arguments;
WqlEventQuery wqlEventQuery = new WqlEventQuery(QueryProcessExitEvent);
ManagementEventWatcher watcher = new ManagementEventWatcher(managementScope, wqlEventQuery);
handler = new ProcessStopTraceHandler();
watcher.EventArrived += new EventArrivedEventHandler(handler.Arrived);
watcher.Start();
ManagementBaseObject outParams = processClass.InvokeMethod(
MethodCreate,
inParams,
null);
if (outParams.Properties[OutputParameters.ProcessId].Value == null ||
outParams.Properties[OutputParameters.ReturnValue].Value == null)
{
throw new WsatAdminException(WsatAdminErrorCode.REMOTE_MISSING_WSAT, SR.GetString(SR.ErrorRemoteWSATMissing));
}
// the process ID when executing a remote command
uint processID = (uint)outParams.Properties[OutputParameters.ProcessId].Value;
uint result = (uint)outParams.Properties[OutputParameters.ReturnValue].Value;
if (result != 0)
{
throw new WsatAdminException(WsatAdminErrorCode.REMOTE_MISSING_WSAT, SR.GetString(SR.ErrorRemoteWSATMissing));
}
handler.ProcessId = processID;
int totalDelay = 0;
while (!handler.IsArrived && totalDelay < autoEventTimeout)
{
totalDelay += delayInAutoEventTimeout;
System.Threading.Thread.Sleep(delayInAutoEventTimeout);
}
watcher.Stop();
}
catch (WsatAdminException)
{
throw;
}
#pragma warning suppress 56500
catch (Exception e)
{
if (Utilities.IsCriticalException(e))
{
throw;
}
throw new WsatAdminException(WsatAdminErrorCode.REMOTE_EXECUTION_ATTEMPT_ERROR,
SR.GetString(SR.ErrorAttemptRemoteExecution, e.Message));
}
if (handler.IsArrived && handler.ReturnCode != 0)
{
throw new WsatAdminException((WsatAdminErrorCode)handler.ReturnCode,
SR.GetString(SR.ErrorRemoteExecution, handler.ReturnCode));
}
else if (!handler.IsArrived)
{
throw new WsatAdminException(WsatAdminErrorCode.REMOTE_TIMEOUT, SR.GetString(SR.ErrorRemoteTimeout));
}
Utilities.Log("ExecuteWSATProcess successfully quitted.");
}
internal string GetDeploymentPath()
{
string path = null;
try
{
//We first check if the 4.0 install path was available.
RegistryConfigurationProvider reg = new RegistryConfigurationProvider(Microsoft.Win32.RegistryHive.LocalMachine,
WsatKeys.WcfSetupKey40,
machineName);
path = reg.ReadString(WsatKeys.RuntimeInstallPath, null);
if (string.IsNullOrEmpty(path))
{
//If path under 4.0 doesnt exit, check under 3.0
RegistryConfigurationProvider reg2 = new RegistryConfigurationProvider(Microsoft.Win32.RegistryHive.LocalMachine,
WsatKeys.WcfSetupKey,
machineName);
path = reg2.ReadString(WsatKeys.RuntimeInstallPath, null);
if(string.IsNullOrEmpty(path))
{
throw new WsatAdminException(WsatAdminErrorCode.CANNOT_GET_REMOTE_INSTALL_PATH,
SR.GetString(SR.ErrorCannotGetRemoteInstallPath));
}
}
path = Path.Combine(path, "WsatConfig.exe");
}
catch (WsatAdminException e)
{
throw new WsatAdminException(WsatAdminErrorCode.CANNOT_GET_REMOTE_INSTALL_PATH,
SR.GetString(SR.ErrorCannotGetRemoteInstallPath), e);
}
catch (ArgumentException e) // if the path in the remote registry is invalid...
{
throw new WsatAdminException(WsatAdminErrorCode.CANNOT_GET_REMOTE_INSTALL_PATH,
SR.GetString(SR.ErrorCannotGetRemoteInstallPath), e);
}
return path;
}
}
class ProcessStopTraceHandler
{
bool isArrived = false;
uint processID = 0;
uint returnCode;
Dictionary processesExited = new Dictionary();
public uint ProcessId
{
get { return processID; }
set
{
processID = value;
if (value > 0)
{
lock (processesExited)
{
uint exitCode = 0;
if (processesExited.TryGetValue(value, out exitCode))
{
isArrived = true;
returnCode = exitCode;
}
}
}
}
}
//Handles the event when it arrives
internal void Arrived(object sender, EventArrivedEventArgs e)
{
uint procID = (uint)e.NewEvent.Properties["ProcessID"].Value;
uint exitCode = (uint)e.NewEvent.Properties["ExitStatus"].Value;
if (ProcessId == 0)
{
lock (processesExited)
{
processesExited[procID] = exitCode;
}
}
else if (procID == this.ProcessId)
{
this.returnCode = exitCode;
isArrived = true;
}
}
//Used to determine whether the event has arrived or not.
internal bool IsArrived
{
get
{
return isArrived;
}
}
internal uint ReturnCode
{
get
{
return returnCode;
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
namespace Microsoft.Tools.ServiceModel.WsatConfig
{
using System;
using System.Collections;
using System.Collections.Generic;
using System.Management;
using System.Threading;
using System.IO;
using System.Runtime.InteropServices;
class RemoteHelper
{
// the name of the remote machine on which the commands are executed
string machineName;
// the class that represnets the WMI Win32_Process
ManagementClass processClass;
ManagementScope managementScope;
const int autoEventTimeout = 90000; // 90 secs
const int delayInAutoEventTimeout = 400; // 400 milliseconds
internal RemoteHelper(string machineName)
{
this.machineName = machineName;
// establish connection
ConnectionOptions co = new ConnectionOptions();
co.Authentication = AuthenticationLevel.PacketPrivacy;
co.Impersonation = ImpersonationLevel.Impersonate;
// define the management scope
managementScope = new ManagementScope("\\\\" + machineName + "\\root\\cimv2", co);
// define the path used
ManagementPath path = new ManagementPath("Win32_Process");
ObjectGetOptions options = new ObjectGetOptions(new ManagementNamedValueCollection(), TimeSpan.FromSeconds(15), false);
// get the object for the defined path in the defined scope
// this object will be the object on which the InvokeMethod will be called
processClass = new ManagementClass(managementScope, path, options);
}
const string MethodCreate = "Create";
const string QueryProcessExitEvent = "SELECT * FROM Win32_ProcessStopTrace";
static class InputParameters
{
public const string CommandLine = "CommandLine";
}
static class OutputParameters
{
public const string ProcessId = "ProcessID";
public const string ReturnValue = "ReturnValue";
}
internal void ExecuteWsatProcess(string arguments)
{
ProcessStopTraceHandler handler;
Utilities.Log("ExecuteWsatProcess(" + arguments + ")");
try
{
ManagementBaseObject inParams = processClass.GetMethodParameters(MethodCreate);
inParams[InputParameters.CommandLine] = GetDeploymentPath() + " " + arguments;
WqlEventQuery wqlEventQuery = new WqlEventQuery(QueryProcessExitEvent);
ManagementEventWatcher watcher = new ManagementEventWatcher(managementScope, wqlEventQuery);
handler = new ProcessStopTraceHandler();
watcher.EventArrived += new EventArrivedEventHandler(handler.Arrived);
watcher.Start();
ManagementBaseObject outParams = processClass.InvokeMethod(
MethodCreate,
inParams,
null);
if (outParams.Properties[OutputParameters.ProcessId].Value == null ||
outParams.Properties[OutputParameters.ReturnValue].Value == null)
{
throw new WsatAdminException(WsatAdminErrorCode.REMOTE_MISSING_WSAT, SR.GetString(SR.ErrorRemoteWSATMissing));
}
// the process ID when executing a remote command
uint processID = (uint)outParams.Properties[OutputParameters.ProcessId].Value;
uint result = (uint)outParams.Properties[OutputParameters.ReturnValue].Value;
if (result != 0)
{
throw new WsatAdminException(WsatAdminErrorCode.REMOTE_MISSING_WSAT, SR.GetString(SR.ErrorRemoteWSATMissing));
}
handler.ProcessId = processID;
int totalDelay = 0;
while (!handler.IsArrived && totalDelay < autoEventTimeout)
{
totalDelay += delayInAutoEventTimeout;
System.Threading.Thread.Sleep(delayInAutoEventTimeout);
}
watcher.Stop();
}
catch (WsatAdminException)
{
throw;
}
#pragma warning suppress 56500
catch (Exception e)
{
if (Utilities.IsCriticalException(e))
{
throw;
}
throw new WsatAdminException(WsatAdminErrorCode.REMOTE_EXECUTION_ATTEMPT_ERROR,
SR.GetString(SR.ErrorAttemptRemoteExecution, e.Message));
}
if (handler.IsArrived && handler.ReturnCode != 0)
{
throw new WsatAdminException((WsatAdminErrorCode)handler.ReturnCode,
SR.GetString(SR.ErrorRemoteExecution, handler.ReturnCode));
}
else if (!handler.IsArrived)
{
throw new WsatAdminException(WsatAdminErrorCode.REMOTE_TIMEOUT, SR.GetString(SR.ErrorRemoteTimeout));
}
Utilities.Log("ExecuteWSATProcess successfully quitted.");
}
internal string GetDeploymentPath()
{
string path = null;
try
{
//We first check if the 4.0 install path was available.
RegistryConfigurationProvider reg = new RegistryConfigurationProvider(Microsoft.Win32.RegistryHive.LocalMachine,
WsatKeys.WcfSetupKey40,
machineName);
path = reg.ReadString(WsatKeys.RuntimeInstallPath, null);
if (string.IsNullOrEmpty(path))
{
//If path under 4.0 doesnt exit, check under 3.0
RegistryConfigurationProvider reg2 = new RegistryConfigurationProvider(Microsoft.Win32.RegistryHive.LocalMachine,
WsatKeys.WcfSetupKey,
machineName);
path = reg2.ReadString(WsatKeys.RuntimeInstallPath, null);
if(string.IsNullOrEmpty(path))
{
throw new WsatAdminException(WsatAdminErrorCode.CANNOT_GET_REMOTE_INSTALL_PATH,
SR.GetString(SR.ErrorCannotGetRemoteInstallPath));
}
}
path = Path.Combine(path, "WsatConfig.exe");
}
catch (WsatAdminException e)
{
throw new WsatAdminException(WsatAdminErrorCode.CANNOT_GET_REMOTE_INSTALL_PATH,
SR.GetString(SR.ErrorCannotGetRemoteInstallPath), e);
}
catch (ArgumentException e) // if the path in the remote registry is invalid...
{
throw new WsatAdminException(WsatAdminErrorCode.CANNOT_GET_REMOTE_INSTALL_PATH,
SR.GetString(SR.ErrorCannotGetRemoteInstallPath), e);
}
return path;
}
}
class ProcessStopTraceHandler
{
bool isArrived = false;
uint processID = 0;
uint returnCode;
Dictionary processesExited = new Dictionary();
public uint ProcessId
{
get { return processID; }
set
{
processID = value;
if (value > 0)
{
lock (processesExited)
{
uint exitCode = 0;
if (processesExited.TryGetValue(value, out exitCode))
{
isArrived = true;
returnCode = exitCode;
}
}
}
}
}
//Handles the event when it arrives
internal void Arrived(object sender, EventArrivedEventArgs e)
{
uint procID = (uint)e.NewEvent.Properties["ProcessID"].Value;
uint exitCode = (uint)e.NewEvent.Properties["ExitStatus"].Value;
if (ProcessId == 0)
{
lock (processesExited)
{
processesExited[procID] = exitCode;
}
}
else if (procID == this.ProcessId)
{
this.returnCode = exitCode;
isArrived = true;
}
}
//Used to determine whether the event has arrived or not.
internal bool IsArrived
{
get
{
return isArrived;
}
}
internal uint ReturnCode
{
get
{
return returnCode;
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- ManagementClass.cs
- HijriCalendar.cs
- DataRecordInfo.cs
- TextServicesProperty.cs
- RegexReplacement.cs
- Rotation3D.cs
- ThicknessConverter.cs
- Util.cs
- _ListenerAsyncResult.cs
- StrongTypingException.cs
- GraphicsState.cs
- UpdateEventArgs.cs
- KerberosSecurityTokenAuthenticator.cs
- NetDataContractSerializer.cs
- GAC.cs
- While.cs
- JpegBitmapEncoder.cs
- SqlDataAdapter.cs
- StringHandle.cs
- BulletChrome.cs
- Propagator.JoinPropagator.cs
- Helper.cs
- RuleSettings.cs
- CultureInfoConverter.cs
- RtfToXamlReader.cs
- SoapParser.cs
- EmptyStringExpandableObjectConverter.cs
- ContentFilePart.cs
- C14NUtil.cs
- SQLDouble.cs
- HttpGetClientProtocol.cs
- BigInt.cs
- XmlSerializer.cs
- DbConnectionPoolIdentity.cs
- Char.cs
- WriteFileContext.cs
- CalendarButton.cs
- CodeConstructor.cs
- InputGestureCollection.cs
- RetriableClipboard.cs
- TableLayoutPanelCodeDomSerializer.cs
- ToolStripItemImageRenderEventArgs.cs
- BezierSegment.cs
- TextDecoration.cs
- SimpleHandlerFactory.cs
- ContainsRowNumberChecker.cs
- XMLUtil.cs
- PixelShader.cs
- Int32Rect.cs
- OverrideMode.cs
- TargetPerspective.cs
- GeneralTransform3DGroup.cs
- ProjectionPath.cs
- DockingAttribute.cs
- COM2EnumConverter.cs
- LayoutTableCell.cs
- XmlUtil.cs
- BinaryReader.cs
- JsonQueryStringConverter.cs
- CustomCategoryAttribute.cs
- SqlGenericUtil.cs
- TextBox.cs
- WindowsListViewItem.cs
- FillErrorEventArgs.cs
- OdbcError.cs
- BitmapFrameDecode.cs
- HttpCachePolicy.cs
- AtomicFile.cs
- HtmlButton.cs
- CultureTableRecord.cs
- RsaSecurityKey.cs
- ModuleElement.cs
- BaseTemplateCodeDomTreeGenerator.cs
- UsernameTokenFactoryCredential.cs
- OracleTimeSpan.cs
- StringKeyFrameCollection.cs
- PropertyMapper.cs
- SqlAliaser.cs
- MatrixStack.cs
- DataPointer.cs
- GeneratedView.cs
- DockPanel.cs
- ExtensionSimplifierMarkupObject.cs
- XmlSchemaElement.cs
- SingleBodyParameterMessageFormatter.cs
- CultureTableRecord.cs
- TextContainer.cs
- BindingContext.cs
- DllNotFoundException.cs
- ServerIdentity.cs
- NamedPipeAppDomainProtocolHandler.cs
- VoiceSynthesis.cs
- PrinterSettings.cs
- CommandSet.cs
- Base64Decoder.cs
- SQLGuidStorage.cs
- PerformanceCounterPermission.cs
- MetadataUtilsSmi.cs
- CloudCollection.cs
- UpdatePanelTrigger.cs