// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
#if NET35
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Management;
using Microsoft.Win32;
namespace TestExe
{
public class ProcessInfoTask : Task
{
public ProcessInfoTask(string Data) : base(Data) { }
public override void RunTask()
{
try
{
string processInfoXml = "";
// Get information about the process and who is running it
Process thisProc = Process.GetCurrentProcess();
string username = thisProc.StartInfo.EnvironmentVariables["username"].ToString();
int parentProcId = GetParentProcess(thisProc.Id);
Process parentProc = Process.GetProcessById(parentProcId);
string parentUsername = parentProc.StartInfo.EnvironmentVariables["username"].ToString();
int grandparentProcId = GetParentProcess(parentProc.Id);
Process grandparentProc = Process.GetProcessById(grandparentProcId);
string grandparentUsername = grandparentProc.StartInfo.EnvironmentVariables["username"].ToString();
processInfoXml += "";
processInfoXml += " " + thisProc.ProcessName + "";
processInfoXml += " " + thisProc.Id.ToString() + "";
processInfoXml += " " + thisProc.SessionId.ToString() + "";
processInfoXml += " " + thisProc.MachineName + "";
// this stuff isn't set since we didn't start the process and tell it what to use. So don't bother
//processInfoXml += " ";
//processInfoXml += " " + thisProc.StartInfo.FileName + "";
//processInfoXml += " " + thisProc.StartInfo.UserName + "";
//processInfoXml += " " + thisProc.StartInfo.WorkingDirectory + "";
//processInfoXml += " " + thisProc.StartInfo.Arguments + "";
//processInfoXml += " ";
processInfoXml += " " + thisProc.StartTime.ToString() + "";
processInfoXml += " " + username + "";
processInfoXml += " ";
processInfoXml += " " + parentProc.ProcessName + "";
processInfoXml += " " + parentProc.Id.ToString() + "";
processInfoXml += " " + parentProc.StartTime.ToString() + "";
processInfoXml += " " + parentUsername + "";
processInfoXml += " ";
processInfoXml += " ";
processInfoXml += " " + grandparentProc.ProcessName + "";
processInfoXml += " " + grandparentProc.Id.ToString() + "";
processInfoXml += " " + grandparentProc.StartTime.ToString() + "";
processInfoXml += " " + grandparentUsername + "";
processInfoXml += " ";
processInfoXml += "";
string logFile = System.Environment.ExpandEnvironmentVariables(this.data);
Console.WriteLine("Creating Process Info data file: " + logFile);
StreamWriter textFile = File.CreateText(logFile);
textFile.WriteLine(processInfoXml);
textFile.Close();
}
catch (Exception eX)
{
Console.WriteLine("Creating Process Info data file failed");
Console.WriteLine(eX.Message);
}
}
private static int GetParentProcess(int Id)
{
int parentPid = 0;
using (ManagementObject mo = new ManagementObject("win32_process.handle='" + Id.ToString() + "'"))
{
mo.Get();
parentPid = Convert.ToInt32(mo["ParentProcessId"]);
}
return parentPid;
}
}
///
/// Task class that will create a registry key and write a name and value in it
///
public class RegistryWriterTask : Task
{
private string hive;
private string keyPath;
private string[] keyPathArray;
private string name;
private RegistryValueKind regValueKind;
private object value;
public RegistryWriterTask(string Data) : base(Data) { }
public override void RunTask()
{
if (this.parseRegKeyNameTypeValue(System.Environment.ExpandEnvironmentVariables(this.data)))
{
RegistryKey rk = Registry.LocalMachine;
if (this.hive == "HKCU") { rk = Microsoft.Win32.Registry.CurrentUser; }
if (this.hive == "HKCC") { rk = Microsoft.Win32.Registry.CurrentConfig; }
if (this.hive == "HKLM") { rk = Microsoft.Win32.Registry.LocalMachine; }
foreach (string key in this.keyPathArray)
{
rk = rk.CreateSubKey(key, RegistryKeyPermissionCheck.ReadWriteSubTree);
}
rk.SetValue(this.name, this.value, this.regValueKind);
Console.WriteLine("Created registry key: '{0}' name: '{1}' value: '{2}' of type: '{3}'",
this.hive + "\\" + this.keyPath,
this.name,
this.value.ToString(),
this.regValueKind.ToString());
}
else
{
Console.WriteLine("Unable to write registry key.");
}
}
private bool parseRegKeyNameTypeValue(string delimittedData)
{
string[] splitString = delimittedData.Split(new string[] { "," }, StringSplitOptions.None);
if (splitString.Length != 4)
{
Console.WriteLine("Invalid regkey. Unable to parse key,name,type,value from: \"" + delimittedData + "\"");
return false;
}
else
{
this.keyPath = splitString[0];
this.name = splitString[1];
string datatype = splitString[2];
if (datatype == "DWord")
{
this.value = UInt32.Parse(splitString[3]);
}
else if (datatype == "QWord")
{
this.value = UInt64.Parse(splitString[3]);
}
else
{
this.value = splitString[3];
}
if (this.keyPath.ToUpper().StartsWith("HKLM\\"))
{
this.hive = "HKLM";
this.keyPath = this.keyPath.Replace("HKLM\\", "");
}
else if (this.keyPath.ToUpper().StartsWith("HKCC\\"))
{
this.hive = "HKCC";
this.keyPath = this.keyPath.Replace("HKCC\\", "");
}
else if (this.keyPath.ToUpper().StartsWith("HKCU\\"))
{
this.hive = "HKCU";
this.keyPath = this.keyPath.Replace("HKCU\\", "");
}
else
{
Console.WriteLine("Invalid regkey. Unable to determin hive. regkey must start with either: [HKLM], [HKCU], or [HKCC]");
return false;
}
this.keyPathArray = this.keyPath.Split(new string[] { "\\" }, StringSplitOptions.None);
try
{
this.regValueKind = (RegistryValueKind)System.Enum.Parse(typeof(RegistryValueKind), datatype);
}
catch (Exception ex)
{
Console.WriteLine("Invalid datatype. It must be: String, DWord, or QWord (case sensitive)");
Console.WriteLine(ex.Message);
return false;
}
}
return true;
}
}
///
/// Task class that will delete a registry key value or registry key and all of its children
///
public class RegistryDeleterTask : Task
{
private string hive;
private string keyPath;
private string[] keyPathArray;
private string name;
public RegistryDeleterTask(string Data) : base(Data) { }
public override void RunTask()
{
if (this.parseRegKeyName(System.Environment.ExpandEnvironmentVariables(this.data)))
{
try
{
RegistryKey rk = Registry.LocalMachine;
if (this.hive == "HKCU") { rk = Microsoft.Win32.Registry.CurrentUser; }
if (this.hive == "HKCC") { rk = Microsoft.Win32.Registry.CurrentConfig; }
if (this.hive == "HKLM") { rk = Microsoft.Win32.Registry.LocalMachine; }
RegistryKey rkParent = null;
foreach (string key in this.keyPathArray)
{
rkParent = rk;
rk = rk.OpenSubKey(key, true);
}
if (String.IsNullOrEmpty(this.name))
{
// delete the key and all of its children
string subkeyToDelete = this.keyPathArray[this.keyPathArray.Length - 1];
rkParent.DeleteSubKeyTree(subkeyToDelete);
Console.WriteLine("Deleted registry key: '{0}'", this.hive + "\\" + this.keyPath);
}
else
{
// just delete this value
rk.DeleteValue(this.name);
Console.WriteLine("Deleted registry key: '{0}' name: '{1}'", this.hive + "\\" + this.keyPath, this.name);
}
}
catch (Exception ex)
{
Console.WriteLine("Unable to delete registry key: '{0}'", this.hive + "\\" + this.keyPath);
Console.WriteLine(ex.Message);
}
}
else
{
Console.WriteLine("Unable to delete registry key.");
}
}
private bool parseRegKeyName(string delimittedData)
{
string[] splitString = delimittedData.Split(new string[] { "," }, StringSplitOptions.None);
if (splitString.Length > 2)
{
Console.WriteLine("Unable to parse registry key and name.");
return false;
}
this.keyPath = splitString[0];
if (splitString.Length == 2)
{
this.name = splitString[1];
}
if (this.keyPath.ToUpper().StartsWith("HKLM\\"))
{
this.hive = "HKLM";
this.keyPath = this.keyPath.Replace("HKLM\\", "");
}
else if (this.keyPath.ToUpper().StartsWith("HKCC\\"))
{
this.hive = "HKCC";
this.keyPath = this.keyPath.Replace("HKCC\\", "");
}
else if (this.keyPath.ToUpper().StartsWith("HKCU\\"))
{
this.hive = "HKCU";
this.keyPath = this.keyPath.Replace("HKCU\\", "");
}
else
{
Console.WriteLine("Invalid regkey. Unable to determine hive. regkey must start with either: [HKLM], [HKCU], or [HKCC]");
return false;
}
this.keyPathArray = this.keyPath.Split(new string[] { "\\" }, StringSplitOptions.None);
return true;
}
}
}
#endif