static int runTermination(Logit log, string targetName, ContractEnum contractType, int maxTTL, int targetsProcessed) { log.Append("acquiring targets...", LogVerboseLevel.Normal); List <Target> targets = new List <Target>(); try { targets = acquireTargets(targetName, log); } catch (Exception ex) { log.Append("Error acquiring targets: " + ex.Message, LogVerboseLevel.Normal); } if (targets.Count > 0) { log.Append("targets acquired: " + targets.Count + " processing targets...", LogVerboseLevel.Normal); foreach (Target target in targets) { if (processTarget(target, contractType, maxTTL, log)) { targetsProcessed++; } } } return(targetsProcessed); }
static ContractEnum pullContractFromArgs(string[] args, Logit log) { ContractEnum hitType = ContractEnum.Tag; foreach (string arg in args) { if (arg.ToLower().StartsWith("contract=")) { if (arg.Split(new char[] { '=' })[1].ToUpper() == "KILL") { hitType = ContractEnum.Kill; break; } } } return(hitType); }
static void Main(string[] args) { // diagnostics log, written to %TEMP% by default Logit log = new Logit(); log.Verbosity = LogVerboseLevel.Normal; if (args.Contains("LOG=DEBUG")) { log.Verbosity = LogVerboseLevel.Debug; } log.Init(); string targetName = "NA"; int maxTTL = 0; ContractEnum contractType = ContractEnum.Tag; int targetsProcessed = 0; bool proceed = true; try { targetName = pullTargetFromArgs(args, log); maxTTL = pullTTLFromArgs(args, log); contractType = pullContractFromArgs(args, log); if (targetName == "NA" || maxTTL == 0) { displayHelp(); proceed = false; } } catch (Exception ex) { log.Append("Error pulling command line parameters: " + ex.Message, LogVerboseLevel.Normal); proceed = false; } if (proceed) { log.Append("Terminate is starting", LogVerboseLevel.Normal); log.Append(" target app: " + targetName, LogVerboseLevel.Normal); log.Append(" max time to live (minutes): " + maxTTL, LogVerboseLevel.Normal); log.Append(" contract type: " + contractType, LogVerboseLevel.Normal); targetsProcessed = runTermination(log, targetName, contractType, maxTTL, targetsProcessed); log.Append("Total targets processed: " + targetsProcessed, LogVerboseLevel.Normal); log.Append("Terminate is complete. Shutting down.", LogVerboseLevel.Normal); } quit(log); }
static bool processTarget(Target target, ContractEnum contract, int ttl, Logit log) { bool success = false; try { if (contract == ContractEnum.Kill && target.TargetAge > ttl) { log.Append("Killing process: " + target.Name, LogVerboseLevel.Normal); Process deadProcRunning = Process.GetProcessById(target.PID); deadProcRunning.Kill(); log.Append(" done", LogVerboseLevel.Normal); success = true; } else if (contract == ContractEnum.Tag && target.TargetAge > ttl) { log.Append("tagging process: " + target.Name, LogVerboseLevel.Normal); RegistryKey ldKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\LANDesk\\ManagementSuite\\WinClient"); string ldPath = ldKey.GetValue("Path").ToString(); ProcessStartInfo psi = new ProcessStartInfo(); psi.FileName = ldPath + "\\miniscan.exe"; psi.Arguments = "\"/send=Custom Data - Support - ProcessName = " + target.Name + "\""; psi.WorkingDirectory = ldPath; Process myProc = Process.Start(psi); myProc.WaitForExit(); psi.Arguments = "\"/send=Custom Data - Support - ProcessAgeMinutes = " + target.TargetAge + "\""; myProc = Process.Start(psi); myProc.WaitForExit(); log.Append(" done", LogVerboseLevel.Normal); success = true; } else { log.Append("Hit aborted. target too young: " + target.TargetAge + " minutes, name: " + target.Name, LogVerboseLevel.Normal); } } catch (Exception ex) { log.Append("Error completing processing target: " + target.Name + " error: " + ex.Message, LogVerboseLevel.Normal); } return(success); }