Micah
Micah

Reputation: 116180

Can't load a .NET type in PowerShell

This is a strange one. I'm trying to load the System.DirectoryServices assembly and then create an instance of the System.DirectoryServices.DirectoryEntry class.

Here's what I'm trying to do:

PS C:> [System.Reflection.Assembly]::LoadWithPartialName("System.DirectoryServices")

GAC    Version        Location
---    -------        --------
True   v2.0.50727     C:\Windows\assembly\GAC_MSIL\System.DirectoryServices\2.0.0.0__b03f5f7f11d50a3a\System.Directo...

It seems to have loaded the assembly fine, but now when I try to instantiate a new object it fails:

PS C:\> $computer = new-object [System.DirectoryServices.DirectoryEntry]("WinNT://localhost,computer")
New-Object : Cannot find type [[System.DirectoryServices.DirectoryEntry]]: make sure the assembly containing this type
is loaded.
At line:1 char:23
+ $computer = new-object <<<<  [System.DirectoryServices.DirectoryEntry]("WinNT://localhost,computer")
    + CategoryInfo          : InvalidType: (:) [New-Object], PSArgumentException
    + FullyQualifiedErrorId : TypeNotFound,Microsoft.PowerShell.Commands.NewObjectCommand

However, if I try to do it in a slightly more obtuse way, it seems to work.

$directoryServices = [System.Reflection.Assembly]::LoadWithPartialName("System.DirectoryServices")
$directoryEntryType = $directoryServices.GetType("System.DirectoryServices.DirectoryEntry")
$machine = New-Object $directoryEntryType("WinNT://localhost,computer")
$machine

It shows me I've created the object successfully:

distinguishedName :
Path              : WinNT://localhost,computer

What's the proper way to do this? What am I doing wrong?

Upvotes: 6

Views: 7499

Answers (3)

Shay Levy
Shay Levy

Reputation: 126912

There's no need to load anything. Use the adsi type accelerator:

[adsi]"WinNT://localhost,computer"

Upvotes: 4

Steve
Steve

Reputation: 2343

I think the syntax for New-Object is incorrect. Taken from [some documentation on New-Object]:1

New-Object System.DirectoryServices.DirectoryEntry("WinNT://localhost,computer")

Upvotes: 0

vcsjones
vcsjones

Reputation: 141688

Your new-object syntax is a little off. Try this:

[System.Reflection.Assembly]::LoadWithPartialName("System.DirectoryServices")
$machine = new-object -typeName System.DirectoryServices.DirectoryEntry -argumentList "WinNT://localhost,computer"

Upvotes: 7

Related Questions