示例#1
0
        private void WuModule(EntityPolicyModules policyModule)
        {
            var clientWuModule = new DtoClientWuModule();
            var wuModule       = new ServiceWuModule().GetModule(policyModule.ModuleId);

            clientWuModule.Guid           = wuModule.Guid;
            clientWuModule.DisplayName    = wuModule.Name;
            clientWuModule.Arguments      = wuModule.AdditionalArguments;
            clientWuModule.Order          = policyModule.Order;
            clientWuModule.Timeout        = wuModule.Timeout;
            clientWuModule.RedirectOutput = wuModule.RedirectStdOut;
            clientWuModule.RedirectError  = wuModule.RedirectStdError;
            foreach (var successCode in wuModule.SuccessCodes.Split(','))
            {
                clientWuModule.SuccessCodes.Add(successCode);
            }

            if (policyModule.ConditionId != -1)
            {
                var conditionScript = new ServiceScriptModule().GetModule(policyModule.ConditionId);
                if (conditionScript != null)
                {
                    clientWuModule.ConditionFailedAction    = policyModule.ConditionFailedAction;
                    clientWuModule.ConditionNextOrder       = policyModule.ConditionNextModule;
                    clientWuModule.Condition                = new DtoClientModuleCondition();
                    clientWuModule.Condition.Arguments      = conditionScript.Arguments;
                    clientWuModule.Condition.DisplayName    = conditionScript.Name;
                    clientWuModule.Condition.Guid           = conditionScript.Guid;
                    clientWuModule.Condition.RedirectError  = conditionScript.RedirectStdError;
                    clientWuModule.Condition.RedirectOutput = conditionScript.RedirectStdOut;
                    if (conditionScript.ImpersonationId != -1)
                    {
                        var scriptImpersonationGuid = new ServiceImpersonationAccount().GetGuid(conditionScript.ImpersonationId);
                        if (!string.IsNullOrEmpty(scriptImpersonationGuid))
                        {
                            clientWuModule.Condition.RunAs = scriptImpersonationGuid;
                        }
                    }
                    clientWuModule.Condition.ScriptType = conditionScript.ScriptType;
                    foreach (var successCode in conditionScript.SuccessCodes.Split(','))
                    {
                        clientWuModule.Condition.SuccessCodes.Add(successCode);
                    }
                    clientWuModule.Condition.Timeout          = conditionScript.Timeout;
                    clientWuModule.Condition.WorkingDirectory = conditionScript.WorkingDirectory;
                }
            }

            var moduleFiles = new ServiceModule().GetModuleFiles(wuModule.Guid);

            foreach (var file in moduleFiles.OrderBy(x => x.FileName))
            {
                var clientFile = new DtoClientFileHash();
                clientFile.FileName = file.FileName;
                clientFile.FileHash = file.Md5Hash;
                clientWuModule.Files.Add(clientFile);
            }

            _clientPolicy.WuModules.Add(clientWuModule);
        }
