在 PowerShell 中调用构造函数的 .NET 语法

Ben*_*ard 6 .net powershell

使用PowerShell 中的System.DirectoryServices.AccountManagement命名空间、PrincipalContext类。我无法PrincipalContext Constructor (ContextType, String)通过以下方式致电

[System.DirectoryServices.AccountManagement.PrincipalContext]::PrincipalContext($ContextType, $ContextName)
Run Code Online (Sandbox Code Playgroud)

我收到错误"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
Run Code Online (Sandbox Code Playgroud)

想了解为什么它以第二种方式工作而不是第一种方式。有没有办法用方括号来做到这一点?

完整代码是这样的:

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')
Run Code Online (Sandbox Code Playgroud)

dug*_*gas 5

在 .net 类后面使用双冒号用于调用该类的静态方法。

请参阅:使用静态类和方法

使用以下语法:

[System.DirectoryServices.AccountManagement.PrincipalContext]::PrincipalContext($ContextType, $ContextName)
Run Code Online (Sandbox Code Playgroud)

您正在尝试调用PrincipalContext 类上名为PrincipalContext 的静态方法而不是构造函数。

只能用下面的方式调用吗?

AFAIK,您需要使用 New-Object cmdlet 创建类的实例(调用构造函数)。

想了解为什么它以第二种方式工作而不是第一种方式。有没有办法用方括号来做到这一点?

它以第二种方式工作,因为您正确地创建了一个新对象并调用构造函数。第一种方式不起作用,因为您没有调用构造函数 - 您正在尝试调用静态方法。

  • 对于那些发现这一点的人来说,在 Powershell v5.1(甚至可能是 5.0 - 但之前没有)中,类具有可通过方括号表示法获得的构造函数。这允许 Powershell ISE 将 Intellisense 用于构造函数签名。像这样调用:`[System.DirectoryServices.AccountManagement.PrincipalContext]::new($ContextType, $ContextName)`。 (7认同)