2012-05-24 50 views
6

Esto es extraño. Estoy intentando cargar el ensamblaje System.DirectoryServices y luego crear una instancia de la clase System.DirectoryServices.DirectoryEntry.No se puede cargar un tipo .NET en PowerShell

Aquí es lo que estoy tratando de hacer:

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... 

Parece que se ha cargado la multa montaje, pero ahora cuando intento crear una instancia de un nuevo objeto que falla:

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 

Sin embargo , si trato de hacerlo de una manera un poco más obtusa, parece funcionar.

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

me demuestra que he creado con éxito el objeto:

distinguishedName : 
Path    : WinNT://localhost,computer 

¿Cuál es la forma correcta de hacer esto? ¿Qué estoy haciendo mal?

Respuesta

7

Su sintaxis de new-object está un poco desajustada. Prueba esto:

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

Sí, usar el "constructor" de estilo C# no es técnicamente válido en PowerShell. Use los parámetros -TypeName y -ArgumentList en el cmdlet New-Object de la forma en que se diseñaron. –

0

Creo que la sintaxis para New-Object es incorrecta. Tomado de [alguna documentación en New-Object]: 1

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

No hay necesidad de cargar nada. Use el acelerador tipo adsi:

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

¿Hay alguna buena documentación sobre esto? Las cosas no parecen muy "detectables" – Micah

+0

Realice una búsqueda de tipos de acceorios eléctricos –

+0

+1. Esta es la respuesta correcta. – vcsjones

Cuestiones relacionadas