示例#2
0
 private void Policy()
 {
     _clientPolicy.Name                  = _policy.Name;
     _clientPolicy.Guid                  = _policy.Guid;
     _clientPolicy.Frequency             = _policy.Frequency;
     _clientPolicy.Trigger               = _policy.Trigger;
     _clientPolicy.SubFrequency          = _policy.SubFrequency;
     _clientPolicy.StartDate             = _policy.StartDate;
     _clientPolicy.CompletedAction       = _policy.CompletedAction;
     _clientPolicy.RemoveInstallCache    = _policy.RemoveInstallCache;
     _clientPolicy.ExecutionType         = _policy.ExecutionType;
     _clientPolicy.ErrorAction           = _policy.ErrorAction;
     _clientPolicy.IsInventory           = _policy.RunInventory;
     _clientPolicy.RemoteAccess          = _policy.RemoteAccess;
     _clientPolicy.IsLoginTracker        = _policy.RunLoginTracker;
     _clientPolicy.JoinDomain            = _policy.JoinDomain;
     _clientPolicy.ImagePrepCleanup      = _policy.ImagePrepCleanup;
     _clientPolicy.FrequencyMissedAction = _policy.MissedAction;
     _clientPolicy.LogLevel              = _policy.LogLevel;
     _clientPolicy.SkipServerResult      = _policy.SkipServerResult;
     _clientPolicy.IsApplicationMonitor  = _policy.RunApplicationMonitor;
     _clientPolicy.StartWindowScheduleId = _policy.WindowStartScheduleId;
     _clientPolicy.EndWindowScheduleId   = _policy.WindowEndScheduleId;
     _clientPolicy.WuType                = _policy.WuType;
     _clientPolicy.PolicyComCondition    = _policy.PolicyComCondition;
     _clientPolicy.Id = _policy.Id;
     _clientPolicy.ConditionFailedAction = _policy.ConditionFailedAction;
     if (_policy.ConditionId != -1)
     {
         var conditionScript = new ServiceScriptModule().GetModule(_policy.ConditionId);
         if (conditionScript != null)
         {
             _clientPolicy.Condition.Arguments      = conditionScript.Arguments;
             _clientPolicy.Condition.DisplayName    = conditionScript.Name;
             _clientPolicy.Condition.Guid           = conditionScript.Guid;
             _clientPolicy.Condition.RedirectError  = conditionScript.RedirectStdError;
             _clientPolicy.Condition.RedirectOutput = conditionScript.RedirectStdOut;
             if (conditionScript.ImpersonationId != -1)
             {
                 var scriptImpersonationGuid = new ServiceImpersonationAccount().GetGuid(conditionScript.ImpersonationId);
                 if (!string.IsNullOrEmpty(scriptImpersonationGuid))
                 {
                     _clientPolicy.Condition.RunAs = scriptImpersonationGuid;
                 }
             }
             _clientPolicy.Condition.ScriptType = conditionScript.ScriptType;
             foreach (var successCode in conditionScript.SuccessCodes.Split(','))
             {
                 _clientPolicy.Condition.SuccessCodes.Add(successCode);
             }
             _clientPolicy.Condition.Timeout          = conditionScript.Timeout;
             _clientPolicy.Condition.WorkingDirectory = conditionScript.WorkingDirectory;
         }
     }
     if (_policy.JoinDomain)
     {
         _clientPolicy.DomainOU = _policy.DomainOU;
     }
 }
示例#3
0
        private void PrinterModule(EntityPolicyModules policyModule)
        {
            var clientPrinterModule = new DtoClientPrinterModule();
            var printerModule       = new ServicePrinterModule().GetModule(policyModule.ModuleId);

            clientPrinterModule.Guid               = printerModule.Guid;
            clientPrinterModule.DisplayName        = printerModule.Name;
            clientPrinterModule.PrinterPath        = printerModule.NetworkPath;
            clientPrinterModule.Order              = policyModule.Order;
            clientPrinterModule.IsDefault          = printerModule.IsDefault;
            clientPrinterModule.RestartSpooler     = printerModule.RestartSpooler;
            clientPrinterModule.PrinterAction      = printerModule.Action;
            clientPrinterModule.WaitForEnumeration = printerModule.WaitForEnumeration;

            if (policyModule.ConditionId != -1)
            {
                var conditionScript = new ServiceScriptModule().GetModule(policyModule.ConditionId);
                if (conditionScript != null)
                {
                    clientPrinterModule.ConditionFailedAction    = policyModule.ConditionFailedAction;
                    clientPrinterModule.ConditionNextOrder       = policyModule.ConditionNextModule;
                    clientPrinterModule.Condition                = new DtoClientModuleCondition();
                    clientPrinterModule.Condition.Arguments      = conditionScript.Arguments;
                    clientPrinterModule.Condition.DisplayName    = conditionScript.Name;
                    clientPrinterModule.Condition.Guid           = conditionScript.Guid;
                    clientPrinterModule.Condition.RedirectError  = conditionScript.RedirectStdError;
                    clientPrinterModule.Condition.RedirectOutput = conditionScript.RedirectStdOut;
                    if (conditionScript.ImpersonationId != -1)
                    {
                        var scriptImpersonationGuid = new ServiceImpersonationAccount().GetGuid(conditionScript.ImpersonationId);
                        if (!string.IsNullOrEmpty(scriptImpersonationGuid))
                        {
                            clientPrinterModule.Condition.RunAs = scriptImpersonationGuid;
                        }
                    }
                    clientPrinterModule.Condition.ScriptType = conditionScript.ScriptType;
                    foreach (var successCode in conditionScript.SuccessCodes.Split(','))
                    {
                        clientPrinterModule.Condition.SuccessCodes.Add(successCode);
                    }
                    clientPrinterModule.Condition.Timeout          = conditionScript.Timeout;
                    clientPrinterModule.Condition.WorkingDirectory = conditionScript.WorkingDirectory;
                }
            }

            _clientPolicy.PrinterModules.Add(clientPrinterModule);
        }
