Exemplo n.º 1
0
        public RESTStatus GetSessions(SQLLib sql, object dummy, NetworkConnectionInfo ni, string MachineID)
        {
            if (ni.HasAcl(ACLFlags.ChangeServerSettings) == false)
            {
                ni.Error   = "Access denied";
                ni.ErrorID = ErrorFlags.AccessDenied;
                return(RESTStatus.Denied);
            }

            string guid = Guid.NewGuid().ToString();

            PushData p = new PushData();

            p.Action  = "getsessions";
            p.ReplyID = guid;

            PushServiceHelper.SendPushService(MachineID, p, 0);
            PushDataResponse resp = PushServiceHelper.PopResponse(MachineID, 0, guid);

            if (resp == null)
            {
                ni.Error   = "No response";
                ni.ErrorID = ErrorFlags.NoData;
                return(RESTStatus.NoContent);
            }

            try
            {
                SessionList = JsonConvert.DeserializeObject <PushRunningSessionList>(resp.Data.ToString());
            }
            catch
            {
                ni.Error   = "Faulty data";
                ni.ErrorID = ErrorFlags.NoData;
                return(RESTStatus.NoContent);
            }
            return(RESTStatus.Success);
        }
Exemplo n.º 2
0
        static bool ProcessSimpleTask(Network net, SimpleTask st, out Int64 NewID)
        {
            NewID = -1;
            Status.UpdateMessage(0, "Running Simple Task: " + st.Name);
            try
            {
                switch (st.Type)
                {
                case 1:
                    #region Run
                {
                    SimpleTaskRunProgramm rt = JsonConvert.DeserializeObject <SimpleTaskRunProgramm>(st.Data);

                    if (string.IsNullOrWhiteSpace(rt.Executable) == true)
                    {
                        CompleteTask(net, st, 0xFFF1, "Simple Task Data is invalid.");
                        break;
                    }

                    Process proc = new Process();
                    if (string.IsNullOrWhiteSpace(rt.User) == false)
                    {
                        PushRunningSessionList sessions = ProgramAgent.CPP.GetActiveTSSessions();
                        int SessionID = -1;
                        foreach (PushRunningSessionElement session in sessions.Data)
                        {
                            if (rt.User.ToLower() == (session.Domain + "\\" + session.User).ToLower())
                            {
                                SessionID = session.SessionID;
                                break;
                            }
                        }

                        if (SessionID == -1)
                        {
                            Int64?nid = net.PutSimpleTaskAside(st.ID);
                            if (nid == null)
                            {
                                return(false);
                            }
                            else
                            {
                                NewID = nid.Value;
                                return(true);
                            }
                        }

                        int processid = ProgramAgent.CPP.StartAppAsUserID(Environment.ExpandEnvironmentVariables(rt.Executable), rt.Parameters, SessionID);
                        if (processid == -1)
                        {
                            CompleteTask(net, st, 0xFFF3, "Cannot start process " + rt.Executable);
                            break;
                        }
                        proc = Process.GetProcessById(processid);
                    }
                    else
                    {
                        try
                        {
                            proc.StartInfo.UseShellExecute = false;
                            proc.StartInfo.FileName        = Environment.ExpandEnvironmentVariables(rt.Executable);
                            proc.StartInfo.Arguments       = rt.Parameters;
                            proc.Start();
                        }
                        catch
                        {
                            CompleteTask(net, st, 0xFFF3, "Cannot start process " + rt.Executable);
                            break;
                        }
                    }

                    int Counter = 0;
                    do
                    {
                        Thread.Sleep(1000);
                        if (proc.HasExited == true)
                        {
                            break;
                        }
                        Counter++;
                        if (Counter % 120 == 0)
                        {
                            net.Ping();
                        }
                    } while (Counter < 3600);

                    if (proc.HasExited == false)
                    {
                        proc.Kill();
                        CompleteTask(net, st, 0xFFF2, "Process has been killed, took too long.");
                        break;
                    }

                    CompleteTask(net, st, proc.ExitCode, "Process completed successfully.");
                    break;
                }

                    #endregion
                case 2:
                    #region Registry
                {
                    SimpleTaskRegistry reg = JsonConvert.DeserializeObject <SimpleTaskRegistry>(st.Data);

                    RegistryKey regroot = null;

                    switch (reg.Root)
                    {
                    case 0:
                        regroot = Registry.LocalMachine;
                        break;

                    case 1:
                        regroot = Registry.Users;
                        break;

                    default:
                    {
                        CompleteTask(net, st, 0xFFF2, "Registry Root is invalid 0x" + reg.Action.ToString("X") + ".");
                        break;
                    }
                    }

                    if (regroot == null)
                    {
                        break;
                    }

                    RegistryValueKind regtype = RegistryValueKind.Unknown;

                    switch (reg.ValueType)
                    {
                    case 0:
                        regtype = RegistryValueKind.String;
                        break;

                    case 1:
                        regtype = RegistryValueKind.DWord;
                        break;

                    case 2:
                        regtype = RegistryValueKind.QWord;
                        break;

                    case 3:
                        regtype = RegistryValueKind.MultiString;
                        break;

                    case 4:
                        regtype = RegistryValueKind.ExpandString;
                        break;

                    case 5:
                        regtype = RegistryValueKind.Binary;
                        break;

                    default:
                    {
                        CompleteTask(net, st, 0xFFF3, "Registry Value Type is invalid 0x" + reg.Action.ToString("X") + ".");
                        break;
                    }
                    }

                    if (regtype == RegistryValueKind.Unknown)
                    {
                        break;
                    }

                    if (string.IsNullOrWhiteSpace(reg.Folder) == true)
                    {
                        CompleteTask(net, st, 0xFFF4, "Registry Root Folder is missing.");
                        break;
                    }

                    reg.Folder = reg.Folder.Trim();
                    if (reg.Folder.StartsWith("\\") == true)
                    {
                        reg.Folder = reg.Folder.Substring(1, reg.Folder.Length - 1);
                    }
                    if (reg.Folder.EndsWith("\\") == true)
                    {
                        reg.Folder = reg.Folder.Substring(0, reg.Folder.Length - 1);
                    }

                    if (string.IsNullOrWhiteSpace(reg.Folder) == true)
                    {
                        CompleteTask(net, st, 0xFFF5, "Registry Root Folder is missing.");
                        break;
                    }

                    if (reg.Root == 1)         //HKEY_USERS
                    {
                        string User = reg.Folder.Split('\\')[0].Trim();
                        using (RegistryKey r = regroot.OpenSubKey(User))
                        {
                            //user not loaded (logged in)
                            if (r == null)
                            {
                                Int64?nid = net.PutSimpleTaskAside(st.ID);
                                if (nid == null)
                                {
                                    return(false);
                                }
                                else
                                {
                                    NewID = nid.Value;
                                    return(true);
                                }
                            }
                        }
                    }

                    bool   Success     = false;
                    string SuccessText = "";

                    switch (reg.Action)
                    {
                    case 0:             //Add / Update key
                    {
                        using (RegistryKey k = regroot.CreateSubKey(reg.Folder))
                        {
                            if (k != null)
                            {
                                switch (regtype)
                                {
                                case RegistryValueKind.String:
                                case RegistryValueKind.ExpandString:
                                    k.SetValue(reg.Valuename, reg.Data, regtype);
                                    SuccessText = "Registry insertation completed successfully (REG_SZ/REG_EXPAND_SZ).";
                                    Success     = true;
                                    break;

                                case RegistryValueKind.MultiString:
                                    k.SetValue(reg.Valuename, reg.Data.Split(new string[] { "\\0" }, StringSplitOptions.None), regtype);
                                    SuccessText = "Registry insertation completed successfully (REG_MULTI_SZ).";
                                    Success     = true;
                                    break;

                                case RegistryValueKind.DWord:
                                {
                                    int dword;
                                    if (reg.Data.ToLower().StartsWith("0x") == true)
                                    {
                                        if (int.TryParse(reg.Data.Substring(2, reg.Data.Length - 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out dword) == false)
                                        {
                                            CompleteTask(net, st, 0xFFF7, "Invalid data.");
                                            break;
                                        }
                                    }
                                    else
                                    {
                                        if (int.TryParse(reg.Data, out dword) == false)
                                        {
                                            CompleteTask(net, st, 0xFFF7, "Invalid data.");
                                            break;
                                        }
                                    }
                                    k.SetValue(reg.Valuename, dword, regtype);
                                    SuccessText = "Registry insertation completed successfully (REG_DWORD).";
                                    Success     = true;
                                }
                                break;

                                case RegistryValueKind.QWord:
                                {
                                    Int64 dword;
                                    if (reg.Data.ToLower().StartsWith("0x") == true)
                                    {
                                        if (Int64.TryParse(reg.Data.Substring(2, reg.Data.Length - 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out dword) == false)
                                        {
                                            CompleteTask(net, st, 0xFFF7, "Invalid data.");
                                            break;
                                        }
                                    }
                                    else
                                    {
                                        if (Int64.TryParse(reg.Data, out dword) == false)
                                        {
                                            CompleteTask(net, st, 0xFFF7, "Invalid data.");
                                            break;
                                        }
                                    }
                                    k.SetValue(reg.Valuename, dword, regtype);
                                    SuccessText = "Registry insertation completed successfully (REG_QWORD).";
                                    Success     = true;
                                }
                                break;

                                case RegistryValueKind.Binary:
                                {
                                    if (reg.Data.Length % 2 != 0)
                                    {
                                        CompleteTask(net, st, 0xFFF7, "Invalid data.");
                                        break;
                                    }
                                    List <byte> bytedata = new List <byte>();
                                    for (int i = 0; i < reg.Data.Length; i += 2)
                                    {
                                        int btmp;
                                        if (int.TryParse(reg.Data.Substring(i, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out btmp) == false)
                                        {
                                            CompleteTask(net, st, 0xFFF7, "Invalid data.");
                                            break;
                                        }
                                        bytedata.Add((byte)btmp);
                                    }
                                    k.SetValue(reg.Valuename, bytedata.ToArray(), regtype);
                                    SuccessText = "Registry insertation completed successfully (REG_BINARY).";
                                    Success     = true;
                                }
                                break;
                                }
                            }
                            else
                            {
                                CompleteTask(net, st, 0xFFF6, "Cannot open registry " + reg.Folder + ".");
                                break;
                            }
                        }
                    }
                    break;

                    case 1:             //Delete value
                    {
                        using (RegistryKey k = regroot.OpenSubKey(reg.Folder, true))
                        {
                            if (k != null)
                            {
                                k.DeleteValue(reg.Valuename, false);
                                SuccessText = "Registry value deletation completed successfully.";
                                Success     = true;
                            }
                            else
                            {
                                CompleteTask(net, st, 0xFFF6, "Cannot open registry " + reg.Folder + ".");
                                break;
                            }
                        }
                    }
                    break;

                    case 2:             //Delete directory
                    {
                        string f = reg.Folder.Substring(0, reg.Folder.LastIndexOf('\\'));
                        string v = reg.Folder.Substring(reg.Folder.LastIndexOf('\\') + 1);

                        using (RegistryKey k = regroot.OpenSubKey(f, true))
                        {
                            if (k != null)
                            {
                                k.DeleteSubKeyTree(v, false);
                                SuccessText = "Registry tree deletation completed successfully.";
                                Success     = true;
                            }
                            else
                            {
                                CompleteTask(net, st, 0xFFF6, "Cannot open registry " + f + ".");
                                break;
                            }
                        }
                    }
                    break;

                    default:
                    {
                        CompleteTask(net, st, 0xFFF1, "Registry Action is invalid 0x" + reg.Action.ToString("X") + ".");
                        break;
                    }
                    }

                    if (Success == true)
                    {
                        CompleteTask(net, st, 0, SuccessText);
                    }
                    break;
                }

                    #endregion
                case 3:
                    #region Reset WU Client
                {
                    try
                    {
                        ServiceController scm = new ServiceController("wuauserv");

                        if (scm.Status != ServiceControllerStatus.Stopped)
                        {
                            if (scm.CanStop == false)
                            {
                                CompleteTask(net, st, 1, "WU Reset: cannot stop Service");
                                break;
                            }

                            scm.Stop();
                            int Counter = 0;
                            do
                            {
                                Counter++;
                                Thread.Sleep(1000);
                                if (Counter > 120)
                                {
                                    CompleteTask(net, st, 2, "WU Reset: stop Service: timed out");
                                    break;
                                }
                            } while (scm.Status != ServiceControllerStatus.Stopped);

                            Thread.Sleep(1000);
                            if (scm.Status != ServiceControllerStatus.Stopped)
                            {
                                scm.Stop();
                                Counter = 0;
                                do
                                {
                                    Counter++;
                                    Thread.Sleep(1000);
                                    if (Counter > 120)
                                    {
                                        CompleteTask(net, st, 3, "WU Reset: stop Service: timed out (2)");
                                        break;
                                    }
                                } while (scm.Status != ServiceControllerStatus.Stopped);
                            }

                            if (scm.Status != ServiceControllerStatus.Stopped)
                            {
                                CompleteTask(net, st, 4, "WU Reset: stop Service: didn't stop for the 2nd time");
                                break;
                            }
                        }

                        string SDPath = Environment.ExpandEnvironmentVariables("%SYSTEMROOT%\\SoftwareDistribution");
                        if (Directory.Exists(SDPath) == true)
                        {
                            Directory.Delete(SDPath, true);
                        }

                        string USOEXE = Environment.ExpandEnvironmentVariables("%SYSTEMROOT%\\System32\\usoclient.exe");
                        try
                        {
                            Process p = new Process();
                            p.StartInfo.UseShellExecute = false;
                            p.StartInfo.FileName        = USOEXE;
                            p.StartInfo.Arguments       = "RefreshSettings";
                            p.Start();
                            p.WaitForExit(30000);
                        }
                        catch
                        {
                        }

                        try
                        {
                            Process p = new Process();
                            p.StartInfo.UseShellExecute = false;
                            p.StartInfo.FileName        = USOEXE;
                            p.StartInfo.Arguments       = "StartScan";
                            p.Start();
                            p.WaitForExit(30000);
                        }
                        catch
                        {
                        }

                        CompleteTask(net, st, 0, "WU Reset completed successfully");
                    }
                    catch (Exception ee)
                    {
                        CompleteTask(net, st, 0xFFFF, "SEH: " + ee.ToString());
                        break;
                    }
                }
                break;

                    #endregion
                default:
                {
                    CompleteTask(net, st, 0xFFFF, "Does not know how to process Simple Task Type 0x" + st.Type.ToString("X") + ".");
                    break;
                }
                }
            }
            catch (Exception ee)
            {
                CompleteTask(net, st, 0xFFF0, "SEH while processing Simple Task: " + ee.ToString());
                return(false);
            }

            Status.UpdateMessage(0, "Completed Simple Task: " + st.Name);
            return(true);
        }