2015-04-27 2 views
3

Использование пространства имен System.DirectoryServices.AccountManagement, PrincipalContext класс в PowerShell. Я не могу назвать PrincipalContext Constructor (ContextType, String) через.NET синтаксис для вызова конструктора в PowerShell

[System.DirectoryServices.AccountManagement.PrincipalContext]::PrincipalContext($ContextType, $ContextName) 

Я получаю ошибку "Method invocation failed because [System.DirectoryServices.AccountManagement.PrincipalContext] does not contain a method named 'PrincipalContext'. "

Может это только можно назвать следующим образом?

New-Object -TypeName System.DirectoryServices.AccountManagement.PrincipalContext -ArgumentList $ContextType, $ContextName 

Хотел бы понять, почему это работает второй путь, но не первый способ. Есть ли способ сделать это с помощью квадратных скобок?

Полный код:

Add-Type -AssemblyName System.DirectoryServices.AccountManagement 
$ContextName = $env:COMPUTERNAME 
$ContextType = [System.DirectoryServices.AccountManagement.ContextType]::Machine 
$PrincipalContext = [System.DirectoryServices.AccountManagement.PrincipalContext]::PrincipalContext($ContextType, $ContextName) 
$IdentityType = [System.DirectoryServices.AccountManagement.IdentityType]::SamAccountName 
[System.DirectoryServices.AccountManagement.GroupPrincipal]::FindByIdentity($PrincipalContext, $IdentityType, 'Administrators') 

ответ

4

Использование двоеточия после класса .net используется для вызова статического метода в этом классе.

См: Using Static Classes and Methods

Используя приведенный ниже синтаксис:

[System.DirectoryServices.AccountManagement.PrincipalContext]::PrincipalContext($ContextType, $ContextName) 

Вы пытаетесь вызвать статический метод с именем PrincipalContext на классе PrincipalContext вместо конструктора.

Можно ли это назвать только следующим образом?

AFAIK, вам нужно создать экземпляр класса (вызвать конструктор) с помощью командлета New-Object.

Хотелось бы понять, почему это работает вторым способом, но не первым способом. Есть ли способ сделать это с помощью квадратных скобок?

Это второй способ, потому что вы правильно создаете новый объект и вызываете конструктор. Это не работает первым способом, потому что вы не вызываете конструктор - вы пытаетесь вызвать статический метод.

+0

Пожалуйста, оставьте это. Я не знаю, что это значит для меня в этом контексте. –

+0

@ Entbark - Я расширил свой первоначальный ответ. – dugas

+1

Для тех, кто находит это, в Powershell v5.1 (возможно, даже 5.0 - но не раньше) классы имеют конструкторы, доступные из нотации квадратной скобки. Это позволяет Powershell ISE использовать Intellisense для подписей конструктора. Вызывается так: '[System.DirectoryServices.AccountManagement.PrincipalContext] :: new ($ ContextType, $ ContextName)'. –

Смежные вопросы