Discussion:
Powershell & "WbemScripting.SWbemRefresher"
(too old to reply)
dallen16
2007-08-01 17:48:46 UTC
Permalink
I'm about day 5 into using Powershell... and I'm trying to figure out
how to use 'SWbemRefresher' to monitor local network traffic from within
a Powershell script.

The classic VBscript solution starts as follows...

******

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
set objRefresher = CreateObject("WbemScripting.SWbemRefresher")
Set colItems = objRefresher.AddEnum _
(objWMIService,
"Win32_PerfFormattedData_TCPIP_NetworkInterface").objectSet


******

Translated to Powershell should look something like the following... but
the first line is "invalid" because -class wants one of the 900+ WMI
class names.

******

$objWMIService = get-wmiobject -class "winmgmts" -namespace "root\cimv2"
-computername '.'
$objRefresher = new-object -com "WbemScripting.SWbemRefresher"
$colItems = $objRefresher.AddEnum($objWMIService,
"Win32_PerfFormattedData_TCPIP_NetworkInterface").objectSet

******

I can't figure out which wmiobject class to specify... and how to
specify impersonation level...

I've tried a few of the more obvious looking class names
("Win32_Service", "CIM_Service", "Win32_Perf", ...) but these either
hang on the get-wmiobject call or generate an exception with the AddEnum
call like the following.

Exception calling "AddEnum" with "2" argument(s): "Type mismatch.
(Exception from HRESULT: 0x80020005 (DISP_E_TYPEMISMATCH))"


Or is there another way altogether to accomplish the same thing?

Any help greatly appreciated!!!

Regards,

... Dewey
Marco Shaw
2007-08-02 16:35:03 UTC
Permalink
Post by dallen16
I'm about day 5 into using Powershell... and I'm trying to figure out
how to use 'SWbemRefresher' to monitor local network traffic from within
a Powershell script.
The classic VBscript solution starts as follows...
******
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
set objRefresher = CreateObject("WbemScripting.SWbemRefresher")
Set colItems = objRefresher.AddEnum _
(objWMIService,
"Win32_PerfFormattedData_TCPIP_NetworkInterface").objectSet
******
Translated to Powershell should look something like the following... but
the first line is "invalid" because -class wants one of the 900+ WMI
class names.
******
$objWMIService = get-wmiobject -class "winmgmts" -namespace "root\cimv2"
-computername '.'
$objRefresher = new-object -com "WbemScripting.SWbemRefresher"
$colItems = $objRefresher.AddEnum($objWMIService,
"Win32_PerfFormattedData_TCPIP_NetworkInterface").objectSet
******
I can't figure out which wmiobject class to specify... and how to
specify impersonation level...
I've tried a few of the more obvious looking class names
("Win32_Service", "CIM_Service", "Win32_Perf", ...) but these either
hang on the get-wmiobject call or generate an exception with the AddEnum
call like the following.
Exception calling "AddEnum" with "2" argument(s): "Type mismatch.
(Exception from HRESULT: 0x80020005 (DISP_E_TYPEMISMATCH))"
Or is there another way altogether to accomplish the same thing?
Any help greatly appreciated!!!
Regards,
... Dewey
I'm a bit ignorant here...

Why can't you simply use something like:

PS> $class="win32_perfrawdata_tcpip_networkinterface"
PS> $namespace="root\cimv2"
PS> get-wmiobject -class $class -namespace $namespace
urkec
2007-08-05 17:52:01 UTC
Permalink
Post by Marco Shaw
Post by dallen16
I'm about day 5 into using Powershell... and I'm trying to figure out
how to use 'SWbemRefresher' to monitor local network traffic from within
a Powershell script.
Same situation here...
Post by Marco Shaw
Post by dallen16
Regards,
... Dewey
I'm a bit ignorant here...
PS> $class="win32_perfrawdata_tcpip_networkinterface"
PS> $namespace="root\cimv2"
PS> get-wmiobject -class $class -namespace $namespace
Problem is, when you do that, WMI object information don't get refreshed.
For example,if I use this:

$proc = get-wmiobject -class "Win32_Process"

I can get number of runninng processes with this:

$proc.Count

But if I create or kill some processes and do this again:

$proc.Count

the number of processes is the same as the first time, and

$proc.IsSynchronized

is false. In VBScript I could add WMI objects to a SWbemRefresher object
and use SWbemRefresher.Refresh to refresh data for all objects added to it.
Using PowerShell, I managed to do something like this:

$objWMILocator = new-object -com "WbemScripting.SWbemLocator"
$objWMIService = $objWMILocator.ConnectServer(".","root\cimv2")
$objRefresher = new-object -com "WbemScripting.SWbemRefresher"
$objRefresher.AddEnum($objWMIService,"Win32_Process").objectSet

but that is just rewriting VBScript code in PowerShell. I have been looking
into .Net System.Management namespace but I haven't been able to find
anything that looks like SWbemRefresher. I know I could use get-wmiobject
multiple times to update object data, but SWbemRefresher was added to WMI
scripting library just to avoid that kind of thing. I am new to PowerShell
and .Net and I can't figure how to do this one.
Hopefully someone can help.
--
urkec
Loading...