示例#4
0
        private void MessageModule(EntityPolicyModules policyModule)
        {
            var clientMessageModule = new DtoClientMessageModule();
            var messageModule       = new ServiceMessageModule().GetModule(policyModule.ModuleId);

            clientMessageModule.Guid        = messageModule.Guid;
            clientMessageModule.DisplayName = messageModule.Name;
            clientMessageModule.Order       = policyModule.Order;
            clientMessageModule.Title       = messageModule.Title;
            clientMessageModule.Message     = messageModule.Message;
            clientMessageModule.Timeout     = messageModule.Timeout;
            if (policyModule.ConditionId != -1)
            {
                var conditionScript = new ServiceScriptModule().GetModule(policyModule.ConditionId);
                if (conditionScript != null)
                {
                    clientMessageModule.ConditionFailedAction    = policyModule.ConditionFailedAction;
                    clientMessageModule.ConditionNextOrder       = policyModule.ConditionNextModule;
                    clientMessageModule.Condition                = new DtoClientModuleCondition();
                    clientMessageModule.Condition.Arguments      = conditionScript.Arguments;
                    clientMessageModule.Condition.DisplayName    = conditionScript.Name;
                    clientMessageModule.Condition.Guid           = conditionScript.Guid;
                    clientMessageModule.Condition.RedirectError  = conditionScript.RedirectStdError;
                    clientMessageModule.Condition.RedirectOutput = conditionScript.RedirectStdOut;
                    if (conditionScript.ImpersonationId != -1)
                    {
                        var scriptImpersonationGuid = new ServiceImpersonationAccount().GetGuid(conditionScript.ImpersonationId);
                        if (!string.IsNullOrEmpty(scriptImpersonationGuid))
                        {
                            clientMessageModule.Condition.RunAs = scriptImpersonationGuid;
                        }
                    }
                    clientMessageModule.Condition.ScriptType = conditionScript.ScriptType;
                    foreach (var successCode in conditionScript.SuccessCodes.Split(','))
                    {
                        clientMessageModule.Condition.SuccessCodes.Add(successCode);
                    }
                    clientMessageModule.Condition.Timeout          = conditionScript.Timeout;
                    clientMessageModule.Condition.WorkingDirectory = conditionScript.WorkingDirectory;
                }
            }
            _clientPolicy.MessageModules.Add(clientMessageModule);
        }
