mirror of
https://github.com/vinaypamnani/wmie2.git
synced 2025-12-06 04:12:02 +01:00
1624 lines
65 KiB
C#
1624 lines
65 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Diagnostics;
|
|
using System.Drawing;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Management;
|
|
using System.Reflection;
|
|
using System.Runtime.Caching;
|
|
using System.Text;
|
|
using System.Windows.Forms;
|
|
using WmiExplorer.Classes;
|
|
using WmiExplorer.Forms;
|
|
using WmiExplorer.Properties;
|
|
|
|
namespace WmiExplorer
|
|
{
|
|
public partial class WmiExplorer : Form
|
|
{
|
|
public static readonly CacheItemPolicy CachePolicy = new CacheItemPolicy();
|
|
public static MemoryCache AppCache = new MemoryCache("AppCache");
|
|
public static bool DebugMode = false;
|
|
public static int DisplayDpi;
|
|
|
|
public WmiExplorer()
|
|
{
|
|
InitializeComponent();
|
|
Application.AddMessageFilter(new MouseWheelMessageFilter());
|
|
}
|
|
|
|
private delegate void LogCallback(string text);
|
|
|
|
private delegate void SetStatusBar1Callback(String text, MessageCategory messagecategory, bool bLog = false);
|
|
|
|
private delegate void SetStatusBar2Callback(String text, MessageCategory messagecategory, bool bLog = false);
|
|
|
|
private delegate void SetStatusBar3Callback(string category, TimeSpan time);
|
|
|
|
public void Log(string text)
|
|
{
|
|
if (textBoxLogging.InvokeRequired)
|
|
{
|
|
LogCallback d = Log; //LogCallback d = new LogCallback(Log);
|
|
Invoke(d, new object[] { text });
|
|
}
|
|
else
|
|
{
|
|
textBoxLogging.AppendText(Environment.NewLine + DateTime.Now + " : " + text);
|
|
}
|
|
}
|
|
|
|
private void buttonClassesRefresh_Click(object sender, EventArgs e)
|
|
{
|
|
if (treeNamespaces.SelectedNode == null)
|
|
SetStatusBar1("No namespace is selected.", MessageCategory.Warn);
|
|
else
|
|
treeNamespaces_NodeMouseDoubleClick(sender, null);
|
|
}
|
|
|
|
private void buttonComputerConnect_Click(object sender, EventArgs e)
|
|
{
|
|
// Set computer name display text to NetBIOS name if using . or localhost or blank name
|
|
if (textBoxComputerName.Text == "." || textBoxComputerName.Text == "localhost" || textBoxComputerName.Text == String.Empty)
|
|
textBoxComputerName.Text = SystemInformation.ComputerName;
|
|
|
|
WmiNode rootNode = new WmiNode
|
|
{
|
|
IsRootNode = true,
|
|
UserSpecifiedPath = textBoxComputerName.Text.ToUpperInvariant()
|
|
};
|
|
|
|
rootNode.SetConnection(_defaultConnection);
|
|
|
|
Connect(rootNode);
|
|
}
|
|
|
|
private void buttonHideNamespaces_Click(object sender, EventArgs e)
|
|
{
|
|
if (buttonHideNamespaces.Text == "-")
|
|
{
|
|
buttonHideNamespaces.Text = "+";
|
|
treeNamespaces.Visible = false;
|
|
groupBoxNamespaces.Text = "N";
|
|
_tempSplitterDistance = splitContainerNamespaceClasses.SplitterDistance;
|
|
splitContainerNamespaceClasses.SplitterDistance = 30;
|
|
splitContainerNamespaceClasses.IsSplitterFixed = true;
|
|
}
|
|
else
|
|
{
|
|
buttonHideNamespaces.Text = "-";
|
|
treeNamespaces.Visible = true;
|
|
groupBoxNamespaces.Text = "Namespaces";
|
|
splitContainerNamespaceClasses.SplitterDistance = _tempSplitterDistance;
|
|
splitContainerNamespaceClasses.IsSplitterFixed = false;
|
|
}
|
|
}
|
|
|
|
private void buttonHideNamespaces_MouseHover(object sender, EventArgs e)
|
|
{
|
|
toolTip.SetToolTip(buttonHideNamespaces,
|
|
buttonHideNamespaces.Text == "+" ? "Show Namespaces" : "Hide Namespaces");
|
|
}
|
|
|
|
private void buttonInstancesRefresh_Click(object sender, EventArgs e)
|
|
{
|
|
if (listClasses.SelectedItems.Count != 0)
|
|
listClasses_DoubleClick(sender, e);
|
|
else
|
|
SetStatusBar2("No class is selected", MessageCategory.Warn);
|
|
}
|
|
|
|
private void buttonQueryExecute1_Click(object sender, EventArgs e)
|
|
{
|
|
tabControlInstances.SelectTab(tabQueryResults);
|
|
textBoxQuery2.Text = textBoxQuery1.Text;
|
|
buttonQueryExecute2.PerformClick();
|
|
}
|
|
|
|
private void buttonQueryExecute2_Click(object sender, EventArgs e)
|
|
{
|
|
ExecuteQuery(textBoxQuery2.Text);
|
|
}
|
|
|
|
private void buttonRefreshObject_Click(object sender, EventArgs e)
|
|
{
|
|
if (listInstances.SelectedItems.Count == 0)
|
|
{
|
|
SetStatusBar2("No instance is selected. ", MessageCategory.Warn);
|
|
return;
|
|
}
|
|
|
|
ListViewItem currentListViewItem = listInstances.SelectedItems[0];
|
|
PopulateInstanceProperties(currentListViewItem, true);
|
|
}
|
|
|
|
private void buttonScriptRun_Click(object sender, EventArgs e)
|
|
{
|
|
const string cmd = "cmd.exe";
|
|
string args;
|
|
string tempPath = Environment.GetEnvironmentVariable("TEMP");
|
|
|
|
if (radioScriptVbs.Checked)
|
|
{
|
|
string scriptPath = tempPath + "\\temp_script.vbs";
|
|
string outPath = tempPath + "\\temp_script_vbs_out.txt";
|
|
File.WriteAllText(scriptPath, textBoxScript.Text);
|
|
|
|
if (radioScriptOutCmd.Checked)
|
|
{
|
|
args = " /k cscript.exe //E:VBScript //NoLogo " + scriptPath;
|
|
Utilities.LaunchProgram(cmd, args, false);
|
|
}
|
|
|
|
if (radioScriptOutTxt.Checked)
|
|
{
|
|
args = " /c cscript.exe //E:VBScript //NoLogo " + scriptPath + " > " + outPath;
|
|
Utilities.LaunchProgram(cmd, args, true);
|
|
Utilities.LaunchProgram("Notepad.exe", outPath, false);
|
|
}
|
|
}
|
|
|
|
if (radioScriptPs.Checked)
|
|
{
|
|
string scriptPath = tempPath + "\\temp_script.ps1";
|
|
string outPath = tempPath + "\\temp_script_ps1_out.txt";
|
|
File.WriteAllText(scriptPath, textBoxScript.Text);
|
|
|
|
if (radioScriptOutCmd.Checked)
|
|
{
|
|
args = " /k powershell.exe -ExecutionPolicy Bypass -NoLogo -NoExit " + scriptPath;
|
|
Utilities.LaunchProgram(cmd, args, false);
|
|
}
|
|
|
|
if (radioScriptOutTxt.Checked)
|
|
{
|
|
args = " /c powershell.exe -ExecutionPolicy Bypass -NoLogo " + scriptPath + " > " + outPath;
|
|
Utilities.LaunchProgram(cmd, args, true);
|
|
Utilities.LaunchProgram("Notepad.exe", outPath, false);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void buttonScriptSave_Click(object sender, EventArgs e)
|
|
{
|
|
saveScriptDialog.InitialDirectory = Environment.CurrentDirectory;
|
|
saveScriptDialog.FileName = listClasses.SelectedItems[0].Text;
|
|
|
|
if (radioScriptVbs.Checked)
|
|
{
|
|
saveScriptDialog.Filter = "VBScript files (*.vbs)|*.vbs|Text files (*.txt)|*.txt|All files (*.*)|*.*";
|
|
saveScriptDialog.ShowDialog();
|
|
}
|
|
else if (radioScriptPs.Checked)
|
|
{
|
|
saveScriptDialog.Filter = "Powershell Script files (*.ps1)|*.ps1|Text files (*.txt)|*.txt|All files (*.*)|*.*";
|
|
saveScriptDialog.ShowDialog();
|
|
}
|
|
else
|
|
{
|
|
MessageBox.Show("No Script Language Selected.", "Invalid Action", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
|
}
|
|
}
|
|
|
|
private void buttonSearch_Click(object sender, EventArgs e)
|
|
{
|
|
if (treeNamespaces.SelectedNode != null)
|
|
{
|
|
string searchPattern = textBoxSearchPattern.Text;
|
|
if (String.IsNullOrEmpty(searchPattern))
|
|
{
|
|
SetStatusBar2("Error: Search String is Empty.", MessageCategory.Warn);
|
|
return;
|
|
}
|
|
|
|
WmiNode currentWmiNode = treeNamespaces.SelectedNode.Tag as WmiNode;
|
|
if (currentWmiNode == null)
|
|
{
|
|
SetStatusBar2("Error: Current WmiNode is null.", MessageCategory.Error, true);
|
|
return;
|
|
}
|
|
|
|
if (currentWmiNode.IsRootNode && !currentWmiNode.IsConnected)
|
|
{
|
|
SetStatusBar2("Please connect to " + currentWmiNode.UserSpecifiedPath + " before searching.", MessageCategory.Warn, true);
|
|
return;
|
|
}
|
|
|
|
// Reset search result counter and error
|
|
_searchResultCount = 0;
|
|
_searchErrorOccurred = false;
|
|
|
|
if (radioSearchClasses.Checked)
|
|
SearchClasses(searchPattern, currentWmiNode);
|
|
|
|
if (radioSearchMethods.Checked)
|
|
SearchMethods(searchPattern, currentWmiNode);
|
|
|
|
if (radioSearchProperties.Checked)
|
|
SearchProperties(searchPattern, currentWmiNode);
|
|
}
|
|
else
|
|
{
|
|
SetStatusBar2("No Namespace selected.", MessageCategory.Warn);
|
|
}
|
|
}
|
|
|
|
private void checkBoxEnumOptions_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
try
|
|
{
|
|
var checkbox = (CheckBox)sender;
|
|
var currentflag = (EnumOptions)checkbox.Tag;
|
|
|
|
if (checkbox.Checked)
|
|
Settings.Default.EnumOptionsFlags |= currentflag;
|
|
else
|
|
Settings.Default.EnumOptionsFlags ^= currentflag;
|
|
|
|
// Re-populate instance properties if Instance Enumeration options changed.
|
|
if (listInstances.SelectedItems.Count == 0) return;
|
|
PopulateInstanceProperties(listInstances.SelectedItems[0]);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Log("checkBoxEnumOptions_CheckedChanged - Failed to get the enumeration options. Error: " + ex.Message);
|
|
}
|
|
}
|
|
|
|
private void contextMenu_Opening(object sender, CancelEventArgs e)
|
|
{
|
|
// Clear current items
|
|
contextMenu.Items.Clear();
|
|
e.Cancel = false;
|
|
|
|
// if context menu is being displayed for treeNamespaces Tree View
|
|
if (contextMenu.SourceControl == treeNamespaces)
|
|
{
|
|
if (treeNamespaces.SelectedNode != null)
|
|
{
|
|
WmiNode currentWmiNode = (WmiNode)treeNamespaces.SelectedNode.Tag;
|
|
|
|
// Disconnected nodes
|
|
if (Helpers.IsNodeDisconnected(treeNamespaces.SelectedNode))
|
|
{
|
|
ToolStripItem defaultItemDisconnected = new ToolStripMenuItem("&Connect", null, contextMenuItemConnectPath_Click);
|
|
defaultItemDisconnected.Font = new Font(defaultItemDisconnected.Font, defaultItemDisconnected.Font.Style | FontStyle.Bold);
|
|
contextMenu.Items.Add(defaultItemDisconnected);
|
|
contextMenu.Items.Add("&Connect As", null, contextMenuItemConnectAsPath_Click);
|
|
contextMenu.Items.Add("&Remove", null, contextMenuItemRemovePath_Click);
|
|
return;
|
|
}
|
|
|
|
// All nodes default item
|
|
ToolStripItem defaultItem = new ToolStripMenuItem("&Enumerate Classes", null, contextMenuItemGetClasses_Click);
|
|
defaultItem.Font = new Font(defaultItem.Font, defaultItem.Font.Style | FontStyle.Bold);
|
|
contextMenu.Items.Add(defaultItem);
|
|
|
|
// Root Nodes
|
|
if (currentWmiNode.IsRootNode)
|
|
{
|
|
contextMenu.Items.Add("Show WMI &Provider Host Information", null, contextMenuItemShowProviderInfo_Click);
|
|
contextMenu.Items.Add("&Disconnect", null, contextMenuItemDisconnectPath_Click);
|
|
contextMenu.Items.Add("Disconnect and &Remove", null, contextMenuItemDisconnectRemovePath_Click);
|
|
}
|
|
|
|
// SMS Provider Node
|
|
if (Settings.Default.bSmsMode &&
|
|
currentWmiNode.WmiNamespace.DisplayName.StartsWith("ROOT\\SMS\\SITE_",
|
|
StringComparison.InvariantCultureIgnoreCase))
|
|
{
|
|
var excludeSmsCollections = new ToolStripMenuItem("Exclude SMS &Collection Classes", null, contextMenuItemExcludeSmsCollections_Click);
|
|
var excludeSmsInventory = new ToolStripMenuItem("Exclude SMS &Inventory Classes", null, contextMenuItemExcludeSmsInventory_Click);
|
|
excludeSmsCollections.Checked = Settings.Default.EnumOptionsFlags.HasFlag(EnumOptions.ExcludeSmsCollections);
|
|
excludeSmsInventory.Checked = Settings.Default.EnumOptionsFlags.HasFlag(EnumOptions.ExcludeSmsInventory);
|
|
contextMenu.Items.Add(excludeSmsCollections);
|
|
contextMenu.Items.Add(excludeSmsInventory);
|
|
}
|
|
|
|
// SMS Client Actions
|
|
if (Settings.Default.bSmsMode && Helpers.GetSmsClient(treeNamespaces.SelectedNode) != null && Helpers.GetSmsClient(treeNamespaces.SelectedNode).IsClientInstalled)
|
|
{
|
|
if (currentWmiNode.WmiNamespace.DisplayName.Equals("ROOT\\CCM", StringComparison.InvariantCultureIgnoreCase))
|
|
{
|
|
var smsClientActionsToolStripItem = GetClientActionsContextMenuItem();
|
|
contextMenu.Items.Add(smsClientActionsToolStripItem);
|
|
}
|
|
}
|
|
|
|
// Currently Enumerating Nodes
|
|
if (currentWmiNode.WmiNamespace.IsEnumerating)
|
|
contextMenu.Items.Add("&Cancel Enumeration", null, contextMenuItemCancelEnumNamespace_Click);
|
|
|
|
// All nodes
|
|
contextMenu.Items.Add("Copy Path", null, contextMenuItemCopyNamespacePath_Click);
|
|
contextMenu.Items.Add("Copy Relative Path", null, contextMenuItemCopyNamespaceRelativePath_Click);
|
|
}
|
|
}
|
|
|
|
// if context menu is being displayed for listClasses list
|
|
if (contextMenu.SourceControl == listClasses)
|
|
{
|
|
if (listClasses.SelectedItems.Count != 0)
|
|
{
|
|
WmiClass currentWmiClass = ((WmiClass)listClasses.SelectedItems[0].Tag);
|
|
// All classes default item
|
|
ToolStripItem defaultItem = new ToolStripMenuItem("&Enumerate Instances", null, listClasses_DoubleClick);
|
|
defaultItem.Font = new Font(defaultItem.Font, defaultItem.Font.Style | FontStyle.Bold);
|
|
contextMenu.Items.Add(defaultItem);
|
|
|
|
// Currently Enumerating Classes
|
|
if (currentWmiClass.IsEnumerating)
|
|
{
|
|
contextMenu.Items.Add("&Cancel Enumeration", null, contextMenuItemCancelEnumClass_Click);
|
|
}
|
|
|
|
contextMenu.Items.Add("Show MOF", null, contextMenuItemShowClassMof_Click);
|
|
contextMenu.Items.Add("Show MOF (Amended Qualifiers)", null, contextMenuItemShowClassMofAmended_Click);
|
|
contextMenu.Items.Add("Copy MOF", null, contextMenuItemCopyClassMof_Click);
|
|
contextMenu.Items.Add("Copy Path", null, contextMenuItemCopyClassPath_Click);
|
|
contextMenu.Items.Add("Copy Relative Path", null, contextMenuItemCopyClassRelativePath_Click);
|
|
|
|
var executeMethodsToolStripItem = GetMethodsContextMenuItem(true);
|
|
if (executeMethodsToolStripItem.HasDropDownItems)
|
|
contextMenu.Items.Add(executeMethodsToolStripItem);
|
|
}
|
|
}
|
|
|
|
// if context menu is being displayed for listInstances list
|
|
if (contextMenu.SourceControl == listInstances)
|
|
{
|
|
if (listInstances.SelectedItems.Count != 0)
|
|
{
|
|
contextMenu.Items.Add("Show MOF", null, contextMenuItemShowInstanceMof_Click);
|
|
contextMenu.Items.Add("Copy MOF", null, contextMenuItemCopyInstanceMof_Click);
|
|
contextMenu.Items.Add("Copy Path", null, contextMenuItemCopyInstancePath_Click);
|
|
contextMenu.Items.Add("Copy Relative Path", null, contextMenuItemCopyInstanceRelativePath_Click);
|
|
|
|
var executeMethodsToolStripItem = GetMethodsContextMenuItem(false);
|
|
if (executeMethodsToolStripItem.HasDropDownItems)
|
|
contextMenu.Items.Add(executeMethodsToolStripItem);
|
|
}
|
|
}
|
|
|
|
// if context menu is being displayed for instance property grid
|
|
if (contextMenu.SourceControl == propertyGridInstance && propertyGridInstance.SelectedGridItem != null)
|
|
{
|
|
contextMenu.Items.Add("Copy Name and Value", null, contextMenuItemCopyPropertyNameValue_Click);
|
|
contextMenu.Items.Add("Copy Value", null, contextMenuItemCopyPropertyValue_Click);
|
|
contextMenu.Items.Add("Copy Description", null, contextMenuItemCopyPropertyDescription_Click);
|
|
}
|
|
}
|
|
|
|
private void contextMenuItemCancelEnumClass_Click(object sender, EventArgs e)
|
|
{
|
|
if (_bwInstanceEnumWorker == null) return;
|
|
|
|
WmiClass currentClass = listClasses.SelectedItems[0].Tag as WmiClass;
|
|
|
|
if (currentClass == null)
|
|
{
|
|
SetStatusBar2("Unable to cancel Enumeration: NullReferenceException", MessageCategory.Error, true);
|
|
return;
|
|
}
|
|
|
|
if (currentClass.IsEnumerating)
|
|
{
|
|
currentClass.IsEnumerationCancelled = true;
|
|
currentClass.IsEnumerating = false;
|
|
_bwInstanceEnumWorker.CancelAsync();
|
|
SetStatusBar2("Cancelling enumeration for " + currentClass.DisplayName, MessageCategory.Warn, true);
|
|
}
|
|
else
|
|
{
|
|
SetStatusBar1("Cancellation skipped. Enumeration already completed.", MessageCategory.Info);
|
|
}
|
|
}
|
|
|
|
private void contextMenuItemCancelEnumNamespace_Click(object sender, EventArgs e)
|
|
{
|
|
if (_bwClassEnumWorker == null) return;
|
|
|
|
WmiNode currentWmiNode = treeNamespaces.SelectedNode.Tag as WmiNode;
|
|
if (currentWmiNode == null)
|
|
{
|
|
SetStatusBar1("Unable to cancel enumeration: NullReferenceException", MessageCategory.Error, true);
|
|
return;
|
|
}
|
|
|
|
if (currentWmiNode.WmiNamespace.IsEnumerating)
|
|
{
|
|
currentWmiNode.WmiNamespace.IsEnumerationCancelled = true;
|
|
currentWmiNode.WmiNamespace.IsEnumerating = false;
|
|
_bwClassEnumWorker.CancelAsync();
|
|
SetStatusBar1("Cancelling enumeration for " + currentWmiNode.WmiNamespace.DisplayName, MessageCategory.Warn, true);
|
|
}
|
|
else
|
|
{
|
|
SetStatusBar1("Cancellation skipped. Enumeration already completed.", MessageCategory.Info);
|
|
}
|
|
}
|
|
|
|
private void contextMenuItemConnectAsPath_Click(object sender, EventArgs e)
|
|
{
|
|
WmiNode namespaceNode = treeNamespaces.SelectedNode.Tag as WmiNode;
|
|
if (namespaceNode != null)
|
|
{
|
|
using (Form_ConnectAs connectAsForm = new Form_ConnectAs(namespaceNode.UserSpecifiedPath))
|
|
{
|
|
connectAsForm.ShowDialog(this);
|
|
|
|
if (connectAsForm.Cancelled) return;
|
|
|
|
if (connectAsForm.Connection != null)
|
|
{
|
|
namespaceNode.SetConnection(connectAsForm.Connection);
|
|
}
|
|
else
|
|
{
|
|
MessageBox.Show("Failed to set credentials. Using logged on user's credentials.", "Credentials Failure", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
namespaceNode.SetConnection(_defaultConnection);
|
|
}
|
|
|
|
Connect(namespaceNode);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void contextMenuItemConnectPath_Click(object sender, EventArgs e)
|
|
{
|
|
WmiNode namespaceNode = treeNamespaces.SelectedNode.Tag as WmiNode;
|
|
if (namespaceNode != null)
|
|
Connect(namespaceNode);
|
|
}
|
|
|
|
private void contextMenuItemCopyClassMof_Click(object sender, EventArgs e)
|
|
{
|
|
string mof = ((WmiClass)listClasses.SelectedItems[0].Tag).GetClassMof();
|
|
if (mof != null)
|
|
Clipboard.SetText(mof);
|
|
}
|
|
|
|
private void contextMenuItemCopyClassPath_Click(object sender, EventArgs e)
|
|
{
|
|
var path = ((WmiClass)listClasses.SelectedItems[0].Tag).Path;
|
|
if (path != null)
|
|
Clipboard.SetText(path);
|
|
}
|
|
|
|
private void contextMenuItemCopyClassRelativePath_Click(object sender, EventArgs e)
|
|
{
|
|
var relativePath = ((WmiNode)treeNamespaces.SelectedNode.Tag).WmiNamespace.RelativePath;
|
|
if (relativePath != null)
|
|
{
|
|
relativePath += ":" + ((WmiClass)listClasses.SelectedItems[0].Tag).RelativePath;
|
|
Clipboard.SetText(relativePath);
|
|
}
|
|
}
|
|
|
|
private void contextMenuItemCopyInstanceMof_Click(object sender, EventArgs e)
|
|
{
|
|
if (_instanceMof != String.Empty)
|
|
Clipboard.SetText(_instanceMof);
|
|
}
|
|
|
|
private void contextMenuItemCopyInstancePath_Click(object sender, EventArgs e)
|
|
{
|
|
var path = ((WmiInstance)listInstances.SelectedItems[0].Tag).Path;
|
|
if (path != null)
|
|
Clipboard.SetText(path);
|
|
}
|
|
|
|
private void contextMenuItemCopyInstanceRelativePath_Click(object sender, EventArgs e)
|
|
{
|
|
var relativePath = ((WmiNode)treeNamespaces.SelectedNode.Tag).WmiNamespace.RelativePath;
|
|
if (relativePath != null)
|
|
{
|
|
relativePath += ":" + ((WmiInstance)listInstances.SelectedItems[0].Tag).RelativePath;
|
|
Clipboard.SetText(relativePath);
|
|
}
|
|
}
|
|
|
|
private void contextMenuItemCopyNamespacePath_Click(object sender, EventArgs e)
|
|
{
|
|
string path = ((WmiNode)treeNamespaces.SelectedNode.Tag).WmiNamespace.Path;
|
|
if (path != null)
|
|
Clipboard.SetText(path);
|
|
}
|
|
|
|
private void contextMenuItemCopyNamespaceRelativePath_Click(object sender, EventArgs e)
|
|
{
|
|
var relativePath = ((WmiNode)treeNamespaces.SelectedNode.Tag).WmiNamespace.RelativePath;
|
|
if (relativePath != null)
|
|
Clipboard.SetText(relativePath);
|
|
}
|
|
|
|
private void contextMenuItemCopyPropertyDescription_Click(object sender, EventArgs e)
|
|
{
|
|
if (propertyGridInstance.SelectedGridItem.PropertyDescriptor == null)
|
|
return;
|
|
|
|
if (propertyGridInstance.SelectedGridItem.PropertyDescriptor.Category == "Misc")
|
|
{
|
|
if (propertyGridInstance.SelectedGridItem.Value is ManagementBaseObjectW)
|
|
MessageBox.Show("Copy Description Operation on an Array Element is Not Allowed. Expand the Object to Copy Description of Desired Property."
|
|
, "Not Supported"
|
|
, MessageBoxButtons.OK
|
|
, MessageBoxIcon.Information);
|
|
else
|
|
MessageBox.Show("Copy Description Operation on an Array Element is Not Allowed."
|
|
, "Not Supported"
|
|
, MessageBoxButtons.OK
|
|
, MessageBoxIcon.Information);
|
|
}
|
|
else
|
|
{
|
|
var txtToCopy = propertyGridInstance.SelectedGridItem.PropertyDescriptor.DisplayName;
|
|
txtToCopy += Environment.NewLine + propertyGridInstance.SelectedGridItem.PropertyDescriptor.Description;
|
|
txtToCopy = txtToCopy.Replace("\n", "\r\n");
|
|
Clipboard.SetText(txtToCopy);
|
|
}
|
|
}
|
|
|
|
private void contextMenuItemCopyPropertyNameValue_Click(object sender, EventArgs e)
|
|
{
|
|
var nameValue = String.Empty;
|
|
|
|
if (propertyGridInstance.SelectedGridItem.PropertyDescriptor == null)
|
|
return;
|
|
|
|
if (propertyGridInstance.SelectedGridItem.Value != null && propertyGridInstance.SelectedGridItem.Value.ToString() != String.Empty)
|
|
{
|
|
if (propertyGridInstance.SelectedGridItem.Value is ManagementBaseObjectW)
|
|
{
|
|
if (propertyGridInstance.SelectedGridItem.PropertyDescriptor.Category == "Misc")
|
|
MessageBox.Show("Copy Value Operation on an element of Embedded Object is Not Allowed. Expand the Object to Copy the Value of Desired Property."
|
|
, "Not Supported"
|
|
, MessageBoxButtons.OK
|
|
, MessageBoxIcon.Information);
|
|
else
|
|
{
|
|
nameValue = propertyGridInstance.SelectedGridItem.PropertyDescriptor.DisplayName;
|
|
nameValue += " = ";
|
|
nameValue += propertyGridInstance.SelectedGridItem.Value.ToString();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
nameValue = propertyGridInstance.SelectedGridItem.PropertyDescriptor.DisplayName;
|
|
nameValue += " = ";
|
|
nameValue += propertyGridInstance.SelectedGridItem.Value.ToString();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
nameValue = propertyGridInstance.SelectedGridItem.PropertyDescriptor.DisplayName;
|
|
nameValue += " = null";
|
|
}
|
|
|
|
if (nameValue != String.Empty)
|
|
Clipboard.SetText(nameValue);
|
|
}
|
|
|
|
private void contextMenuItemCopyPropertyValue_Click(object sender, EventArgs e)
|
|
{
|
|
if (propertyGridInstance.SelectedGridItem.PropertyDescriptor == null)
|
|
return;
|
|
|
|
if (propertyGridInstance.SelectedGridItem.Value != null && propertyGridInstance.SelectedGridItem.Value.ToString() != String.Empty)
|
|
{
|
|
if (propertyGridInstance.SelectedGridItem.Value is ManagementBaseObjectW)
|
|
{
|
|
if (propertyGridInstance.SelectedGridItem.PropertyDescriptor.Category == "Misc")
|
|
MessageBox.Show("Copy Value Operation on an element of Embedded Object is Not Allowed. Expand the Object to Copy the Value of Desired Property."
|
|
, "Not Supported"
|
|
, MessageBoxButtons.OK
|
|
, MessageBoxIcon.Information);
|
|
else
|
|
Clipboard.SetText(propertyGridInstance.SelectedGridItem.Value.ToString());
|
|
}
|
|
else
|
|
Clipboard.SetText(propertyGridInstance.SelectedGridItem.Value.ToString());
|
|
}
|
|
}
|
|
|
|
private void contextMenuItemDisconnectPath_Click(object sender, EventArgs e)
|
|
{
|
|
var nodeToDisconnect = ((WmiNode)treeNamespaces.SelectedNode.Tag).UserSpecifiedPath;
|
|
|
|
// Clear all UI elements
|
|
ResetListClasses();
|
|
ResetListInstances();
|
|
ResetListMethods();
|
|
ResetListClassProperties();
|
|
ResetListQueryResults();
|
|
RenameNamespaceTabsToDefault();
|
|
RenameClassTabsToDefault();
|
|
dataGridQueryResults.DataSource = null;
|
|
propertyGridInstance.SelectedObject = null;
|
|
propertyGridQueryResults.SelectedObject = null;
|
|
textBoxQuery1.Text = String.Empty;
|
|
textBoxQuery2.Text = String.Empty;
|
|
textBoxClassQuickFilter.Text = String.Empty;
|
|
textBoxInstanceFilterQuick.Text = String.Empty;
|
|
|
|
((WmiNode)treeNamespaces.SelectedNode.Tag).IsConnected = false;
|
|
((WmiNode)treeNamespaces.SelectedNode.Tag).IsExpanded = false;
|
|
|
|
treeNamespaces.SelectedNode.Text = nodeToDisconnect + " (Disconnected)";
|
|
treeNamespaces.SelectedNode.Nodes.Clear();
|
|
|
|
foreach (var element in AppCache)
|
|
{
|
|
if (element.Key.Contains(((WmiNode)treeNamespaces.SelectedNode.Tag).WmiNamespace.Path))
|
|
{
|
|
AppCache.Remove(element.Key);
|
|
}
|
|
}
|
|
|
|
SetStatusBar1(nodeToDisconnect + " Disconnected", MessageCategory.Info, true);
|
|
SetStatusBar2(String.Empty, MessageCategory.None);
|
|
}
|
|
|
|
private void contextMenuItemDisconnectRemovePath_Click(object sender, EventArgs e)
|
|
{
|
|
contextMenuItemDisconnectPath_Click(sender, e);
|
|
contextMenuItemRemovePath_Click(sender, e);
|
|
}
|
|
|
|
private void contextMenuItemExcludeSmsCollections_Click(object sender, EventArgs e)
|
|
{
|
|
ToolStripMenuItem t = (ToolStripMenuItem)sender;
|
|
|
|
if (t.Checked)
|
|
{
|
|
Settings.Default.EnumOptionsFlags ^= EnumOptions.ExcludeSmsCollections;
|
|
t.Checked = false;
|
|
}
|
|
else
|
|
{
|
|
Settings.Default.EnumOptionsFlags |= EnumOptions.ExcludeSmsCollections;
|
|
t.Checked = true;
|
|
}
|
|
|
|
Settings.Default.Save();
|
|
}
|
|
|
|
private void contextMenuItemExcludeSmsInventory_Click(object sender, EventArgs e)
|
|
{
|
|
ToolStripMenuItem t = (ToolStripMenuItem)sender;
|
|
|
|
if (t.Checked)
|
|
{
|
|
Settings.Default.EnumOptionsFlags ^= EnumOptions.ExcludeSmsInventory;
|
|
t.Checked = false;
|
|
}
|
|
else
|
|
{
|
|
Settings.Default.EnumOptionsFlags |= EnumOptions.ExcludeSmsInventory;
|
|
t.Checked = true;
|
|
}
|
|
|
|
Settings.Default.Save();
|
|
}
|
|
|
|
private void contextMenuItemGetClasses_Click(object sender, EventArgs e)
|
|
{
|
|
ResetListInstances();
|
|
ResetListClassProperties();
|
|
ResetListMethods();
|
|
RenameClassTabsToDefault();
|
|
|
|
EnumerateClasses();
|
|
}
|
|
|
|
private void contextMenuItemRemovePath_Click(object sender, EventArgs e)
|
|
{
|
|
string nodeToRemove = ((WmiNode)treeNamespaces.SelectedNode.Tag).UserSpecifiedPath;
|
|
if (Settings.Default.RecentPaths.Contains(nodeToRemove))
|
|
{
|
|
Settings.Default.RecentPaths.Remove(nodeToRemove);
|
|
Settings.Default.Save();
|
|
}
|
|
Log(nodeToRemove + " Removed");
|
|
treeNamespaces.SelectedNode.Remove();
|
|
}
|
|
|
|
private void contextMenuItemShowClassMof_Click(object sender, EventArgs e)
|
|
{
|
|
var mof = ((WmiClass)listClasses.SelectedItems[0].Tag).GetClassMof();
|
|
Form_ShowMof mofForm = new Form_ShowMof(mof);
|
|
mofForm.CenterForm(this).Show(this);
|
|
}
|
|
|
|
private void contextMenuItemShowClassMofAmended_Click(object sender, EventArgs e)
|
|
{
|
|
var mof = ((WmiClass)listClasses.SelectedItems[0].Tag).GetClassMof(true);
|
|
Form_ShowMof mofForm = new Form_ShowMof(mof);
|
|
mofForm.CenterForm(this).Show(this);
|
|
}
|
|
|
|
private void contextMenuItemShowInstanceMof_Click(object sender, EventArgs e)
|
|
{
|
|
Form_ShowMof mofForm = new Form_ShowMof(_instanceMof);
|
|
mofForm.CenterForm(this).Show(this);
|
|
}
|
|
|
|
private void contextMenuItemShowProviderInfo_Click(object sender, EventArgs e)
|
|
{
|
|
const string msftProvidersQuery = "SELECT * FROM MSFT_Providers";
|
|
|
|
StringBuilder output = new StringBuilder();
|
|
var caption = "WMI Provider Process Information";
|
|
|
|
try
|
|
{
|
|
WmiNode rootWmiNode = treeNamespaces.SelectedNode.Tag as WmiNode;
|
|
|
|
if (rootWmiNode == null)
|
|
{
|
|
SetStatusBar1("Unable to get WMI Provider Process information: NullReferenceException", MessageCategory.Error, true);
|
|
SetStatusBar2(String.Empty, MessageCategory.None);
|
|
return;
|
|
}
|
|
|
|
Cursor = Cursors.WaitCursor;
|
|
|
|
if (rootWmiNode.WmiNamespace.ServerName.Equals(".", StringComparison.InvariantCultureIgnoreCase))
|
|
caption += " for localhost";
|
|
else
|
|
caption += " for " + rootWmiNode.WmiNamespace.ServerName;
|
|
|
|
output.AppendLine(String.Empty);
|
|
|
|
ManagementScope mScope = new ManagementScope("\\\\" + rootWmiNode.WmiNamespace.ServerName + "\\ROOT\\CIMV2", Helpers.GetRootNodeCredentials(treeNamespaces.SelectedNode));
|
|
ObjectQuery query = new ObjectQuery(msftProvidersQuery);
|
|
ManagementObjectSearcher queryResults = new ManagementObjectSearcher(mScope, query);
|
|
queryResults.Options.EnumerateDeep = false;
|
|
|
|
foreach (var instance in (from ManagementBaseObject i in queryResults.Get()
|
|
orderby i.GetPropertyValue("HostProcessIdentifier")
|
|
select i))
|
|
{
|
|
output.AppendLine("Process ID " + instance.GetPropertyValue("HostProcessIdentifier"));
|
|
output.AppendLine(" - Used by Provider " + instance.GetPropertyValue("provider"));
|
|
output.AppendLine(" - Associated with Namespace " + instance.GetPropertyValue("namespace"));
|
|
|
|
var user = instance.GetPropertyValue("user").ToString();
|
|
if (!String.IsNullOrEmpty(user))
|
|
output.AppendLine(" - By User " + user);
|
|
|
|
var hostingGroup = instance.GetPropertyValue("hostinggroup").ToString();
|
|
if (!String.IsNullOrEmpty(hostingGroup))
|
|
output.AppendLine(" - Under Hosting Group " + hostingGroup);
|
|
|
|
output.AppendLine(String.Empty);
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
output.AppendLine("Error getting WMI Provider details. " + ex.Message);
|
|
}
|
|
finally
|
|
{
|
|
Cursor = Cursors.Default;
|
|
}
|
|
|
|
using (Form_DisplayText displayForm = new Form_DisplayText("WMI Providers", caption, output.ToString()))
|
|
{
|
|
displayForm.ShowDialog(this);
|
|
}
|
|
}
|
|
|
|
private void listClasses_DoubleClick(object sender, EventArgs e)
|
|
{
|
|
EnumerateInstances();
|
|
}
|
|
|
|
private void listClasses_MouseClick(object sender, MouseEventArgs e)
|
|
{
|
|
// Display context menu on Right Click
|
|
if (e.Button == MouseButtons.Right)
|
|
{
|
|
ListView listView = sender as ListView;
|
|
|
|
// ReSharper disable PossibleNullReferenceException
|
|
ListViewItem item = listView.GetItemAt(e.X, e.Y);
|
|
// ReSharper restore PossibleNullReferenceException
|
|
|
|
if (item != null)
|
|
{
|
|
item.Selected = true;
|
|
contextMenu.Show(listView, e.Location);
|
|
}
|
|
}
|
|
|
|
// Generate script if Scripts tab is selected
|
|
if (tabControlInstances.SelectedTab == tabScript)
|
|
{
|
|
GenerateVbScript();
|
|
GeneratePsScript();
|
|
}
|
|
|
|
// Create class query
|
|
WmiClass currentWmiClass = listClasses.SelectedItems[0].Tag as WmiClass;
|
|
if (currentWmiClass != null)
|
|
textBoxQuery1.Text = CreateQueryForSelectedClass(currentWmiClass);
|
|
}
|
|
|
|
private void listClasses_SelectedIndexChanged(object sender, EventArgs e)
|
|
{
|
|
// SelectedIndexChanged occurs twice, so bail out if nothing is selected
|
|
if (listClasses.SelectedItems.Count == 0)
|
|
{
|
|
// Clear UI
|
|
ResetListInstances();
|
|
propertyGridInstance.SelectedObject = null;
|
|
RenameClassTabsToDefault();
|
|
ResetListMethods();
|
|
ResetListClassProperties();
|
|
buttonScriptRun.Enabled = false;
|
|
buttonScriptSave.Enabled = false;
|
|
textBoxScript.Text = String.Empty;
|
|
return;
|
|
}
|
|
|
|
ListViewItem currentItem = listClasses.SelectedItems[0];
|
|
if (currentItem == null) return;
|
|
|
|
WmiClass currentWmiClass = currentItem.Tag as WmiClass;
|
|
if (currentWmiClass == null)
|
|
{
|
|
SetStatusBar2("Unexpected error. Currently selected class has a null value.", MessageCategory.Error, true);
|
|
return;
|
|
}
|
|
|
|
// Check if current class is already being enumerated
|
|
if (currentWmiClass.IsEnumerating)
|
|
{
|
|
SetStatusBar2("Enumerating Instances from " + currentWmiClass.DisplayName + "...", MessageCategory.Action);
|
|
ResetListInstances();
|
|
return;
|
|
}
|
|
|
|
// Set Instance Filter
|
|
textBoxInstanceFilterQuick.Text = currentWmiClass.InstanceFilterQuick;
|
|
|
|
// Enable script buttons
|
|
buttonScriptRun.Enabled = true;
|
|
buttonScriptSave.Enabled = true;
|
|
|
|
PopulateClassProperties(currentWmiClass);
|
|
PopulateMethods(currentWmiClass);
|
|
EnumerateInstancesFromCache(currentWmiClass);
|
|
|
|
// Display properties if DebugMode
|
|
if (DebugMode)
|
|
propertyGridDebugWmiClass.SelectedObject = listClasses.SelectedItems[0].Tag;
|
|
}
|
|
|
|
private void listInstances_MouseClick(object sender, MouseEventArgs e)
|
|
{
|
|
// Display context menu on Right Click
|
|
if (e.Button == MouseButtons.Right)
|
|
{
|
|
ListView listView = sender as ListView;
|
|
|
|
// ReSharper disable PossibleNullReferenceException
|
|
ListViewItem item = listView.GetItemAt(e.X, e.Y);
|
|
// ReSharper restore PossibleNullReferenceException
|
|
|
|
if (item != null)
|
|
{
|
|
item.Selected = true;
|
|
contextMenu.Show(listView, e.Location);
|
|
}
|
|
}
|
|
|
|
// Create query for selected instance
|
|
WmiInstance currentWmiInstance = listInstances.SelectedItems[0].Tag as WmiInstance;
|
|
if (currentWmiInstance != null)
|
|
textBoxQuery1.Text = CreateQueryForSelectedInstance(listInstances.SelectedItems[0].Tag as WmiInstance);
|
|
}
|
|
|
|
private void listInstances_SelectedIndexChanged(object sender, EventArgs e)
|
|
{
|
|
// SelectedIndexChange doccurs twice, so bail out if nothing is selected
|
|
if (listInstances.SelectedItems.Count == 0)
|
|
{
|
|
propertyGridInstance.SelectedObject = null;
|
|
return;
|
|
}
|
|
|
|
// Display properties if DebugMode
|
|
if (DebugMode)
|
|
propertyGridDebugWmiInstance.SelectedObject = listInstances.SelectedItems[0].Tag;
|
|
|
|
// Display instance properties
|
|
PopulateInstanceProperties(listInstances.SelectedItems[0]);
|
|
}
|
|
|
|
private void listMethods_SelectedIndexChanged(object sender, EventArgs e)
|
|
{
|
|
if (listMethods.SelectedItems.Count == 0)
|
|
{
|
|
ResetListMethodParams();
|
|
return;
|
|
}
|
|
|
|
PopulateMethodHelp(listMethods.SelectedItems[0].Tag as MethodData);
|
|
}
|
|
|
|
private void listProps_SelectedIndexChanged(object sender, EventArgs e)
|
|
{
|
|
ListView lvSender = (ListView)sender;
|
|
RichTextBox rtb;
|
|
string textToSearch;
|
|
_richTextSelectionResetRequired = true;
|
|
|
|
if (lvSender.SelectedItems.Count == 0)
|
|
{
|
|
if (lvSender == listClassProperties)
|
|
richTextBoxClassDetails.SelectionBackColor = SystemColors.Control;
|
|
else
|
|
richTextBoxMethodDetails.SelectionBackColor = SystemColors.Control;
|
|
return;
|
|
}
|
|
|
|
if (lvSender == listClassProperties)
|
|
{
|
|
rtb = richTextBoxClassDetails;
|
|
textToSearch = listClassProperties.SelectedItems[0].Text + " - " + listClassProperties.SelectedItems[0].SubItems[1].Text;
|
|
}
|
|
else if (lvSender == listMethodParamsIn)
|
|
{
|
|
rtb = richTextBoxMethodDetails;
|
|
textToSearch = listMethodParamsIn.SelectedItems[0].SubItems[1].Text + " - " + listMethodParamsIn.SelectedItems[0].SubItems[2].Text;
|
|
}
|
|
else if (lvSender == listMethodParamsOut)
|
|
{
|
|
rtb = richTextBoxMethodDetails;
|
|
textToSearch = listMethodParamsOut.SelectedItems[0].Text + " - " + listMethodParamsOut.SelectedItems[0].SubItems[1].Text;
|
|
}
|
|
else
|
|
return;
|
|
|
|
// Reset start index and highlighting
|
|
int startindex = 0;
|
|
rtb.SelectionBackColor = SystemColors.Control;
|
|
|
|
if (textToSearch.Length > 0)
|
|
startindex = Utilities.FindTextInRichTextBox(textToSearch.Trim(), 0, 0, rtb);
|
|
|
|
// If string was found in the RichTextBox, highlight it
|
|
if (startindex >= 0)
|
|
{
|
|
// Set the highlight color as yellow
|
|
rtb.SelectionBackColor = Color.Yellow;
|
|
|
|
// Find the end index. End Index = number of characters in textbox
|
|
int endindex = textToSearch.Length;
|
|
|
|
// Highlight the search string
|
|
rtb.Select(startindex, endindex);
|
|
rtb.ScrollToCaret();
|
|
}
|
|
}
|
|
|
|
private void listQueryResults_SelectedIndexChanged(object sender, EventArgs e)
|
|
{
|
|
if (listQueryResults.SelectedItems.Count == 0)
|
|
{
|
|
propertyGridQueryResults.SelectedObject = null;
|
|
return;
|
|
}
|
|
|
|
ManagementObject mObject = listQueryResults.SelectedItems[0].Tag as ManagementObject;
|
|
|
|
ManagementBaseObjectW mObjectW = new ManagementBaseObjectW(mObject)
|
|
{
|
|
IncludeNullProperties = checkNullProps.Checked,
|
|
IncludeSystemProperties = checkSystemProps.Checked
|
|
};
|
|
|
|
propertyGridQueryResults.SelectedObject = mObjectW;
|
|
}
|
|
|
|
private void listView_ColumnClick(object sender, ColumnClickEventArgs e)
|
|
{
|
|
ListView lvSender = (ListView)sender;
|
|
ListViewColumnSorter lvColumnSorter;
|
|
|
|
if (lvSender == listMethods)
|
|
lvColumnSorter = _listMethodsColumnSorter;
|
|
else if (lvSender == listClassProperties)
|
|
lvColumnSorter = _listClassPropertiesColumnSorter;
|
|
else if (lvSender == listClasses)
|
|
lvColumnSorter = _listClassesColumnSorter;
|
|
else if (lvSender == listSearchResults)
|
|
lvColumnSorter = _listSearchResultsColumnSorter;
|
|
else
|
|
return;
|
|
|
|
// Determine if clicked column is already the column that is being sorted.
|
|
if (e.Column == lvColumnSorter.SortColumn)
|
|
{
|
|
// Reverse the current sort direction for this column.
|
|
lvColumnSorter.Order = lvColumnSorter.Order == SortOrder.Ascending ? SortOrder.Descending : SortOrder.Ascending;
|
|
}
|
|
else
|
|
{
|
|
// Set the column number that is to be sorted; default to ascending.
|
|
lvColumnSorter.SortColumn = e.Column;
|
|
lvColumnSorter.Order = SortOrder.Ascending;
|
|
}
|
|
|
|
// Perform the sort with these new sort options.
|
|
lvSender.Sort();
|
|
lvSender.SetSortIcon(lvColumnSorter.SortColumn, lvColumnSorter.Order);
|
|
}
|
|
|
|
private void menuItemFile_ConnectAs_Click(object sender, EventArgs e)
|
|
{
|
|
using (Form_ConnectAs connectAsForm = new Form_ConnectAs())
|
|
{
|
|
connectAsForm.ShowDialog(this);
|
|
|
|
if (connectAsForm.Cancelled) return;
|
|
|
|
WmiNode rootNode = new WmiNode
|
|
{
|
|
IsRootNode = true,
|
|
UserSpecifiedPath = connectAsForm.Path
|
|
};
|
|
|
|
if (connectAsForm.Connection != null)
|
|
{
|
|
rootNode.SetConnection(connectAsForm.Connection);
|
|
}
|
|
else
|
|
{
|
|
MessageBox.Show("Failed to set credentials. Using logged on user's credentials.", "Credentials Failure", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
rootNode.SetConnection(_defaultConnection);
|
|
}
|
|
|
|
Connect(rootNode);
|
|
}
|
|
}
|
|
|
|
private void menuItemFile_Exit_Click(object sender, EventArgs e)
|
|
{
|
|
Close();
|
|
}
|
|
|
|
private void menuItemFile_Preferences_Click(object sender, EventArgs e)
|
|
{
|
|
using (Form_Settings settingsForm = new Form_Settings())
|
|
{
|
|
settingsForm.ShowDialog(this);
|
|
}
|
|
}
|
|
|
|
private void menuItemFile_SmsMode_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
// Save current setting
|
|
Settings.Default.bSmsMode = menuItemFile_SmsMode.Checked;
|
|
Settings.Default.Save();
|
|
|
|
// return if nothing is selected
|
|
if (treeNamespaces.SelectedNode == null)
|
|
return;
|
|
|
|
// Connect to Sms Client
|
|
TreeNode rootNode = treeNamespaces.SelectedNode.GetRootNode();
|
|
WmiNode rootWmiNode = rootNode.Tag as WmiNode;
|
|
|
|
if (rootWmiNode != null && rootWmiNode.SmsClient != null && rootWmiNode.SmsClient.IsClientInstalled && Settings.Default.bSmsMode)
|
|
{
|
|
ConnectToSmsClient(rootWmiNode.SmsClient);
|
|
}
|
|
}
|
|
|
|
private void menuItemHelp_About_Click(object sender, EventArgs e)
|
|
{
|
|
using (Form_About aboutForm = new Form_About())
|
|
{
|
|
aboutForm.ShowDialog(this);
|
|
}
|
|
}
|
|
|
|
private void menuItemHelp_CheckUpdate_Click(object sender, EventArgs e)
|
|
{
|
|
UpdateCheckAsync(true);
|
|
}
|
|
|
|
private void menuItemHelp_Documentation_Click(object sender, EventArgs e)
|
|
{
|
|
Process.Start("https://github.com/vinaypamnani/wmie2/wiki");
|
|
}
|
|
|
|
private void menuItemLaunch_DcomCnfg_Click(object sender, EventArgs e)
|
|
{
|
|
Utilities.LaunchProgram("dcomcnfg.exe");
|
|
}
|
|
|
|
private void menuItemLaunch_WbemTest_Click(object sender, EventArgs e)
|
|
{
|
|
Utilities.LaunchProgram("wbemtest.exe");
|
|
}
|
|
|
|
private void menuItemLaunch_WmiMgmt_Click(object sender, EventArgs e)
|
|
{
|
|
Utilities.LaunchProgram("wmimgmt.msc");
|
|
}
|
|
|
|
private void radioQueryOutDataGrid_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
dataGridQueryResults.Visible = radioQueryOutDataGrid.Checked;
|
|
}
|
|
|
|
private void radioQueryOutListView_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
splitContainerQueryResults.Visible = radioQueryOutListView.Checked;
|
|
}
|
|
|
|
private void radioScriptPs_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
GeneratePsScript();
|
|
}
|
|
|
|
private void radioScriptVbs_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
GenerateVbScript();
|
|
}
|
|
|
|
private void richTextBox_Click(object sender, EventArgs e)
|
|
{
|
|
RichTextBox rtb = (RichTextBox)sender;
|
|
|
|
if (_richTextSelectionResetRequired)
|
|
{
|
|
int firstVisibleChar = rtb.GetCharIndexFromPosition(new Point(0, 0));
|
|
rtb.SelectAll();
|
|
rtb.SelectionBackColor = SystemColors.Control;
|
|
rtb.DeselectAll();
|
|
rtb.SelectionStart = firstVisibleChar;
|
|
rtb.ScrollToCaret();
|
|
_richTextSelectionResetRequired = false;
|
|
}
|
|
}
|
|
|
|
private void richTextBoxClassDetails_LinkClicked(object sender, LinkClickedEventArgs e)
|
|
{
|
|
Process.Start(e.LinkText);
|
|
}
|
|
|
|
private void richTextBoxMethodDetails_LinkClicked(object sender, LinkClickedEventArgs e)
|
|
{
|
|
Process.Start(e.LinkText);
|
|
}
|
|
|
|
private void saveScriptDialog_FileOk(object sender, CancelEventArgs e)
|
|
{
|
|
string scriptPath = saveScriptDialog.FileName;
|
|
try
|
|
{
|
|
File.WriteAllText(scriptPath, textBoxScript.Text);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
SetStatusBar2("Error saving script to " + scriptPath + ": " + ex.Message, MessageCategory.Error, true);
|
|
}
|
|
}
|
|
|
|
private void SetStatusBar(ToolStripStatusLabel toolStripLabel, String text, MessageCategory messagecategory, bool bLog = false)
|
|
{
|
|
if (text != "")
|
|
{
|
|
toolStripLabel.BorderSides = ToolStripStatusLabelBorderSides.All;
|
|
toolStripLabel.BorderStyle = Border3DStyle.SunkenInner;
|
|
}
|
|
else
|
|
{
|
|
toolStripLabel.BorderSides = ToolStripStatusLabelBorderSides.None;
|
|
toolStripLabel.BorderStyle = Border3DStyle.Flat;
|
|
}
|
|
|
|
toolStripLabel.Text = text;
|
|
|
|
switch (messagecategory)
|
|
{
|
|
case MessageCategory.Info:
|
|
toolStripLabel.BackColor = ColorCategory.Info;
|
|
break;
|
|
|
|
case MessageCategory.Action:
|
|
toolStripLabel.BackColor = ColorCategory.Action;
|
|
break;
|
|
|
|
case MessageCategory.Warn:
|
|
toolStripLabel.BackColor = ColorCategory.Warn;
|
|
break;
|
|
|
|
case MessageCategory.Cache:
|
|
toolStripLabel.BackColor = ColorCategory.Cache;
|
|
break;
|
|
|
|
case MessageCategory.Error:
|
|
toolStripLabel.BackColor = ColorCategory.Error;
|
|
break;
|
|
|
|
case MessageCategory.Sms:
|
|
toolStripLabel.BackColor = ColorCategory.Sms;
|
|
break;
|
|
|
|
case MessageCategory.None:
|
|
toolStripLabel.BackColor = ColorCategory.None;
|
|
break;
|
|
|
|
default:
|
|
toolStripLabel.BackColor = ColorCategory.Unknown;
|
|
break;
|
|
}
|
|
|
|
if (bLog)
|
|
Log(text);
|
|
}
|
|
|
|
private void SetStatusBar1(String text, MessageCategory messagecategory, bool bLog = false)
|
|
{
|
|
if (statusStrip.InvokeRequired)
|
|
{
|
|
SetStatusBar1Callback d = SetStatusBar1; //SetStatusBar1Callback d = new SetStatusBar1Callback(SetStatusBar1);
|
|
Invoke(d, new object[] { text, messagecategory, bLog });
|
|
}
|
|
else
|
|
{
|
|
SetStatusBar(toolStripLabel1, text, messagecategory, bLog);
|
|
}
|
|
}
|
|
|
|
private void SetStatusBar2(String text, MessageCategory messagecategory, bool bLog = false)
|
|
{
|
|
if (statusStrip.InvokeRequired)
|
|
{
|
|
SetStatusBar2Callback d = SetStatusBar2; //SetStatusBar2Callback d = new SetStatusBar2Callback(SetStatusBar2);
|
|
Invoke(d, new object[] { text, messagecategory, bLog });
|
|
}
|
|
else
|
|
{
|
|
SetStatusBar(toolStripLabel2, text, messagecategory, bLog);
|
|
}
|
|
}
|
|
|
|
private void SetStatusBar3(string operation, TimeSpan time)
|
|
{
|
|
if (statusStrip.InvokeRequired)
|
|
{
|
|
SetStatusBar3Callback d = SetStatusBar3; //SetStatusBar3Callback d = new SetStatusBar3Callback(SetStatusBar3);
|
|
Invoke(d, new object[] { operation, time });
|
|
}
|
|
else
|
|
{
|
|
toolStripLabel3.Text = "Time to " + operation + ": " + time.ToString(@"mm\:ss\.fff");
|
|
}
|
|
}
|
|
|
|
private void splitContainerNamespaceClasses_SplitterMoved(object sender, SplitterEventArgs e)
|
|
{
|
|
if (buttonHideNamespaces.Text == "+")
|
|
{
|
|
splitContainerNamespaceClasses.SplitterDistance = 30;
|
|
}
|
|
}
|
|
|
|
private void tabControlInstances_Selected(object sender, TabControlEventArgs e)
|
|
{
|
|
// Scroll to the last line when Logging tab is selected
|
|
if (tabControlInstances.SelectedTab == tabLogging)
|
|
{
|
|
// ReSharper disable InconsistentNaming
|
|
const int WM_VSCROLL = 0x115;
|
|
const int SB_BOTTOM = 7;
|
|
// ReSharper restore InconsistentNaming
|
|
|
|
NativeMethods.SendMessage(textBoxLogging.Handle, WM_VSCROLL, (IntPtr)SB_BOTTOM, IntPtr.Zero);
|
|
}
|
|
}
|
|
|
|
private void textBoxClassFilter_KeyDown(object sender, KeyEventArgs e)
|
|
{
|
|
if (e.KeyCode == Keys.Enter)
|
|
buttonClassesRefresh.PerformClick();
|
|
}
|
|
|
|
private void textBoxClassQuickFilter_TextChanged(object sender, EventArgs e)
|
|
{
|
|
// Do nothing and return if no node is selected
|
|
if (treeNamespaces.SelectedNode == null) return;
|
|
|
|
TreeNode currentNode = treeNamespaces.SelectedNode;
|
|
WmiNode currentWmiNode = currentNode.Tag as WmiNode;
|
|
if (currentWmiNode == null || currentWmiNode.WmiNamespace == null)
|
|
{
|
|
SetStatusBar1("Failed to filter results. ERROR: TextChanged - Current Namespace is null", MessageCategory.Error, true);
|
|
return;
|
|
}
|
|
|
|
// Do nothing and return if current namespace is not enumerated
|
|
WmiNamespace currentNamespace = currentWmiNode.WmiNamespace;
|
|
if (!currentNamespace.IsEnumerated) return;
|
|
|
|
// Parse filter text
|
|
string filterText = textBoxClassQuickFilter.Text.ToLower();
|
|
bool notFilter = false;
|
|
if (filterText.StartsWith("!") && filterText.Length > 1)
|
|
{
|
|
filterText = filterText.Substring(1);
|
|
notFilter = true;
|
|
}
|
|
|
|
// Don't do anything if filter Text is not atleast 3 characters
|
|
if (filterText.Length > 0 && filterText.Length < 3) return;
|
|
|
|
// Clear UI Elements
|
|
ResetListInstances();
|
|
ResetListClassProperties();
|
|
ResetListMethods();
|
|
RenameClassTabsToDefault();
|
|
propertyGridInstance.SelectedObject = null;
|
|
|
|
var cachedItem = AppCache[currentNamespace.Path];
|
|
if (cachedItem != null)
|
|
{
|
|
List<ListViewItem> lc = cachedItem as List<ListViewItem>;
|
|
PopulateListClasses(lc, filterText, notFilter);
|
|
SetStatusBar1("Showing " + listClasses.Items.Count + "/" + currentNamespace.ClassCount + " matching cached classes from " + currentNamespace.DisplayName, MessageCategory.Cache);
|
|
}
|
|
else
|
|
{
|
|
SetStatusBar1("Cache Expired for " + currentNamespace.DisplayName, MessageCategory.Warn, true);
|
|
SetStatusBar2("Double click namespace to refresh classes.", MessageCategory.Warn);
|
|
}
|
|
}
|
|
|
|
private void textBoxComputerName_KeyDown(object sender, KeyEventArgs e)
|
|
{
|
|
if (e.KeyCode == Keys.Enter)
|
|
buttonComputerConnect.PerformClick();
|
|
}
|
|
|
|
private void textBoxInstanceFilterQuick_TextChanged(object sender, EventArgs e)
|
|
{
|
|
// Do nothing and return if no Class is selected.
|
|
if (listClasses.SelectedItems.Count == 0) return;
|
|
|
|
WmiClass currentWmiClass = listClasses.SelectedItems[0].Tag as WmiClass;
|
|
if (currentWmiClass == null)
|
|
{
|
|
SetStatusBar2("Failed to filter results. ERROR: TextChanged - Current Class is null", MessageCategory.Error, true);
|
|
return;
|
|
}
|
|
|
|
// Do nothing and return if selected class is not enumerated
|
|
if (!currentWmiClass.IsEnumerated) return;
|
|
|
|
// Save filter text
|
|
string filterText = textBoxInstanceFilterQuick.Text.ToLower();
|
|
currentWmiClass.InstanceFilterQuick = filterText;
|
|
|
|
// Parse filter text
|
|
bool notFilter = false;
|
|
if (filterText.StartsWith("!") && filterText.Length > 1)
|
|
{
|
|
filterText = filterText.Substring(1);
|
|
notFilter = true;
|
|
}
|
|
|
|
// Don't do anything if filter Text is not atleast 3 characters
|
|
if (filterText.Length > 0 && filterText.Length < 3) return;
|
|
|
|
// Clear UI Elements
|
|
propertyGridInstance.SelectedObject = null;
|
|
|
|
var cachedItem = AppCache[currentWmiClass.Path];
|
|
if (cachedItem != null)
|
|
{
|
|
List<ListViewItem> lc = cachedItem as List<ListViewItem>;
|
|
PopulateListInstances(lc, filterText, notFilter);
|
|
SetStatusBar2("Showing " + listInstances.Items.Count + "/" + currentWmiClass.InstanceCount + " mathing instances from " + currentWmiClass.DisplayName, MessageCategory.Cache);
|
|
}
|
|
else
|
|
{
|
|
SetStatusBar2("Failed to filter results. Cache Expired for " + currentWmiClass.DisplayName, MessageCategory.Warn, true);
|
|
}
|
|
}
|
|
|
|
private void textBoxSearchPattern_KeyDown(object sender, KeyEventArgs e)
|
|
{
|
|
if (e.KeyCode == Keys.Enter)
|
|
{
|
|
buttonSearch.PerformClick();
|
|
}
|
|
}
|
|
|
|
private void toolStripLabelUpdateNotification_Click(object sender, EventArgs e)
|
|
{
|
|
var changeLog = File.Exists(_changeLogPath) ? File.ReadAllText(_changeLogPath) : "Change Log Not Available";
|
|
bool bUpdateAvailable = (bool)toolStripLabelUpdateNotification.Tag;
|
|
|
|
if (bUpdateAvailable)
|
|
{
|
|
using (Form_Update updateForm = new Form_Update(bUpdateAvailable, changeLog))
|
|
{
|
|
updateForm.ShowDialog(this);
|
|
}
|
|
//string caption = "A new version of WMI Explorer is available!";
|
|
//string updateUrl = "To download the latest version, visit the link below:\n" + Settings.Default.UpdateUrl;
|
|
//changeLog = updateUrl + "\n\n" + changeLog;
|
|
//using (Form_DisplayText displayForm = new Form_DisplayText("WMI Explorer Update", caption, changeLog))
|
|
//{
|
|
// displayForm.ShowDialog(this);
|
|
//}
|
|
}
|
|
else
|
|
{
|
|
MessageBox.Show(
|
|
"You are running version " + Assembly.GetExecutingAssembly().GetName().Version + "\n\n" +
|
|
"This is the latest version!",
|
|
"WMI Explorer Update",
|
|
MessageBoxButtons.OK,
|
|
MessageBoxIcon.Information
|
|
);
|
|
}
|
|
|
|
// Log(File.Exists(_changeLogPath) ? File.ReadAllText(_changeLogPath) : "Change Log not available");
|
|
//Process.Start(Settings.Default.UpdateUrl);
|
|
}
|
|
|
|
private void treeNamespaces_AfterSelect(object sender, TreeViewEventArgs e)
|
|
{
|
|
WmiNode selectedWmiNode = treeNamespaces.SelectedNode.Tag as WmiNode;
|
|
if (selectedWmiNode == null)
|
|
{
|
|
const string message = "Unexpected Error. treeNamespaces_AfterSelect - Current WMI Node is null.";
|
|
NotifyNodeError(treeNamespaces.SelectedNode, message);
|
|
return;
|
|
}
|
|
|
|
// Check if we've selected a DISCONNECTED node
|
|
if (Helpers.IsNodeDisconnected(treeNamespaces.SelectedNode))
|
|
{
|
|
SetStatusBar1(selectedWmiNode.UserSpecifiedPath + " is not connected. Right click to connect.", MessageCategory.Info);
|
|
textBoxClassQuickFilter.Text = String.Empty;
|
|
textBoxClassFilter.Text = String.Empty;
|
|
return;
|
|
}
|
|
|
|
ResetListClasses();
|
|
ResetListInstances();
|
|
ResetListClassProperties();
|
|
ResetListMethods();
|
|
RenameNamespaceTabsToDefault();
|
|
propertyGridInstance.SelectedObject = null;
|
|
|
|
WmiNamespace selectedNamespace = selectedWmiNode.WmiNamespace;
|
|
|
|
// Populate child namespaces, after clicking on a namespace
|
|
EnumerateChildNamespaces(treeNamespaces.SelectedNode);
|
|
|
|
// Enumerate classes from cache, if they exist in cache
|
|
EnumerateClassesFromCache(selectedNamespace);
|
|
|
|
// Set quick filter text back so that items are filtered again
|
|
textBoxClassQuickFilter.Text = selectedNamespace.ClassFilterQuick;
|
|
textBoxClassFilter.Text = selectedNamespace.ClassFilter;
|
|
|
|
// Check if current namespace is already being enumerated
|
|
if (selectedNamespace.IsEnumerating)
|
|
{
|
|
SetStatusBar1("Enumerating Classes from " + selectedNamespace.DisplayName + "...", MessageCategory.Action);
|
|
SetStatusBar2("", MessageCategory.None);
|
|
}
|
|
|
|
if (DebugMode)
|
|
{
|
|
propertyGridDebugWmiNode.SelectedObject = selectedWmiNode;
|
|
propertyGridDebugWmiNamespace.SelectedObject = selectedNamespace;
|
|
}
|
|
}
|
|
|
|
private void treeNamespaces_BeforeSelect(object sender, TreeViewCancelEventArgs e)
|
|
{
|
|
// If selected node is null, do nothing and return
|
|
if (treeNamespaces.SelectedNode == null) return;
|
|
|
|
// Save filter text before moving away from the namespace
|
|
WmiNode selectedWmiNode = treeNamespaces.SelectedNode.Tag as WmiNode;
|
|
if (selectedWmiNode != null && selectedWmiNode.WmiNamespace != null)
|
|
{
|
|
selectedWmiNode.WmiNamespace.ClassFilterQuick = textBoxClassQuickFilter.Text;
|
|
selectedWmiNode.WmiNamespace.ClassFilter = textBoxClassFilter.Text;
|
|
}
|
|
}
|
|
|
|
private void treeNamespaces_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
|
|
{
|
|
if (e.Button == MouseButtons.Right)
|
|
{
|
|
treeNamespaces.SelectedNode = e.Node;
|
|
contextMenu.Show(treeNamespaces, e.Location);
|
|
}
|
|
}
|
|
|
|
private void treeNamespaces_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
|
|
{
|
|
// Check if we've double clicked a DISCONNECTED node
|
|
if (Helpers.IsNodeDisconnected(treeNamespaces.SelectedNode))
|
|
{
|
|
WmiNode wmiNode = treeNamespaces.SelectedNode.Tag as WmiNode;
|
|
if (wmiNode != null)
|
|
Connect(wmiNode);
|
|
|
|
return;
|
|
}
|
|
|
|
ResetListInstances();
|
|
ResetListClassProperties();
|
|
ResetListMethods();
|
|
RenameClassTabsToDefault();
|
|
|
|
EnumerateClasses();
|
|
}
|
|
|
|
private void WmiExplorer_FormClosing(object sender, FormClosingEventArgs e)
|
|
{
|
|
// Show namespaces again so that splitter distance is saved properly
|
|
if (buttonHideNamespaces.Text == "+")
|
|
buttonHideNamespaces.PerformClick();
|
|
|
|
// Save Window Placement
|
|
if (Settings.Default.bPreserveLayout)
|
|
{
|
|
Settings.Default.WindowPlacement = WindowPlacement.GetPlacement(Handle);
|
|
Settings.Default.SplitterDistanceNamespaces = splitContainerNamespaceClasses.SplitterDistance;
|
|
Settings.Default.SplitterDistanceClasses = splitContainerClassesInstances.SplitterDistance;
|
|
Settings.Default.SplitterDistanceInstances = splitContainerInstancesProperties.SplitterDistance;
|
|
}
|
|
|
|
// Save Settings
|
|
Settings.Default.Save();
|
|
}
|
|
|
|
private void WmiExplorer_KeyDown(object sender, KeyEventArgs e)
|
|
{
|
|
// Log Settings on Ctrl+Shift+S
|
|
if (e.Control && e.Shift && e.KeyCode == Keys.S)
|
|
LogSettings();
|
|
|
|
// Enable/Disable Debug Mode on Ctrl+Shift+D
|
|
if (e.Control && e.Shift && e.KeyCode == Keys.D)
|
|
{
|
|
if (DebugMode)
|
|
{
|
|
DebugMode = false;
|
|
tabControlClasses.Controls.Remove(tabDebug1);
|
|
tabControlInstances.Controls.Remove(tabDebug2);
|
|
}
|
|
else
|
|
{
|
|
DebugMode = true;
|
|
tabControlClasses.Controls.Add(tabDebug1);
|
|
tabControlInstances.Controls.Add(tabDebug2);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void WmiExplorer_Load(object sender, EventArgs e)
|
|
{
|
|
InitializeForm();
|
|
ProcessCommandLineArgs();
|
|
}
|
|
}
|
|
} |