/// <summary> /// Applies changes since the most recent apply. /// </summary> /// <returns> true if changes can be applied. </returns> public bool CanApplyChanges() { ManagementObjectSearcher ServiceQuery = new ManagementObjectSearcher ("Select * from Win32_Service Where DisplayName ='" + serviceResultNode.DisplayName + "'"); object[] parameters = new object[1]; parameters[0] = ComboBoxStartupType.SelectedItem.ToString(); foreach (ManagementObject ServiceObject in ServiceQuery.Get()) { ServiceObject.InvokeMethod("ChangeStartMode", parameters); } serviceResultNode.SubItemDisplayNames[2] = ComboBoxStartupType.SelectedItem.ToString(); return(true); }
/// <summary> /// Handles MessageReceived events of all clients, evaluates each message, finds appropriate /// service object and invokes appropriate method. /// </summary> /// <param name="sender">Source of event</param> /// <param name="e">Event arguments</param> private void Client_MessageReceived(object sender, MessageEventArgs e) { // Get RequestReplyMessenger object (sender of event) to get client RequestReplyMessenger <IScsServerClient> requestReplyMessenger = (RequestReplyMessenger <IScsServerClient>)sender; // Cast message to ScsRemoteInvokeMessage and check it if (!(e.Message is ScsRemoteInvokeMessage invokeMessage)) { return; } try { // Get client object IScsServiceClient client = _serviceClients[requestReplyMessenger.Messenger.ClientId]; if (client == null) { requestReplyMessenger.Messenger.Disconnect(); return; } // Get service object ServiceObject serviceObject = _serviceObjects[invokeMessage.ServiceClassName]; if (serviceObject == null) { SendInvokeResponse(requestReplyMessenger, invokeMessage, null, new ScsRemoteException("There is no service with name '" + invokeMessage.ServiceClassName + "'")); return; } // Invoke method try { // Set client to service, so user service can get client in service method using // CurrentClient property. object returnValue; serviceObject.Service.CurrentClient = client; try { returnValue = serviceObject.InvokeMethod(invokeMessage.MethodName, invokeMessage.Parameters); } finally { // Set CurrentClient as null since method call completed serviceObject.Service.CurrentClient = null; } // Send method invocation return value to the client SendInvokeResponse(requestReplyMessenger, invokeMessage, returnValue, null, invokeMessage.Parameters); } catch (TargetInvocationException ex) { Exception innerEx = ex.InnerException; if (innerEx != null) { SendInvokeResponse(requestReplyMessenger, invokeMessage, null, new ScsRemoteInvocationException(invokeMessage.ServiceClassName, serviceObject.ServiceAttribute?.Version ?? "", invokeMessage.MethodName, innerEx.Message, innerEx)); } } catch (Exception ex) { SendInvokeResponse(requestReplyMessenger, invokeMessage, null, new ScsRemoteInvocationException(invokeMessage.ServiceClassName, serviceObject.ServiceAttribute?.Version ?? "", invokeMessage.MethodName, ex.Message, ex)); } } catch (Exception ex) { SendInvokeResponse(requestReplyMessenger, invokeMessage, null, new ScsRemoteException("An error occured during remote service method call.", ex)); } }
/// <summary> /// OnSelectionAction method handles the execution of a selection-dependent action. /// </summary> /// <param name="action">The executed action.</param> /// <param name="status">The object that holds the status information.</param> protected override void OnSelectionAction(Action action, AsyncStatus status) { ManagementObjectSearcher ServiceQuery = new ManagementObjectSearcher ("Select * from Win32_Service Where DisplayName = '" + SelectedNodes[0].DisplayName + "'"); string actionString = action.Tag as string; if (actionString != null) { switch (actionString) { case "Start": { foreach (ManagementObject ServiceObject in ServiceQuery.Get()) { ServiceObject.InvokeMethod("StartService", null); } SelectedNodes[0].SubItemDisplayNames[1] = "Started"; ((Action)SelectionData.ActionsPaneItems[0]).Enabled = false; ((Action)SelectionData.ActionsPaneItems[3]).Enabled = false; } break; case "Stop": { foreach (ManagementObject ServiceObject in ServiceQuery.Get()) { ServiceObject.InvokeMethod("StopService", null); } SelectedNodes[0].SubItemDisplayNames[1] = "Stopped"; ((Action)SelectionData.ActionsPaneItems[1]).Enabled = false; ((Action)SelectionData.ActionsPaneItems[2]).Enabled = false; ((Action)SelectionData.ActionsPaneItems[3]).Enabled = false; } break; case "Pause": { foreach (ManagementObject ServiceObject in ServiceQuery.Get()) { ServiceObject.InvokeMethod("PauseService", null); } SelectedNodes[0].SubItemDisplayNames[1] = "Paused"; ((Action)SelectionData.ActionsPaneItems[0]).Enabled = false; ((Action)SelectionData.ActionsPaneItems[2]).Enabled = false; } break; case "Resume": { foreach (ManagementObject ServiceObject in ServiceQuery.Get()) { ServiceObject.InvokeMethod("ResumeService", null); } SelectedNodes[0].SubItemDisplayNames[1] = "Started"; ((Action)SelectionData.ActionsPaneItems[0]).Enabled = false; ((Action)SelectionData.ActionsPaneItems[3]).Enabled = false; } break; case "Properties": { SelectionData.ShowPropertySheet("Service Properties"); } break; } } }