<?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="http://www.codeplex.com/rss.xsl"?><rss version="2.0"><channel><title>PowerShell Scripts</title><link>http://www.codeplex.com/PsObject/Project/ProjectRss.aspx</link><description>PowerShell scripts for Administrators and .NET Developers.</description><item><title>Commented Issue: enable-mailbox overwrites AD mail attribute</title><link>http://www.codeplex.com/PsObject/WorkItem/View.aspx?WorkItemId=17499</link><description>Is there a way to prevent the enable-mailbox cmdlet from overwriting the &amp;#91;mail&amp;#93; field in Active Directory&amp;#63; &lt;br /&gt;If not, why is this&amp;#63;  &lt;br /&gt;This AD field doesn&amp;#39;t appear to be used by Exch2007,   &lt;br /&gt;Also, Enable-Mailbox is supposed to take the PrimarySmtpAddress &lt;br /&gt; parameter, but it  throws an exception.&lt;br /&gt;I&amp;#39;m using powershell version 1 on win2003&lt;br /&gt;Comments: ** Comment from web user: rroman81 ** &lt;p&gt;I just tested on Ex2k7 SP1, it appears enable-mailbox does modify mail attribute based on the EAP but effectively removes the mailbox in policy participation and sets the PrimarySmtpAddress value to proxyAddresses multi-valued attribute.  Are you following up on this issue somewhere else&amp;#63;  I&amp;#39;d expect mail and proxyAddresses &amp;#34;SMTP&amp;#58;&amp;#42;&amp;#34; be synched based on exchange requirements.&lt;/p&gt;</description><author>rroman81</author><pubDate>Wed, 03 Sep 2008 21:51:24 GMT</pubDate><guid isPermaLink="false">Commented Issue: enable-mailbox overwrites AD mail attribute 20080903095124P</guid></item><item><title>New Post: Easily build XML file from a specific folder</title><link>http://www.codeplex.com/PsObject/Thread/View.aspx?ThreadId=34446</link><description>&lt;div style="line-height: normal;"&gt;#Mike71&lt;br&gt;
#email: djmid71@gmail.com&lt;br&gt;
&lt;br&gt;
echo &amp;quot;&amp;lt;?xml version=&amp;quot;&amp;quot;1.0&amp;quot;&amp;quot; encoding='UTF-8'?&amp;gt;&amp;quot; &amp;gt;&amp;gt; c:\myfile.xml ; echo '&amp;lt;list&amp;gt;' &amp;gt;&amp;gt; c:\myfile.xml ;foreach( $file in get-childitem -exclude &amp;quot;xmlbuilder.ps1&amp;quot;) {echo '&amp;lt;dir&amp;gt;' &amp;gt;&amp;gt; c:\myfile.xml; $file.name &amp;gt;&amp;gt; c:\myfile.xml ; echo '&amp;lt;/dir&amp;gt;' &amp;gt;&amp;gt; c:\myfile.xml }; echo '&amp;lt;/list&amp;gt;' &amp;gt;&amp;gt; c:\myfile.xml&lt;br&gt;
&lt;br&gt;
&amp;quot;All Done!&amp;quot;&lt;br&gt;
&amp;quot;Your xml is located on C:\&amp;quot;
&lt;/div&gt;</description><author>Mike71</author><pubDate>Thu, 28 Aug 2008 07:58:50 GMT</pubDate><guid isPermaLink="false">New Post: Easily build XML file from a specific folder 20080828075850A</guid></item><item><title>New Post: Get-Tail</title><link>http://www.codeplex.com/PsObject/Thread/View.aspx?ThreadId=7637</link><description>&lt;div style="line-height: normal;"&gt;&lt;pre style="padding:0.5em;overflow:auto;background-color:rgb(236, 236, 236);font-family:Consolas,Courier New,Courier,Monospace;font-size:1em;margin-top:0pt;height:auto"&gt;#while($line = $reader.ReadLine())&lt;br&gt;# if the line is empty, it'll break. So need to determine if $line is null&lt;br&gt;while(($line = $reader.ReadLine()) -ne $null)&lt;br&gt;{&lt;br&gt;	$lines += ,$line&lt;br&gt;}&lt;/pre&gt;
&lt;/div&gt;</description><author>congling</author><pubDate>Sun, 17 Aug 2008 17:21:17 GMT</pubDate><guid isPermaLink="false">New Post: Get-Tail 20080817052117P</guid></item><item><title>New Post: No Windows PowerShell Snap-ins are available for version 1</title><link>http://www.codeplex.com/PsObject/Thread/View.aspx?ThreadId=32878</link><description>&lt;div style="line-height: normal;"&gt;For anyone else who has a question about this:&lt;br&gt;
My problem was that I needed MSScript control (which will not run on x64) and&amp;nbsp;Microsoft.Exchange.Management.PowerShell.Admin(which only runs on x64).&lt;br&gt;
&lt;br&gt;
You CAN use the 32 bit Exchange Server 2007 demo.&amp;nbsp; The demo application will cease to function after 120 days, but the component will continue to work.&lt;br&gt;
So, in the case that you need&amp;nbsp;to use a legacy component like I did, install the 32 bit version of exchange server admin tools&amp;nbsp; and set target to x86.&lt;br&gt;
&lt;br&gt;
&lt;/div&gt;</description><author>MikeNaho</author><pubDate>Mon, 11 Aug 2008 14:11:24 GMT</pubDate><guid isPermaLink="false">New Post: No Windows PowerShell Snap-ins are available for version 1 20080811021124P</guid></item><item><title>New Post: No Windows PowerShell Snap-ins are available for version 1</title><link>http://www.codeplex.com/PsObject/Thread/View.aspx?ThreadId=32878</link><description>&lt;div style="line-height: normal;"&gt;I can partially answer my own question:&lt;br&gt;
I was attempting to compile the apps and copy the exe's and dll's over the existing ones created by the InstallShield setup.&lt;br&gt;
That did not work.&lt;br&gt;
By setting the executable application platform and its dependants to x64 seems to work just fine.&lt;br&gt;
&lt;br&gt;
Next problem:&lt;br&gt;
&lt;br&gt;
app A uses&amp;nbsp;assembly C&lt;br&gt;
app B uses assembly C&lt;br&gt;
&lt;br&gt;
assembly C needs to run x64 because it handles Exchange 2007 with&amp;nbsp;Microsoft.Exchange.Management.PowerShell.Admin.dll.&lt;br&gt;
&lt;br&gt;
app B runs x64 and works.&lt;br&gt;
app A has other assemblies that apparently do not work in x64.&lt;br&gt;
&lt;br&gt;
Is there a Mixed Mode option?&amp;nbsp; I know we can't run an x64 assembly from a x86bit app, so app A will have to be an x64.&lt;br&gt;
&lt;br&gt;
When App A runs, I get System.ApplicationException: Unable to connect to ActiveDirectory: Retrieving the COM class factory for component with CLSID {...} failed due to the following error: 80040154&lt;br&gt;
&lt;br&gt;
So, a com dependency assembly is not registered in x64.&lt;br&gt;
&lt;br&gt;
Any ideas?&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;/div&gt;</description><author>MikeNaho</author><pubDate>Sat, 09 Aug 2008 00:41:50 GMT</pubDate><guid isPermaLink="false">New Post: No Windows PowerShell Snap-ins are available for version 1 20080809124150A</guid></item><item><title>New Post: No Windows PowerShell Snap-ins are available for version 1</title><link>http://www.codeplex.com/PsObject/Thread/View.aspx?ThreadId=32878</link><description>&lt;div style="line-height: normal;"&gt;Could somebody please give me some help here??&amp;nbsp;&amp;nbsp;&lt;br&gt;
&lt;p align=left&gt;I have to load the snappin Microsoft.Exchange.Management.PowerShell.Admin on&lt;/p&gt;
&lt;p align=left&gt;both 32 and 64 bit machines.&lt;/p&gt;
&lt;br&gt;
&lt;p align=left&gt;I understand why it works on a 32 bit machine with Microsoft Exchange Server 2007 Mgmt tools.&amp;nbsp; Using this solution&lt;/p&gt;
&lt;p align=left&gt;is only a very temporary fix, as it seems only to come as a 120 day demo, with no registration option. And doesn't provide a solution for our 64 bit os customers.&lt;/p&gt;
&lt;p align=left&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align=left&gt;Our app was originally set as x86.&lt;/p&gt;
&lt;p align=left&gt;All dependency dll's have platform target set to 'use any'.&lt;/p&gt;
&lt;p align=left&gt;This worked on all platforms&amp;nbsp; until I had to add Exchange 2007 support, where I needed to call the 64 bit Microsoft.Exchange.Management.PowerShell.Admin dll.&lt;/p&gt;
&lt;p align=left&gt;Unfortunately, as you know, in the 32 bit enviornment of our app, the 32 bit version of powershell is called, for which there is no Microsoft.Exchange.Management.PowerShell.Admin&amp;nbsp; plugin, hence the error 'no windows powershell snap-ins are available for version 1'.&amp;nbsp;&lt;br&gt;
&lt;/p&gt;
&lt;p align=left&gt;I&amp;nbsp; changing Target Platform of the app to x64 with&amp;nbsp; dependecy dll's set to 'Use Any'.&lt;/p&gt;
&lt;p align=left&gt;I did have partial success. I was able to create the powershell runspace and load the 64 bit exchange plugin. Yeah!&lt;/p&gt;
&lt;p align=left&gt;Howerver, after successive attempts, &amp;nbsp;I am now unable to reproduce the&amp;nbsp;previous success.&amp;nbsp; &lt;/p&gt;
&lt;p align=left&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align=left&gt;On the 64 bit os, I get an error while starting the app. I receive the 'System.BadImageFormatExceptin: Could not load file or assembly.... or one of its dependencies.&amp;nbsp; An attempt was made to load a program with an incorrect format.&lt;/p&gt;
&lt;p align=left&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align=left&gt;&amp;nbsp;The assembly that handles all powershell functions is a dependency of the main app.&lt;/p&gt;
&lt;p align=left&gt;Do they both have to have target platform set to x64?&lt;/p&gt;
&lt;p align=left&gt;I don't really understand the rule here.&lt;br&gt;
&amp;nbsp; Will I have to create two seperate applications, one for x64 and the other for 32 bit os ?&lt;/p&gt;
&lt;p align=left&gt;Mike&lt;/p&gt;
&lt;/div&gt;</description><author>MikeNaho</author><pubDate>Fri, 08 Aug 2008 15:48:57 GMT</pubDate><guid isPermaLink="false">New Post: No Windows PowerShell Snap-ins are available for version 1 20080808034857P</guid></item><item><title>New Post: No Windows PowerShell Snap-ins are available for version 1</title><link>http://www.codeplex.com/PsObject/Thread/View.aspx?ThreadId=32878</link><description>&lt;div style="line-height: normal;"&gt;Maybe this is the proper place for this question.&lt;br&gt;
I never receive any response to requests here.&lt;br&gt;
&lt;br&gt;
Anyway, I get this error when running my c# application on a 64 bit os.&lt;br&gt;
It appears that the 32 bit powershell is being invoked rather than the 64 bit.&amp;nbsp; &lt;br&gt;
This same error appear when I attempt to add&amp;nbsp; snap-in Microsoft.Exchange.Management.PowerShell.Admin.&lt;br&gt;
I know that its a 64 bit app, but I don't know how to make my c# app use the correct version.&lt;br&gt;
I've set the platform to x86 and x64, as well as any cpu, but it does not work.&lt;br&gt;
I still get the error, &amp;quot;No Windows PowerShell Snap-ins are available for version 1&amp;quot;.&lt;br&gt;
&lt;br&gt;
I would really appreciate some help with this, as we've invested alot of time and resources to using Powershell.&lt;br&gt;
&lt;br&gt;
&lt;/div&gt;</description><author>MikeNaho</author><pubDate>Mon, 04 Aug 2008 20:29:33 GMT</pubDate><guid isPermaLink="false">New Post: No Windows PowerShell Snap-ins are available for version 1 20080804082933P</guid></item><item><title>Created Issue: 64 bit OS error : No Windows PowerShell Snap-ins are available for version 1</title><link>http://www.codeplex.com/PsObject/WorkItem/View.aspx?WorkItemId=17665</link><description>Does someone know how to solve this&amp;#63;  I have a component &amp;#40;Platform target x86&amp;#41; which runs fine on 32 bit os, but it seems to be calling the 32 bit version of Powershell, causing the error&amp;#58; No Windows PowerShell Snap-ins are available for version 1.&lt;br /&gt;thank you for any answers.&lt;br /&gt;Mike&lt;br /&gt;</description><author>MikeNaho</author><pubDate>Mon, 04 Aug 2008 18:04:28 GMT</pubDate><guid isPermaLink="false">Created Issue: 64 bit OS error : No Windows PowerShell Snap-ins are available for version 1 20080804060428P</guid></item><item><title>Created Issue: enable-mailbox overwrites AD mail attribute</title><link>http://www.codeplex.com/PsObject/WorkItem/View.aspx?WorkItemId=17499</link><description>Is there a way to prevent the enable-mailbox cmdlet from overwriting the &amp;#91;mail&amp;#93; field in Active Directory&amp;#63; &lt;br /&gt;If not, why is this&amp;#63;  &lt;br /&gt;This AD field doesn&amp;#39;t appear to be used by Exch2007,   &lt;br /&gt;Also, Enable-Mailbox is supposed to take the PrimarySmtpAddress &lt;br /&gt; parameter, but it  throws an exception.&lt;br /&gt;I&amp;#39;m using powershell version 1 on win2003&lt;br /&gt;</description><author>MikeNaho</author><pubDate>Tue, 22 Jul 2008 22:46:16 GMT</pubDate><guid isPermaLink="false">Created Issue: enable-mailbox overwrites AD mail attribute 20080722104616P</guid></item><item><title>New Post: Remote Computers Inventory</title><link>http://www.codeplex.com/PsObject/Thread/View.aspx?ThreadId=30444</link><description>&lt;div style="line-height: normal;"&gt;&lt;br&gt;
&lt;div style="border-style:dotted none;border-color:rgb(170, 170, 170) -moz-use-text-color;border-width:0.1em medium;margin:1em 0em 2.5em 3em;padding:0.2em;font-style:italic"&gt;&lt;br&gt;
AndrewTearle wrote:&lt;br&gt;
## Icon calls need to be valid ...&lt;br&gt;
&lt;br&gt;
## Written for Version 1 ? Seems to crash CTP 2 when in search of File ... &lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Didn't checked it on CTP2 ...&lt;br&gt;
Works greate in Version 1&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;</description><author>Meiron</author><pubDate>Mon, 07 Jul 2008 16:49:02 GMT</pubDate><guid isPermaLink="false">New Post: Remote Computers Inventory 20080707044902P</guid></item><item><title>New Post: Remote Computers Inventory</title><link>http://www.codeplex.com/PsObject/Thread/View.aspx?ThreadId=30444</link><description>&lt;div style="line-height: normal;"&gt;## Icon calls need to be valid ...&lt;br&gt;
&lt;br&gt;
## Written for Version 1 ? Seems to crash CTP 2 when in search of File ... &lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;/div&gt;</description><author>AndrewTearle</author><pubDate>Sun, 29 Jun 2008 23:36:54 GMT</pubDate><guid isPermaLink="false">New Post: Remote Computers Inventory 20080629113654P</guid></item><item><title>New Post: Remote Computers Inventory</title><link>http://www.codeplex.com/PsObject/Thread/View.aspx?ThreadId=30444</link><description>&lt;div style="line-height: normal;"&gt;# ========================================================&lt;br&gt;
#&lt;br&gt;
# &amp;nbsp;&amp;nbsp; &amp;nbsp;Script Information&lt;br&gt;
#&lt;br&gt;
#&amp;nbsp;&amp;nbsp; &amp;nbsp;Title:&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Remote Computer Inventory&lt;br&gt;
#&amp;nbsp;&amp;nbsp; &amp;nbsp;Author:&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Assaf Miron&lt;br&gt;
#&amp;nbsp;&amp;nbsp; &amp;nbsp;Originally created:&amp;nbsp;&amp;nbsp; &amp;nbsp;21/06/2008&lt;br&gt;
#&amp;nbsp;&amp;nbsp; &amp;nbsp;Original path:&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;ComputerInventory.PS1&lt;br&gt;
#&amp;nbsp;&amp;nbsp; &amp;nbsp;Description:&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Collects Remote Computer Data Using WMI and Registry Access&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br&gt;
#&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Outputs all information to a Data Grid Form and to a CSV Log File&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br&gt;
#&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br&gt;
# ========================================================&lt;br&gt;
&lt;br&gt;
#region Constructor&lt;br&gt;
# Import Assembly&lt;br&gt;
[void][System.Reflection.Assembly]::LoadWithPartialName(&amp;quot;System.Windows.Forms&amp;quot;)&lt;br&gt;
[void][System.Reflection.Assembly]::LoadWithPartialName(&amp;quot;System.Drawing&amp;quot;)&lt;br&gt;
&lt;br&gt;
# Log File where the results are Saved&lt;br&gt;
$LogFile = &amp;quot;C:\Monitoring\Test-Monitor.csv&amp;quot;&lt;br&gt;
# Check to see if the Log File Directory exists&lt;br&gt;
If((Test-Path ($LogFile.Substring(0,$logFile.LastIndexof(&amp;quot;\&amp;quot;)))) -eq $False)&lt;br&gt;
{ &lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;# Create The Directory&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;New-Item ($LogFile.Substring(0,$logFile.LastIndexof(&amp;quot;\&amp;quot;))) -Type Directory&lt;br&gt;
}&lt;br&gt;
#endregion&lt;br&gt;
&lt;br&gt;
#region Form Creation&lt;br&gt;
&lt;br&gt;
#~~&amp;lt; Form1 &amp;gt;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&lt;br&gt;
$Form1 = New-Object System.Windows.Forms.Form&lt;br&gt;
$Form1.AutoSize = $TRUE&lt;br&gt;
$Form1.ClientSize = New-Object System.Drawing.Size(522, 404)&lt;br&gt;
$Form1.StartPosition = [System.Windows.Forms.FormStartPosition]::CenterScreen&lt;br&gt;
$Form1.Text = &amp;quot;Computer Inventory&amp;quot;&lt;br&gt;
#~~&amp;lt; Panel1 &amp;gt;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&lt;br&gt;
$Panel1 = new-object System.Windows.Forms.Panel&lt;br&gt;
$Panel1.Dock = [System.Windows.Forms.DockStyle]::Fill&lt;br&gt;
$Panel1.Location = new-object System.Drawing.Point(0, 24)&lt;br&gt;
$Panel1.Size = new-object System.Drawing.Size(522, 380)&lt;br&gt;
$Panel1.TabIndex = 20&lt;br&gt;
$Panel1.Text = &amp;quot;&amp;quot;&lt;br&gt;
#~~&amp;lt; btnRun &amp;gt;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&lt;br&gt;
$btnRun = New-Object System.Windows.Forms.Button&lt;br&gt;
$btnRun.Enabled = $FALSE&lt;br&gt;
$btnRun.Location = New-Object System.Drawing.Point(431, 30)&lt;br&gt;
$btnRun.Size = New-Object System.Drawing.Size(75, 23)&lt;br&gt;
$btnRun.TabIndex = 2&lt;br&gt;
$btnRun.Text = &amp;quot;Run&amp;quot;&lt;br&gt;
$btnRun.UseVisualStyleBackColor = $TRUE&lt;br&gt;
$btnRun.add_Click({ RunScript($btnRun) })&lt;br&gt;
#~~&amp;lt; Label1 &amp;gt;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&lt;br&gt;
$Label1 = New-Object System.Windows.Forms.Label&lt;br&gt;
$Label1.AutoSize = $TRUE&lt;br&gt;
$Label1.Location = New-Object System.Drawing.Point(12, 33)&lt;br&gt;
$Label1.Size = New-Object System.Drawing.Size(159, 13)&lt;br&gt;
$Label1.TabIndex = 15&lt;br&gt;
$Label1.Text = &amp;quot;File containing Computer Names&amp;quot;&lt;br&gt;
#~~&amp;lt; TextBox1 &amp;gt;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&lt;br&gt;
$TextBox1 = New-Object System.Windows.Forms.TextBox&lt;br&gt;
$TextBox1.Location = New-Object System.Drawing.Point(177, 30)&lt;br&gt;
$TextBox1.Size = New-Object System.Drawing.Size(161, 20)&lt;br&gt;
$TextBox1.TabIndex = 0&lt;br&gt;
$TextBox1.Text = &amp;quot;&amp;quot;&lt;br&gt;
#~~&amp;lt; btnBrowse &amp;gt;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&lt;br&gt;
$btnBrowse = New-Object System.Windows.Forms.Button&lt;br&gt;
$btnBrowse.Location = New-Object System.Drawing.Point(347, 30)&lt;br&gt;
$btnBrowse.Size = New-Object System.Drawing.Size(75, 23)&lt;br&gt;
$btnBrowse.TabIndex = 1&lt;br&gt;
$btnBrowse.Text = &amp;quot;Browse&amp;quot;&lt;br&gt;
$btnBrowse.UseVisualStyleBackColor = $TRUE&lt;br&gt;
$btnBrowse.add_Click({ BrowseFile($btnBrowse) })&lt;br&gt;
#~~&amp;lt; DataGridView1 &amp;gt;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&lt;br&gt;
$DataGridView1 = new-object System.Windows.Forms.DataGridView&lt;br&gt;
$DataGridView1.Anchor = ([System.Windows.Forms.AnchorStyles]([System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Bottom -bor [System.Windows.Forms.AnchorStyles]::Left -bor [System.Windows.Forms.AnchorStyles]::Right))&lt;br&gt;
$DataGridView1.ColumnHeadersHeightSizeMode = [System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode]::AutoSize&lt;br&gt;
$DataGridView1.Location = New-Object System.Drawing.Point(12, 59)&lt;br&gt;
$DataGridView1.Size = New-Object System.Drawing.Size(497, 280)&lt;br&gt;
$DataGridView1.TabIndex = 4&lt;br&gt;
$DataGridView1.ClipboardCopyMode = [System.Windows.Forms.DataGridViewClipboardCopyMode]::Disable&lt;br&gt;
$DataGridView1.Text = &amp;quot;&amp;quot;&lt;br&gt;
#~~&amp;lt; ProgressBar1 &amp;gt;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&lt;br&gt;
$ProgressBar1 = New-Object System.Windows.Forms.ProgressBar&lt;br&gt;
$ProgressBar1.Anchor = ([System.Windows.Forms.AnchorStyles] ([System.Windows.Forms.AnchorStyles]::Bottom -bor [System.Windows.Forms.AnchorStyles]::Left -bor [System.Windows.Forms.AnchorStyles]::Right ))&lt;br&gt;
$ProgressBar1.Location = New-Object System.Drawing.Point(12, 345)&lt;br&gt;
$ProgressBar1.Size = New-Object System.Drawing.Size(410, 23)&lt;br&gt;
$ProgressBar1.TabIndex = 5&lt;br&gt;
$ProgressBar1.Text = &amp;quot;&amp;quot;&lt;br&gt;
#~~&amp;lt; btnExit &amp;gt;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&lt;br&gt;
$btnExit = New-Object System.Windows.Forms.Button&lt;br&gt;
$btnExit.Anchor = ([System.Windows.Forms.AnchorStyles]([System.Windows.Forms.AnchorStyles]::Bottom -bor [System.Windows.Forms.AnchorStyles]::Right))&lt;br&gt;
$btnExit.DialogResult = [System.Windows.Forms.DialogResult]::Cancel&lt;br&gt;
$btnExit.Location = New-Object System.Drawing.Point(431, 345)&lt;br&gt;
$btnExit.Size = New-Object System.Drawing.Size(78, 23)&lt;br&gt;
$btnExit.TabIndex = 3&lt;br&gt;
$btnExit.Text = &amp;quot;Exit&amp;quot;&lt;br&gt;
$btnExit.UseVisualStyleBackColor = $TRUE&lt;br&gt;
$btnExit.add_Click({ CloseForm($btnExit) })&lt;br&gt;
#~~&amp;lt; MenuStrip1 &amp;gt;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&lt;br&gt;
$MenuStrip1 = new-object System.Windows.Forms.MenuStrip&lt;br&gt;
$MenuStrip1.Location = new-object System.Drawing.Point(0, 0)&lt;br&gt;
$MenuStrip1.Size = new-object System.Drawing.Size(292, 24)&lt;br&gt;
$MenuStrip1.TabIndex = 6&lt;br&gt;
$MenuStrip1.Text = &amp;quot;MenuStrip1&amp;quot;&lt;br&gt;
#~~&amp;lt; FileToolStripMenuItem &amp;gt;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&lt;br&gt;
$FileToolStripMenuItem = new-object System.Windows.Forms.ToolStripMenuItem&lt;br&gt;
$FileToolStripMenuItem.Size = new-object System.Drawing.Size(35, 20)&lt;br&gt;
$FileToolStripMenuItem.Text = &amp;quot;File&amp;quot;&lt;br&gt;
#~~&amp;lt; OpenLogFileToolStripMenuItem &amp;gt;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&lt;br&gt;
$OpenLogFileToolStripMenuItem = new-object System.Windows.Forms.ToolStripMenuItem&lt;br&gt;
$OpenLogFileToolStripMenuItem.Size = new-object System.Drawing.Size(152, 22)&lt;br&gt;
$OpenLogFileToolStripMenuItem.Text = &amp;quot;Open Log File&amp;quot;&lt;br&gt;
$OpenLogFileToolStripMenuItem.add_Click({Open-file($OpenLogFileToolStripMenuItem)})&lt;br&gt;
#~~&amp;lt; ExitToolStripMenuItem &amp;gt;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&lt;br&gt;
$ExitToolStripMenuItem = new-object System.Windows.Forms.ToolStripMenuItem&lt;br&gt;
$ExitToolStripMenuItem.Size = new-object System.Drawing.Size(152, 22)&lt;br&gt;
$ExitToolStripMenuItem.Text = &amp;quot;Exit&amp;quot;&lt;br&gt;
$ExitToolStripMenuItem.add_Click({CloseForm($ExitToolStripMenuItem)})&lt;br&gt;
$FileToolStripMenuItem.DropDownItems.AddRange([System.Windows.Forms.ToolStripItem[]](@($OpenLogFileToolStripMenuItem, $ExitToolStripMenuItem)))&lt;br&gt;
#~~&amp;lt; HelpToolStripMenuItem &amp;gt;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&lt;br&gt;
$HelpToolStripMenuItem = new-object System.Windows.Forms.ToolStripMenuItem&lt;br&gt;
$HelpToolStripMenuItem.Size = new-object System.Drawing.Size(40, 20)&lt;br&gt;
$HelpToolStripMenuItem.Text = &amp;quot;Help&amp;quot;&lt;br&gt;
#~~&amp;lt; AboutToolStripMenuItem &amp;gt;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&lt;br&gt;
$AboutToolStripMenuItem = new-object System.Windows.Forms.ToolStripMenuItem&lt;br&gt;
$AboutToolStripMenuItem.Size = new-object System.Drawing.Size(152, 22)&lt;br&gt;
$AboutToolStripMenuItem.Text = &amp;quot;About&amp;quot;&lt;br&gt;
$AboutToolStripMenuItem.add_Click({Show-About($AboutToolStripMenuItem)})&lt;br&gt;
#~~&amp;lt; HowToToolStripMenuItem &amp;gt;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&lt;br&gt;
$HowToToolStripMenuItem = new-object System.Windows.Forms.ToolStripMenuItem&lt;br&gt;
$HowToToolStripMenuItem.Size = new-object System.Drawing.Size(152, 22)&lt;br&gt;
$HowToToolStripMenuItem.Text = &amp;quot;How To?&amp;quot;&lt;br&gt;
$HowToToolStripMenuItem.add_Click({Show-HowTo($HowToToolStripMenuItem)})&lt;br&gt;
$HelpToolStripMenuItem.DropDownItems.AddRange([System.Windows.Forms.ToolStripItem[]](@($AboutToolStripMenuItem, $HowToToolStripMenuItem)))&lt;br&gt;
$MenuStrip1.Items.AddRange([System.Windows.Forms.ToolStripItem[]](@($FileToolStripMenuItem, $HelpToolStripMenuItem)))&lt;br&gt;
$Panel1.Controls.Add($MenuStrip1)&lt;br&gt;
$Panel1.Controls.Add($btnRun)&lt;br&gt;
$Panel1.Controls.Add($Label1)&lt;br&gt;
$Panel1.Controls.Add($TextBox1)&lt;br&gt;
$Panel1.Controls.Add($btnBrowse)&lt;br&gt;
$Panel1.Controls.Add($ProgressBar1)&lt;br&gt;
$Panel1.Controls.Add($btnExit)&lt;br&gt;
$Panel1.Controls.Add($DataGridView1)&lt;br&gt;
$Panel1.Controls.Add($Menu)&lt;br&gt;
$Form1.Controls.Add($Panel1)&lt;br&gt;
#~~&amp;lt; Ping1 &amp;gt;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&lt;br&gt;
$Ping1 = New-Object System.Net.NetworkInformation.Ping&lt;br&gt;
#~~&amp;lt; OpenFileDialog1 &amp;gt;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&lt;br&gt;
$OpenFileDialog1 = New-Object System.Windows.Forms.OpenFileDialog&lt;br&gt;
$OpenFileDialog1.Filter = &amp;quot;Text Files|*.txt|CSV Files|*.csv|All Files|*.*&amp;quot;&lt;br&gt;
$OpenFileDialog1.InitialDirectory = &amp;quot;C:&amp;quot;&lt;br&gt;
$OpenFileDialog1.Title = &amp;quot;Open Computers File&amp;quot;&lt;br&gt;
#~~&amp;lt; objNotifyIcon &amp;gt;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&lt;br&gt;
$objNotifyIcon = New-Object System.Windows.Forms.NotifyIcon &lt;br&gt;
# Assign an Icon and Icon Type For the NotifyIcon Object&lt;br&gt;
$objNotifyIcon.Icon = &amp;quot;D:\Assaf\Scripts\Icons\XP\people15.ico&amp;quot;&lt;br&gt;
$objNotifyIcon.BalloonTipIcon = &amp;quot;Info&amp;quot; &lt;br&gt;
&lt;br&gt;
#endregion&lt;br&gt;
&lt;br&gt;
#region Functions&lt;br&gt;
&lt;br&gt;
function out-DataTable&lt;br&gt;
# Function Creates a New Data Table that will be set as the Data Source of the Data Grid View&lt;br&gt;
# Thanks to /\/\o\/\/ http:\\thePowerShellGuy.com&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;$dt = New-Object Data.datatable&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;$First = $TRUE&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;foreach ($item in $Input)&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$DR = $DT.NewRow()&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$Item.PsObject.get_properties() | foreach {&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if ($first)&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$Col = New-Object Data.DataColumn&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$Col.ColumnName = $_.Name.ToString()&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$DT.Columns.Add($Col) }&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if ($_.value -eq $null)&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$DR.Item($_.Name) = &amp;quot;[empty]&amp;quot;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;elseif ($_.IsArray) {&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$DR.Item($_.Name) = [string]::Join($_.value, &amp;quot;;&amp;quot;)&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;else&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$DR.Item($_.Name) = $_.value&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$DT.Rows.Add($DR)&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$First = $FALSE&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;return @(, ( $dt ))&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
function Join-Data&lt;br&gt;
# Function Joins arrays and Strings to a Single Object with Members&lt;br&gt;
# I Used the same principle of the Out-DataTable and converted it to Join Objects into one&lt;br&gt;
# Using the Add-Member cmdlet. the Function writes to a predefiend object named $DataObject&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;param($objName=&amp;quot;&amp;quot;) # This parameter is used for objects that don't have member other than Length like Strings&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;foreach ($item in $Input)&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$Item.PsObject.get_properties() | foreach{&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if ($_.value -eq $null)&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$DataObject | Add-Member noteproperty $_.Name &amp;quot;[empty]&amp;quot;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;elseif ($_.IsArray) {&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$DataObject | Add-Member noteproperty $_.Name [string]::Join($_.value, &amp;quot;;&amp;quot;)&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;elseif ($objName -ne &amp;quot;&amp;quot;) {&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$DataObject | Add-Member noteproperty $objName $Item&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;else&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$DataObject | Add-Member noteproperty $_.Name $_.value -Force&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;return @(,$DataObject)&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
function Get-Reg {&lt;br&gt;
# Function Connects to a remote computer Registry using the Parameters it recievs&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;param(&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$Hive,&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$Key,&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$Value,&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$RemoteComputer=&amp;quot;.&amp;quot; # If not enterd Local Computer is Selected&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;)&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;# Connect to Remote Computer Registry&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;$reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey($Hive, $RemoteComputer)&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;# Open Remote Sub Key&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;$regKey= $reg.OpenSubKey($Key)&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;if($regKey.ValueCount -gt 0) # check if there are Values &lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;{$regKey.GetValue($Value)} # Return Value&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
function Get-WMIItem {&lt;br&gt;
# Function Retreives a specific Item from a remote computer's WMI&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;param(&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$Class,&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$RemoteComputer=&amp;quot;.&amp;quot;, # If not enterd Local Computer is Selected&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$Item,&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$Query=&amp;quot;&amp;quot;, # If not enterd an empty WMI SQL Query is Entered&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$Filter=&amp;quot;&amp;quot; # If not enterd an empty Filter is Entered&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;)&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;if ($Query -eq &amp;quot;&amp;quot;) # No Specific WMI SQL Query&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Execute WMI Query, Return only the Requsted Items&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;gwmi -Class $Class -ComputerName $RemoteComputer -Filter $Filter -Property $Item | Select $Item&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;else # User Entered a WMI SQL Query&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;{gwmi -ComputerName $RemoteComputer -Query $Query | select $Item}&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
function Show-NotifyIcon {&lt;br&gt;
# Function Controls the Notification Icon&lt;br&gt;
# Changes its Title and Text&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;param(&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$Title,&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$Text&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;)&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Change Notify Icon Title&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$objNotifyIcon.BalloonTipTitle = $Title&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Change Notify Icon Text&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$objNotifyIcon.BalloonTipText = $Text&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Show Notify Icon for 10 Secs&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$objNotifyIcon.Visible = $TRUE &lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$objNotifyIcon.ShowBalloonTip(10000)&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
#endregion&lt;br&gt;
&lt;br&gt;
#region Event Loop&lt;br&gt;
&lt;br&gt;
function Main&lt;br&gt;
# Main Function, Runs the Form&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;[System.Windows.Forms.Application]::EnableVisualStyles()&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;[System.Windows.Forms.Application]::Run($Form1)&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
#endregion&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
#region Event Handlers&lt;br&gt;
&lt;br&gt;
function BrowseFile($object)&lt;br&gt;
# Function for Running the OpenFileDialog&lt;br&gt;
# Used when Clicking on the Browse Button&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;$OpenFileDialog1.showdialog()&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;$TextBox1.Text = $OpenFileDialog1.FileName&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;$btnRun.Enabled = $TRUE&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
function Open-File( $object ){&lt;br&gt;
# Function Open the Log File&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;if(Test-Path $LogFile){&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Invoke-Item $LogFile&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
function Show-PopUp&lt;br&gt;
# Function for Showing Custom Pop up Forms&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;param(&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$PopupTitle,&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$PopupText&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;)&lt;br&gt;
#~~&amp;lt; PopupForm &amp;gt;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&lt;br&gt;
$PopupForm = New-Object System.Windows.Forms.Form&lt;br&gt;
$PopupForm.ClientSize = New-Object System.Drawing.Size(381, 356)&lt;br&gt;
$PopupForm.ControlBox = $false&lt;br&gt;
$PopupForm.ShowInTaskbar = $false&lt;br&gt;
$PopupForm.StartPosition = [System.Windows.Forms.FormStartPosition]::CenterParent&lt;br&gt;
$PopupForm.Text = $PopupTitle&lt;br&gt;
#~~&amp;lt; PopupColse &amp;gt;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&lt;br&gt;
$PopupColse = New-Object System.Windows.Forms.Button&lt;br&gt;
$PopupColse.Anchor = ([System.Windows.Forms.AnchorStyles]([System.Windows.Forms.AnchorStyles]::Bottom -bor [System.Windows.Forms.AnchorStyles]::Left -bor [System.Windows.Forms.AnchorStyles]::Right))&lt;br&gt;
$PopupColse.DialogResult = [System.Windows.Forms.DialogResult]::Cancel&lt;br&gt;
$PopupColse.Location = New-Object System.Drawing.Point(137, 321)&lt;br&gt;
$PopupColse.Size = New-Object System.Drawing.Size(104, 23)&lt;br&gt;
$PopupColse.TabIndex = 0&lt;br&gt;
$PopupColse.Text = &amp;quot;Close&amp;quot;&lt;br&gt;
$PopupColse.UseVisualStyleBackColor = $true&lt;br&gt;
$PopupForm.AcceptButton = $PopupColse&lt;br&gt;
$PopupForm.CancelButton = $PopupColse&lt;br&gt;
#~~&amp;lt; PopupHeader &amp;gt;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&lt;br&gt;
$PopupHeader = New-Object System.Windows.Forms.Label&lt;br&gt;
$PopupHeader.Font = New-Object System.Drawing.Font(&amp;quot;Calibri&amp;quot;, 15.75, ([System.Drawing.FontStyle]([System.Drawing.FontStyle]::Bold -bor [System.Drawing.FontStyle]::Italic)), [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0)))&lt;br&gt;
$PopupHeader.Location = New-Object System.Drawing.Point(137, 9)&lt;br&gt;
$PopupHeader.Size = New-Object System.Drawing.Size(104, 23)&lt;br&gt;
$PopupHeader.TabIndex = 2&lt;br&gt;
$PopupHeader.Text = $PopupTitle&lt;br&gt;
$PopupHeader.TextAlign = [System.Drawing.ContentAlignment]::MiddleCenter&lt;br&gt;
#~~&amp;lt; PopUpTextArea &amp;gt;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&lt;br&gt;
$PopUpTextArea = New-Object System.Windows.Forms.Label&lt;br&gt;
$PopUpTextArea.Anchor = ([System.Windows.Forms.AnchorStyles]([System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Bottom -bor [System.Windows.Forms.AnchorStyles]::Left -bor [System.Windows.Forms.AnchorStyles]::Right))&lt;br&gt;
$PopUpTextArea.Location = New-Object System.Drawing.Point(12, 15)&lt;br&gt;
$PopUpTextArea.Size = New-Object System.Drawing.Size(357, 265)&lt;br&gt;
$PopUpTextArea.TabIndex = 1&lt;br&gt;
$PopUpTextArea.Text = $PopupText&lt;br&gt;
$PopUpTextArea.TextAlign = [System.Drawing.ContentAlignment]::MiddleLeft&lt;br&gt;
$PopupForm.Controls.Add($PopupHeader)&lt;br&gt;
$PopupForm.Controls.Add($PopUpTextArea)&lt;br&gt;
$PopupForm.Controls.Add($PopupColse)&lt;br&gt;
&lt;br&gt;
# Show Form&lt;br&gt;
$PopupForm.Add_Shown({$PopupForm.Activate()}) &amp;nbsp;&lt;br&gt;
[void]$PopupForm.showdialog() &lt;br&gt;
&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
function Show-About( $object ){&lt;br&gt;
# Function Opens the About Page&lt;br&gt;
$AboutText = @(&amp;quot;&lt;br&gt;
Script Title:&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Remote Computer Inventory`n&lt;br&gt;
Script Author:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Assaf Miron`n&lt;br&gt;
Script Description:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Collects Remote Computer Data Using WMI and Registry Access Outputs all information to a Data Grid Form and to a CSV Log File.`n&lt;br&gt;
&lt;br&gt;
Log File Name:&amp;nbsp;&amp;nbsp; &amp;nbsp;$LogFile&amp;quot;)&lt;br&gt;
&lt;br&gt;
Show-Popup -PopupTitle &amp;quot;About&amp;quot; -PopupText $AboutText&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
function Show-HowTo( $object ){&lt;br&gt;
# Function Opens the Help Page&lt;br&gt;
$HowToText = @(&amp;quot;&lt;br&gt;
1. Click on the Browse Button and select a TXT or a CSV File Containing Computer Names`n&lt;br&gt;
2. After File is Selected click on the Run Button.`n&lt;br&gt;
3. You will see a Notify Icon with the Coresponding Text.`n&lt;br&gt;
4. The Script has begon collecting Remote Computer Inventory!`n&lt;br&gt;
`nWhen The script is Done you will see a Popup Message and all data will be presented in the DataGrid.`n&lt;br&gt;
** Because Poweshell works only in MTA mode there is no Option Copying the Data off the DataGrid...`n&lt;br&gt;
5. All Data will be Exported to a Log File Located Here: $LogFile&amp;quot;)&lt;br&gt;
&lt;br&gt;
Show-Popup -PopupTitle &amp;quot;How To?&amp;quot; -PopupText $HowToText&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
function CloseForm($object)&lt;br&gt;
# Function End the Program&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;$Form1.Close()&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
function RunScript($object)&lt;br&gt;
# Function Runs the Program and starts collecting data&lt;br&gt;
{&lt;br&gt;
# Create an Array of Computers Enterd in the Input File&lt;br&gt;
$arrComputers = Get-Content -path $textBox1.Text -encoding UTF8&lt;br&gt;
&lt;br&gt;
# Create an Empty Array to Contain all The Data of all Scaned Computers&lt;br&gt;
$AllComputerInfo = @()&lt;br&gt;
&lt;br&gt;
# Init the Progress bar to it's Maximum Value&lt;br&gt;
if(($arrComputers -is [array]) -eq $FALSE) { $ProgressBar1.Maximum = 1 }&lt;br&gt;
else { $ProgressBar1.Maximum = $arrComputers.Count }&lt;br&gt;
$ProgressBar1.Step = 1 # Define the Progress bar Step value&lt;br&gt;
&lt;br&gt;
# Scan all Computers in the Array $arrComputers&lt;br&gt;
foreach ($strComputer in $arrComputers)&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;{ &lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Uses the Ping Command to check if the Computer is Alive&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$Alive=&amp;quot;&amp;quot;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$Alive = $Ping1.Send($strComputer).Status &lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if($Alive -eq &amp;quot;Success&amp;quot;){&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Show-NotifyIcon -Title &amp;quot;Retriving Computer Information&amp;quot; -Text &amp;quot;Scanning $strComputer For Hardware Data&amp;quot; &lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Collect Computer Details from Win32_computersystem Using WMI&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$ComputerDet = Get-WMIItem -Class &amp;quot;Win32_computersystem&amp;quot; -RemoteComputer $strComputer -Item Caption,Domain,SystemType,Manufacturer,Model,NumberOfProcessors,TotalPhysicalMemory,UserName&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if($ComputerDet.Caption.Length -gt 1) # Check to See if Any data was Collected at all&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br&gt;
&lt;br&gt;
#region Total Memory Formating&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Check Total Physical Memory Size and Format it acourdingly&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if($ComputerDet.TotalPhysicalMemory -ge 1GB){&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$ComputerDet.TotalPhysicalMemory = ($ComputerDet.TotalPhysicalMemory/1GB).Tostring(&amp;quot;# GB&amp;quot;)} # Format to GB&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;else {$ComputerDet.TotalPhysicalMemory = ($ComputerDet.TotalPhysicalMemory/1MB).Tostring(&amp;quot;# MB&amp;quot;)} # Format to MB&lt;br&gt;
#endregion&lt;br&gt;
&lt;br&gt;
#region CPU Name&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Collect CPU Name Using WMI&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$CPUName = Get-WMIItem -Class &amp;quot;Win32_Processor&amp;quot; -RemoteComputer $strComputer -Item Name&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# CPU Names Can Contain Multiple Values, in Order to Insert Them into the DataGridView I Divde them to String with &amp;quot;;&amp;quot; Seperators&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$arrCPUNames = @() &lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;foreach($CPU in $CPUName){&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$arrCPUNames = $CPU.Name.Trim()+&amp;quot;;&amp;quot;+$arrCPUNames # the Sting of the CPU Name has White Space in The Begining - Trim It&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br&gt;
#endregion&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br&gt;
&lt;br&gt;
#region Operating System Data&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Collect Operating System and Service Pack Information Usin WMI&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$OS = Get-WMIItem -Class &amp;quot;win32_operatingsystem&amp;quot; -RemoteComputer $strComputer -Item Caption,csdversion&lt;br&gt;
#endregion&lt;br&gt;
&lt;br&gt;
#region Chassis Type&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Collect Machine Chassis Using WMI&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$ChassisType = Get-WMIItem -Class Win32_SystemEnclosure -RemoteComputer $strComputer -Item ChassisTypes &lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Select Machine Chassis&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;switch ($ChassisType.ChassisTypes) {&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;1 {$ChassisType = &amp;quot;Other&amp;quot;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;2 {$ChassisType = &amp;quot;Unknown&amp;quot;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;3 {$ChassisType = &amp;quot;Desktop&amp;quot;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;4 {$ChassisType = &amp;quot;Low Profile Desktop&amp;quot;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;5 {$ChassisType = &amp;quot;Pizza Box&amp;quot;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;6 {$ChassisType = &amp;quot;Mini Tower&amp;quot;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;7 {$ChassisType = &amp;quot;Tower&amp;quot;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;8 {$ChassisType = &amp;quot;Portable&amp;quot;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;9 {$ChassisType = &amp;quot;Laptop&amp;quot;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;10 {$ChassisType = &amp;quot;Notebook&amp;quot;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;11 {$ChassisType = &amp;quot;Handheld&amp;quot;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;12 {$ChassisType = &amp;quot;Docking Station&amp;quot;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;13 {$ChassisType = &amp;quot;All-in-One&amp;quot;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;14 {$ChassisType = &amp;quot;Sub-Notebook&amp;quot;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;15 {$ChassisType = &amp;quot;Space Saving&amp;quot;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;16 {$ChassisType = &amp;quot;Lunch Box&amp;quot;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;17 {$ChassisType = &amp;quot;Main System Chassis&amp;quot;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;18 {$ChassisType = &amp;quot;Expansion Chassis&amp;quot;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;19 {$ChassisType = &amp;quot;Sub-Chassis&amp;quot;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;20 {$ChassisType = &amp;quot;Bus Expansion Chassis&amp;quot;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;21 {$ChassisType = &amp;quot;Peripheral Chassis&amp;quot;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;22 {$ChassisType = &amp;quot;Storage Chassis&amp;quot;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;23 {$ChassisType = &amp;quot;Rack Mount Chassis&amp;quot;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;24 {$ChassisType = &amp;quot;Sealed- PC&amp;quot;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;default {$ChassisType = &amp;quot;Unknown&amp;quot;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br&gt;
#endregion&lt;br&gt;
&lt;br&gt;
#region Automatic Updates&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Collect the Automatic Updates Options Using Registry Access&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$AUOptions = Get-Reg -Hive LocalMachine -Key &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update&amp;quot; -Value &amp;quot;AUOptions&amp;quot;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Collect the Automatic Updates Install Day Using Registry Access&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$AUDay = Get-Reg -Hive LocalMachine -Key &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update&amp;quot; -Value &amp;quot;ScheduledInstallDay&amp;quot;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Collect the Automatic Updates Install Time Using Registry Access&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$AUTime = Get-Reg -Hive LocalMachine -Key &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update&amp;quot; -Value &amp;quot;ScheduledInstallTime&amp;quot;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if($AUOptions -eq $null){ # Automatic Updates is defined in Group Policy&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$AUOptions = Get-Reg -Hive LocalMachine -Key &amp;quot;SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU&amp;quot; -Value &amp;quot;AUOptions&amp;quot;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$AUDay = Get-Reg -Hive LocalMachine -Key &amp;quot;SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU&amp;quot; -Value &amp;quot;ScheduledInstallDay&amp;quot;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$AUTime = Get-Reg -Hive LocalMachine -Key &amp;quot;SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU&amp;quot; -Value &amp;quot;ScheduledInstallTime&amp;quot;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;switch ($AUOptions){ # Check Wich Automatic Update Option is Selected&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;1 {$AUClient = &amp;quot;Automatic Updates is Turnd off.&amp;quot;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;2 {$AUClient = &amp;quot;Notify for download and notify for install &amp;quot;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;3 {$AUClient = &amp;quot;Auto download and notify for install &amp;quot;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;4 {&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;switch ($AUDay) # Check on What day the Automatic Update Installs&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;0 {$InstDay = &amp;quot;Every Day&amp;quot;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;1 {$InstDay = &amp;quot;Sunday&amp;quot;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;2 {$InstDay = &amp;quot;Monday&amp;quot;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;3 {$InstDay = &amp;quot;Tuesday&amp;quot;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;4 {$InstDay = &amp;quot;Wensday&amp;quot;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;5 {$InstDay = &amp;quot;Thursday&amp;quot;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;6 {$InstDay = &amp;quot;Friday&amp;quot;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;7 {$InstDay = &amp;quot;Saturday&amp;quot;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Check on What time the Automatic Update Installs&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if ($AUTime -le 12) { $AUTime = $AUTime.ToString() + &amp;quot; AM&amp;quot; } else { $AUTime = ($AUTime -12) + &amp;quot; PM&amp;quot; }&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$AUClient = &amp;quot;Auto download and schedule the install - &amp;quot;+$InstDay+&amp;quot; &amp;quot;+$AUTime}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Defualt {&amp;quot;Automatic Updates is not Set.&amp;quot;} # No setting Collected&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br&gt;
#endregion&lt;br&gt;
&lt;br&gt;
#region Computer Total Health&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Collect Avialable Memory with WMI&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$AvialableMem = Get-WMIItem -Class &amp;quot;Win32_PerfFormattedData_PerfOS_Memory&amp;quot; -RemoteComputer $strComputer -Item &amp;quot;AvailableMBytes&amp;quot;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Collect Disk Queue,Queue Length, Processor time Data Using WMI&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$DiskQueue = Get-WMIItem -Class &amp;quot;Win32_PerfFormattedData_PerfDisk_LogicalDisk&amp;quot; -RemoteComputer $strComputer -Item CurrentDiskQueueLength&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$QueueLength = Get-WMIItem -Class &amp;quot;Win32_PerfFormattedData_PerfNet_ServerWorkQueues&amp;quot; -RemoteComputer $strComputer -Item QueueLength&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$Processor = Get-WMIItem -Class &amp;quot;Win32_PerfFormattedData_PerfOS_Processor&amp;quot; -RemoteComputer $strComputer -Item PercentProcessorTime&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$intHealth = 0 # integer for Collecting Computer Total Health&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Using the Avialable Memory to Check Computer Totla Health&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if($AvialableMem.AvailableMBytes -lt 4) { $intHealth += 1; $strHealth += &amp;quot;Low Free Memory;&amp;quot; }&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Using Current Disk Queue Length to Check Computer Total Health&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if($DiskQueue.CurrentDiskQueueLength -gt 2) { $intHealth += 1; $strHealth += &amp;quot;High Disk Queue;&amp;quot; }&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Using Queue Length to Check Computer Total Health&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if($QueueLength.QueueLength -gt 4) { $intHealth += 1; $strHealth += &amp;quot;Long Disk Queue;&amp;quot; }&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Using Processor Time(%) to Check Computer Total Health&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if($Processor.PercentProcessorTime -gt 90) { $intHealth += 1; $strHealth += &amp;quot;Processor Usage Over 90%;&amp;quot; }&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# If the integer is Bigger than 1 so the computer is Unhealthy, Describe Computer Problems&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Else The Computer is Healthy&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if($intHealth -gt 1) { $ComputerTotalHealth = &amp;quot;UnHealthy, &amp;quot; + $strHealth } else { $ComputerTotalHealth = &amp;quot;Healthy&amp;quot; }&lt;br&gt;
#endregion&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br&gt;
&lt;br&gt;
#region Avialable Memory Formating&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Format Avialable Memory MB&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$AvialableMem.AvailableMBytes = $AvialableMem.AvailableMBytes.ToString(&amp;quot;# MB&amp;quot;)&lt;br&gt;
#endregion&lt;br&gt;
&lt;br&gt;
#region Disk Drive Info&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Collect Disk Drive Information Using WMI&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$DriveInfo = Get-WMIItem -Class &amp;quot;Win32_LogicalDisk&amp;quot; -RemoteComputer $strComputer -Item Caption,Size,FreeSpace&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Format Every Drive Size and Free Space&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;foreach($DRSize in $DriveInfo)&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;{ # Check Object Size and Format Acourdingly&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if($DRSize.Size -ge 1GB){&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$DRSize.Size = ($DRSize.Size/1GB).ToString(&amp;quot;# GB&amp;quot;) } # Format to GB&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;else { $DRSize.Size = ($DRSize.Size/1MB).ToString(&amp;quot;# MB&amp;quot;) } # Format to MB&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if($DRSize.FreeSpace -ge 1GB){&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$DRSize.FreeSpace = ($DRSize.FreeSpace/1GB).ToString(&amp;quot;# GB&amp;quot;) } # Format to GB&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;else { $DRSize.FreeSpace = ($DRSize.FreeSpace/1MB).ToString(&amp;quot;# MB&amp;quot;) } # Format to MB&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Disk Drives Can Contain Multiple Values, in Order to Insert Them into the DataGridView I divide them to Strings with &amp;quot;;&amp;quot; Seperators&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$arrDiskDrives = @() &lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$arrDiskSize = @() &lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$arrDiskFreeSpace = @() &lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;foreach($Drive in $DriveInfo){&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$arrDiskDrives = $Drive.Caption+&amp;quot;;&amp;quot;+$arrDiskDrives&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$arrDiskSize = $Drive.Size+&amp;quot;;&amp;quot;+$arrDiskSize&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$arrDiskFreeSpace = $Drive.FreeSpace+&amp;quot;;&amp;quot;+$arrDiskFreeSpace&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br&gt;
#endregion&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br&gt;
&lt;br&gt;
#region IP Addresses&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Collect IPAddresses Using WMI, Filter only Enabled IPs&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$IPAddress = Get-WmiItem -Class &amp;quot;Win32_NetworkAdapterConfiguration&amp;quot; -Filter &amp;quot;IPEnabled = True&amp;quot; -RemoteComputer $strComputer -Item IPAddress&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# IPAddress Can Contain Multiple Values, in Order to Insert Them into the DataGridView I divide them to Strings with &amp;quot;;&amp;quot; Seperators&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$arrIPAddress = @() &lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;foreach($IP in $IPAddress){&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$arrIPAddress = $IP.IPAddress[0]+&amp;quot;;&amp;quot;+$arrIPAddress&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br&gt;
#endregion&lt;br&gt;
&lt;br&gt;
#region Time Zone&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Collect Time Zone Information Using WMI&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$TimeZone = Get-WMIItem -Class &amp;quot;Win32_TimeZone&amp;quot; -RemoteComputer $strComputer -Item Bias,StandardName&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$TimeZone.Bias = $TimeZone.Bias/60&lt;br&gt;
#endregion&lt;br&gt;
&lt;br&gt;
#region System Restore Status&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Collect System Restore Information Using Remote Registry&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$SysRestoreStatus = Get-Reg -Hive LocalMachine -RemoteComputer $strComputer -Key &amp;quot;SOFTWARE\Microsoft\Windows NT\CurrentVersion\SystemRestore&amp;quot; -Value &amp;quot;DisableSR&amp;quot;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if ($SysRestoreStatus -eq 0) { $SysRestoreStatus = &amp;quot;Enabled&amp;quot; } else { $SysRestoreStatus = &amp;quot;Disabled&amp;quot; }&lt;br&gt;
#endregion&lt;br&gt;
&lt;br&gt;
#region Offline Files Status&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Collect Offline Files Information Using Remote Registry&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$OfflineFolStatus = Get-Reg -Hive LocalMachine -RemoteComputer $strComputer -Key &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\NetCache&amp;quot; -Value &amp;quot;Enabled&amp;quot;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if ($OfflineFolStatus -eq 1) { $OfflineFolStatus = &amp;quot;Enabled&amp;quot; } else { $OfflineFolStatus = &amp;quot;Disabled&amp;quot; }&lt;br&gt;
#endregion&lt;br&gt;
&lt;br&gt;
#region Printers&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Collect Printers Information Using WMI&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$Printers = Get-WMIItem -Class &amp;quot;Win32_Printer&amp;quot; -RemoteComputer $strComputer -Item Name,PortName,Caption&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Printers Contain Multiple Values, in Order to Insert Them into the DataGridView I divide them to Strings with &amp;quot;;&amp;quot; Seperators&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$arrPrinters = @() &lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;foreach($Printer in $Printers){&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$arrPrinters = $Printer.Name+&amp;quot;(&amp;quot;+$Printer.PortName+&amp;quot;);&amp;quot;+$arrPrinters&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br&gt;
#endregion&lt;br&gt;
&lt;br&gt;
#region BIOS Serial Number&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Collect BIOS Serial Number Using WMI&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$BIOSSN = Get-WMIItem -Class &amp;quot;Win32_Bios&amp;quot; -RemoteComputer $strComputer -Item SerialNumber&lt;br&gt;
#endregion&lt;br&gt;
&lt;br&gt;
#region Network Drives&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Collect Network Drives Using WMI&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$NetDrives = Get-WMIItem -Query &amp;quot;Select * From Win32_LogicalDisk Where DriveType = 4&amp;quot; -RemoteComputer $strComputer -Item DeviceID,ProviderName&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Network Drives Contain Multiple Values, in Order to Insert Them into the DataGridView I divide them to Strings with &amp;quot;;&amp;quot; Seperators&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$arrNetDrives = @() &lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;foreach($NetDrive in $NetDrives){&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$arrNetDrives = $NetDrive.DeviceID+&amp;quot;(&amp;quot;+$NetDrive.ProviderName+&amp;quot;);&amp;quot;+$arrNetDrives&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br&gt;
#endregion&lt;br&gt;
&lt;br&gt;
#region Anti-Virus Client Data&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Collect Anti-Virus Info Using Remote Registry&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$AVParentServer = Get-Reg -Hive LocalMachine -RemoteComputer $strComputer -Key &amp;quot;SOFTWARE\Intel\LANDesk\VirusProtect6\CurrentVersion&amp;quot; -Value &amp;quot;Parent&amp;quot;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Read the Anti-Virus Virus Definition File and Format it to an actual Date&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$VirusDefFile = &amp;quot;C:\Program Files\Common Files\Symantec Shared\VirusDefs\definfo.dat&amp;quot;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;If(Test-Path $VirusDefFile){&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$AVDefs = Get-Content $VirusDefFile | where { $_ -match &amp;quot;CurDefs&amp;quot; }&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$AVDefs = $AVDefs.Substring(8)&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$AVDefs = [datetime]($AVDefs.Substring(5,1)&amp;nbsp; + &amp;quot;/&amp;quot; + $AVDefs.Substring(6,2) + &amp;quot;/&amp;quot; + $AVDefs.substring(0,4))&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Else { $AVDefs = &amp;quot;&amp;quot; }&lt;br&gt;
#endregion&lt;br&gt;
&lt;br&gt;
#region Operating Systems Hotfixes&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Collect all Hotfix Information Using WMI&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$HotFixes = Get-WMIItem -Class &amp;quot;Win32_QuickFixEngineering&amp;quot; -RemoteComputer $strComputer -Item Description,HotFixID,ServicePackInEffect&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# HotFixes Contain Multiple Values, in Order to Insert Them into the DataGridView I divide them to Strings with &amp;quot;;&amp;quot; Seperators&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$arrHotFixes = @()&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;foreach($Fix in $HotFixes){&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if($Fix.Description -eq &amp;quot;&amp;quot;){&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if($Fix.HotFixID -eq &amp;quot;File 1&amp;quot;){&amp;nbsp;&amp;nbsp; &amp;nbsp;$arrHotFixes = $Fix.ServicePackInEffect+&amp;quot;;&amp;quot;+$arrHotFixes }&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;else { $arrHotFixes =$Fix.HotFixID+&amp;quot;;&amp;quot;+$arrHotFixes }&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;else { $arrHotFixes = $Fix.Description+&amp;quot;;&amp;quot;+$arrHotFixes }&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br&gt;
#endRegion&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br&gt;
&lt;br&gt;
#region Remote Desktop Status&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Collect Remote Desktop Protocol Status Using Remote Registry&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$RDPStatus = Get-Reg -Hive LocalMachine -remoteComputer $strComputer -Key &amp;quot;SYSTEM\CurrentControlSet\Control\Terminal Server&amp;quot; -Value &amp;quot;fAllowToGetHelp&amp;quot;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if($RDPStatus -eq 0) {$RDPStatus = &amp;quot;Enabled&amp;quot; } else {$RDPStatus = &amp;quot;Disabled&amp;quot; }&lt;br&gt;
#endregion&lt;br&gt;
&lt;br&gt;
#region Remote Assistance Status&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Collect Remote Assistance Status Using Remote Registry&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$RAStatus = Get-Reg -Hive LocalMachine -remoteComputer $strComputer -Key &amp;quot;SYSTEM\CurrentControlSet\Control\Terminal Server&amp;quot; -Value &amp;quot;fDenyTSConnections&amp;quot;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if($RAStatus -eq 1) {$RAStatus = &amp;quot;Enabled&amp;quot; } else {$RAStatus = &amp;quot;Disabled&amp;quot; }&lt;br&gt;
#endregion&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Change the Notify Icon to Show Exporting Text&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Show-NotifyIcon -Text &amp;quot;Exporting $strComputer Information&amp;quot; -Title &amp;quot;Exporting...&amp;quot;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br&gt;
#region Check the Null Valued Paramters&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# If one of the Parameters are Null, Enter Space (looks better in the Table)&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if($ComputerDet -eq $Null){ $ComputerDet = &amp;quot; &amp;quot; }&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if($ChassisType -eq $Null){ $ChassisType = &amp;quot; &amp;quot; }&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if($BIOSSN -eq $Null){ $BIOSSN = &amp;quot; &amp;quot; }&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if($CPUName -eq $Null){ $CPUName = &amp;quot; &amp;quot; }&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if($AvialableMem -eq $Null){ $AvialableMem = &amp;quot; &amp;quot; }&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if($OS -eq $Null){ $OS = &amp;quot; &amp;quot; }&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if($SP -eq $Null){ $SP = &amp;quot; &amp;quot; }&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if($IPAddress -eq $Null){ $IPAddress = &amp;quot; &amp;quot; }&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if($HotFixes -eq $Null){ $HotFixes = &amp;quot; &amp;quot; }&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if($arrDiskDrives -eq $Null){ $arrDiskDrives=&amp;quot; &amp;quot; }&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if($arrDiskFreeSpace -eq $Null){ $arrDiskFreeSpace=&amp;quot; &amp;quot; }&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if($arrDiskSize -eq $Null){ $arrDiskSize=&amp;quot; &amp;quot; }&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if($RDPStatus -eq $Null){ $RDPStatus = &amp;quot; &amp;quot; }&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if($RAStatus -eq $Null){ $RAStatus = &amp;quot; &amp;quot; }&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if($AUClient -eq $Null){ $AUClient = &amp;quot; &amp;quot; }&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if($AVParentServer -eq $Null){ $AVParentServer = &amp;quot; &amp;quot; }&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if($AVDefs -eq $Null){ $AVDefs = &amp;quot; &amp;quot; }&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if($Printers -eq $Null){ $Printers = &amp;quot; &amp;quot; }&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if($ComputerTotalHealth -eq $Null){ $ComputerTotalHealth = &amp;quot; &amp;quot; }&lt;br&gt;
#endregion&lt;br&gt;
&lt;br&gt;
#region Creating the Data Object - $DataObject&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Create an Empty psObject, $DataObjcet - Used by this Name in the Join-Data Function&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$DataObject = New-Object psobject&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Join all the Data to the DataObject&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$ComputerDet | Join-Data # Contians Multiple Values, No need to Define a Name&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$ChassisType | Join-Data -objName &amp;quot;Chassis Type&amp;quot; # String with no Values - Define a Name&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$BIOSSN | Join-Data # Contians Multiple Values, No need to Define a Name&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$CPUName | Join-Data # Contians Multiple Values, No need to Define a Name&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$AvialableMem | Join-Data # Contians Multiple Values, No need to Define a Name&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$OS.Caption | Join-Data -objName &amp;quot;Operating System&amp;quot; # Contians Multiple Values, Caption Value canot be overwritten - Define a Name to a certian Value&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$OS.CsdVersion | Join-Data -objName &amp;quot;Service Pack&amp;quot; # String with no Values - Define a Name&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$arrIPAddress | Join-Data -objName &amp;quot;IP Addresses&amp;quot; # String with no Values - Define a Name&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$arrHotFixes | Join-Data -objName &amp;quot;HotFixes&amp;quot; # String with no Values - Define a Name&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$arrDiskDrives | Join-Data -objName &amp;quot;Disk Drives&amp;quot; # String with no Values - Define a Name&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$arrDiskSize | Join-Data -objName &amp;quot;Disk Size&amp;quot; # String with no Values - Define a Name&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$arrDiskFreeSpace | Join-Data -objName &amp;quot;Disk Free Space&amp;quot; # String with no Values - Define a Name&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$arrNetDrives | Join-Data -objName &amp;quot;Network Disks&amp;quot; # String with no Values - Define a Name&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$RDPStatus.ToString() | Join-Data -objName &amp;quot;Remote Desktop&amp;quot; # String with no Values - Define a Name&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$RAStatus.ToString()&amp;nbsp; | Join-Data -objName &amp;quot;Remote Assistance&amp;quot; # String with no Values - Define a Name&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$AUClient | Join-Data -objName &amp;quot;Automatic Updates&amp;quot; # String with no Values - Define a Name&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$AVParentServer&amp;nbsp; | Join-Data -objName &amp;quot;Anti-Virus Server&amp;quot; # String with no Values - Define a Name&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$AVDefs | Join-Data -objName &amp;quot;Anti-Virus Defs&amp;quot; # String with no Values - Define a Name&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$arrPrinters | Join-Data&amp;nbsp; -objName &amp;quot;Printers&amp;quot; # String with no Values - Define a Name&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$ComputerTotalHealth | Join-Data -objName &amp;quot;Computer Totla Health&amp;quot; # String with no Values - Define a Name&lt;br&gt;
#endregion&lt;br&gt;
&lt;br&gt;
#region Exporting data&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$AllComputerInfo += $DataObject&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Export the DataObject to the DataGridView Using the out-DataTable&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$DataTable = $AllComputerInfo | out-dataTable&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Define Data Grid's Data Source to the DataTable we Created&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$DataGridView1.DataSource = $DataTable.psObject.baseobject&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$DataGridView1.Refresh() # Refresh the Table View in order to View the new lines&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Export all the Data to the Log File&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$AllComputerInfo | Export-Csv -Encoding OEM -Path $LogFile&lt;br&gt;
#endregion&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;} &lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;else { # No Ping to Computer&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$objNotifyIcon.BalloonTipIcon = &amp;quot;Error&amp;quot; &lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Write-Warning &amp;quot;No Ping to $strComputer.`nNo Data was Collected&amp;quot;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Show-NotifyIcon -Title &amp;quot;$strComputer is not avialable&amp;quot; -Text &amp;quot;No Ping to $strComputer.`n`tNo Data was Collected&amp;quot;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$objNotifyIcon.BalloonTipIcon = &amp;quot;Info&amp;quot; &lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$ProgressBar1.PerformStep()&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
#region Finishing - Script is Done&lt;br&gt;
&lt;br&gt;
# Assign an Icon and Icon Type For the NotifyIcon Object&lt;br&gt;
$objNotifyIcon.Icon = &amp;quot;D:\Assaf\Scripts\Icons\XP\people5.ico&amp;quot;&lt;br&gt;
$objNotifyIcon.BalloonTipIcon = &amp;quot;Info&amp;quot; &lt;br&gt;
&lt;br&gt;
# Show Notify Icon with Finishing Text&lt;br&gt;
$objNotifyIcon.BalloonTipText = &amp;quot;Done!`nFile Saved in &amp;quot;+$LogFile&lt;br&gt;
$objNotifyIcon.Visible = $TRUE &lt;br&gt;
$objNotifyIcon.ShowBalloonTip(10000)&lt;br&gt;
&lt;br&gt;
# Pop Up a Message box&lt;br&gt;
$MSGObject = new-object -comobject wscript.shell&lt;br&gt;
$MSGResult = $MSGObject.popup(&amp;quot;Script Has Finished Running!&amp;quot;,0,&amp;quot;I'm Done&amp;quot;,0)&lt;br&gt;
&lt;br&gt;
# Set to False so that the Notify Icon will Disapear after the Script is Done&lt;br&gt;
$objNotifyIcon.Visible = $FALSE &lt;br&gt;
&lt;br&gt;
#endregion&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
Main # This call must remain below all other event functions&lt;br&gt;
&lt;br&gt;
#endregion&lt;br&gt;
&lt;/div&gt;</description><author>Meiron</author><pubDate>Sat, 28 Jun 2008 18:51:38 GMT</pubDate><guid isPermaLink="false">New Post: Remote Computers Inventory 20080628065138P</guid></item><item><title>NEW POST: Use PS and ImgBurn to burn a set of ISO's.</title><link>http://www.codeplex.com/PsObject/Thread/View.aspx?ThreadId=28510</link><description>&lt;div style="line-height: normal;"&gt;&lt;a href="http://tech-michael.blogspot.com/2008/05/useful-powershell-script.html"&gt;Read about it at my blog!&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
Or below:&lt;br&gt;
&lt;br&gt;
Have you ever had a list of .ISO's that you needed to burn but were
tired of setting each iso to burn individually. I often have this
problem when I need to burn for instance the 5 iso's that vista shipped
with. Below is a useful powershell script that will scan a directory or
directories, find the ISO file, and ship it to ImgBurn. I have it setup
so that it deletes the image. All you have to do is wait for the drive
to eject your dvd.&lt;br&gt;
&lt;br&gt;
&lt;code&gt;&lt;br&gt;
function burn()&lt;br&gt;
{&lt;br&gt;
#get the files and ship them to burn-file&lt;br&gt;
dir -recurse -include *.iso -path c:\,d:\,e:\ | foreach { burn-file $_.FullName }&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
function burn-file($filename)&lt;br&gt;
{&lt;br&gt;
#call img burn with the nessessary arguments&lt;br&gt;
. &amp;quot;c:\Program Files\ImgBurn\ImgBurn.exe&amp;quot; /mode ISOWRITE /WAITFORMEDIA /start /close /DELETEIMAGE /EJECT /SRC $filename&lt;br&gt;
#Wait for IMGBURN to finish (right now you can only have one open at a time)&lt;br&gt;
while ( (get-process | where{$_.ProcessName -eq &amp;quot;ImgBurn&amp;quot;}) -ne $null)&lt;br&gt;
{&lt;br&gt;
#sleep for a bit to let the processor work on burning&lt;br&gt;
Start-Sleep –s 10&lt;br&gt;
#tell the user what file you are still working on&lt;br&gt;
&amp;quot;waiting for $filename to complete&amp;quot;&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
#call the burn function&lt;br&gt;
burn&lt;/code&gt; 
&lt;/div&gt;</description><author>89iroc</author><pubDate>Tue, 27 May 2008 23:56:24 GMT</pubDate><guid isPermaLink="false">NEW POST: Use PS and ImgBurn to burn a set of ISO's. 20080527115624P</guid></item><item><title>NEW POST: Create .zip archive from command-line</title><link>http://www.codeplex.com/PsObject/Thread/View.aspx?ThreadId=27707</link><description>&lt;div style="line-height: normal;"&gt;&lt;p&gt;&lt;span id=UniqueID1210774600706&gt;The script below creates and populates a .zip from command line, using Windows Shell Automation. No extra packages are needed.&lt;br&gt;
Everytime script is started, a new .zip archive is created. Append files to archive is not implemented.&lt;br&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
&lt;table width="100%" border=0&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr bgcolor="#c0c0c0"&gt;
            &lt;code&gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&lt;br&gt;
            # Name: zip.ps1 &lt;br&gt;
            # Author: Eduardo_M &lt;br&gt;
            # Created: 05/12/2008 &lt;br&gt;
            &lt;br&gt;
            param([string]$zipfilename=$(throw &amp;quot;ZIP archive name needed!&amp;quot;), &lt;br&gt;
            [string]$filetozip=$(throw &amp;quot;Supply the file(s) to compress (wildcards accepted)&amp;quot;)) &lt;br&gt;
            trap [Exception] {break;} &lt;br&gt;
            &lt;br&gt;
            #empyt zip file contents &lt;br&gt;
            $emptyzipfile=80,75,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; &lt;br&gt;
            &lt;br&gt;
            #create a new file with $ZIPFILENAME and copy the above array into it &lt;br&gt;
            $fmode = [System.IO.FileMode]::Create; &lt;br&gt;
            $zipfile = new-object -type System.IO.FileStream $zipfilename, $fmode; &lt;br&gt;
            $zipfile.Write($emptyzipfile,0,22); &lt;br&gt;
            $zipfile.Flush(); &lt;br&gt;
            $zipfile.Close(); &lt;br&gt;
            &lt;br&gt;
            #open the new zip file as folder from Windows Shell Application &lt;br&gt;
            $shell=new-object -comobject Shell.Application; &lt;br&gt;
            $foldername=(ls $zipfile.Name).FullName; &lt;br&gt;
            $zipfolder=$shell.Namespace($foldername); &lt;br&gt;
            &lt;br&gt;
            #Iterate files to zip, copying them to zip folder. &lt;br&gt;
            #In the process, the shell compress them &lt;br&gt;
            Write-Host &amp;quot;Compressing:&amp;quot;; &lt;br&gt;
            ls $filetozip| &lt;br&gt;
               foreach{ &lt;br&gt;
                  (&amp;quot;`t&amp;quot;+$_.fullname); &lt;br&gt;
                  $zipfolder.copyhere($_.fullname,20); &lt;br&gt;
                  [System.Threading.Thread]::Sleep(250); &lt;br&gt;
               } &lt;br&gt;
            $shell=$null; &lt;br&gt;
            $zipfolder=$null; &amp;lt;/&amp;gt;&lt;/code&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
Example:&lt;br&gt;
zip.ps1 test.zip afile.txt&lt;br&gt;
&lt;/div&gt;</description><author>Eduardo_M</author><pubDate>Wed, 14 May 2008 14:41:48 GMT</pubDate><guid isPermaLink="false">NEW POST: Create .zip archive from command-line 20080514024148P</guid></item><item><title>NEW POST: GPO Scripting Setting in detail</title><link>http://www.codeplex.com/PsObject/Thread/View.aspx?ThreadId=24780</link><description>&lt;div class="wikidoc"&gt;
Looking for a script to dump all the setting from a GPO into a text file or can be able to be read. I do not want to export the GPO into either a XML or HTML file.  Would like to do reporting on all GPOs in my environment for example how many GPOs are using proxy setting and what is in it or how many gpos are using restricted groups and what type of groups. The only thing I can find out there is dumping the GPOs to a XML or HTML.&lt;br /&gt;
&lt;/div&gt;</description><author>junester</author><pubDate>Wed, 26 Mar 2008 20:06:51 GMT</pubDate><guid isPermaLink="false">NEW POST: GPO Scripting Setting in detail 20080326080651P</guid></item><item><title>NEW POST: How to access Pipe.Input from a script?</title><link>http://www.codeplex.com/PsObject/Thread/View.aspx?ThreadId=21813</link><description>&lt;div class="wikidoc"&gt;
I've integrated the PS into my project and trying to invoke a script, but, before hand, I'd like to populate a new pipeline with some data so the script can process it, but, after writing it to the pipeline, I can't access it from the script. How do I do this?&lt;br /&gt; &lt;br /&gt;Here is the host code snippet:&lt;br /&gt; &lt;br /&gt;foreach (PSObject obj in InputPipeline)&lt;br /&gt;{&lt;br /&gt;   pipeline.Input.Write(obj);&lt;br /&gt;}&lt;br /&gt;pipeline.Input.Close();&lt;br /&gt; &lt;br /&gt;OutputPipeline = pipeline.Invoke();&lt;br /&gt; &lt;br /&gt;foreach (PSObject result in OutputPipeline)&lt;br /&gt;{&lt;br /&gt;   // .... Do stuff here&lt;br /&gt;}&lt;br /&gt; &lt;br /&gt;And this is the list of different command permutations I've tried to run (let's say I want just to print the input items):&lt;br /&gt; &lt;br /&gt;$input | % &amp;quot;data: $_&amp;quot;&lt;br /&gt;% &amp;quot;data: $_&amp;quot;&lt;br /&gt;&amp;quot;data: $_&amp;quot;&lt;br /&gt; &lt;br /&gt;Nothing worked. Any ideas?&lt;br /&gt;
&lt;/div&gt;</description><author>IgorMoochnick</author><pubDate>Fri, 08 Feb 2008 20:35:28 GMT</pubDate><guid isPermaLink="false">NEW POST: How to access Pipe.Input from a script? 20080208083528P</guid></item><item><title>UPDATED WIKI: WMI</title><link>http://www.codeplex.com/PsObject/Wiki/View.aspx?title=WMI&amp;version=7</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
WMI
&lt;/h1&gt; &lt;br /&gt;Windows Management Instrumentation – WMI – is a powerful method of obtaining information about your systems. A WMI call can be executed on your local system or on a remote system (assuming that you have the correct level of permissions and that a firewall or some other device doesn't stop you). There are a mass of VBScripts available on the Microsoft TechNet Script Center most of which are concerned with retrieving information from one or more Windows systems. &lt;br /&gt; &lt;br /&gt;One thing to be aware of with WMI is that it is evolving. WMI functionality is available in Windows Vista for instance that is not available in earlier versions. Full information on WMI is available in the WMI SDK at &lt;a href="http://msdn2.microsoft.com/en-us/library/aa394582.aspx" class="externalLink"&gt;http://msdn2.microsoft.com/en-us/library/aa394582.aspx&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;. WMI is organised as classes within namespaces. The default namespace is root\cimv2. This will be used unless stated otherwise. &lt;br /&gt; &lt;br /&gt;PowerShell has excellent WMI support via the Get-WMIObject cmdlet. In order to see the scope of WMI try typing the following. &lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
Get-WMIObject –list 
&lt;/pre&gt; &lt;br /&gt;You will see a very long list of WMI classes scrolling by. To make the list more manageable try – &lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
Get-WMIObject –list | Where{$_.Name -like &amp;quot;*OperatingSystem*&amp;quot;} 
&lt;/pre&gt; &lt;br /&gt;Which will return a list of the classes containing &amp;quot;OperatingSystem&amp;quot; in their name. Win32_OperatingSystem looks like it could be interesting . &lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
Get-WMIObject –class Win32_OperatingSystem 
&lt;/pre&gt; &lt;br /&gt;On its own doesn't seem to return much. Time to fall back on the Swiss army knife of PowerShell – get-member &lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
Get-WMIObject -Class Win32_OperatingSystem | Get-Member
&lt;/pre&gt; &lt;br /&gt;Now that's much better – lots of interesting properties become available now. Get-WMIObject has a –property parameter that lets you select which properties to display. Alternatively a Select-Object could be used. Lets just see how much we can do within Get-WMIObject. &lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
Get-WMIObject -Class Win32_OperatingSystem -property TotalVirtualMemorySize, FreeVirtualmemory, LastBootUpTime 
&lt;/pre&gt; &lt;br /&gt;The TotalVirtualMemorySize and, FreeVirtualmemory properties are returned as kilobytes. The LastBootUpTime is in WMI date format. To convert it to a more readable format the .NET System.Management.ManagementDateTimeConverter can be used. &lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
PS&amp;gt; $t = Get-WMIObject -Class Win32_OperatingSystem | Select LastBootUpTime 
PS&amp;gt; $t 
 
LastBootUpTime 
 
-------------- 
 
20070406072653.500000+060 
&lt;/pre&gt; &lt;br /&gt;When converted to a more readable format we get this. &lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
PS&amp;gt; Get-WMIObject -Class Win32_OperatingSystem -property LastBootUpTime | foreach 
{[System.Management.ManagementDateTimeConverter]::ToDateTime($_.LastBootUpTime)} 
 
 
06 April 2007 07:26:53 
&lt;/pre&gt; &lt;br /&gt;The PowerShell Community extensions contain scripts that can be included in the pipeline for performing this calculation. It would be a simple matter to include the calculation in a cmdlet that was written to access this information. &lt;br /&gt; &lt;br /&gt;One very useful addition to the WMI capability are scriptmethods for converting between the WMI time format and the &amp;quot;normal&amp;quot; data time format.  These can be viewed as follows:&lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
 
PS&amp;gt; $w1 = Get-WmiObject -class Win32_OperatingSystem
PS&amp;gt; $w1 | Get-Member
 
   TypeName: System.Management.ManagementObject#root\cimv2\Win32_OperatingSystem
Name                                      MemberType   Definition
----                                      ----------   ----------
Reboot                                    Method       System.Management.ManagementBaseObject Reboot()
SetDateTime                               Method       System.Management.ManagementBaseObject SetDateTime(System.Str...
Shutdown                                  Method       System.Management.ManagementBaseObject Shutdown()
Win32Shutdown                             Method       System.Management.ManagementBaseObject Win32Shutdown(System.I...
Win32ShutdownTracker                      Method       System.Management.ManagementBaseObject Win32ShutdownTracker(S...
 
etc etc
 
ConvertFromDateTime                       ScriptMethod System.Object ConvertFromDateTime();
ConvertToDateTime                         ScriptMethod System.Object ConvertToDateTime();
Delete                                    ScriptMethod System.Object Delete();
GetType                                   ScriptMethod System.Object GetType();
Put                                       ScriptMethod System.Object Put();
&lt;/pre&gt; &lt;br /&gt;To get the LastBootUpTime  &lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
 
PS&amp;gt; $w1.ConvertToDateTime($w1.LastBootUpTime)
08 April 2007 10:05:35
&lt;/pre&gt; &lt;br /&gt;WMI contains a wealth of information about your systems. The information returned from WMI is the sort that lends itself to be displayed by PowerGadgets or PowerGUI. &lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
WMI Objects
&lt;/h2&gt;A number of changes were made to the handling of WMI in PowerShell RC2 among them the introduction of the WMI accelarators including &lt;a href="http://www.codeplex.com/PsObject/Wiki/View.aspx?title=WMIClass&amp;amp;referringTitle=WMI"&gt;WMIClass&lt;/a&gt; which allows us to create a WMI instance&lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
 
$w = [WMIClass]&amp;quot;Win32_OperatingSystem&amp;quot;
$w
$w | Get-Member
 
   TypeName: System.Management.ManagementClass#ROOT\cimv2\Win32_OperatingSystem
Name                   MemberType    Definition
----                   ----------    ----------
Name                   AliasProperty Name = __Class
__CLASS                Property      System.String __CLASS {get;set;}
__DERIVATION           Property      System.String[] __DERIVATION {get;set;}
__DYNASTY              Property      System.String __DYNASTY {get;set;}
__GENUS                Property      System.Int32 __GENUS {get;set;}
__NAMESPACE            Property      System.String __NAMESPACE {get;set;}
__PATH                 Property      System.String __PATH {get;set;}
__PROPERTY_COUNT       Property      System.Int32 __PROPERTY_COUNT {get;set;}
__RELPATH              Property      System.String __RELPATH {get;set;}
__SERVER               Property      System.String __SERVER {get;set;}
__SUPERCLASS           Property      System.String __SUPERCLASS {get;set;}
ConvertFromDateTime    ScriptMethod  System.Object ConvertFromDateTime();
ConvertToDateTime      ScriptMethod  System.Object ConvertToDateTime();
CreateInstance         ScriptMethod  System.Object CreateInstance();
Delete                 ScriptMethod  System.Object Delete();
GetRelatedClasses      ScriptMethod  System.Object GetRelatedClasses();
GetRelationshipClasses ScriptMethod  System.Object GetRelationshipClasses();
GetType                ScriptMethod  System.Object GetType();
Put                    ScriptMethod  System.Object Put();
 
&lt;/pre&gt; &lt;br /&gt;What we get returned is an new WMI object that represents the Operating System but does not populate the values with those of the operating system on the machine.&lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
 
$w.psbase.properties
&lt;/pre&gt; &lt;br /&gt;will return a list of the properties that matches with those shown by Get-Member on $w1 earlier.  All the examples I have found show &lt;a href="http://www.codeplex.com/PsObject/Wiki/View.aspx?title=WMIClass&amp;amp;referringTitle=WMI"&gt;WMIClass&lt;/a&gt; being used to instantiate a new object rather than access what is currently happening e.g.&lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
 
$c = [WMIClass]&amp;quot;Win32_Process&amp;quot;
$c.Create(&amp;quot;calc.exe&amp;quot;)
&lt;/pre&gt; &lt;br /&gt;will create a new process and start calc.exe in that process.&lt;br /&gt; &lt;br /&gt;PowerShell and WMI make a very powerful, and in some cases, frightening combination. One of the parameters on the Get-WMIObject cmdlet is –filter. This allows a WMI Query Language &lt;a href="http://www.codeplex.com/PsObject/Wiki/View.aspx?title=WQL&amp;amp;referringTitle=WMI"&gt;WQL&lt;/a&gt; syntax clause to be used to further tighten the search. For example &lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
$s = Get-WmiObject -class Win32_Service 
 
$s 
&lt;/pre&gt; &lt;br /&gt;Will return a list of services including the startmode and the current state i.e. if it is running or not. Note that Get-Service does not return the startmode. &lt;br /&gt; &lt;br /&gt;This can be narrowed down to a particular service like this &lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
PS&amp;gt; $s = Get-WmiObject -class Win32_Service -filter 'Name = &amp;quot;BITS&amp;quot;' 
 
PS&amp;gt; $s 
  
 
ExitCode : 0 
 
Name : BITS 
 
ProcessId : 1100 
 
StartMode : Auto 
 
State : Running 
 
Status : OK 
&lt;/pre&gt; &lt;br /&gt;Note that the startmode is set to auto &lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
$s | get-member 
&lt;/pre&gt; &lt;br /&gt;Returns a number of methods including &lt;br /&gt; &lt;br /&gt;PauseService &lt;br /&gt;ResumeService &lt;br /&gt;StartService &lt;br /&gt;StopService &lt;br /&gt;Together with a long list of properties e.g. &lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
PS&amp;gt; $s.Description 
 
 
Transfers files in the background using idle network bandwidth. If the service is disabled, then any applications that 
depend on BITS, such as Windows Update or MSN Explorer, will be unable to automatically download programs and other information. 
 
PS&amp;gt; 
&lt;/pre&gt; &lt;br /&gt;Looking at the list of cmdlets with service as the noun you will no doubt recognise that the methods I listed above are available as cmdlets. This is where WMI gets a bit frightening &lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
$s.stopservice() 
 
$s = Get-WmiObject -class Win32_Service -filter 'Name = &amp;quot;BITS&amp;quot;' 
 
$s 
 
ExitCode : 0 
 
Name : BITS 
 
ProcessId : 0 
 
StartMode : Auto 
 
State : Stopped 
 
Status : OK 
&lt;/pre&gt;  &lt;br /&gt; &lt;br /&gt;Note that we have to refresh the object to see that the service has stopped. If you are running on Vista you will need to start PowerShell as the administrator. &lt;b&gt;Using the WMI methods like this THERE IS NO WHATIF or CONFIRM options like you get with stop-service. This is where it is frightening – be very careful with WMI methods you do not have a safety net.&lt;/b&gt; &lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Querying WMI – &lt;a href="http://www.codeplex.com/PsObject/Wiki/View.aspx?title=WMISEARCHER&amp;amp;referringTitle=WMI"&gt;WMISEARCHER&lt;/a&gt;. 
&lt;/h2&gt; &lt;br /&gt;This uses WMI Query Language – WQL – which is a subset of SQL to query WMI providers. &lt;br /&gt; &lt;br /&gt;The following is a fairly standard activity using Get-Process &lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
PS&amp;gt; Get-Process | Where{$_.Handles -gt 1000} 
 
  
 
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName 
 
------- ------ ----- ----- ----- ------ -- ----------- 
 
1162 37 82432 96292 286 60.48 1056 iexplore 
 
1337 50 31184 32124 169 1000 svchost 
 
1039 29 57072 90364 295 21.63 856 WINWORD 
 
1222 29 47876 36356 206 114.13 3780 wlmail 
&lt;/pre&gt; &lt;br /&gt;It is possible to return similar information using WMI directly. &lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
$query = [WMISEARCHER] 'Select * from Win32_Process where Handlecount &amp;gt; 1000' 
 
$query.get() 
&lt;/pre&gt; &lt;br /&gt;This will return a lot of data. &lt;br /&gt; &lt;br /&gt;In order to cut down the data returned then we can use &lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
PS&amp;gt; $query.get() | Sort Handlecount | Format-Table Handlecount, WS, VM, Name -auto 
 
  
 
Handlecount WS VM Name 
 
----------- -- -- ---- 
 
1270 35749888 227962880 wlmail.exe 
 
1285 76976128 321593344 iexplore.exe 
 
1385 24543232 179179520 svchost.exe 
&lt;/pre&gt; &lt;br /&gt; &lt;br /&gt;By using get-process and WMISEARCHER we have two ways to find what we are looking for – this shows how flexible PowerShell can be.  Other alternatives include piping the data into powerGadgets for display or using PowerGUI to display in a grid. &lt;br /&gt; &lt;br /&gt;Further details on using WQL can be found here - &lt;a href="http://msdn2.microsoft.com/en-us/library/aa392902.aspx" class="externalLink"&gt;http://msdn2.microsoft.com/en-us/library/aa392902.aspx&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;
&lt;/div&gt;</description><author>rsiddaw</author><pubDate>Mon, 28 May 2007 13:46:54 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: WMI 20070528014654P</guid></item><item><title>UPDATED WIKI: WMI</title><link>http://www.codeplex.com/PsObject/Wiki/View.aspx?title=WMI&amp;version=6</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
WMI
&lt;/h1&gt; &lt;br /&gt;Windows Management Instrumentation – WMI – is a powerful method of obtaining information about your systems. A WMI call can be executed on your local system or on a remote system (assuming that you have the correct level of permissions and that a firewall or some other device doesn't stop you). There are a mass of VBScripts available on the Microsoft TechNet Script Center most of which are concerned with retrieving information from one or more Windows systems. &lt;br /&gt; &lt;br /&gt;One thing to be aware of with WMI is that it is evolving. WMI functionality is available in Windows Vista for instance that is not available in earlier versions. Full information on WMI is available in the WMI SDK at &lt;a href="http://msdn2.microsoft.com/en-us/library/aa394582.aspx" class="externalLink"&gt;http://msdn2.microsoft.com/en-us/library/aa394582.aspx&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;. WMI is organised as classes within namespaces. The default namespace is root\cimv2. This will be used unless stated otherwise. &lt;br /&gt; &lt;br /&gt;PowerShell has excellent WMI support via the Get-WMIObject cmdlet. In order to see the scope of WMI try typing the following. &lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
Get-WMIObject –list 
&lt;/pre&gt; &lt;br /&gt;You will see a very long list of WMI classes scrolling by. To make the list more manageable try – &lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
Get-WMIObject –list | Where{$_.Name -like &amp;quot;*OperatingSystem*&amp;quot;} 
&lt;/pre&gt; &lt;br /&gt;Which will return a list of the classes containing &amp;quot;OperatingSystem&amp;quot; in their name. Win32_OperatingSystem looks like it could be interesting . &lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
Get-WMIObject –class Win32_OperatingSystem 
&lt;/pre&gt; &lt;br /&gt;On its own doesn't seem to return much. Time to fall back on the Swiss army knife of PowerShell – get-member &lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
Get-WMIObject -Class Win32_OperatingSystem | Get-Member
&lt;/pre&gt; &lt;br /&gt;Now that's much better – lots of interesting properties become available now. Get-WMIObject has a –property parameter that lets you select which properties to display. Alternatively a Select-Object could be used. Lets just see how much we can do within Get-WMIObject. &lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
Get-WMIObject -Class Win32_OperatingSystem -property TotalVirtualMemorySize, FreeVirtualmemory, LastBootUpTime 
&lt;/pre&gt; &lt;br /&gt;The TotalVirtualMemorySize and, FreeVirtualmemory properties are returned as kilobytes. The LastBootUpTime is in WMI date format. To convert it to a more readable format the .NET System.Management.ManagementDateTimeConverter can be used. &lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
PS&amp;gt; $t = Get-WMIObject -Class Win32_OperatingSystem | Select LastBootUpTime 
PS&amp;gt; $t 
 
LastBootUpTime 
 
-------------- 
 
20070406072653.500000+060 
&lt;/pre&gt; &lt;br /&gt;When converted to a more readable format we get this. &lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
PS&amp;gt; Get-WMIObject -Class Win32_OperatingSystem -property LastBootUpTime | foreach 
{[System.Management.ManagementDateTimeConverter]::ToDateTime($_.LastBootUpTime)} 
 
 
06 April 2007 07:26:53 
&lt;/pre&gt; &lt;br /&gt;The PowerShell Community extensions contain scripts that can be included in the pipeline for performing this calculation. It would be a simple matter to include the calculation in a cmdlet that was written to access this information. &lt;br /&gt; &lt;br /&gt;One very useful addition to the WMI capability are scriptmethods for converting between the WMI time format and the &amp;quot;normal&amp;quot; data time format.  These can be viewed as follows:&lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
 
PS&amp;gt; $w1 = Get-WmiObject -class Win32_OperatingSystem
PS&amp;gt; $w1 | Get-Member
 
   TypeName: System.Management.ManagementObject#root\cimv2\Win32_OperatingSystem
Name                                      MemberType   Definition
----                                      ----------   ----------
Reboot                                    Method       System.Management.ManagementBaseObject Reboot()
SetDateTime                               Method       System.Management.ManagementBaseObject SetDateTime(System.Str...
Shutdown                                  Method       System.Management.ManagementBaseObject Shutdown()
Win32Shutdown                             Method       System.Management.ManagementBaseObject Win32Shutdown(System.I...
Win32ShutdownTracker                      Method       System.Management.ManagementBaseObject Win32ShutdownTracker(S...
 
etc etc
 
ConvertFromDateTime                       ScriptMethod System.Object ConvertFromDateTime();
ConvertToDateTime                         ScriptMethod System.Object ConvertToDateTime();
Delete                                    ScriptMethod System.Object Delete();
GetType                                   ScriptMethod System.Object GetType();
Put                                       ScriptMethod System.Object Put();
&lt;/pre&gt; &lt;br /&gt;To get the LastBootUpTime  &lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
 
PS&amp;gt; $w1.ConvertToDateTime($w1.LastBootUpTime)
08 April 2007 10:05:35
&lt;/pre&gt; &lt;br /&gt;WMI contains a wealth of information about your systems. The information returned from WMI is the sort that lends itself to be displayed by PowerGadgets or PowerGUI. &lt;br /&gt; &lt;br /&gt;A number of changes were made to the handling of WMI in PowerShell RC2 among them the introduction of the WMI accelarators including &lt;a href="http://www.codeplex.com/PsObject/Wiki/View.aspx?title=WMIClass&amp;amp;referringTitle=WMI"&gt;WMIClass&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
 
$w = [WMIClass]&amp;quot;Win32_OperatingSystem&amp;quot;
$w
$w | Get-Member
 
   TypeName: System.Management.ManagementClass#ROOT\cimv2\Win32_OperatingSystem
Name                   MemberType    Definition
----                   ----------    ----------
Name                   AliasProperty Name = __Class
__CLASS                Property      System.String __CLASS {get;set;}
__DERIVATION           Property      System.String[] __DERIVATION {get;set;}
__DYNASTY              Property      System.String __DYNASTY {get;set;}
__GENUS                Property      System.Int32 __GENUS {get;set;}
__NAMESPACE            Property      System.String __NAMESPACE {get;set;}
__PATH                 Property      System.String __PATH {get;set;}
__PROPERTY_COUNT       Property      System.Int32 __PROPERTY_COUNT {get;set;}
__RELPATH              Property      System.String __RELPATH {get;set;}
__SERVER               Property      System.String __SERVER {get;set;}
__SUPERCLASS           Property      System.String __SUPERCLASS {get;set;}
ConvertFromDateTime    ScriptMethod  System.Object ConvertFromDateTime();
ConvertToDateTime      ScriptMethod  System.Object ConvertToDateTime();
CreateInstance         ScriptMethod  System.Object CreateInstance();
Delete                 ScriptMethod  System.Object Delete();
GetRelatedClasses      ScriptMethod  System.Object GetRelatedClasses();
GetRelationshipClasses ScriptMethod  System.Object GetRelationshipClasses();
GetType                ScriptMethod  System.Object GetType();
Put                    ScriptMethod  System.Object Put();
 
&lt;/pre&gt; &lt;br /&gt;What we get returned is an new WMI object that represents the Operating System but does not populate the values with those of the operating system on the machine.&lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
 
$w.psbase.properties
&lt;/pre&gt; &lt;br /&gt;will return a list of the properties that matches with those shown by Get-Member on $w1 earlier.  All the examples I have found show &lt;a href="http://www.codeplex.com/PsObject/Wiki/View.aspx?title=WMIClass&amp;amp;referringTitle=WMI"&gt;WMIClass&lt;/a&gt; being used to instantiate a new object rather than access what is currently happening e.g.&lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
 
$c = [WMIClass]&amp;quot;Win32_Process&amp;quot;
$c.Create(&amp;quot;calc.exe&amp;quot;)
&lt;/pre&gt; &lt;br /&gt;will create a new process and start calc.exe in that process.&lt;br /&gt; &lt;br /&gt;PowerShell and WMI make a very powerful, and in some cases, frightening combination. One of the parameters on the Get-WMIObject cmdlet is –filter. This allows a WMI Query Language &lt;a href="http://www.codeplex.com/PsObject/Wiki/View.aspx?title=WQL&amp;amp;referringTitle=WMI"&gt;WQL&lt;/a&gt; syntax clause to be used to further tighten the search. For example &lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
$s = Get-WmiObject -class Win32_Service 
 
$s 
&lt;/pre&gt; &lt;br /&gt;Will return a list of services including the startmode and the current state i.e. if it is running or not. Note that Get-Service does not return the startmode. &lt;br /&gt; &lt;br /&gt;This can be narrowed down to a particular service like this &lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
PS&amp;gt; $s = Get-WmiObject -class Win32_Service -filter 'Name = &amp;quot;BITS&amp;quot;' 
 
PS&amp;gt; $s 
  
 
ExitCode : 0 
 
Name : BITS 
 
ProcessId : 1100 
 
StartMode : Auto 
 
State : Running 
 
Status : OK 
&lt;/pre&gt; &lt;br /&gt;Note that the startmode is set to auto &lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
$s | get-member 
&lt;/pre&gt; &lt;br /&gt;Returns a number of methods including &lt;br /&gt; &lt;br /&gt;PauseService &lt;br /&gt;ResumeService &lt;br /&gt;StartService &lt;br /&gt;StopService &lt;br /&gt;Together with a long list of properties e.g. &lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
PS&amp;gt; $s.Description 
 
 
Transfers files in the background using idle network bandwidth. If the service is disabled, then any applications that 
depend on BITS, such as Windows Update or MSN Explorer, will be unable to automatically download programs and other information. 
 
PS&amp;gt; 
&lt;/pre&gt; &lt;br /&gt;Looking at the list of cmdlets with service as the noun you will no doubt recognise that the methods I listed above are available as cmdlets. This is where WMI gets a bit frightening &lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
$s.stopservice() 
 
$s = Get-WmiObject -class Win32_Service -filter 'Name = &amp;quot;BITS&amp;quot;' 
 
$s 
 
ExitCode : 0 
 
Name : BITS 
 
ProcessId : 0 
 
StartMode : Auto 
 
State : Stopped 
 
Status : OK 
&lt;/pre&gt;  &lt;br /&gt; &lt;br /&gt;Note that we have to refresh the object to see that the service has stopped. If you are running on Vista you will need to start PowerShell as the administrator. &lt;b&gt;Using the WMI methods like this THERE IS NO WHATIF or CONFIRM options like you get with stop-service. This is where it is frightening – be very careful with WMI methods you do not have a safety net.&lt;/b&gt; &lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Querying WMI – &lt;a href="http://www.codeplex.com/PsObject/Wiki/View.aspx?title=WMISEARCHER&amp;amp;referringTitle=WMI"&gt;WMISEARCHER&lt;/a&gt;. 
&lt;/h2&gt; &lt;br /&gt;This uses WMI Query Language – WQL – which is a subset of SQL to query WMI providers. &lt;br /&gt; &lt;br /&gt;The following is a fairly standard activity using Get-Process &lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
PS&amp;gt; Get-Process | Where{$_.Handles -gt 1000} 
 
  
 
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName 
 
------- ------ ----- ----- ----- ------ -- ----------- 
 
1162 37 82432 96292 286 60.48 1056 iexplore 
 
1337 50 31184 32124 169 1000 svchost 
 
1039 29 57072 90364 295 21.63 856 WINWORD 
 
1222 29 47876 36356 206 114.13 3780 wlmail 
&lt;/pre&gt; &lt;br /&gt;It is possible to return similar information using WMI directly. &lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
$query = [WMISEARCHER] 'Select * from Win32_Process where Handlecount &amp;gt; 1000' 
 
$query.get() 
&lt;/pre&gt; &lt;br /&gt;This will return a lot of data. &lt;br /&gt; &lt;br /&gt;In order to cut down the data returned then we can use &lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
PS&amp;gt; $query.get() | Sort Handlecount | Format-Table Handlecount, WS, VM, Name -auto 
 
  
 
Handlecount WS VM Name 
 
----------- -- -- ---- 
 
1270 35749888 227962880 wlmail.exe 
 
1285 76976128 321593344 iexplore.exe 
 
1385 24543232 179179520 svchost.exe 
&lt;/pre&gt; &lt;br /&gt; &lt;br /&gt;By using get-process and WMISEARCHER we have two ways to find what we are looking for – this shows how flexible PowerShell can be.  Other alternatives include piping the data into powerGadgets for display or using PowerGUI to display in a grid. &lt;br /&gt; &lt;br /&gt;Further details on using WQL can be found here - &lt;a href="http://msdn2.microsoft.com/en-us/library/aa392902.aspx" class="externalLink"&gt;http://msdn2.microsoft.com/en-us/library/aa392902.aspx&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;
&lt;/div&gt;</description><author>rsiddaw</author><pubDate>Mon, 28 May 2007 13:45:18 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: WMI 20070528014518P</guid></item><item><title>UPDATED WIKI: WMI</title><link>http://www.codeplex.com/PsObject/Wiki/View.aspx?title=WMI&amp;version=5</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
WMI
&lt;/h1&gt; &lt;br /&gt;Windows Management Instrumentation – WMI – is a powerful method of obtaining information about your systems. A WMI call can be executed on your local system or on a remote system (assuming that you have the correct level of permissions and that a firewall or some other device doesn't stop you). There are a mass of VBScripts available on the Microsoft TechNet Script Center most of which are concerned with retrieving information from one or more Windows systems. &lt;br /&gt; &lt;br /&gt;One thing to be aware of with WMI is that it is evolving. WMI functionality is available in Windows Vista for instance that is not available in earlier versions. Full information on WMI is available in the WMI SDK at &lt;a href="http://msdn2.microsoft.com/en-us/library/aa394582.aspx" class="externalLink"&gt;http://msdn2.microsoft.com/en-us/library/aa394582.aspx&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;. 