示例#5
0
        private string VerifySoftware(EntityPolicyModules policyModule)
        {
            var softwareModule = new ServiceSoftwareModule().GetModule(policyModule.ModuleId);

            if (string.IsNullOrEmpty(softwareModule.Name))
            {
                return("A Software Module Has An Invalid Name");
            }

            if (softwareModule.Archived)
            {
                return("Software Module: " + softwareModule.Name + " Is Archived");
            }

            if (string.IsNullOrEmpty(softwareModule.Guid))
            {
                return("Software Module: " + softwareModule.Name + " Has An Invalid GUID");
            }

            int value;

            if (!int.TryParse(softwareModule.Timeout.ToString(), out value))
            {
                return("Software Module: " + softwareModule.Name + " Has An Invalid Timeout");
            }

            if (string.IsNullOrEmpty(softwareModule.Command))
            {
                return("Software Module: " + softwareModule.Name + " Has An Invalid Command");
            }

            if (!int.TryParse(policyModule.Order.ToString(), out value))
            {
                return("Software Module: " + softwareModule.Name + " Has An Invalid Order");
            }

            List <string> successCodes = new List <string>();

            foreach (var successCode in softwareModule.SuccessCodes.Split(','))
            {
                successCodes.Add(successCode);
            }

            if (successCodes.Count == 0)
            {
                return("Software Module: " + softwareModule.Name + " Has An Invalid Success Code");
            }

            if (successCodes.Any(code => !int.TryParse(code, out value)))
            {
                return("Software Module: " + softwareModule.Name + " Has An Invalid Success Code");
            }

            var uploadedFiles = new ServiceUploadedFile().GetFilesForModule(softwareModule.Guid);
            var externalFiles = new ServiceExternalDownload().GetForModule(softwareModule.Guid);

            if (uploadedFiles == null && externalFiles == null)
            {
                return("Software Module: " + softwareModule.Name + " Does Not Have Any Associated Files");
            }

            try
            {
                if (uploadedFiles.Count == 0 && externalFiles.Count == 0)
                {
                    return("Software Module: " + softwareModule.Name + " Does Not Have Any Associated Files");
                }
            }
            catch
            {
                return("Software Module: " + softwareModule.Name + " Error While Determining Associated Files");
            }

            var basePath = Path.Combine(ServiceSetting.GetSettingValue(SettingStrings.StoragePath), "software_uploads");

            using (var unc = new UncServices())
            {
                if (unc.NetUseWithCredentials() || unc.LastError == 1219)
                {
                    try
                    {
                        foreach (var file in uploadedFiles.OrderBy(x => x.Name))
                        {
                            if (string.IsNullOrEmpty(file.Hash))
                            {
                                return("Software Module: " + softwareModule.Name + " " + file.Name + " Does Not Have An MD5 Hash");
                            }
                            var fullPath = Path.Combine(basePath, file.Guid, file.Name);
                            if (!File.Exists(fullPath))
                            {
                                return("Software Module: " + softwareModule.Name + " " + fullPath + " Does Not Exist");
                            }
                        }


                        foreach (var file in externalFiles.OrderBy(x => x.FileName))
                        {
                            if (file.Status != EnumFileDownloader.DownloadStatus.Complete)
                            {
                                return("Software Module: " + softwareModule.Name + " " + file.FileName + " Has Not Finished Downloading Or Is In An Error State");
                            }
                            if (string.IsNullOrEmpty(file.Md5Hash))
                            {
                                return("Software Module: " + softwareModule.Name + " " + file.FileName + " Does Not Have An MD5 Hash");
                            }
                            var fullPath = Path.Combine(basePath, file.ModuleGuid, file.FileName);
                            if (!File.Exists(fullPath))
                            {
                                return("Software Module: " + softwareModule.Name + " " + fullPath + " Does Not Exist");
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        Logger.Debug(ex.Message);
                        return("Software Module: " + softwareModule.Name + " Unknown Error Trying To Verify Files");
                    }
                }
                else
                {
                    return("Could Not Reach Storage Path");
                }
            }


            if (softwareModule.ImpersonationId != -1)
            {
                var impAccount = new ServiceImpersonationAccount().GetAccount(softwareModule.ImpersonationId);
                if (impAccount == null)
                {
                    return("Software Module: " + softwareModule.Name + " Has An Invalid Impersonation Account");
                }
            }

            return(null);
        }
示例#6
0
        private string VerifyScript(EntityPolicyModules policyModule)
        {
            var scriptModule = new ServiceScriptModule().GetModule(policyModule.ModuleId);

            if (scriptModule == null)
            {
                return("An Assigned Script Module No Longer Exists");
            }

            if (string.IsNullOrEmpty(scriptModule.Name))
            {
                return("A Script Module Has An Invalid Name");
            }

            if (scriptModule.Archived)
            {
                return("Script Module: " + scriptModule.Name + " Is Archived");
            }

            if (string.IsNullOrEmpty(scriptModule.ScriptContents))
            {
                return("Script Module: " + scriptModule.Name + " Has An Invalid Script.  It Cannot Be Empty.");
            }

            if (string.IsNullOrEmpty(scriptModule.Guid))
            {
                return("Script Module: " + scriptModule.Name + " Has An Invalid GUID");
            }

            if (scriptModule.ScriptType != EnumScriptModule.ScriptType.Batch &&
                scriptModule.ScriptType != EnumScriptModule.ScriptType.Powershell &&
                scriptModule.ScriptType != EnumScriptModule.ScriptType.VbScript)
            {
                return("Script Module: " + scriptModule.Name + " Has An Invalid Type");
            }
            int value;

            if (!int.TryParse(scriptModule.Timeout.ToString(), out value))
            {
                return("Script Module: " + scriptModule.Name + " Has An Invalid Timeout");
            }

            List <string> successCodes = new List <string>();

            foreach (var successCode in scriptModule.SuccessCodes.Split(','))
            {
                successCodes.Add(successCode);
            }

            if (successCodes.Count == 0)
            {
                return("Script Module: " + scriptModule.Name + " Has An Invalid Success Code");
            }

            if (successCodes.Any(code => !int.TryParse(code, out value)))
            {
                return("Script Module: " + scriptModule.Name + " Has An Invalid Success Code");
            }

            if (!string.IsNullOrEmpty(scriptModule.WorkingDirectory))
            {
                try
                {
                    Path.GetFullPath(scriptModule.WorkingDirectory);
                }
                catch
                {
                    return("Script Module: " + scriptModule.Name + " Has An Invalid Working Directory");
                }
            }

            if (scriptModule.ImpersonationId != -1)
            {
                var impAccount = new ServiceImpersonationAccount().GetAccount(scriptModule.ImpersonationId);
                if (impAccount == null)
                {
                    return("Script Module: " + scriptModule.Name + " Has An Invalid Impersonation Account");
                }
            }

            if (!int.TryParse(policyModule.Order.ToString(), out value))
            {
                return("Script Module: " + scriptModule.Name + " Has An Invalid Order");
            }
            return(null);
        }
示例#7
0
        private string VerifyConditions(EntityPolicyModules policyModule, List <EntityPolicyModules> policyModules)
        {
            if (policyModule.ConditionId != -1) // -1 = disabled
            {
                var conditionScript = new ServiceScriptModule().GetModule(policyModule.ConditionId);
                if (conditionScript == null)
                {
                    return($"Condition Script For {policyModule.Name} Does Not Exist");
                }

                if (!conditionScript.IsCondition)
                {
                    return($"The Condition Script For {policyModule.Name} Is Not Currently Set As A Condition");
                }

                if (string.IsNullOrEmpty(conditionScript.Name))
                {
                    return($"A Condition Script For {policyModule.Name} Has An Invalid Name");
                }

                if (conditionScript.Archived)
                {
                    return($"A Condition Script For {policyModule.Name} Is Archived");
                }

                if (string.IsNullOrEmpty(conditionScript.ScriptContents))
                {
                    return("Condition Script: " + conditionScript.Name + " Has An Invalid Script.  It Cannot Be Empty.");
                }

                if (string.IsNullOrEmpty(conditionScript.Guid))
                {
                    return("Condition Script: " + conditionScript.Name + " Has An Invalid GUID");
                }

                if (conditionScript.ScriptType != EnumScriptModule.ScriptType.Batch &&
                    conditionScript.ScriptType != EnumScriptModule.ScriptType.Powershell &&
                    conditionScript.ScriptType != EnumScriptModule.ScriptType.VbScript)
                {
                    return("Condition Script: " + conditionScript.Name + " Has An Invalid Type");
                }
                int value;
                if (!int.TryParse(conditionScript.Timeout.ToString(), out value))
                {
                    return("Condition Script: " + conditionScript.Name + " Has An Invalid Timeout");
                }

                List <string> successCodes = new List <string>();
                foreach (var successCode in conditionScript.SuccessCodes.Split(','))
                {
                    successCodes.Add(successCode);
                }

                if (successCodes.Count == 0)
                {
                    return("Condition Script: " + conditionScript.Name + " Has An Invalid Success Code");
                }

                if (successCodes.Any(code => !int.TryParse(code, out value)))
                {
                    return("Condition Script: " + conditionScript.Name + " Has An Invalid Success Code");
                }

                if (!string.IsNullOrEmpty(conditionScript.WorkingDirectory))
                {
                    try
                    {
                        Path.GetFullPath(conditionScript.WorkingDirectory);
                    }
                    catch
                    {
                        return("Condition Script: " + conditionScript.Name + " Has An Invalid Working Directory");
                    }
                }

                if (conditionScript.ImpersonationId != -1)
                {
                    var impAccount = new ServiceImpersonationAccount().GetAccount(conditionScript.ImpersonationId);
                    if (impAccount == null)
                    {
                        return("Condition Script: " + conditionScript.Name + " Has An Invalid Impersonation Account");
                    }
                }


                if (policyModule.ConditionFailedAction != EnumCondition.FailedAction.GotoModule && policyModule.ConditionFailedAction != EnumCondition.FailedAction.MarkFailed &&
                    policyModule.ConditionFailedAction != EnumCondition.FailedAction.MarkNotApplicable && policyModule.ConditionFailedAction != EnumCondition.FailedAction.MarkSkipped &&
                    policyModule.ConditionFailedAction != EnumCondition.FailedAction.MarkSuccess)
                {
                    return($"The Condition Failed Action For {policyModule.Name} Is Not Valid");
                }

                if (policyModule.ConditionFailedAction == EnumCondition.FailedAction.GotoModule)
                {
                    if (!int.TryParse(policyModule.ConditionNextModule.ToString(), out value))
                    {
                        return("Module: " + policyModule.Name + " Has An Invalid Next Order Number");
                    }

                    if (policyModule.ConditionNextModule <= policyModule.Order)
                    {
                        return("Module: " + policyModule.Name + " The Goto Order Number Must Be Greater Than Itself");
                    }

                    if (!policyModules.Any(x => x.Order == policyModule.ConditionNextModule))
                    {
                        return("Module: " + policyModule.Name + " The Goto Order Number Is Not Assigned To Any Modules.");
                    }
                }
            }
            return(null);
        }
示例#8
0
        private string VerifyPolicy()
        {
            if (string.IsNullOrEmpty(_policy.Name))
            {
                return("The Policy's Name Is Not Valid.");
            }
            if (string.IsNullOrEmpty(_policy.Guid))
            {
                return("The Policy's Guid Is Not Valid.");
            }

            if (_policy.Frequency != EnumPolicy.Frequency.OncePerComputer &&
                _policy.Frequency != EnumPolicy.Frequency.OncePerDay &&
                _policy.Frequency != EnumPolicy.Frequency.OncePerMonth &&
                _policy.Frequency != EnumPolicy.Frequency.OncePerUserPerComputer &&
                _policy.Frequency != EnumPolicy.Frequency.OncePerWeek &&
                _policy.Frequency != EnumPolicy.Frequency.Ongoing &&
                _policy.Frequency != EnumPolicy.Frequency.EveryXdays &&
                _policy.Frequency != EnumPolicy.Frequency.EveryXhours)
            {
                return("The Policy's Frequency Is Not Valid.");
            }
            if (_policy.Trigger != EnumPolicy.Trigger.Checkin && _policy.Trigger != EnumPolicy.Trigger.Login &&
                _policy.Trigger != EnumPolicy.Trigger.Startup &&
                _policy.Trigger != EnumPolicy.Trigger.StartupOrCheckin)
            {
                return("The Policy's Trigger Is Not Valid.");
            }
            if (_policy.RunInventory != EnumPolicy.InventoryAction.After &&
                _policy.RunInventory != EnumPolicy.InventoryAction.Before &&
                _policy.RunInventory != EnumPolicy.InventoryAction.Both &&
                _policy.RunInventory != EnumPolicy.InventoryAction.Disabled)
            {
                return("The Policy's Run Inventory Is Not Valid.");
            }
            int value;

            if (!int.TryParse(_policy.SubFrequency.ToString(), out value))
            {
                return("The Policy's Sub Frequency Is Not Valid.");
            }
            if (_policy.CompletedAction != EnumPolicy.CompletedAction.DoNothing &&
                _policy.CompletedAction != EnumPolicy.CompletedAction.Reboot && _policy.CompletedAction != EnumPolicy.CompletedAction.RebootIfNoLogins)
            {
                return("The Policy's Completed Action Is Not Valid.");
            }
            if (_policy.ExecutionType != EnumPolicy.ExecutionType.Cache &&
                _policy.ExecutionType != EnumPolicy.ExecutionType.Install)
            {
                return("The Policy's Execution Type Is Not Valid.");
            }
            if (_policy.ErrorAction != EnumPolicy.ErrorAction.AbortCurrentPolicy &&
                _policy.ErrorAction != EnumPolicy.ErrorAction.AbortRemainingPolicies &&
                _policy.ErrorAction != EnumPolicy.ErrorAction.Continue)
            {
                return("The Policy's Error Action Is Not Valid");
            }
            if (_policy.MissedAction != EnumPolicy.FrequencyMissedAction.NextOpportunity &&
                _policy.MissedAction != EnumPolicy.FrequencyMissedAction.ScheduleDayOnly)
            {
                return("The Policy's Frequency Missed Action Is Not Valid.");
            }
            if (_policy.LogLevel != EnumPolicy.LogLevel.Full &&
                _policy.LogLevel != EnumPolicy.LogLevel.HiddenArguments &&
                _policy.LogLevel != EnumPolicy.LogLevel.None)
            {
                return("The Policy's Log Level Is Not Valid.");
            }
            if (_policy.WuType != EnumPolicy.WuType.Disabled && _policy.WuType != EnumPolicy.WuType.Microsoft &&
                _policy.WuType != EnumPolicy.WuType.MicrosoftSkipUpgrades &&
                _policy.WuType != EnumPolicy.WuType.Wsus && _policy.WuType != EnumPolicy.WuType.WsusSkipUpgrades)
            {
                return("The Policy's Windows Update Type Is Not Valid.");
            }
            if (_policy.AutoArchiveType != EnumPolicy.AutoArchiveType.AfterXdays &&
                _policy.AutoArchiveType != EnumPolicy.AutoArchiveType.None &&
                _policy.AutoArchiveType != EnumPolicy.AutoArchiveType.WhenComplete)
            {
                return("The Policy's Auto Archive Type Is Not Valid.");
            }

            if (_policy.AutoArchiveType == EnumPolicy.AutoArchiveType.AfterXdays)
            {
                int autoArchiveSub;
                if (!int.TryParse(_policy.AutoArchiveSub, out autoArchiveSub))
                {
                    return("The Policy's Auto Archive Sub Is Not Valid.");
                }
            }

            if (_policy.WindowStartScheduleId != -1)
            {
                var schedule = new ServiceSchedule().GetSchedule(_policy.WindowStartScheduleId);
                if (schedule == null)
                {
                    return("The Policy's Start Schedule Id Is Not Valid.");
                }
            }
            if (_policy.WindowEndScheduleId != -1)
            {
                var schedule = new ServiceSchedule().GetSchedule(_policy.WindowEndScheduleId);
                if (schedule == null)
                {
                    return("The Policy's End Schedule Id Is Not Valid.");
                }
            }

            if (_policy.PolicyComCondition != EnumPolicy.PolicyComCondition.Any &&
                _policy.PolicyComCondition != EnumPolicy.PolicyComCondition.Selective)
            {
                return("The Policy's Com Server Condition Is Not Valid");
            }
            if (_policy.PolicyComCondition == EnumPolicy.PolicyComCondition.Selective)
            {
                var policyComServers = _policyService.GetPolicyComServers(_policy.Id);
                if (policyComServers == null)
                {
                    return("The Policy's Selected Com Servers Are Not Valid");
                }
                if (policyComServers.Count == 0)
                {
                    return("The Policy's Selected Com Servers Are Not Valid.  At Least One Server Must Be Selected.");
                }
                foreach (var policyComServer in policyComServers)
                {
                    var comServer = new ServiceClientComServer().GetServer(policyComServer.ComServerId);
                    if (comServer == null)
                    {
                        return("The Policy's Selected Com Servers Are Not Valid.  A Specified Com Server Does Not Exist");
                    }
                }
            }
            if (_policy.ConditionId != -1) // -1 = disabled
            {
                var conditionScript = new ServiceScriptModule().GetModule(_policy.ConditionId);
                if (conditionScript == null)
                {
                    return($"Condition Script For {_policy.Name} Does Not Exist");
                }

                if (!conditionScript.IsCondition)
                {
                    return($"The Condition Script For {_policy.Name} Is Not Currently Set As A Condition");
                }

                if (string.IsNullOrEmpty(conditionScript.Name))
                {
                    return($"A Condition Script For {_policy.Name} Has An Invalid Name");
                }

                if (conditionScript.Archived)
                {
                    return($"A Condition Script For {_policy.Name} Is Archived");
                }

                if (string.IsNullOrEmpty(conditionScript.ScriptContents))
                {
                    return("Condition Script: " + conditionScript.Name + " Has An Invalid Script.  It Cannot Be Empty.");
                }

                if (string.IsNullOrEmpty(conditionScript.Guid))
                {
                    return("Condition Script: " + conditionScript.Name + " Has An Invalid GUID");
                }

                if (conditionScript.ScriptType != EnumScriptModule.ScriptType.Batch &&
                    conditionScript.ScriptType != EnumScriptModule.ScriptType.Powershell &&
                    conditionScript.ScriptType != EnumScriptModule.ScriptType.VbScript)
                {
                    return("Condition Script: " + conditionScript.Name + " Has An Invalid Type");
                }

                if (!int.TryParse(conditionScript.Timeout.ToString(), out value))
                {
                    return("Condition Script: " + conditionScript.Name + " Has An Invalid Timeout");
                }

                List <string> successCodes = new List <string>();
                foreach (var successCode in conditionScript.SuccessCodes.Split(','))
                {
                    successCodes.Add(successCode);
                }

                if (successCodes.Count == 0)
                {
                    return("Condition Script: " + conditionScript.Name + " Has An Invalid Success Code");
                }

                if (successCodes.Any(code => !int.TryParse(code, out value)))
                {
                    return("Condition Script: " + conditionScript.Name + " Has An Invalid Success Code");
                }

                if (!string.IsNullOrEmpty(conditionScript.WorkingDirectory))
                {
                    try
                    {
                        Path.GetFullPath(conditionScript.WorkingDirectory);
                    }
                    catch
                    {
                        return("Condition Script: " + conditionScript.Name + " Has An Invalid Working Directory");
                    }
                }

                if (conditionScript.ImpersonationId != -1)
                {
                    var impAccount = new ServiceImpersonationAccount().GetAccount(conditionScript.ImpersonationId);
                    if (impAccount == null)
                    {
                        return("Condition Script: " + conditionScript.Name + " Has An Invalid Impersonation Account");
                    }
                }


                if (_policy.ConditionFailedAction != EnumCondition.FailedAction.MarkFailed &&
                    _policy.ConditionFailedAction != EnumCondition.FailedAction.MarkNotApplicable && _policy.ConditionFailedAction != EnumCondition.FailedAction.MarkSkipped &&
                    _policy.ConditionFailedAction != EnumCondition.FailedAction.MarkSuccess)
                {
                    return($"The Condition Failed Action For {_policy.Name} Is Not Valid");
                }
            }

            return(null);
        }
 public ImpersonationAccountController()
 {
     _impersonationAccountService = new ServiceImpersonationAccount();
 }