internal void Start(Business.Server server, SetStatusLabelDelegate setStatusLabelDelegate)
        {
            string userName = null;
            string password = null;

            if (server.UseImpersonation == true)
            {
                userName = server.UserName;
                password = Encryption.Decrypt(server.Password);
            }

            List <WmiService> services = WmiService.GetAllServices(server.ServerName, userName, password, "Name = '" + this.ServiceName + "'");

            foreach (WmiService service in services)
            {
                setStatusLabelDelegate("Starting " + service.DisplayName);

                ReturnValue returnValue;

                if (service.State != State.Running && service.State != State.StartPending)
                {
                    if ((returnValue = WmiService.Start(server.ServerName, userName, password, service.Name)) != ReturnValue.Success)
                    {
                        throw new Exception("Couldn't start service: " + service.DisplayName + ", the result was: " + returnValue);
                    }
                }
            }

            setStatusLabelDelegate("Ready.");
        }
        private void SaveChanges()
        {
            if (chkUseSpecificIPAddress.Checked == true && IsIpAddressValid() == false)
            {
                MessageBox.Show("IP address specified is not a legal IP address.");
                return;
            }

            //if (VerifyFieldValues() == false)
            //{
            //    MessageBox.Show("IP address specified is not a legal IP address.");
            //    return;
            //}

            if (AreIpAndTcpAndUdpPortUniqueForInstance() == false)
            {
                MessageBox.Show("You must specify a unique TCP/IP IP address and port combination.", "IP address or port duplication error.", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            if (IsInstanceNameUnique() == false)
            {
                MessageBox.Show("Instance name is not unique.");
                return;
            }

            Cursor = Cursors.WaitCursor;
            SetStatusLabel("Saving.");

            //ImpersonateUser impersonateUser = null;

            try
            {
                //if (_server.UseImpersonation == true)
                //{
                //    SetStatusLabel("Saving: Setting up impersonation.");
                //    impersonateUser = new ImpersonateUser(_server.UserName, Encryption.Decrypt(_server.Password));
                //}

                //
                //string networkPath = null;
                //try
                //{
                //    networkPath = "\\\\" + _server.ServerName + "\\c$";
                //    Directory.GetDirectories(networkPath);
                //}
                //catch (Exception ex)
                //{
                //    MessageBox.Show("Couldn't establish connection on network path: " + networkPath + "\n\n" + ex.Message);
                //    return;
                //}

                bool isNewInstance = false;

                try
                {
                    if (_instance == null)
                    {
                        string nextInstanceServiceName = GetNextMemcachedInstanceName();

                        _instance = new MemCacheDManager.Business.Instance();

                        _instance.ServiceName   = nextInstanceServiceName;
                        _instance.ImageBasePath = _server.BinaryPath;

                        _server.Instances.Add(_instance);

                        isNewInstance = true;
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Couldn't get a list of instances on this server. Please check server connectivity and user credentials and try again.\n" + ex.Message, "Error.", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }

                // TODO: Add rest of fields here.
                _instance.DisplayName = txtInstanceName.Text;

                decimal chunkSizeGrowthFactor = 0;
                string  chunkSizeString       = ConvertDecimalUserInputToLocalizedString(txtChunkSizeGrowthFactor.Text);
                if (Decimal.TryParse(chunkSizeString, out chunkSizeGrowthFactor) == true)
                {
                    _instance.ChunkSizeGrowthFactor = chunkSizeGrowthFactor;
                }

                int defaultKeySize = 0;
                if (Int32.TryParse(txtDefaultKeySize.Text, out defaultKeySize) == true)
                {
                    _instance.DefaultKeySize = defaultKeySize;
                }


                _instance.MaximizeCoreFile = chkMaximizeCoreFile.Checked;

                int maximumConnections = 0;
                if (Int32.TryParse(txtMaximumConnections.Text, out maximumConnections) == true)
                {
                    _instance.MaximumConnections = maximumConnections;
                }

                int memoryLimit = 0;
                if (Int32.TryParse(txtMemoryLimit.Text, out memoryLimit) == true)
                {
                    _instance.MemoryLimit = memoryLimit;
                }

                _instance.UseManagedInstance = chkUseManagedInstance.Checked;

                if (chkUseSpecificIPAddress.Checked == true)
                {
                    _instance.IpAddress = txtIpAddress.Text;
                }
                else
                {
                    _instance.IpAddress = null;
                }

                if (chkUseUDP.Checked == true)
                {
                    int udpPort = 0;
                    if (Int32.TryParse(txtUdpPort.Text, out udpPort) == true)
                    {
                        _instance.UdpPort = udpPort;
                    }
                }
                else
                {
                    _instance.UdpPort = 0;
                }

                int tcpPort;
                Int32.TryParse(txtTcpPort.Text, out tcpPort);
                _instance.TcpPort = tcpPort;

                _instance.UpdateInstanceOnServer(_server, this.SetStatusLabel);

                if (isNewInstance == true)
                {
                    if (MessageBox.Show("Would you like to start the new instance now?", "Start Service?", MessageBoxButtons.YesNo) == DialogResult.Yes)
                    {
                        string userName = null;
                        string password = null;

                        if (_server.UseImpersonation == true)
                        {
                            userName = _server.UserName;
                            password = Encryption.Decrypt(_server.Password);
                        }

                        SetStatusLabel("Starting service.");
                        Cursor.Current = Cursors.WaitCursor;
                        try
                        {
                            WmiService.Start(_server.ServerName, userName, password, _instance.ServiceName);
                        }
                        finally
                        {
                            SetStatusLabel("Service started.");
                            Cursor.Current = Cursors.Default;
                        }
                    }
                }

                btnApply.Enabled = false;

                SetStatusLabel("Updating cofiguration file.");

                ServerConfiguration.Save(Configuration.Default.LastConfigFile);

                SetStatusLabel("Refreshing UI.");

                if (Save != null)
                {
                    Save(this, EventArgs.Empty);
                }
            }
            finally
            {
                //if (impersonateUser != null && impersonateUser.IsImpersonating == true)
                //    impersonateUser.Undo();

                Cursor = Cursors.Default;
                SetStatusLabel("Ready.");
            }
        }