예제 #1
0
        private void SendData(byte[] data, DataPriorityType priorityType)
        {
            BaseClientTransportManager.tracer.WriteLine("Command sending data of size : {0}", new object[] { data.Length });
            byte[] buffer = data;
            bool   flag   = true;

            if (commandSendRedirect != null)
            {
                object[] objArray3 = new object[2];
                objArray3[1] = buffer;
                object[] args = objArray3;
                flag   = (bool)commandSendRedirect.DynamicInvoke(args);
                buffer = (byte[])args[0];
            }
            if (flag)
            {
                using (WSManNativeApi.WSManData data2 = new WSManNativeApi.WSManData(buffer))
                {
                    PSEtwLog.LogAnalyticInformational(PSEventId.WSManSendShellInputEx, PSOpcode.Send, PSTask.None, PSKeyword.Transport | PSKeyword.UseAlwaysAnalytic, new object[] { base.RunspacePoolInstanceId.ToString(), this.powershellInstanceId.ToString(), data2.BufferLength.ToString(CultureInfo.InvariantCulture) });
                    lock (base.syncObject)
                    {
                        if (base.isClosed)
                        {
                            BaseClientTransportManager.tracer.WriteLine("Client Session TM: Transport manager is closed. So returning", new object[0]);
                        }
                        else
                        {
                            this.sendToRemoteCompleted = new WSManNativeApi.WSManShellAsync(new IntPtr(this.cmdContextId), cmdSendCallback);
                            WSManNativeApi.WSManSendShellInputEx(this.wsManShellOperationHandle, this.wsManCmdOperationHandle, 0, (priorityType == DataPriorityType.Default) ? "stdin" : "pr", data2, (IntPtr)this.sendToRemoteCompleted, ref this.wsManSendOperationHandle);
                        }
                    }
                }
            }
        }
 internal override void Dispose(bool isDisposing)
 {
     BaseClientTransportManager.tracer.WriteLine("Disposing session with session context: {0} Operation Context: {1}", (object)this.sessionContextID, (object)this.wsManShellOperationHandle);
     this.CloseSessionAndClearResources();
     if (isDisposing && this.openContent != null)
     {
         this.openContent.Dispose();
         this.openContent = (WSManNativeApi.WSManData)null;
     }
     base.Dispose(isDisposing);
 }
 internal void SetWSManSessionOption(WSManNativeApi.WSManSessionOption option, string stringData)
 {
     using (WSManNativeApi.WSManData wsManData = new WSManNativeApi.WSManData(stringData))
     {
         int errorCode = WSManNativeApi.WSManSetSessionOption(this.wsManSessionHandle, option, (IntPtr)wsManData);
         if (errorCode != 0)
         {
             throw new PSInvalidOperationException(WSManNativeApi.WSManGetErrorMessage(WSManClientSessionTransportManager.wsManApiStaticData.WSManAPIHandle, errorCode));
         }
     }
 }
예제 #4
0
 internal static void WSManSendShellInputEx(
     IntPtr shellOperationHandle,
     IntPtr commandOperationHandle,
     int flags,
     [MarshalAs(UnmanagedType.LPWStr)] string streamId,
     WSManNativeApi.WSManData streamData,
     IntPtr asyncCallback,
     ref IntPtr sendOperationHandle)
 {
     WSManNativeApi.WSManSendShellInputExInternal(shellOperationHandle, commandOperationHandle, flags, streamId, (IntPtr)streamData, false, asyncCallback, ref sendOperationHandle);
 }
