(newbie warning) vb.net, stdregprov, deletekey - Invalid cast

S

Schroeder, AJ

Hello,

I am trying to delete keys via WMI using VB.NET. I have used the "EnumKeys"
method before, but the "DeleteKey" method is obviously different. The error
that I get is "The specified cast is invalid" on the GetMethodParameters
line, and I have googled and there isn't much out there specifically for
what I am doing.

I am hoping to the members in these newsgroups will be able to provide me
with some advice, it would be much appreciated!

Along with my thanks, the code is below:

Enum MainRegHives

HKEY_CLASSES_ROOT = &H80000000

HKEY_CURRENT_USER = &H80000001

HKEY_LOCAL_MACHINE = &H80000002

HKEY_USERS = &H80000003

HKEY_CURRENT_CONFIG = &H80000005

End Enum


Dim strHKLM As MainRegHives
Dim objEnumDeleteKeys As System.Management.ManagementBaseObject

Dim objDeleteKeys As System.Management.ManagementObject

Dim WMIManagementClass As System.Management.ManagementClass

Dim WMIManagementScope As System.Management.ManagementScope

Try

strHKLM = MainRegHives.HKEY_LOCAL_MACHINE

WMIManagementScope = New System.Management.ManagementScope

With WMIManagementScope

..Path.Server = strServer

..Path.NamespacePath = "root\default"

..Options.EnablePrivileges = True

'.Options.Username = "AdminUser

'.Options.Password = "adminpass"

'.Options.Impersonation = ImpersonationLevel.Impersonate

' For XP compatibility

'.Options.Authentication = System.Management.AuthenticationLevel.Packet

' For 2000/NT compatibility

'.Options.Authentication = System.Management.AuthenticationLevel.Connect

End With

WMIManagementScope.Connect()

Catch ex As Exception

End Try

Try

WMIManagementClass = New System.Management.ManagementClass("StdRegProv")

With WMIManagementClass

..Scope = WMIManagementScope

End With

Catch ex As ManagementException

Console.WriteLine(("Failed to query WMI on " & strServer & ": " & ex.Message
& " Error code: " & ex.ErrorCode))

End Try

Try

objDeleteKeys = WMIManagementClass.GetMethodParameters("DeleteKey")

With objDeleteKeys

..SetPropertyValue("hDefKey", CType("&H" & Hex(strHKLM), Long))

..SetPropertyValue("sSubKeyName", strRegPath)

End With

objDeleteKeys.Delete()

Catch ex As ManagementException

Debug.WriteLine(ex.ErrorInformation)

End Try
 
K

Ken Tucker [MVP]

Hi,

GetMethodParameters returns a ManagementBaseObject not a
ManagementObject. You can not convert a manamentbaseobject to an
managementobject.

Why not use the win32.registry classes. You can use the
registrykeys openremotebasekey to access the registry on another machine.

http://msdn.microsoft.com/library/d...n32registrykeyclassopenremotebasekeytopic.asp

Ken
------------------
Hello,

I am trying to delete keys via WMI using VB.NET. I have used the "EnumKeys"
method before, but the "DeleteKey" method is obviously different. The error
that I get is "The specified cast is invalid" on the GetMethodParameters
line, and I have googled and there isn't much out there specifically for
what I am doing.

I am hoping to the members in these newsgroups will be able to provide me
with some advice, it would be much appreciated!

Along with my thanks, the code is below:

Enum MainRegHives

HKEY_CLASSES_ROOT = &H80000000

HKEY_CURRENT_USER = &H80000001

HKEY_LOCAL_MACHINE = &H80000002

HKEY_USERS = &H80000003

HKEY_CURRENT_CONFIG = &H80000005

End Enum


Dim strHKLM As MainRegHives
Dim objEnumDeleteKeys As System.Management.ManagementBaseObject

Dim objDeleteKeys As System.Management.ManagementObject

Dim WMIManagementClass As System.Management.ManagementClass

Dim WMIManagementScope As System.Management.ManagementScope

Try

strHKLM = MainRegHives.HKEY_LOCAL_MACHINE

WMIManagementScope = New System.Management.ManagementScope

With WMIManagementScope

..Path.Server = strServer

..Path.NamespacePath = "root\default"

..Options.EnablePrivileges = True

'.Options.Username = "AdminUser