예제 #5
0
 internal static void WSManCreateShellEx(
     IntPtr wsManSessionHandle,
     int flags,
     string resourceUri,
     WSManNativeApi.WSManShellStartupInfo startupInfo,
     WSManNativeApi.WSManOptionSet optionSet,
     WSManNativeApi.WSManData openContent,
     IntPtr asyncCallback,
     ref IntPtr shellOperationHandle)
 {
     WSManNativeApi.WSManCreateShellExInternal(wsManSessionHandle, flags, resourceUri, (IntPtr)startupInfo, (IntPtr)optionSet, (IntPtr)openContent, asyncCallback, ref shellOperationHandle);
 }
        private void SendData(byte[] data, DataPriorityType priorityType)
        {
            BaseClientTransportManager.tracer.WriteLine("Session sending data of size : {0}", (object)data.Length);
            byte[] data1 = data;
            bool   flag  = true;

            if ((object)WSManClientSessionTransportManager.sessionSendRedirect != null)
            {
                object[] objArray = new object[2]
                {
                    null,
                    (object)data1
                };
                flag  = (bool)WSManClientSessionTransportManager.sessionSendRedirect.DynamicInvoke(objArray);
                data1 = (byte[])objArray[0];
            }
            if (!flag)
            {
                return;
            }
            using (WSManNativeApi.WSManData streamData = new WSManNativeApi.WSManData(data1))
            {
                BaseTransportManager.ETWTracer.AnalyticChannel.WriteInformation(PSEventId.WSManSendShellInputEx, PSOpcode.Send, PSTask.None, (object)this.RunspacePoolInstanceId, (object)Guid.Empty, (object)streamData.BufferLength.ToString((IFormatProvider)CultureInfo.InvariantCulture));
                lock (this.syncObject)
                {
                    if (this.isClosed)
                    {
                        BaseClientTransportManager.tracer.WriteLine("Client Session TM: Transport manager is closed. So returning", new object[0]);
                    }
                    else
                    {
                        this.sendToRemoteCompleted = new WSManNativeApi.WSManShellAsync(new IntPtr(this.sessionContextID), WSManClientSessionTransportManager.sessionSendCallback);
                        WSManNativeApi.WSManSendShellInputEx(this.wsManShellOperationHandle, IntPtr.Zero, 0, priorityType == DataPriorityType.Default ? "stdin" : "pr", streamData, (IntPtr)this.sendToRemoteCompleted, ref this.wsManSendOperationHandle);
                    }
                }
            }
        }
 private void SendData(byte[] data, DataPriorityType priorityType)
 {
     BaseClientTransportManager.tracer.WriteLine("Command sending data of size : {0}", new object[] { data.Length });
     byte[] buffer = data;
     bool flag = true;
     if (commandSendRedirect != null)
     {
         object[] objArray3 = new object[2];
         objArray3[1] = buffer;
         object[] args = objArray3;
         flag = (bool) commandSendRedirect.DynamicInvoke(args);
         buffer = (byte[]) args[0];
     }
     if (flag)
     {
         using (WSManNativeApi.WSManData data2 = new WSManNativeApi.WSManData(buffer))
         {
             PSEtwLog.LogAnalyticInformational(PSEventId.WSManSendShellInputEx, PSOpcode.Send, PSTask.None, PSKeyword.Transport | PSKeyword.UseAlwaysAnalytic, new object[] { base.RunspacePoolInstanceId.ToString(), this.powershellInstanceId.ToString(), data2.BufferLength.ToString(CultureInfo.InvariantCulture) });
             lock (base.syncObject)
             {
                 if (base.isClosed)
                 {
                     BaseClientTransportManager.tracer.WriteLine("Client Session TM: Transport manager is closed. So returning", new object[0]);
                 }
                 else
                 {
                     this.sendToRemoteCompleted = new WSManNativeApi.WSManShellAsync(new IntPtr(this.cmdContextId), cmdSendCallback);
                     WSManNativeApi.WSManSendShellInputEx(this.wsManShellOperationHandle, this.wsManCmdOperationHandle, 0, (priorityType == DataPriorityType.Default) ? "stdin" : "pr", data2, (IntPtr) this.sendToRemoteCompleted, ref this.wsManSendOperationHandle);
                 }
             }
         }
     }
 }
        internal override void ConnectAsync()
        {
            List <WSManNativeApi.WSManOption> wsManOptionList = new List <WSManNativeApi.WSManOption>((IEnumerable <WSManNativeApi.WSManOption>)WSManClientSessionTransportManager.wsManApiStaticData.CommonOptionSet);

            if ((object)WSManClientSessionTransportManager.protocolVersionRedirect != null)
            {
                string str = (string)WSManClientSessionTransportManager.protocolVersionRedirect.DynamicInvoke();
                wsManOptionList.Clear();
                wsManOptionList.Add(new WSManNativeApi.WSManOption()
                {
                    name       = "protocolversion",
                    value      = str,
                    mustComply = true
                });
            }
            WSManNativeApi.WSManShellStartupInfo startupInfo = new WSManNativeApi.WSManShellStartupInfo(WSManClientSessionTransportManager.wsManApiStaticData.InputStreamSet, WSManClientSessionTransportManager.wsManApiStaticData.OutputStreamSet, 0L > this.idleTimeout || this.idleTimeout >= (long)uint.MaxValue ? uint.MaxValue : (uint)this.idleTimeout);
            if (this.openContent == null)
            {
                byte[] inArray = this.dataToBeSent.ReadOrRegisterCallback((PrioritySendDataCollection.OnDataAvailableCallback)null, out DataPriorityType _);
                bool   flag    = true;
                if ((object)WSManClientSessionTransportManager.sessionSendRedirect != null)
                {
                    object[] objArray = new object[2]
                    {
                        null,
                        (object)inArray
                    };
                    flag    = (bool)WSManClientSessionTransportManager.sessionSendRedirect.DynamicInvoke(objArray);
                    inArray = (byte[])objArray[0];
                }
                if (!flag)
                {
                    return;
                }
                if (inArray != null)
                {
                    this.openContent = new WSManNativeApi.WSManData(string.Format((IFormatProvider)CultureInfo.InvariantCulture, "<{0} xmlns=\"{1}\">{2}</{0}>", (object)"creationXml", (object)"http://schemas.microsoft.com/powershell", (object)Convert.ToBase64String(inArray, Base64FormattingOptions.None)));
                }
            }
            this.sessionContextID = WSManClientSessionTransportManager.GetNextSessionTMHandleId();
            WSManClientSessionTransportManager.AddSessionTransportManager(this.sessionContextID, this);
            BaseTransportManager.ETWTracer.AnalyticChannel.WriteInformation(PSEventId.WSManCreateShell, PSOpcode.Connect, PSTask.CreateRunspace, (object)this.RunspacePoolInstanceId);
            this.createSessionCompleted         = new WSManNativeApi.WSManShellAsync(new IntPtr(this.sessionContextID), WSManClientSessionTransportManager.sessionCreateCallback);
            this.createSessionCompletedGCHandle = GCHandle.Alloc((object)this.createSessionCompleted);
            try
            {
                lock (this.syncObject)
                {
                    if (this.isClosed)
                    {
                        return;
                    }
                    if (this.noMachineProfile)
                    {
                        wsManOptionList.Add(new WSManNativeApi.WSManOption()
                        {
                            name       = "WINRS_NOPROFILE",
                            mustComply = true,
                            value      = "1"
                        });
                    }
                    using (WSManNativeApi.WSManOptionSet optionSet = new WSManNativeApi.WSManOptionSet(wsManOptionList.ToArray()))
                        WSManNativeApi.WSManCreateShellEx(this.wsManSessionHandle, this.noCompression ? 1 : 0, this.resourceUri, startupInfo, optionSet, this.openContent, (IntPtr)this.createSessionCompleted, ref this.wsManShellOperationHandle);
                }
                if (!(this.wsManShellOperationHandle == IntPtr.Zero))
                {
                    return;
                }
                this.RaiseErrorHandler(WSManTransportManagerUtils.ConstructTransportErrorEventArgs(WSManClientSessionTransportManager.wsManApiStaticData.WSManAPIHandle, IntPtr.Zero, new WSManNativeApi.WSManError(), TransportMethodEnum.CreateShellEx, PSRemotingErrorId.ConnectExFailed));
            }
            finally
            {
                startupInfo.Dispose();
            }
        }
 internal override void Dispose(bool isDisposing)
 {
     BaseClientTransportManager.tracer.WriteLine("Disposing session with session context: {0} Operation Context: {1}", new object[] { this.sessionContextID, this.wsManShellOperationHandle });
     this.CloseSessionAndClearResources();
     if (isDisposing && (this.openContent != null))
     {
         this.openContent.Dispose();
         this.openContent = null;
     }
     base.Dispose(isDisposing);
 }
 internal override void CreateAsync()
 {
     List<WSManNativeApi.WSManOption> list = new List<WSManNativeApi.WSManOption>(wsManApiStaticData.CommonOptionSet);
     if (protocolVersionRedirect != null)
     {
         string str = (string) protocolVersionRedirect.DynamicInvoke(new object[0]);
         list.Clear();
         WSManNativeApi.WSManOption item = new WSManNativeApi.WSManOption {
             name = "protocolversion",
             value = str,
             mustComply = true
         };
         list.Add(item);
     }
     int serverIdleTimeOut = (this._connectionInfo.IdleTimeout > 0) ? ((int) this._connectionInfo.IdleTimeout) : int.MaxValue;
     WSManNativeApi.WSManShellStartupInfo startupInfo = new WSManNativeApi.WSManShellStartupInfo(wsManApiStaticData.InputStreamSet, wsManApiStaticData.OutputStreamSet, serverIdleTimeOut, this.sessionName);
     if (this.openContent == null)
     {
         DataPriorityType type;
         byte[] inArray = base.dataToBeSent.ReadOrRegisterCallback(null, out type);
         bool flag = true;
         if (sessionSendRedirect != null)
         {
             object[] objArray2 = new object[2];
             objArray2[1] = inArray;
             object[] objArray = objArray2;
             flag = (bool) sessionSendRedirect.DynamicInvoke(objArray);
             inArray = (byte[]) objArray[0];
         }
         if (!flag)
         {
             return;
         }
         if (inArray != null)
         {
             string data = string.Format(CultureInfo.InvariantCulture, "<{0} xmlns=\"{1}\">{2}</{0}>", new object[] { "creationXml", "http://schemas.microsoft.com/powershell", Convert.ToBase64String(inArray, Base64FormattingOptions.None) });
             this.openContent = new WSManNativeApi.WSManData(data);
         }
     }
     this.sessionContextID = GetNextSessionTMHandleId();
     AddSessionTransportManager(this.sessionContextID, this);
     PSEtwLog.LogAnalyticInformational(PSEventId.WSManCreateShell, PSOpcode.Connect, PSTask.CreateRunspace, PSKeyword.Transport | PSKeyword.UseAlwaysAnalytic, new object[] { base.RunspacePoolInstanceId.ToString() });
     this.createSessionCallback = new WSManNativeApi.WSManShellAsync(new IntPtr(this.sessionContextID), sessionCreateCallback);
     this.createSessionCallbackGCHandle = GCHandle.Alloc(this.createSessionCallback);
     try
     {
         lock (base.syncObject)
         {
             if (base.isClosed)
             {
                 return;
             }
             this.startMode = WSManTransportManagerUtils.tmStartModes.Create;
             if (this.noMachineProfile)
             {
                 WSManNativeApi.WSManOption option2 = new WSManNativeApi.WSManOption {
                     name = "WINRS_NOPROFILE",
                     mustComply = true,
                     value = "1"
                 };
                 list.Add(option2);
             }
             int flags = this.noCompression ? 1 : 0;
             flags |= (this._connectionInfo.OutputBufferingMode == OutputBufferingMode.Block) ? 8 : 0;
             flags |= (this._connectionInfo.OutputBufferingMode == OutputBufferingMode.Drop) ? 4 : 0;
             using (WSManNativeApi.WSManOptionSet set = new WSManNativeApi.WSManOptionSet(list.ToArray()))
             {
                 WSManNativeApi.WSManCreateShellEx(this.wsManSessionHandle, flags, this._connectionInfo.ShellUri, base.RunspacePoolInstanceId.ToString().ToUpper(CultureInfo.InvariantCulture), startupInfo, set, this.openContent, (IntPtr) this.createSessionCallback, ref this.wsManShellOperationHandle);
             }
         }
         if (this.wsManShellOperationHandle == IntPtr.Zero)
         {
             TransportErrorOccuredEventArgs eventArgs = WSManTransportManagerUtils.ConstructTransportErrorEventArgs(wsManApiStaticData.WSManAPIHandle, this, new WSManNativeApi.WSManError(), TransportMethodEnum.CreateShellEx, RemotingErrorIdStrings.ConnectExFailed, new object[] { this.ConnectionInfo.ComputerName });
             this.ProcessWSManTransportError(eventArgs);
         }
     }
     finally
     {
         startupInfo.Dispose();
     }
 }
 internal override void ConnectAsync()
 {
     base.ReceivedDataCollection.PrepareForStreamConnect();
     if (this.openContent == null)
     {
         DataPriorityType type;
         byte[] inArray = base.dataToBeSent.ReadOrRegisterCallback(null, out type);
         if (inArray != null)
         {
             string data = string.Format(CultureInfo.InvariantCulture, "<{0} xmlns=\"{1}\">{2}</{0}>", new object[] { "connectXml", "http://schemas.microsoft.com/powershell", Convert.ToBase64String(inArray, Base64FormattingOptions.None) });
             this.openContent = new WSManNativeApi.WSManData(data);
         }
         if (base.dataToBeSent.ReadOrRegisterCallback(null, out type) != null)
         {
             return;
         }
     }
     this.sessionContextID = GetNextSessionTMHandleId();
     AddSessionTransportManager(this.sessionContextID, this);
     this.supportsDisconnect = true;
     this.connectSessionCallback = new WSManNativeApi.WSManShellAsync(new IntPtr(this.sessionContextID), sessionConnectCallback);
     lock (base.syncObject)
     {
         if (base.isClosed)
         {
             return;
         }
         this.startMode = WSManTransportManagerUtils.tmStartModes.Connect;
         int flags = 0;
         flags |= (this._connectionInfo.OutputBufferingMode == OutputBufferingMode.Block) ? 8 : 0;
         flags |= (this._connectionInfo.OutputBufferingMode == OutputBufferingMode.Drop) ? 4 : 0;
         WSManNativeApi.WSManConnectShellEx(this.wsManSessionHandle, flags, this._connectionInfo.ShellUri, base.RunspacePoolInstanceId.ToString().ToUpper(CultureInfo.InvariantCulture), IntPtr.Zero, (IntPtr) this.openContent, (IntPtr) this.connectSessionCallback, ref this.wsManShellOperationHandle);
     }
     if (this.wsManShellOperationHandle == IntPtr.Zero)
     {
         TransportErrorOccuredEventArgs eventArgs = WSManTransportManagerUtils.ConstructTransportErrorEventArgs(wsManApiStaticData.WSManAPIHandle, this, new WSManNativeApi.WSManError(), TransportMethodEnum.ConnectShellEx, RemotingErrorIdStrings.ConnectExFailed, new object[] { this.ConnectionInfo.ComputerName });
         this.ProcessWSManTransportError(eventArgs);
     }
 }
 internal void SetWSManSessionOption(WSManNativeApi.WSManSessionOption option, string stringData)
 {
     using (WSManNativeApi.WSManData data = new WSManNativeApi.WSManData(stringData))
     {
         int errorCode = WSManNativeApi.WSManSetSessionOption(this.wsManSessionHandle, option, (IntPtr) data);
         if (errorCode != 0)
         {
             PSInvalidOperationException exception = new PSInvalidOperationException(WSManNativeApi.WSManGetErrorMessage(wsManApiStaticData.WSManAPIHandle, errorCode));
             throw exception;
         }
     }
 }