'.Options.Password = "adminpass"

'.Options.Impersonation = ImpersonationLevel.Impersonate

' For XP compatibility

'.Options.Authentication = System.Management.AuthenticationLevel.Packet

' For 2000/NT compatibility

'.Options.Authentication = System.Management.AuthenticationLevel.Connect

End With

WMIManagementScope.Connect()

Catch ex As Exception

End Try

Try

WMIManagementClass = New System.Management.ManagementClass("StdRegProv")

With WMIManagementClass

..Scope = WMIManagementScope

End With

Catch ex As ManagementException

Console.WriteLine(("Failed to query WMI on " & strServer & ": " & ex.Message
& " Error code: " & ex.ErrorCode))

End Try

Try

objDeleteKeys = WMIManagementClass.GetMethodParameters("DeleteKey")

With objDeleteKeys

..SetPropertyValue("hDefKey", CType("&H" & Hex(strHKLM), Long))

..SetPropertyValue("sSubKeyName", strRegPath)

End With

objDeleteKeys.Delete()

Catch ex As ManagementException

Debug.WriteLine(ex.ErrorInformation)

End Try
 
G

Gerry Hickman

Hi,

I don't understand why anyone would use VB.NET for this type of
programming? I've never seen such convoluted code for such a simple
task. VB is the worst language available in .NET and is not standards based.

Forgetting the cast, can you clarify strRegPath in the code below. I
can't see where it's defined.
 
A

AJ Schroeder

Well, everyone around here uses VB, so it was a natural choice because
of the learning curve. I agree, this code is quite convoluted (it is
even more apparent now that I am looking at C# examples), maybe I'll
cut my losses and switchover to C#. It does look WAY easier!

Anyway, strRegPath is just a parameter that I am passing from Main. Tis
just a path to the registry keys...

BTW - I have figured it out and I changed my ManagementObject to a
ManagementBaseObject and now the keys are being removed...
 
G

Gerry Hickman

Hi AJ,
Well, everyone around here uses VB,
Why?

so it was a natural choice because
of the learning curve. I agree, this code is quite convoluted (it is
even more apparent now that I am looking at C# examples), maybe I'll
cut my losses and switchover to C#. It does look WAY easier!

You are right, C# is easier, and 100 times more elegant and
professional. It's also standards based, so you have options to use it
on Linux too.
Anyway, strRegPath is just a parameter that I am passing from Main. Tis
just a path to the registry keys...

OK, I only asked so I could test a much cleaner and meaner JScript
version which cuts out all the .NET bloat. You only need a few Kb of
DLLs to do this kind of thing, not 65Mb of badly designed bloatware.
BTW - I have figured it out and I changed my ManagementObject to a
ManagementBaseObject and now the keys are being removed...

Great! Glad it's working now.
 
A

AJ Schroeder

Hello Gerry,

Not sure really, it seems to be the platform of choice for my company.
Probably because we are primarily a MS shop and the older developers
are used
to VB from version 2 on up...
You are right, C# is easier, and 100 times more elegant and
professional. It's also standards based, so you have options to use it
on Linux too.

I have dabbled a little bit with C on unix a bit, and I like it and
understand it better
than the vb.net stuff... that does it, time to switch! On top of the
convoluted code
I have run into stumbling block after stumbling block trying to get
this application I
am writing to work in VB. I appears I can do the same thing in C# in
half the code.

Thank you for your input,

AJ Schroeder
 
A

AJ Schroeder

Doh! I didn't even read that part in MSDN... <sigh>

I have coded quite a bit of this in WMI already, but there are just
some things that are
horribly complex in WMI, so I might just go ahead and try out
impersonation in VB and
then do the win32 registry classes.

WMI is cool, but just way too complex for what I am trying to do.

Thanks Ken,

Cheers,

AJ
 
C

Cor Ligthert [MVP]

AJ,
I am writing to work in VB. I appears I can do the same thing in C# in
half the code.
This is mostly because somebody uses his basic programming language and
change only the keywords. Example

DataSet ds = new Dataset();
dim ds as New Dataset

which can as well written as
dim ds as Dataset = New DataSet

int i = Convert.ToInt32("1");
dim i as integer = CInt("1")
which can as well be written as
dim i as integer = Convert.ToInt32("1")

I hope this gives an idea what I want to tell

Cor
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top